{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/SocketClientProvider.tsx","../src/Context.ts","../src/useSocketClient.ts"],"sourcesContent":["export { ConnectionStatus } from \"./constants.ts\";\nexport { default as SocketClientProvider } from \"./SocketClientProvider.tsx\";\nexport type {\n  ConnectionStatusValues,\n  SocketClientHookReturnType,\n  SocketClientProviderProps,\n  SocketInstance,\n} from \"./types.ts\";\nexport { default as useSocketClient } from \"./useSocketClient.ts\";\n","export const ConnectionStatus = {\n  CONNECTED: \"connected\",\n  DISCONNECTED: \"disconnected\",\n  RECONNECTING: \"reconnecting\",\n} as const;\n","import {\n  ClientSocketManager,\n  ClientSocketManagerStub,\n} from \"@tapsioss/client-socket-manager\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ConnectionStatus } from \"./constants.ts\";\nimport { SocketContext, type SocketContextValue } from \"./Context.ts\";\nimport type {\n  ConnectionStatusValues,\n  SocketClientProviderProps,\n} from \"./types.ts\";\n\nconst __SINGLETON_REFS__: Record<\n  string,\n  | InstanceType<typeof ClientSocketManager>\n  | InstanceType<typeof ClientSocketManagerStub>\n  | null\n> = {};\n\n/**\n * React provider that initializes and manages a socket connection via `ClientSocketManager`.\n *\n * It optionally uses a stubbed socket manager in server-side rendering or testing environments.\n * The provider ensures a singleton instance per URI and updates the connection status accordingly.\n *\n * Properties:\n * - `children` (`React.ReactNode`): React children to render within the provider.\n * - `uri` (`string`): The URI to connect the socket client to.\n * - `shouldUseStub?` (`boolean`): Optional flag indicating whether to use the stubbed version of `ClientSocketManager` (useful for SSR or testing).\n * - Additional props from `ClientSocketManagerOptions` can be provided, such as `eventHandlers`, `reconnectionDelay`, etc.\n *\n * @param props - Props for the provider, including connection URI, stub flag, and socket manager options.\n * @returns A context provider that supplies the socket instance and its connection status.\n *\n * @example\n * ```tsx\n * <SocketClientProvider uri=\"https://example.com/socket\" shouldUseStub={typeof window === \"undefined\"}>\n *   <App />\n * </SocketClientProvider>\n * ```\n */\nconst SocketClientProvider = (props: SocketClientProviderProps) => {\n  const { children, uri, ...options } = props;\n\n  const [clientInstance, setClientInstance] = useState(\n    __SINGLETON_REFS__[uri] ?? null,\n  );\n\n  const [connectionStatus, setConnectionStatus] =\n    useState<ConnectionStatusValues>(ConnectionStatus.DISCONNECTED);\n\n  const registerClientSocketManager = (\n    client: SocketContextValue[\"socket\"],\n  ) => {\n    setClientInstance(client);\n    __SINGLETON_REFS__[uri] = client;\n  };\n\n  useEffect(() => {\n    if (!__SINGLETON_REFS__[uri]) {\n      if (props.shouldUseStub) {\n        registerClientSocketManager(new ClientSocketManagerStub(uri, {}));\n      } else {\n        const client = new ClientSocketManager(uri, {\n          ...options,\n          eventHandlers: {\n            ...(options.eventHandlers ?? {}),\n            onSocketConnection() {\n              options.eventHandlers?.onSocketConnection?.call(client);\n              setConnectionStatus(ConnectionStatus.CONNECTED);\n            },\n            onSocketDisconnection(reason, details) {\n              options.eventHandlers?.onSocketDisconnection?.call(\n                client,\n                reason,\n                details,\n              );\n              setConnectionStatus(ConnectionStatus.DISCONNECTED);\n            },\n            onReconnecting(attempt) {\n              options.eventHandlers?.onReconnecting?.call(client, attempt);\n              setConnectionStatus(ConnectionStatus.RECONNECTING);\n            },\n          },\n        });\n\n        registerClientSocketManager(client);\n      }\n    } else {\n      throw new Error(\n        [\n          `ClientSocketManager: An active client already exists for the URI \"${uri}\".`,\n          \"Multiple clients for the same URI are not allowed.\",\n        ].join(\" \"),\n      );\n    }\n\n    return () => {\n      if (__SINGLETON_REFS__[uri]) {\n        __SINGLETON_REFS__[uri].dispose();\n        __SINGLETON_REFS__[uri] = null;\n      }\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const ctx: SocketContextValue = useMemo(\n    () =>\n      ({\n        connectionStatus,\n        get socket() {\n          if (!clientInstance) return null;\n          if (clientInstance.disposed) return null;\n\n          return clientInstance;\n        },\n      }) satisfies SocketContextValue,\n    [connectionStatus, clientInstance],\n  );\n\n  return (\n    <SocketContext.Provider value={ctx}>{children}</SocketContext.Provider>\n  );\n};\n\nexport default SocketClientProvider;\n","import { createContext } from \"react\";\nimport type {\n  ConnectionStatusValues,\n  SocketInstance,\n  SocketInstanceStub,\n} from \"./types.ts\";\n\nexport type SocketContextValue = {\n  /**\n   * The socket client instance.\n   */\n  socket: SocketInstance | SocketInstanceStub | null;\n  /**\n   * The connection status of the socket instance.\n   */\n  connectionStatus: ConnectionStatusValues;\n};\n\nexport const SocketContext = createContext<SocketContextValue | null>(null);\n\nSocketContext.displayName = \"SocketContext\";\n","import { useContext } from \"react\";\nimport { SocketContext } from \"./Context.ts\";\nimport type { SocketClientHookReturnType } from \"./types.ts\";\n\n/**\n * A React hook that provides access to the current socket client instance and its connection status.\n *\n * This hook must be used within a `<SocketClientProvider>`, otherwise it will throw an error.\n *\n * @throws Will throw an error if used outside of a `<SocketClientProvider>`.\n *\n * @returns {SocketClientHookReturnType} An object containing the socket client instance and its connection status.\n *\n * @example\n * ```tsx\n * const { socket, connectionStatus } = useSocketClient();\n * if (socket?.connected) {\n *   socket.emit(\"message\", { text: \"Hello\" });\n * }\n * ```\n */\nconst useSocketClient = (): SocketClientHookReturnType => {\n  const ctx = useContext(SocketContext);\n\n  if (!ctx) {\n    throw new Error(\n      [\n        \"ClientSocketManager: `useSocketClient` must be used within a `<SocketClientProvider>`.\",\n        \"Please wrap your component with a `<SocketClientProvider>`.\",\n      ].join(\" \"),\n    );\n  }\n\n  return ctx;\n};\n\nexport default useSocketClient;\n"],"mappings":"s6BAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,yBAAAC,EAAA,oBAAAC,IAAA,eAAAC,EAAAL,GCAO,IAAMM,EAAmB,CAC9B,UAAW,YACX,aAAc,eACd,aAAc,cAChB,ECJA,IAAAC,EAGO,2CACPC,EAA6C,iBCJ7C,IAAAC,EAA8B,iBAkBjBC,KAAgB,iBAAyC,IAAI,EAE1EA,EAAc,YAAc,gBDqGxB,IAAAC,EAAA,6BA7GEC,EAKF,CAAC,EAwBCC,EAAwBC,GAAqC,CAzCnE,IAAAC,EA0CE,IAAsCC,EAAAF,EAA9B,UAAAG,EAAU,IAAAC,CA1CpB,EA0CwCF,EAAZG,EAAAC,EAAYJ,EAAZ,CAAlB,WAAU,QAEZ,CAACK,EAAgBC,CAAiB,KAAI,aAC1CP,EAAAH,EAAmBM,CAAG,IAAtB,KAAAH,EAA2B,IAC7B,EAEM,CAACQ,EAAkBC,CAAmB,KAC1C,YAAiCC,EAAiB,YAAY,EAE1DC,EACJC,GACG,CACHL,EAAkBK,CAAM,EACxBf,EAAmBM,CAAG,EAAIS,CAC5B,KAEA,aAAU,IAAM,CA1DlB,IAAAX,EA2DI,GAAKJ,EAAmBM,CAAG,EA8BzB,MAAM,IAAI,MACR,CACE,qEAAqEA,CAAG,KACxE,oDACF,EAAE,KAAK,GAAG,CACZ,EAlCA,GAAIJ,EAAM,cACRY,EAA4B,IAAI,0BAAwBR,EAAK,CAAC,CAAC,CAAC,MAC3D,CACL,IAAMS,EAAS,IAAI,sBAAoBT,EAAKU,EAAAC,EAAA,GACvCV,GADuC,CAE1C,cAAeS,EAAAC,EAAA,IACTb,EAAAG,EAAQ,gBAAR,KAAAH,EAAyB,CAAC,GADjB,CAEb,oBAAqB,CAnEjC,IAAAA,EAAAD,GAoEcA,GAAAC,EAAAG,EAAQ,gBAAR,YAAAH,EAAuB,qBAAvB,MAAAD,EAA2C,KAAKY,GAChDH,EAAoBC,EAAiB,SAAS,CAChD,EACA,sBAAsBK,EAAQC,EAAS,CAvEnD,IAAAf,EAAAD,GAwEcA,GAAAC,EAAAG,EAAQ,gBAAR,YAAAH,EAAuB,wBAAvB,MAAAD,EAA8C,KAC5CY,EACAG,EACAC,GAEFP,EAAoBC,EAAiB,YAAY,CACnD,EACA,eAAeO,EAAS,CA/EpC,IAAAhB,EAAAD,GAgFcA,GAAAC,EAAAG,EAAQ,gBAAR,YAAAH,EAAuB,iBAAvB,MAAAD,EAAuC,KAAKY,EAAQK,GACpDR,EAAoBC,EAAiB,YAAY,CACnD,CACF,EACF,EAAC,EAEDC,EAA4BC,CAAM,CACpC,CAUF,MAAO,IAAM,CACPf,EAAmBM,CAAG,IACxBN,EAAmBM,CAAG,EAAE,QAAQ,EAChCN,EAAmBM,CAAG,EAAI,KAE9B,CAEF,EAAG,CAAC,CAAC,EAEL,IAAMe,KAA0B,WAC9B,KACG,CACC,iBAAAV,EACA,IAAI,QAAS,CAEX,MADI,CAACF,GACDA,EAAe,SAAiB,KAE7BA,CACT,CACF,GACF,CAACE,EAAkBF,CAAc,CACnC,EAEA,SACE,OAACa,EAAc,SAAd,CAAuB,MAAOD,EAAM,SAAAhB,EAAS,CAElD,EAEOkB,EAAQtB,EE7Hf,IAAAuB,EAA2B,iBAqB3B,IAAMC,EAAkB,IAAkC,CACxD,IAAMC,KAAM,cAAWC,CAAa,EAEpC,GAAI,CAACD,EACH,MAAM,IAAI,MACR,CACE,yFACA,6DACF,EAAE,KAAK,GAAG,CACZ,EAGF,OAAOA,CACT,EAEOE,EAAQH","names":["index_exports","__export","ConnectionStatus","SocketClientProvider_default","useSocketClient_default","__toCommonJS","ConnectionStatus","import_client_socket_manager","import_react","import_react","SocketContext","import_jsx_runtime","__SINGLETON_REFS__","SocketClientProvider","props","_b","_a","children","uri","options","__objRest","clientInstance","setClientInstance","connectionStatus","setConnectionStatus","ConnectionStatus","registerClientSocketManager","client","__spreadProps","__spreadValues","reason","details","attempt","ctx","SocketContext","SocketClientProvider_default","import_react","useSocketClient","ctx","SocketContext","useSocketClient_default"]}