{"version":3,"sources":["../../../../../src/client/dev/hot-reloader/pages/websocket.ts"],"sourcesContent":["import { logQueue } from '../../../../next-devtools/userspace/app/forward-logs'\nimport {\n  HMR_MESSAGE_SENT_TO_BROWSER,\n  type HmrMessageSentToBrowser,\n} from '../../../../server/dev/hot-reloader-types'\nimport { getSocketUrl } from '../get-socket-url'\nimport { WEB_SOCKET_MAX_RECONNECTIONS } from '../../../../lib/constants'\n\nlet source: WebSocket\n\ntype MessageCallback = (message: HmrMessageSentToBrowser) => void\n\nconst messageCallbacks: Array<MessageCallback> = []\n\nexport function addMessageListener(callback: MessageCallback) {\n  messageCallbacks.push(callback)\n}\n\nexport function sendMessage(data: string) {\n  if (!source || source.readyState !== source.OPEN) return\n  return source.send(data)\n}\n\nlet reconnections = 0\nlet reloading = false\nlet serverSessionId: number | null = null\n\nexport function connectHMR(options: { path: string; assetPrefix: string }) {\n  let timer: ReturnType<typeof setTimeout>\n\n  function init() {\n    if (source) source.close()\n\n    function handleOnline() {\n      logQueue.onSocketReady(source)\n      reconnections = 0\n      window.console.log('[HMR] connected')\n    }\n\n    function handleMessage(event: MessageEvent<string>) {\n      // While the page is reloading, don't respond to any more messages.\n      // On reconnect, the server may send an empty list of changes if it was restarted.\n      if (reloading) {\n        return\n      }\n\n      const message: HmrMessageSentToBrowser = JSON.parse(event.data)\n\n      if (message.type === HMR_MESSAGE_SENT_TO_BROWSER.TURBOPACK_CONNECTED) {\n        if (\n          serverSessionId !== null &&\n          serverSessionId !== message.data.sessionId\n        ) {\n          // Either the server's session id has changed and it's a new server, or\n          // it's been too long since we disconnected and we should reload the page.\n          // There could be 1) unhandled server errors and/or 2) stale content.\n          // Perform a hard reload of the page.\n          window.location.reload()\n\n          reloading = true\n          return\n        }\n\n        serverSessionId = message.data.sessionId\n      }\n\n      for (const messageCallback of messageCallbacks) {\n        messageCallback(message)\n      }\n    }\n\n    function handleDisconnect() {\n      source.onerror = null\n      source.onclose = null\n      source.close()\n      reconnections++\n      // After 25 reconnects we'll want to reload the page as it indicates the dev server is no longer running.\n      if (reconnections > WEB_SOCKET_MAX_RECONNECTIONS) {\n        reloading = true\n        window.location.reload()\n        return\n      }\n\n      clearTimeout(timer)\n      // Try again after 5 seconds\n      timer = setTimeout(init, reconnections > 5 ? 5000 : 1000)\n    }\n\n    const url = getSocketUrl(options.assetPrefix)\n\n    source = new window.WebSocket(`${url}${options.path}`)\n    source.onopen = handleOnline\n    source.onerror = handleDisconnect\n    source.onclose = handleDisconnect\n    source.onmessage = handleMessage\n  }\n\n  init()\n}\n"],"names":["addMessageListener","connectHMR","sendMessage","source","messageCallbacks","callback","push","data","readyState","OPEN","send","reconnections","reloading","serverSessionId","options","timer","init","close","handleOnline","logQueue","onSocketReady","window","console","log","handleMessage","event","message","JSON","parse","type","HMR_MESSAGE_SENT_TO_BROWSER","TURBOPACK_CONNECTED","sessionId","location","reload","messageCallback","handleDisconnect","onerror","onclose","WEB_SOCKET_MAX_RECONNECTIONS","clearTimeout","setTimeout","url","getSocketUrl","assetPrefix","WebSocket","path","onopen","onmessage"],"mappings":";;;;;;;;;;;;;;;;IAcgBA,kBAAkB;eAAlBA;;IAaAC,UAAU;eAAVA;;IATAC,WAAW;eAAXA;;;6BAlBS;kCAIlB;8BACsB;2BACgB;AAE7C,IAAIC;AAIJ,MAAMC,mBAA2C,EAAE;AAE5C,SAASJ,mBAAmBK,QAAyB;IAC1DD,iBAAiBE,IAAI,CAACD;AACxB;AAEO,SAASH,YAAYK,IAAY;IACtC,IAAI,CAACJ,UAAUA,OAAOK,UAAU,KAAKL,OAAOM,IAAI,EAAE;IAClD,OAAON,OAAOO,IAAI,CAACH;AACrB;AAEA,IAAII,gBAAgB;AACpB,IAAIC,YAAY;AAChB,IAAIC,kBAAiC;AAE9B,SAASZ,WAAWa,OAA8C;IACvE,IAAIC;IAEJ,SAASC;QACP,IAAIb,QAAQA,OAAOc,KAAK;QAExB,SAASC;YACPC,qBAAQ,CAACC,aAAa,CAACjB;YACvBQ,gBAAgB;YAChBU,OAAOC,OAAO,CAACC,GAAG,CAAC;QACrB;QAEA,SAASC,cAAcC,KAA2B;YAChD,mEAAmE;YACnE,kFAAkF;YAClF,IAAIb,WAAW;gBACb;YACF;YAEA,MAAMc,UAAmCC,KAAKC,KAAK,CAACH,MAAMlB,IAAI;YAE9D,IAAImB,QAAQG,IAAI,KAAKC,6CAA2B,CAACC,mBAAmB,EAAE;gBACpE,IACElB,oBAAoB,QACpBA,oBAAoBa,QAAQnB,IAAI,CAACyB,SAAS,EAC1C;oBACA,uEAAuE;oBACvE,0EAA0E;oBAC1E,qEAAqE;oBACrE,qCAAqC;oBACrCX,OAAOY,QAAQ,CAACC,MAAM;oBAEtBtB,YAAY;oBACZ;gBACF;gBAEAC,kBAAkBa,QAAQnB,IAAI,CAACyB,SAAS;YAC1C;YAEA,KAAK,MAAMG,mBAAmB/B,iBAAkB;gBAC9C+B,gBAAgBT;YAClB;QACF;QAEA,SAASU;YACPjC,OAAOkC,OAAO,GAAG;YACjBlC,OAAOmC,OAAO,GAAG;YACjBnC,OAAOc,KAAK;YACZN;YACA,yGAAyG;YACzG,IAAIA,gBAAgB4B,uCAA4B,EAAE;gBAChD3B,YAAY;gBACZS,OAAOY,QAAQ,CAACC,MAAM;gBACtB;YACF;YAEAM,aAAazB;YACb,4BAA4B;YAC5BA,QAAQ0B,WAAWzB,MAAML,gBAAgB,IAAI,OAAO;QACtD;QAEA,MAAM+B,MAAMC,IAAAA,0BAAY,EAAC7B,QAAQ8B,WAAW;QAE5CzC,SAAS,IAAIkB,OAAOwB,SAAS,CAAC,GAAGH,MAAM5B,QAAQgC,IAAI,EAAE;QACrD3C,OAAO4C,MAAM,GAAG7B;QAChBf,OAAOkC,OAAO,GAAGD;QACjBjC,OAAOmC,OAAO,GAAGF;QACjBjC,OAAO6C,SAAS,GAAGxB;IACrB;IAEAR;AACF","ignoreList":[0]}