{"version":3,"sources":["jsdelivr-header.js","/npm/alp-websocket@6.1.2/src/browser.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,4JCII,O,4GAJE,OAAS,IAAI,OAAO,iBAKtB,qBAAuC,KACvC,WAAY,EAuBV,6BAA+B,WACnC,sBAAuB,CACxB,EAEY,UAAuB,CAClC,aAAI,GACF,OAAO,SACR,EACD,MACA,QACA,UACA,wBACA,8BACA,eAGF,SAAS,MAAM,EAAyB,GAA+B,IAC7D,EAAoB,EAApB,OAAQ,EAAY,EAAZ,QAEhB,GAAI,OACF,MAAM,IAAI,MAAM,6BAGlB,IAAM,EAAkB,EAAO,IAAI,cAAgB,EAAO,IAAI,aAE9D,IAAK,EACH,MAAM,IAAI,MAAM,4BAGlB,IAAK,EAAgB,IAAI,QACvB,MAAM,IAAI,MAAM,iCAGlB,IAAM,EAAS,EAAgB,IAAI,UAC7B,EAAO,EAAgB,IAAI,QAE3B,EAAgB,SAAQ,QACrB,EAAS,IAAM,IADM,MAE1B,OAAO,SAAS,SAFU,IAGxB,EAHwB,IAGhB,EACZ,CACE,kBAAmB,IACnB,qBAAsB,KACtB,QAAS,IACT,WAAY,CAAC,eA6CjB,OA1CA,OAAS,EAET,EAAc,GAAG,gBAAiB,8BAElC,EAAc,GAAG,WAAW,WAC1B,EAAc,IAAI,gBAAiB,8BACnC,OAAO,QAAQ,aACf,sBAAuB,EACvB,WAAY,CACb,IAED,EAAc,GAAG,aAAa,WAC5B,OAAO,QAAQ,eACf,WAAY,CACb,IAED,EAAc,GAAG,cAAc,WAC7B,OAAO,KAAK,gBACZ,WAAY,CACb,IAED,EAAc,GAAG,SAAS,SAAA,GAAsC,IAAnC,EAAmC,EAAnC,QAC3B,GAAI,IAAY,OAAO,YAAa,CAElC,GAAkB,OAAO,QAAQ,EAAQ,EAAE,eACzC,OAAO,OAAO,SAAS,QAAO,GAE9B,QAAQ,KAAK,mBAAoB,CAC/B,cAAe,EACf,cAAe,OAAO,aAG3B,CACF,IAED,EAAc,GAAG,gBAAgB,SAAC,GAChC,OAAO,MAAM,iCAAkC,GAG/C,EAAI,MAAM,SAAS,EACpB,IAEM,CACR,CAED,SAAS,KAAa,GAAgD,IAAA,EAAA,UAAA,OAA9B,EAA8B,IAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,EAAA,EAAA,IAA9B,EAA8B,EAAA,GAAA,UAAA,GACpE,IAAK,OAAQ,MAAM,IAAI,MAAM,qCAC7B,IAAA,EAFsC,EAEtC,EAAM,EAAiB,OAEvB,OADA,OAAO,MAAM,OAAQ,CAAE,SAChB,IAAI,SAAQ,SAAC,EAAS,GAC3B,IAAM,EAAW,YAAW,WAC1B,OAAO,KAAK,yBAA0B,CAAE,SACxC,EAAO,IAAI,MAAM,8BAClB,GAAE,KAEH,EAAe,KAAf,MAAA,EAAc,CACZ,GADY,OAET,EAFS,CAGZ,SAAC,EAA8B,GAE7B,GADA,aAAa,GACA,MAAT,EACF,OAAO,EAAwB,iBAAV,EAAqB,IAAI,MAAM,GAAS,GAE/D,EAAQ,EACT,IAEJ,GACF,CAED,SAAS,GAAuB,EAAe,GAC7C,IAAK,OAAQ,MAAM,IAAI,MAAM,mCAE7B,OADA,OAAO,GAAG,EAAO,GACV,CACR,CAED,SAAS,IAAI,EAAe,GAC1B,IAAK,OAAQ,MAAM,IAAI,MAAM,oCAC7B,OAAO,IAAI,EAAO,EACnB,CAED,SAAS,cAEP,QAAS,QAAU,SACpB,CAED,SAAS,iBACP,QAAS,uBAAyB,aACnC,CAEc,SAAS,aACtB,EACA,QACQ,IADR,MAAgB,IAEhB,IAAM,EAAS,MAAM,EAAK,GAG1B,OAFA,EAAI,UAAY,UAChB,UAAU,OAAS,EACZ,CACR,C","file":"/npm/alp-websocket@6.1.2/dist/index-browser.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/alp-websocket@6.1.2/dist/index-browser.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define, max-lines */\nimport { PRODUCTION } from 'pob-babel';\nimport socketio from 'socket.io-client';\nimport Logger from 'nightingale-logger';\nimport { BrowserApplication } from 'alp-types';\n\nconst logger = new Logger('alp:websocket');\n\ntype Socket = ReturnType<typeof socketio>;\n\nlet socket: Socket | undefined;\nlet successfulConnection: boolean | null = null;\nlet connected = false;\n\ninterface Websocket {\n  connected: boolean;\n  isConnected: () => boolean;\n  isDisconnected: () => boolean;\n  on: typeof on;\n  off: typeof off;\n  emit: typeof emit;\n  socket?: Socket;\n}\n\ndeclare module 'alp-types' {\n  interface BrowserApplication {\n    websocket: Websocket;\n  }\n}\ndeclare global {\n  interface Window {\n    __VERSION__: string;\n  }\n}\n\nconst callbackFirstConnectionError = () => {\n  successfulConnection = false;\n};\n\nexport const websocket: Websocket = {\n  get connected() {\n    return connected;\n  },\n  on,\n  off,\n  emit,\n  isConnected,\n  isDisconnected,\n  socket,\n};\n\nfunction start(app: BrowserApplication, namespaceName: string): Socket {\n  const { config, context } = app;\n\n  if (socket) {\n    throw new Error('WebSocket already started');\n  }\n\n  const webSocketConfig = config.get('webSocket') || config.get('websocket');\n\n  if (!webSocketConfig) {\n    throw new Error('Missing config webSocket');\n  }\n\n  if (!webSocketConfig.has('port')) {\n    throw new Error('Missing config webSocket.port');\n  }\n\n  const secure = webSocketConfig.get('secure');\n  const port = webSocketConfig.get('port');\n\n  const createdSocket = socketio(\n    `http${secure ? 's' : ''}://${\n      window.location.hostname\n    }:${port}/${namespaceName}`,\n    {\n      reconnectionDelay: 500,\n      reconnectionDelayMax: 2500,\n      timeout: 4000,\n      transports: ['websocket'],\n    },\n  );\n  socket = createdSocket;\n\n  createdSocket.on('connect_error', callbackFirstConnectionError);\n\n  createdSocket.on('connect', () => {\n    createdSocket.off('connect_error', callbackFirstConnectionError);\n    logger.success('connected');\n    successfulConnection = true;\n    connected = true;\n  });\n\n  createdSocket.on('reconnect', () => {\n    logger.success('reconnected');\n    connected = true;\n  });\n\n  createdSocket.on('disconnect', () => {\n    logger.warn('disconnected');\n    connected = false;\n  });\n\n  createdSocket.on('hello', ({ version }: { version: string }) => {\n    if (version !== window.__VERSION__) {\n      // eslint-disable-next-line no-alert\n      if (PRODUCTION && window.confirm(context.t('newversion'))) {\n        return window.location.reload(true);\n      } else {\n        console.warn('Version mismatch', {\n          serverVersion: version,\n          clientVersion: window.__VERSION__,\n        });\n      }\n    }\n  });\n\n  createdSocket.on('redux:action', (action: any) => {\n    logger.debug('dispatch action from websocket', action);\n    // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n    // @ts-ignore\n    app.store.dispatch(action);\n  });\n\n  return createdSocket;\n}\n\nfunction emit<Result>(event: string, ...args: any[]): Promise<Result> {\n  if (!socket) throw new Error('Cannot call emit() before start()');\n  const existingSocket = socket;\n  logger.debug('emit', { args });\n  return new Promise((resolve, reject) => {\n    const resolved = setTimeout(() => {\n      logger.warn('websocket emit timeout', { args });\n      reject(new Error('websocket response timeout'));\n    }, 10000);\n\n    existingSocket.emit(\n      event,\n      ...args,\n      (error: Error | string | null, result: Result): void => {\n        clearTimeout(resolved);\n        if (error != null) {\n          return reject(typeof error === 'string' ? new Error(error) : error);\n        }\n        resolve(result);\n      },\n    );\n  });\n}\n\nfunction on<T extends Function>(event: string, handler: T): T {\n  if (!socket) throw new Error('Cannot call on() before start()');\n  socket.on(event, handler);\n  return handler;\n}\n\nfunction off(event: string, handler: Function): void {\n  if (!socket) throw new Error('Cannot call off() before start()');\n  socket.off(event, handler);\n}\n\nfunction isConnected(): boolean {\n  // socket.connected is not updated after reconnect event\n  return !!socket && connected;\n}\n\nfunction isDisconnected(): boolean {\n  return !!successfulConnection && !isConnected();\n}\n\nexport default function alpWebsocket(\n  app: BrowserApplication,\n  namespaceName = '',\n): Socket {\n  const socket = start(app, namespaceName);\n  app.websocket = websocket;\n  websocket.socket = socket;\n  return socket;\n}\n"]}