{
  "version": 3,
  "sources": ["../../src/methods/initApp/websocket/initializeWebsocketConnection.ts"],
  "sourcesContent": ["import { io } from 'socket.io-client';\nimport { getWebsocketUrl } from 'apiCalls/websocket/getWebsocketUrl';\nimport {\n  WebsocketConnectionStatusEnum,\n  websocketConnection\n} from 'constants/websocket.constants';\nimport {\n  setWebsocketBatchEvent,\n  setWebsocketEvent\n} from 'store/actions/account/accountActions';\nimport { setWebsocketStatus } from 'store/actions/config/configActions';\nimport { networkSelector } from 'store/selectors/networkSelectors';\nimport { getStore } from 'store/store';\nimport { BatchTransactionsWSResponseType } from 'types/websocket.types';\n\nconst TIMEOUT = 3_000;\nconst RECONNECTION_ATTEMPTS = 3;\nconst RETRY_INTERVAL = 500;\nconst MESSAGE_DELAY = 500;\nconst BATCH_UPDATED_EVENT = 'batchUpdated';\nconst CONNECT = 'connect';\nconst CONNECT_ERROR = 'connect_error';\nconst DISCONNECT = 'disconnect';\n\ntype TimeoutType = ReturnType<typeof setTimeout> | null;\n\nexport async function initializeWebsocketConnection(address: string) {\n  const { apiAddress, websocketUrl: customWebsocketUrl } = networkSelector(\n    getStore().getState()\n  );\n\n  if (!address) {\n    throw new Error('Websocket could not be initialized: address missing');\n  }\n\n  let messageTimeout: TimeoutType = null;\n  let batchTimeout: TimeoutType = null;\n\n  // Update socket status in store for status subscription\n  const updateSocketStatus = (status: WebsocketConnectionStatusEnum) => {\n    websocketConnection.status = status;\n    setWebsocketStatus(status);\n  };\n\n  const handleMessageReceived = (message: string) => {\n    if (messageTimeout) {\n      clearTimeout(messageTimeout);\n    }\n    messageTimeout = setTimeout(() => {\n      setWebsocketEvent(message);\n    }, MESSAGE_DELAY);\n  };\n\n  const handleBatchUpdate = (data: BatchTransactionsWSResponseType) => {\n    if (batchTimeout) {\n      clearTimeout(batchTimeout);\n    }\n    batchTimeout = setTimeout(() => {\n      setWebsocketBatchEvent(data);\n    }, MESSAGE_DELAY);\n  };\n\n  const closeConnection = () => {\n    const instance = websocketConnection.instance;\n    if (instance) {\n      instance.off(CONNECT_ERROR);\n      instance.off(CONNECT);\n      instance.off(BATCH_UPDATED_EVENT);\n      instance.off(DISCONNECT);\n      instance.close();\n      console.log('Websocket disconnected.');\n    }\n\n    updateSocketStatus(WebsocketConnectionStatusEnum.NOT_INITIALIZED);\n    websocketConnection.instance = null;\n\n    if (messageTimeout) {\n      clearTimeout(messageTimeout);\n    }\n\n    if (batchTimeout) {\n      clearTimeout(batchTimeout);\n    }\n  };\n\n  const initializeConnection = async () => {\n    updateSocketStatus(WebsocketConnectionStatusEnum.PENDING);\n\n    let websocketUrl = '';\n    try {\n      websocketUrl = customWebsocketUrl ?? (await getWebsocketUrl(apiAddress));\n    } catch (error) {\n      console.error('Failed to get websocket url:', error);\n      updateSocketStatus(WebsocketConnectionStatusEnum.NOT_INITIALIZED);\n      throw error;\n    }\n\n    if (!websocketUrl) {\n      updateSocketStatus(WebsocketConnectionStatusEnum.NOT_INITIALIZED);\n      return;\n    }\n\n    websocketConnection.instance = io(websocketUrl, {\n      forceNew: true,\n      reconnection: true,\n      reconnectionAttempts: RECONNECTION_ATTEMPTS,\n      reconnectionDelay: RETRY_INTERVAL,\n      timeout: TIMEOUT,\n      query: { address },\n      transports: ['websocket']\n    });\n\n    websocketConnection.instance.onAny(handleMessageReceived);\n\n    websocketConnection.instance.on(BATCH_UPDATED_EVENT, handleBatchUpdate);\n\n    websocketConnection.instance.on(CONNECT, () => {\n      console.log('Websocket connected.');\n      updateSocketStatus(WebsocketConnectionStatusEnum.COMPLETED);\n    });\n\n    websocketConnection.instance.on(CONNECT_ERROR, (error) => {\n      console.warn('Websocket connect error: ', error.message);\n    });\n\n    websocketConnection.instance.on(DISCONNECT, (reason) => {\n      console.warn('Websocket disconnected: ', reason);\n      updateSocketStatus(WebsocketConnectionStatusEnum.PENDING);\n    });\n  };\n\n  if (\n    websocketConnection.status ===\n      WebsocketConnectionStatusEnum.NOT_INITIALIZED &&\n    !websocketConnection.instance?.active\n  ) {\n    await initializeConnection();\n  }\n\n  return {\n    closeConnection\n  };\n}\n"],
  "mappings": "6PAAA,OAAS,MAAAA,MAAU,mBAenB,IAAMC,EAAU,IACVC,EAAwB,EACxBC,EAAiB,IACjBC,EAAgB,IAChBC,EAAsB,eACtBC,EAAU,UACVC,EAAgB,gBAChBC,EAAa,aAInB,eAAsBC,EAA8BC,EAAiB,CACnE,GAAM,CAAE,WAAAC,EAAY,aAAcC,CAAmB,EAAIC,EACvDC,EAAS,EAAE,SAAS,CACtB,EAEA,GAAI,CAACJ,EACH,MAAM,IAAI,MAAM,qDAAqD,EAGvE,IAAIK,EAA8B,KAC9BC,EAA4B,KAG1BC,EAAsBC,GAA0C,CACpEC,EAAoB,OAASD,EAC7BE,EAAmBF,CAAM,CAC3B,EAEMG,EAAyBC,GAAoB,CAC7CP,GACF,aAAaA,CAAc,EAE7BA,EAAiB,WAAW,IAAM,CAChCQ,EAAkBD,CAAO,CAC3B,EAAGlB,CAAa,CAClB,EAEMoB,EAAqBC,GAA0C,CAC/DT,GACF,aAAaA,CAAY,EAE3BA,EAAe,WAAW,IAAM,CAC9BU,EAAuBD,CAAI,CAC7B,EAAGrB,CAAa,CAClB,EAEMuB,EAAkB,IAAM,CAC5B,IAAMC,EAAWT,EAAoB,SACjCS,IACFA,EAAS,IAAIrB,CAAa,EAC1BqB,EAAS,IAAItB,CAAO,EACpBsB,EAAS,IAAIvB,CAAmB,EAChCuB,EAAS,IAAIpB,CAAU,EACvBoB,EAAS,MAAM,EACf,QAAQ,IAAI,yBAAyB,GAGvCX,mBAAgE,EAChEE,EAAoB,SAAW,KAE3BJ,GACF,aAAaA,CAAc,EAGzBC,GACF,aAAaA,CAAY,CAE7B,EAEMa,EAAuB,SAAY,CACvCZ,WAAwD,EAExD,IAAIa,EAAe,GACnB,GAAI,CACFA,EAAelB,GAAuB,MAAMmB,EAAgBpB,CAAU,CACxE,OAASqB,EAAO,CACd,cAAQ,MAAM,+BAAgCA,CAAK,EACnDf,mBAAgE,EAC1De,CACR,CAEA,GAAI,CAACF,EAAc,CACjBb,mBAAgE,EAChE,MACF,CAEAE,EAAoB,SAAWc,EAAGH,EAAc,CAC9C,SAAU,GACV,aAAc,GACd,qBAAsB5B,EACtB,kBAAmBC,EACnB,QAASF,EACT,MAAO,CAAE,QAAAS,CAAQ,EACjB,WAAY,CAAC,WAAW,CAC1B,CAAC,EAEDS,EAAoB,SAAS,MAAME,CAAqB,EAExDF,EAAoB,SAAS,GAAGd,EAAqBmB,CAAiB,EAEtEL,EAAoB,SAAS,GAAGb,EAAS,IAAM,CAC7C,QAAQ,IAAI,sBAAsB,EAClCW,aAA0D,CAC5D,CAAC,EAEDE,EAAoB,SAAS,GAAGZ,EAAgByB,GAAU,CACxD,QAAQ,KAAK,4BAA6BA,EAAM,OAAO,CACzD,CAAC,EAEDb,EAAoB,SAAS,GAAGX,EAAa0B,GAAW,CACtD,QAAQ,KAAK,2BAA4BA,CAAM,EAC/CjB,WAAwD,CAC1D,CAAC,CACH,EAEA,OACEE,EAAoB,4BAEpB,CAACA,EAAoB,UAAU,QAE/B,MAAMU,EAAqB,EAGtB,CACL,gBAAAF,CACF,CACF",
  "names": ["io", "TIMEOUT", "RECONNECTION_ATTEMPTS", "RETRY_INTERVAL", "MESSAGE_DELAY", "BATCH_UPDATED_EVENT", "CONNECT", "CONNECT_ERROR", "DISCONNECT", "initializeWebsocketConnection", "address", "apiAddress", "customWebsocketUrl", "networkSelector", "getStore", "messageTimeout", "batchTimeout", "updateSocketStatus", "status", "websocketConnection", "setWebsocketStatus", "handleMessageReceived", "message", "setWebsocketEvent", "handleBatchUpdate", "data", "setWebsocketBatchEvent", "closeConnection", "instance", "initializeConnection", "websocketUrl", "getWebsocketUrl", "error", "io", "reason"]
}
