@elqnt/nats 1.0.0 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  "use strict";
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.tsx","../context/nats-context.ts","../context/nats-provider.tsx","../hooks/use-nats.ts","../utils/nats.ts"],"sourcesContent":["// export * from \"./consts\";\nexport * from \"./context\";\nexport * from \"./hooks\";\n// export * from \"./jobs\";\n// export * from \"./models\";\nexport * from \"./types\";\nexport * from \"./utils\";\n// export * from \"./client-types\";\n","\"use client\";\n\nimport { KV, ObjectStore } from \"nats.ws\";\nimport { createContext, useContext } from \"react\";\nimport { NATSContextType } from \"../types/nats\";\n\nexport const initialNATS: NATSContextType = {\n nats: undefined,\n JetStream: () => null as any,\n KV: async (bucket: string) => Promise.resolve({} as KV),\n ObjectStore: async (bucket: string) => Promise.resolve({} as ObjectStore),\n natsConnected: false,\n natsError: null,\n request: <R, S>(topic: string, data: R) => Promise.resolve<S>({} as S),\n publish: <T>(topic: string, data: T) => Promise.resolve(),\n subscribe: <T>(topic: string, callback: (data: T | Error) => void) =>\n Promise.resolve(),\n parseJson: <T>(data: Uint8Array) => JSON.parse(data.toString()),\n parseString: (data: Uint8Array) => data.toString(),\n encodePayLoad: (data: unknown) =>\n new TextEncoder().encode(JSON.stringify(data)),\n loading: false,\n retry: () => {},\n retryCount: 0,\n isRetrying: false,\n};\n\nexport const NatsContext = createContext(initialNATS);\n\nexport const useNatsContext = () => useContext(NatsContext);\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useNATS } from \"../hooks\";\nimport { NATSContextType } from \"../types\";\nimport { NatsContext } from \"./nats-context\";\n\ntype NATSProviderProps = {\n children: React.ReactNode;\n apiEndpoint: string;\n};\n\nexport function NATSProvider(props: NATSProviderProps) {\n const { children, apiEndpoint } = props;\n\n const {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n } = useNATS(apiEndpoint);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n if (!ready) {\n return null;\n }\n\n const contextValue: NATSContextType = {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n };\n\n return (\n <NatsContext.Provider value={contextValue}>{children}</NatsContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n JSONCodec,\n JetStreamClient,\n KV,\n NatsConnection,\n ObjectStore,\n StringCodec,\n connect,\n headers,\n jwtAuthenticator,\n} from \"nats.ws\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst TIMEOUT = 900000000;\nconst AUTH_FETCH_TIMEOUT = 10000; // 10 seconds for auth fetch\nconst MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY = 1000; // 1 second\n\nexport const useNATS = (authApiUrl: string) => {\n const [nats, setNATS] = useState<NatsConnection | undefined>(undefined);\n const [natsConnected, setNATSConnected] = useState(false);\n const [natsError, setNATSError] = useState<any>(undefined);\n const [loading, setLoading] = useState(false);\n const [retryCount, setRetryCount] = useState(0);\n const [isRetrying, setIsRetrying] = useState(false);\n\n const connectionRef = useRef<NatsConnection | null>(null);\n const retryTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isConnectingRef = useRef(false);\n const isMountedRef = useRef(true);\n\n const connectNATS = useCallback(\n async (attempt: number = 0) => {\n // Prevent concurrent connection attempts\n if (isConnectingRef.current || connectionRef.current) {\n return;\n }\n\n isConnectingRef.current = true;\n setLoading(true);\n setNATSError(undefined);\n\n if (attempt > 0) {\n setIsRetrying(true);\n setRetryCount(attempt);\n }\n\n try {\n // Fetch auth with timeout\n const controller = new AbortController();\n const fetchTimeout = setTimeout(\n () => controller.abort(),\n AUTH_FETCH_TIMEOUT\n );\n\n const resp = await fetch(authApiUrl, { signal: controller.signal });\n clearTimeout(fetchTimeout);\n\n if (!resp.ok) {\n throw new Error(`Auth fetch failed: ${resp.status}`);\n }\n\n const { jwt, natsUrl } = await resp.json();\n\n const authenticator = jwtAuthenticator(jwt);\n\n const nc = await connect({\n servers: natsUrl,\n authenticator,\n timeout: TIMEOUT,\n reconnect: true,\n maxReconnectAttempts: -1, // Unlimited reconnect attempts\n reconnectTimeWait: 2000, // Wait 2 seconds between reconnect attempts\n });\n\n if (!isMountedRef.current) {\n await nc.close();\n return;\n }\n\n connectionRef.current = nc;\n setNATS(nc);\n setNATSConnected(true);\n setIsRetrying(false);\n setRetryCount(0);\n isConnectingRef.current = false;\n setLoading(false);\n\n console.log(\"NATS connected:\", natsUrl);\n\n // Monitor connection status\n (async () => {\n for await (const status of nc.status()) {\n if (!isMountedRef.current) break;\n\n if (status.type === \"disconnect\") {\n console.log(\"NATS disconnected, will auto-reconnect...\");\n setNATSConnected(false);\n } else if (status.type === \"reconnect\") {\n console.log(\"NATS reconnected\");\n setNATSConnected(true);\n } else if (status.type === \"error\") {\n console.error(\"NATS error:\", status.data);\n }\n }\n })();\n } catch (error: any) {\n isConnectingRef.current = false;\n setLoading(false);\n\n if (!isMountedRef.current) return;\n\n const errorMessage =\n error.name === \"AbortError\" ? \"Auth request timed out\" : error;\n console.error(\n `NATS connection failed (attempt ${attempt + 1}/${MAX_RETRIES}):`,\n errorMessage\n );\n\n if (attempt < MAX_RETRIES - 1) {\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s\n const delay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);\n console.log(`Retrying NATS connection in ${delay / 1000}s...`);\n\n retryTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) {\n connectNATS(attempt + 1);\n }\n }, delay);\n } else {\n // Max retries reached\n setNATSError(error);\n setIsRetrying(false);\n console.error(\"NATS connection failed after max retries\");\n }\n }\n },\n [authApiUrl]\n );\n\n // Manual retry function exposed to consumers\n const retry = useCallback(() => {\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n connectionRef.current = null;\n isConnectingRef.current = false;\n setNATSError(undefined);\n connectNATS(0);\n }, [connectNATS]);\n\n useEffect(() => {\n isMountedRef.current = true;\n connectNATS(0);\n\n return () => {\n isMountedRef.current = false;\n\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n\n if (connectionRef.current) {\n connectionRef.current.close();\n connectionRef.current = null;\n }\n };\n }, [connectNATS]);\n\n async function request<R, S>(\n topic: string,\n data: R,\n headersObj: object = {}\n ): Promise<S> {\n if (!nats || !natsConnected) throw new Error(\"nats not connected !!\");\n\n const h = headers();\n Object.entries(headersObj).forEach(([key, value]) => {\n if (!value) return;\n h.append(key, value.toString());\n });\n\n const reqJC = JSONCodec<R>();\n const resJC = JSONCodec<S>();\n\n try {\n const msg = await nats.request(topic, reqJC.encode(data), {\n timeout: TIMEOUT,\n headers: h,\n });\n return resJC.decode(msg.data);\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseJson<T>(data: Uint8Array): T {\n const jc = JSONCodec<T>();\n try {\n return jc.decode(data) as unknown as T;\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseString(data: Uint8Array): string {\n const sc = StringCodec();\n try {\n return sc.decode(data);\n } catch (error: any) {\n throw error;\n }\n }\n\n // publish data asynchronously\n async function publish(topic: string, data: any, headersObj: object = {}) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n // console.time(\"publish: \" + topic);\n const jc = JSONCodec();\n\n const h = headers();\n\n for (const [key, value] of Object.entries(headersObj)) {\n h.append(key, value);\n }\n\n nats.publish(topic, jc.encode(data), {\n headers: h,\n });\n // console.timeEnd(\"publish: \" + topic);\n }\n\n function encodePayLoad(data: unknown): Uint8Array {\n const jc = JSONCodec();\n return jc.encode(data);\n }\n\n async function subscribe<S>(\n topic: string,\n callbackFn: (data: S | Error) => void\n ) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n nats.subscribe(topic, {\n callback: (err, msg) => {\n const jc = JSONCodec<S>();\n const data = jc.decode(msg.data);\n\n if (err) {\n callbackFn(err);\n return;\n }\n\n callbackFn(data);\n },\n });\n }\n\n function JetStream(): JetStreamClient {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n\n return nats.jetstream();\n }\n\n // todo: move to a separate hook\n async function KV(bucket: string): Promise<KV> {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n const js = JetStream();\n\n // if (js instanceof Error) {\n // throw js;\n // }\n\n return js.views.kv(bucket);\n }\n\n // todo: move to a separate hook\n async function ObjectStore(bucket: string): Promise<ObjectStore> {\n const js = JetStream();\n\n return js.views.os(bucket);\n }\n\n return {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n // New retry-related properties\n retry,\n retryCount,\n isRetrying,\n };\n};\n","export function stringToReadableStream(str: string) {\n let currentOffset = 0;\n const encoder = new TextEncoder(); // this is used to convert a string into Uint8Array\n const uint8Array = encoder.encode(str);\n\n return new ReadableStream({\n pull(controller) {\n // this method is called when the stream's internal queue is not full\n const chunkSize = 1; // adjust as per your needs\n const start = currentOffset;\n const end =\n start + chunkSize <= uint8Array.length\n ? start + chunkSize\n : uint8Array.length;\n\n controller.enqueue(uint8Array.slice(start, end)); // put data into the stream's internal queue\n\n currentOffset = end;\n if (currentOffset == uint8Array.length) {\n controller.close(); // close the stream if we've put all the data into the stream's internal queue\n }\n },\n });\n}\n\nexport async function readStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n "],"mappings":"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","names":["import_react","import_react","KV","ObjectStore","KV","ObjectStore"]}
1
+ {"version":3,"sources":["../index.tsx","../context/nats-context.ts","../context/nats-provider.tsx","../hooks/use-nats.ts","../utils/nats.ts"],"sourcesContent":["// export * from \"./consts\";\nexport * from \"./context\";\nexport * from \"./hooks\";\n// export * from \"./jobs\";\n// export * from \"./models\";\nexport * from \"./types\";\nexport * from \"./utils\";\n// export * from \"./client-types\";\n","\"use client\";\n\nimport { KV, ObjectStore } from \"nats.ws\";\nimport { createContext, useContext } from \"react\";\nimport { NATSContextType } from \"../types/nats\";\n\nexport const initialNATS: NATSContextType = {\n nats: undefined,\n JetStream: () => null as any,\n KV: async (bucket: string) => Promise.resolve({} as KV),\n ObjectStore: async (bucket: string) => Promise.resolve({} as ObjectStore),\n natsConnected: false,\n natsError: null,\n request: <R, S>(topic: string, data: R) => Promise.resolve<S>({} as S),\n publish: <T>(topic: string, data: T) => Promise.resolve(),\n subscribe: <T>(topic: string, callback: (data: T | Error) => void) =>\n Promise.resolve(),\n parseJson: <T>(data: Uint8Array) => JSON.parse(data.toString()),\n parseString: (data: Uint8Array) => data.toString(),\n encodePayLoad: (data: unknown) =>\n new TextEncoder().encode(JSON.stringify(data)),\n loading: false,\n retry: () => {},\n retryCount: 0,\n isRetrying: false,\n};\n\nexport const NatsContext = createContext(initialNATS);\n\nexport const useNatsContext = () => useContext(NatsContext);\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useNATS } from \"../hooks\";\nimport { NATSContextType } from \"../types\";\nimport { NatsContext } from \"./nats-context\";\n\ntype NATSProviderProps = {\n children: React.ReactNode;\n apiEndpoint: string;\n};\n\nexport function NATSProvider(props: NATSProviderProps) {\n const { children, apiEndpoint } = props;\n\n const {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n } = useNATS(apiEndpoint);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n if (!ready) {\n return null;\n }\n\n const contextValue: NATSContextType = {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n };\n\n return (\n <NatsContext.Provider value={contextValue}>{children}</NatsContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n JSONCodec,\n JetStreamClient,\n KV,\n NatsConnection,\n ObjectStore,\n StringCodec,\n connect,\n headers,\n jwtAuthenticator,\n} from \"nats.ws\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst TIMEOUT = 900000000;\nconst AUTH_FETCH_TIMEOUT = 10000; // 10 seconds for auth fetch\nconst MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY = 1000; // 1 second\n\nexport const useNATS = (authApiUrl: string) => {\n const [nats, setNATS] = useState<NatsConnection | undefined>(undefined);\n const [natsConnected, setNATSConnected] = useState(false);\n const [natsError, setNATSError] = useState<any>(undefined);\n const [loading, setLoading] = useState(false);\n const [retryCount, setRetryCount] = useState(0);\n const [isRetrying, setIsRetrying] = useState(false);\n\n const connectionRef = useRef<NatsConnection | null>(null);\n const retryTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isConnectingRef = useRef(false);\n const isMountedRef = useRef(true);\n\n const connectNATS = useCallback(\n async (attempt: number = 0) => {\n // Prevent concurrent connection attempts\n if (isConnectingRef.current || connectionRef.current) {\n return;\n }\n\n isConnectingRef.current = true;\n setLoading(true);\n setNATSError(undefined);\n\n if (attempt > 0) {\n setIsRetrying(true);\n setRetryCount(attempt);\n }\n\n try {\n // Fetch auth with timeout\n const controller = new AbortController();\n const fetchTimeout = setTimeout(\n () => controller.abort(),\n AUTH_FETCH_TIMEOUT\n );\n\n const resp = await fetch(authApiUrl, { signal: controller.signal });\n clearTimeout(fetchTimeout);\n\n if (!resp.ok) {\n throw new Error(`Auth fetch failed: ${resp.status}`);\n }\n\n const { jwt, natsUrl } = await resp.json();\n\n const authenticator = jwtAuthenticator(jwt);\n\n const nc = await connect({\n servers: natsUrl,\n authenticator,\n timeout: TIMEOUT,\n reconnect: true,\n maxReconnectAttempts: -1, // Unlimited reconnect attempts\n reconnectTimeWait: 2000, // Wait 2 seconds between reconnect attempts\n });\n\n if (!isMountedRef.current) {\n await nc.close();\n return;\n }\n\n connectionRef.current = nc;\n setNATS(nc);\n setNATSConnected(true);\n setIsRetrying(false);\n setRetryCount(0);\n isConnectingRef.current = false;\n setLoading(false);\n\n console.log(\"NATS connected:\", natsUrl);\n\n // Monitor connection status\n (async () => {\n for await (const status of nc.status()) {\n if (!isMountedRef.current) break;\n\n if (status.type === \"disconnect\") {\n console.log(\"NATS disconnected, will auto-reconnect...\");\n setNATSConnected(false);\n } else if (status.type === \"reconnect\") {\n console.log(\"NATS reconnected\");\n setNATSConnected(true);\n } else if (status.type === \"error\") {\n console.error(\"NATS error:\", status.data);\n }\n }\n })();\n } catch (error: any) {\n isConnectingRef.current = false;\n setLoading(false);\n\n if (!isMountedRef.current) return;\n\n const errorMessage =\n error.name === \"AbortError\" ? \"Auth request timed out\" : error;\n console.error(\n `NATS connection failed (attempt ${attempt + 1}/${MAX_RETRIES}):`,\n errorMessage\n );\n\n if (attempt < MAX_RETRIES - 1) {\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s\n const delay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);\n console.log(`Retrying NATS connection in ${delay / 1000}s...`);\n\n retryTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) {\n connectNATS(attempt + 1);\n }\n }, delay);\n } else {\n // Max retries reached\n setNATSError(error);\n setIsRetrying(false);\n console.error(\"NATS connection failed after max retries\");\n }\n }\n },\n [authApiUrl]\n );\n\n // Manual retry function exposed to consumers\n const retry = useCallback(() => {\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n connectionRef.current = null;\n isConnectingRef.current = false;\n setNATSError(undefined);\n connectNATS(0);\n }, [connectNATS]);\n\n useEffect(() => {\n isMountedRef.current = true;\n connectNATS(0);\n\n return () => {\n isMountedRef.current = false;\n\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n\n if (connectionRef.current) {\n connectionRef.current.close();\n connectionRef.current = null;\n }\n };\n }, [connectNATS]);\n\n async function request<R, S>(\n topic: string,\n data: R,\n headersObj: object = {}\n ): Promise<S> {\n if (!nats || !natsConnected) throw new Error(\"nats not connected !!\");\n\n const h = headers();\n Object.entries(headersObj).forEach(([key, value]) => {\n if (!value) return;\n h.append(key, value.toString());\n });\n\n const reqJC = JSONCodec<R>();\n const resJC = JSONCodec<S>();\n\n try {\n const msg = await nats.request(topic, reqJC.encode(data), {\n timeout: TIMEOUT,\n headers: h,\n });\n return resJC.decode(msg.data);\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseJson<T>(data: Uint8Array): T {\n const jc = JSONCodec<T>();\n try {\n return jc.decode(data) as unknown as T;\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseString(data: Uint8Array): string {\n const sc = StringCodec();\n try {\n return sc.decode(data);\n } catch (error: any) {\n throw error;\n }\n }\n\n // publish data asynchronously\n async function publish(topic: string, data: any, headersObj: object = {}) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n // console.time(\"publish: \" + topic);\n const jc = JSONCodec();\n\n const h = headers();\n\n for (const [key, value] of Object.entries(headersObj)) {\n h.append(key, value);\n }\n\n nats.publish(topic, jc.encode(data), {\n headers: h,\n });\n // console.timeEnd(\"publish: \" + topic);\n }\n\n function encodePayLoad(data: unknown): Uint8Array {\n const jc = JSONCodec();\n return jc.encode(data);\n }\n\n async function subscribe<S>(\n topic: string,\n callbackFn: (data: S | Error) => void\n ) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n nats.subscribe(topic, {\n callback: (err, msg) => {\n const jc = JSONCodec<S>();\n const data = jc.decode(msg.data);\n\n if (err) {\n callbackFn(err);\n return;\n }\n\n callbackFn(data);\n },\n });\n }\n\n function JetStream(): JetStreamClient {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n\n return nats.jetstream();\n }\n\n // todo: move to a separate hook\n async function KV(bucket: string): Promise<KV> {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n const js = JetStream();\n\n // if (js instanceof Error) {\n // throw js;\n // }\n\n return js.views.kv(bucket);\n }\n\n // todo: move to a separate hook\n async function ObjectStore(bucket: string): Promise<ObjectStore> {\n const js = JetStream();\n\n return js.views.os(bucket);\n }\n\n return {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n // New retry-related properties\n retry,\n retryCount,\n isRetrying,\n };\n};\n","export function stringToReadableStream(str: string) {\n let currentOffset = 0;\n const encoder = new TextEncoder(); // this is used to convert a string into Uint8Array\n const uint8Array = encoder.encode(str);\n\n return new ReadableStream({\n pull(controller) {\n // this method is called when the stream's internal queue is not full\n const chunkSize = 1; // adjust as per your needs\n const start = currentOffset;\n const end =\n start + chunkSize <= uint8Array.length\n ? start + chunkSize\n : uint8Array.length;\n\n controller.enqueue(uint8Array.slice(start, end)); // put data into the stream's internal queue\n\n currentOffset = end;\n if (currentOffset == uint8Array.length) {\n controller.close(); // close the stream if we've put all the data into the stream's internal queue\n }\n },\n });\n}\n\nexport async function readStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n "],"mappings":"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","names":["import_react","import_react","KV","ObjectStore","KV","ObjectStore"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  // context/nats-context.ts
2
4
  import { createContext, useContext } from "react";
3
5
  var initialNATS = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../context/nats-context.ts","../context/nats-provider.tsx","../hooks/use-nats.ts","../utils/nats.ts"],"sourcesContent":["\"use client\";\n\nimport { KV, ObjectStore } from \"nats.ws\";\nimport { createContext, useContext } from \"react\";\nimport { NATSContextType } from \"../types/nats\";\n\nexport const initialNATS: NATSContextType = {\n nats: undefined,\n JetStream: () => null as any,\n KV: async (bucket: string) => Promise.resolve({} as KV),\n ObjectStore: async (bucket: string) => Promise.resolve({} as ObjectStore),\n natsConnected: false,\n natsError: null,\n request: <R, S>(topic: string, data: R) => Promise.resolve<S>({} as S),\n publish: <T>(topic: string, data: T) => Promise.resolve(),\n subscribe: <T>(topic: string, callback: (data: T | Error) => void) =>\n Promise.resolve(),\n parseJson: <T>(data: Uint8Array) => JSON.parse(data.toString()),\n parseString: (data: Uint8Array) => data.toString(),\n encodePayLoad: (data: unknown) =>\n new TextEncoder().encode(JSON.stringify(data)),\n loading: false,\n retry: () => {},\n retryCount: 0,\n isRetrying: false,\n};\n\nexport const NatsContext = createContext(initialNATS);\n\nexport const useNatsContext = () => useContext(NatsContext);\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useNATS } from \"../hooks\";\nimport { NATSContextType } from \"../types\";\nimport { NatsContext } from \"./nats-context\";\n\ntype NATSProviderProps = {\n children: React.ReactNode;\n apiEndpoint: string;\n};\n\nexport function NATSProvider(props: NATSProviderProps) {\n const { children, apiEndpoint } = props;\n\n const {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n } = useNATS(apiEndpoint);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n if (!ready) {\n return null;\n }\n\n const contextValue: NATSContextType = {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n };\n\n return (\n <NatsContext.Provider value={contextValue}>{children}</NatsContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n JSONCodec,\n JetStreamClient,\n KV,\n NatsConnection,\n ObjectStore,\n StringCodec,\n connect,\n headers,\n jwtAuthenticator,\n} from \"nats.ws\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst TIMEOUT = 900000000;\nconst AUTH_FETCH_TIMEOUT = 10000; // 10 seconds for auth fetch\nconst MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY = 1000; // 1 second\n\nexport const useNATS = (authApiUrl: string) => {\n const [nats, setNATS] = useState<NatsConnection | undefined>(undefined);\n const [natsConnected, setNATSConnected] = useState(false);\n const [natsError, setNATSError] = useState<any>(undefined);\n const [loading, setLoading] = useState(false);\n const [retryCount, setRetryCount] = useState(0);\n const [isRetrying, setIsRetrying] = useState(false);\n\n const connectionRef = useRef<NatsConnection | null>(null);\n const retryTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isConnectingRef = useRef(false);\n const isMountedRef = useRef(true);\n\n const connectNATS = useCallback(\n async (attempt: number = 0) => {\n // Prevent concurrent connection attempts\n if (isConnectingRef.current || connectionRef.current) {\n return;\n }\n\n isConnectingRef.current = true;\n setLoading(true);\n setNATSError(undefined);\n\n if (attempt > 0) {\n setIsRetrying(true);\n setRetryCount(attempt);\n }\n\n try {\n // Fetch auth with timeout\n const controller = new AbortController();\n const fetchTimeout = setTimeout(\n () => controller.abort(),\n AUTH_FETCH_TIMEOUT\n );\n\n const resp = await fetch(authApiUrl, { signal: controller.signal });\n clearTimeout(fetchTimeout);\n\n if (!resp.ok) {\n throw new Error(`Auth fetch failed: ${resp.status}`);\n }\n\n const { jwt, natsUrl } = await resp.json();\n\n const authenticator = jwtAuthenticator(jwt);\n\n const nc = await connect({\n servers: natsUrl,\n authenticator,\n timeout: TIMEOUT,\n reconnect: true,\n maxReconnectAttempts: -1, // Unlimited reconnect attempts\n reconnectTimeWait: 2000, // Wait 2 seconds between reconnect attempts\n });\n\n if (!isMountedRef.current) {\n await nc.close();\n return;\n }\n\n connectionRef.current = nc;\n setNATS(nc);\n setNATSConnected(true);\n setIsRetrying(false);\n setRetryCount(0);\n isConnectingRef.current = false;\n setLoading(false);\n\n console.log(\"NATS connected:\", natsUrl);\n\n // Monitor connection status\n (async () => {\n for await (const status of nc.status()) {\n if (!isMountedRef.current) break;\n\n if (status.type === \"disconnect\") {\n console.log(\"NATS disconnected, will auto-reconnect...\");\n setNATSConnected(false);\n } else if (status.type === \"reconnect\") {\n console.log(\"NATS reconnected\");\n setNATSConnected(true);\n } else if (status.type === \"error\") {\n console.error(\"NATS error:\", status.data);\n }\n }\n })();\n } catch (error: any) {\n isConnectingRef.current = false;\n setLoading(false);\n\n if (!isMountedRef.current) return;\n\n const errorMessage =\n error.name === \"AbortError\" ? \"Auth request timed out\" : error;\n console.error(\n `NATS connection failed (attempt ${attempt + 1}/${MAX_RETRIES}):`,\n errorMessage\n );\n\n if (attempt < MAX_RETRIES - 1) {\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s\n const delay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);\n console.log(`Retrying NATS connection in ${delay / 1000}s...`);\n\n retryTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) {\n connectNATS(attempt + 1);\n }\n }, delay);\n } else {\n // Max retries reached\n setNATSError(error);\n setIsRetrying(false);\n console.error(\"NATS connection failed after max retries\");\n }\n }\n },\n [authApiUrl]\n );\n\n // Manual retry function exposed to consumers\n const retry = useCallback(() => {\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n connectionRef.current = null;\n isConnectingRef.current = false;\n setNATSError(undefined);\n connectNATS(0);\n }, [connectNATS]);\n\n useEffect(() => {\n isMountedRef.current = true;\n connectNATS(0);\n\n return () => {\n isMountedRef.current = false;\n\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n\n if (connectionRef.current) {\n connectionRef.current.close();\n connectionRef.current = null;\n }\n };\n }, [connectNATS]);\n\n async function request<R, S>(\n topic: string,\n data: R,\n headersObj: object = {}\n ): Promise<S> {\n if (!nats || !natsConnected) throw new Error(\"nats not connected !!\");\n\n const h = headers();\n Object.entries(headersObj).forEach(([key, value]) => {\n if (!value) return;\n h.append(key, value.toString());\n });\n\n const reqJC = JSONCodec<R>();\n const resJC = JSONCodec<S>();\n\n try {\n const msg = await nats.request(topic, reqJC.encode(data), {\n timeout: TIMEOUT,\n headers: h,\n });\n return resJC.decode(msg.data);\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseJson<T>(data: Uint8Array): T {\n const jc = JSONCodec<T>();\n try {\n return jc.decode(data) as unknown as T;\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseString(data: Uint8Array): string {\n const sc = StringCodec();\n try {\n return sc.decode(data);\n } catch (error: any) {\n throw error;\n }\n }\n\n // publish data asynchronously\n async function publish(topic: string, data: any, headersObj: object = {}) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n // console.time(\"publish: \" + topic);\n const jc = JSONCodec();\n\n const h = headers();\n\n for (const [key, value] of Object.entries(headersObj)) {\n h.append(key, value);\n }\n\n nats.publish(topic, jc.encode(data), {\n headers: h,\n });\n // console.timeEnd(\"publish: \" + topic);\n }\n\n function encodePayLoad(data: unknown): Uint8Array {\n const jc = JSONCodec();\n return jc.encode(data);\n }\n\n async function subscribe<S>(\n topic: string,\n callbackFn: (data: S | Error) => void\n ) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n nats.subscribe(topic, {\n callback: (err, msg) => {\n const jc = JSONCodec<S>();\n const data = jc.decode(msg.data);\n\n if (err) {\n callbackFn(err);\n return;\n }\n\n callbackFn(data);\n },\n });\n }\n\n function JetStream(): JetStreamClient {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n\n return nats.jetstream();\n }\n\n // todo: move to a separate hook\n async function KV(bucket: string): Promise<KV> {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n const js = JetStream();\n\n // if (js instanceof Error) {\n // throw js;\n // }\n\n return js.views.kv(bucket);\n }\n\n // todo: move to a separate hook\n async function ObjectStore(bucket: string): Promise<ObjectStore> {\n const js = JetStream();\n\n return js.views.os(bucket);\n }\n\n return {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n // New retry-related properties\n retry,\n retryCount,\n isRetrying,\n };\n};\n","export function stringToReadableStream(str: string) {\n let currentOffset = 0;\n const encoder = new TextEncoder(); // this is used to convert a string into Uint8Array\n const uint8Array = encoder.encode(str);\n\n return new ReadableStream({\n pull(controller) {\n // this method is called when the stream's internal queue is not full\n const chunkSize = 1; // adjust as per your needs\n const start = currentOffset;\n const end =\n start + chunkSize <= uint8Array.length\n ? start + chunkSize\n : uint8Array.length;\n\n controller.enqueue(uint8Array.slice(start, end)); // put data into the stream's internal queue\n\n currentOffset = end;\n if (currentOffset == uint8Array.length) {\n controller.close(); // close the stream if we've put all the data into the stream's internal queue\n }\n },\n });\n}\n\nexport async function readStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n "],"mappings":";AAGA,SAAS,eAAe,kBAAkB;AAGnC,IAAM,cAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,MAAM;AAAA,EACjB,IAAI,OAAO,WAAmB,QAAQ,QAAQ,CAAC,CAAO;AAAA,EACtD,aAAa,OAAO,WAAmB,QAAQ,QAAQ,CAAC,CAAgB;AAAA,EACxE,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SAAS,CAAO,OAAe,SAAY,QAAQ,QAAW,CAAC,CAAM;AAAA,EACrE,SAAS,CAAI,OAAe,SAAY,QAAQ,QAAQ;AAAA,EACxD,WAAW,CAAI,OAAe,aAC5B,QAAQ,QAAQ;AAAA,EAClB,WAAW,CAAI,SAAqB,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,EAC9D,aAAa,CAAC,SAAqB,KAAK,SAAS;AAAA,EACjD,eAAe,CAAC,SACd,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,IAAI,CAAC;AAAA,EAC/C,SAAS;AAAA,EACT,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,IAAM,cAAc,cAAc,WAAW;AAE7C,IAAM,iBAAiB,MAAM,WAAW,WAAW;;;AC3B1D,SAAS,aAAAA,YAAW,YAAAC,iBAAgB;;;ACApC;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AAEzD,IAAM,UAAU;AAChB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AACpB,IAAM,sBAAsB;AAErB,IAAM,UAAU,CAAC,eAAuB;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAqC,MAAS;AACtE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAc,MAAS;AACzD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,CAAC;AAC9C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAElD,QAAM,gBAAgB,OAA8B,IAAI;AACxD,QAAM,kBAAkB,OAA8B,IAAI;AAC1D,QAAM,kBAAkB,OAAO,KAAK;AACpC,QAAM,eAAe,OAAO,IAAI;AAEhC,QAAM,cAAc;AAAA,IAClB,OAAO,UAAkB,MAAM;AAE7B,UAAI,gBAAgB,WAAW,cAAc,SAAS;AACpD;AAAA,MACF;AAEA,sBAAgB,UAAU;AAC1B,iBAAW,IAAI;AACf,mBAAa,MAAS;AAEtB,UAAI,UAAU,GAAG;AACf,sBAAc,IAAI;AAClB,sBAAc,OAAO;AAAA,MACvB;AAEA,UAAI;AAEF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,eAAe;AAAA,UACnB,MAAM,WAAW,MAAM;AAAA,UACvB;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,MAAM,YAAY,EAAE,QAAQ,WAAW,OAAO,CAAC;AAClE,qBAAa,YAAY;AAEzB,YAAI,CAAC,KAAK,IAAI;AACZ,gBAAM,IAAI,MAAM,sBAAsB,KAAK,MAAM,EAAE;AAAA,QACrD;AAEA,cAAM,EAAE,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK;AAEzC,cAAM,gBAAgB,iBAAiB,GAAG;AAE1C,cAAM,KAAK,MAAM,QAAQ;AAAA,UACvB,SAAS;AAAA,UACT;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,UACX,sBAAsB;AAAA;AAAA,UACtB,mBAAmB;AAAA;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,aAAa,SAAS;AACzB,gBAAM,GAAG,MAAM;AACf;AAAA,QACF;AAEA,sBAAc,UAAU;AACxB,gBAAQ,EAAE;AACV,yBAAiB,IAAI;AACrB,sBAAc,KAAK;AACnB,sBAAc,CAAC;AACf,wBAAgB,UAAU;AAC1B,mBAAW,KAAK;AAEhB,gBAAQ,IAAI,mBAAmB,OAAO;AAGtC,SAAC,YAAY;AACX,2BAAiB,UAAU,GAAG,OAAO,GAAG;AACtC,gBAAI,CAAC,aAAa,QAAS;AAE3B,gBAAI,OAAO,SAAS,cAAc;AAChC,sBAAQ,IAAI,2CAA2C;AACvD,+BAAiB,KAAK;AAAA,YACxB,WAAW,OAAO,SAAS,aAAa;AACtC,sBAAQ,IAAI,kBAAkB;AAC9B,+BAAiB,IAAI;AAAA,YACvB,WAAW,OAAO,SAAS,SAAS;AAClC,sBAAQ,MAAM,eAAe,OAAO,IAAI;AAAA,YAC1C;AAAA,UACF;AAAA,QACF,GAAG;AAAA,MACL,SAAS,OAAY;AACnB,wBAAgB,UAAU;AAC1B,mBAAW,KAAK;AAEhB,YAAI,CAAC,aAAa,QAAS;AAE3B,cAAM,eACJ,MAAM,SAAS,eAAe,2BAA2B;AAC3D,gBAAQ;AAAA,UACN,mCAAmC,UAAU,CAAC,IAAI,WAAW;AAAA,UAC7D;AAAA,QACF;AAEA,YAAI,UAAU,cAAc,GAAG;AAE7B,gBAAM,QAAQ,sBAAsB,KAAK,IAAI,GAAG,OAAO;AACvD,kBAAQ,IAAI,+BAA+B,QAAQ,GAAI,MAAM;AAE7D,0BAAgB,UAAU,WAAW,MAAM;AACzC,gBAAI,aAAa,SAAS;AACxB,0BAAY,UAAU,CAAC;AAAA,YACzB;AAAA,UACF,GAAG,KAAK;AAAA,QACV,OAAO;AAEL,uBAAa,KAAK;AAClB,wBAAc,KAAK;AACnB,kBAAQ,MAAM,0CAA0C;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAGA,QAAM,QAAQ,YAAY,MAAM;AAC9B,QAAI,gBAAgB,SAAS;AAC3B,mBAAa,gBAAgB,OAAO;AAAA,IACtC;AACA,kBAAc,UAAU;AACxB,oBAAgB,UAAU;AAC1B,iBAAa,MAAS;AACtB,gBAAY,CAAC;AAAA,EACf,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,iBAAa,UAAU;AACvB,gBAAY,CAAC;AAEb,WAAO,MAAM;AACX,mBAAa,UAAU;AAEvB,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AAAA,MACtC;AAEA,UAAI,cAAc,SAAS;AACzB,sBAAc,QAAQ,MAAM;AAC5B,sBAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,iBAAe,QACb,OACA,MACA,aAAqB,CAAC,GACV;AACZ,QAAI,CAAC,QAAQ,CAAC,cAAe,OAAM,IAAI,MAAM,uBAAuB;AAEpE,UAAM,IAAI,QAAQ;AAClB,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,UAAI,CAAC,MAAO;AACZ,QAAE,OAAO,KAAK,MAAM,SAAS,CAAC;AAAA,IAChC,CAAC;AAED,UAAM,QAAQ,UAAa;AAC3B,UAAM,QAAQ,UAAa;AAE3B,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,QAAQ,OAAO,MAAM,OAAO,IAAI,GAAG;AAAA,QACxD,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,aAAO,MAAM,OAAO,IAAI,IAAI;AAAA,IAC9B,SAAS,OAAY;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,WAAS,UAAa,MAAqB;AACzC,UAAM,KAAK,UAAa;AACxB,QAAI;AACF,aAAO,GAAG,OAAO,IAAI;AAAA,IACvB,SAAS,OAAY;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,WAAS,YAAY,MAA0B;AAC7C,UAAM,KAAK,YAAY;AACvB,QAAI;AACF,aAAO,GAAG,OAAO,IAAI;AAAA,IACvB,SAAS,OAAY;AACnB,YAAM;AAAA,IACR;AAAA,EACF;AAGA,iBAAe,QAAQ,OAAe,MAAW,aAAqB,CAAC,GAAG;AACxE,QAAI,CAAC,QAAQ,CAAC,eAAe;AAC3B,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACF;AAGA,UAAM,KAAK,UAAU;AAErB,UAAM,IAAI,QAAQ;AAElB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAE,OAAO,KAAK,KAAK;AAAA,IACrB;AAEA,SAAK,QAAQ,OAAO,GAAG,OAAO,IAAI,GAAG;AAAA,MACnC,SAAS;AAAA,IACX,CAAC;AAAA,EAEH;AAEA,WAAS,cAAc,MAA2B;AAChD,UAAM,KAAK,UAAU;AACrB,WAAO,GAAG,OAAO,IAAI;AAAA,EACvB;AAEA,iBAAe,UACb,OACA,YACA;AACA,QAAI,CAAC,QAAQ,CAAC,eAAe;AAC3B,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACF;AAEA,SAAK,UAAU,OAAO;AAAA,MACpB,UAAU,CAAC,KAAK,QAAQ;AACtB,cAAM,KAAK,UAAa;AACxB,cAAM,OAAO,GAAG,OAAO,IAAI,IAAI;AAE/B,YAAI,KAAK;AACP,qBAAW,GAAG;AACd;AAAA,QACF;AAEA,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,YAA6B;AACpC,QAAI,CAAC,QAAQ,CAAC,eAAe;AAC3B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,WAAO,KAAK,UAAU;AAAA,EACxB;AAGA,iBAAeC,IAAG,QAA6B;AAC7C,QAAI,CAAC,QAAQ,CAAC,eAAe;AAC3B,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,UAAM,KAAK,UAAU;AAMrB,WAAO,GAAG,MAAM,GAAG,MAAM;AAAA,EAC3B;AAGA,iBAAeC,aAAY,QAAsC;AAC/D,UAAM,KAAK,UAAU;AAErB,WAAO,GAAG,MAAM,GAAG,MAAM;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAAD;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD5PI;AAnDG,SAAS,aAAa,OAA0B;AACrD,QAAM,EAAE,UAAU,YAAY,IAAI;AAElC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,IAAAC;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ,WAAW;AACvB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAS,KAAK;AAExC,EAAAC,WAAU,MAAM;AACd,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,eAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA,IAAAH;AAAA,IACA,aAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,oBAAC,YAAY,UAAZ,EAAqB,OAAO,cAAe,UAAS;AAEzD;;;AEjEO,SAAS,uBAAuB,KAAa;AAClD,MAAI,gBAAgB;AACpB,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,aAAa,QAAQ,OAAO,GAAG;AAErC,SAAO,IAAI,eAAe;AAAA,IACxB,KAAK,YAAY;AAEf,YAAM,YAAY;AAClB,YAAM,QAAQ;AACd,YAAM,MACJ,QAAQ,aAAa,WAAW,SAC5B,QAAQ,YACR,WAAW;AAEjB,iBAAW,QAAQ,WAAW,MAAM,OAAO,GAAG,CAAC;AAE/C,sBAAgB;AAChB,UAAI,iBAAiB,WAAW,QAAQ;AACtC,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,WACpB,QACqB;AACrB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,SAAuB,CAAC;AAC9B,MAAI,cAAc;AAElB,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AACV,WAAO,KAAK,KAAK;AACjB,mBAAe,MAAM;AAAA,EACvB;AAEA,QAAM,SAAS,IAAI,WAAW,WAAW;AACzC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,WAAO,IAAI,OAAO,MAAM;AACxB,cAAU,MAAM;AAAA,EAClB;AAEA,SAAO;AACT;","names":["useEffect","useState","KV","ObjectStore","KV","ObjectStore","useState","useEffect"]}
1
+ {"version":3,"sources":["../context/nats-context.ts","../context/nats-provider.tsx","../hooks/use-nats.ts","../utils/nats.ts"],"sourcesContent":["\"use client\";\n\nimport { KV, ObjectStore } from \"nats.ws\";\nimport { createContext, useContext } from \"react\";\nimport { NATSContextType } from \"../types/nats\";\n\nexport const initialNATS: NATSContextType = {\n nats: undefined,\n JetStream: () => null as any,\n KV: async (bucket: string) => Promise.resolve({} as KV),\n ObjectStore: async (bucket: string) => Promise.resolve({} as ObjectStore),\n natsConnected: false,\n natsError: null,\n request: <R, S>(topic: string, data: R) => Promise.resolve<S>({} as S),\n publish: <T>(topic: string, data: T) => Promise.resolve(),\n subscribe: <T>(topic: string, callback: (data: T | Error) => void) =>\n Promise.resolve(),\n parseJson: <T>(data: Uint8Array) => JSON.parse(data.toString()),\n parseString: (data: Uint8Array) => data.toString(),\n encodePayLoad: (data: unknown) =>\n new TextEncoder().encode(JSON.stringify(data)),\n loading: false,\n retry: () => {},\n retryCount: 0,\n isRetrying: false,\n};\n\nexport const NatsContext = createContext(initialNATS);\n\nexport const useNatsContext = () => useContext(NatsContext);\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useNATS } from \"../hooks\";\nimport { NATSContextType } from \"../types\";\nimport { NatsContext } from \"./nats-context\";\n\ntype NATSProviderProps = {\n children: React.ReactNode;\n apiEndpoint: string;\n};\n\nexport function NATSProvider(props: NATSProviderProps) {\n const { children, apiEndpoint } = props;\n\n const {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n } = useNATS(apiEndpoint);\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n if (!ready) {\n return null;\n }\n\n const contextValue: NATSContextType = {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n retry,\n retryCount,\n isRetrying,\n };\n\n return (\n <NatsContext.Provider value={contextValue}>{children}</NatsContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n JSONCodec,\n JetStreamClient,\n KV,\n NatsConnection,\n ObjectStore,\n StringCodec,\n connect,\n headers,\n jwtAuthenticator,\n} from \"nats.ws\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nconst TIMEOUT = 900000000;\nconst AUTH_FETCH_TIMEOUT = 10000; // 10 seconds for auth fetch\nconst MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY = 1000; // 1 second\n\nexport const useNATS = (authApiUrl: string) => {\n const [nats, setNATS] = useState<NatsConnection | undefined>(undefined);\n const [natsConnected, setNATSConnected] = useState(false);\n const [natsError, setNATSError] = useState<any>(undefined);\n const [loading, setLoading] = useState(false);\n const [retryCount, setRetryCount] = useState(0);\n const [isRetrying, setIsRetrying] = useState(false);\n\n const connectionRef = useRef<NatsConnection | null>(null);\n const retryTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isConnectingRef = useRef(false);\n const isMountedRef = useRef(true);\n\n const connectNATS = useCallback(\n async (attempt: number = 0) => {\n // Prevent concurrent connection attempts\n if (isConnectingRef.current || connectionRef.current) {\n return;\n }\n\n isConnectingRef.current = true;\n setLoading(true);\n setNATSError(undefined);\n\n if (attempt > 0) {\n setIsRetrying(true);\n setRetryCount(attempt);\n }\n\n try {\n // Fetch auth with timeout\n const controller = new AbortController();\n const fetchTimeout = setTimeout(\n () => controller.abort(),\n AUTH_FETCH_TIMEOUT\n );\n\n const resp = await fetch(authApiUrl, { signal: controller.signal });\n clearTimeout(fetchTimeout);\n\n if (!resp.ok) {\n throw new Error(`Auth fetch failed: ${resp.status}`);\n }\n\n const { jwt, natsUrl } = await resp.json();\n\n const authenticator = jwtAuthenticator(jwt);\n\n const nc = await connect({\n servers: natsUrl,\n authenticator,\n timeout: TIMEOUT,\n reconnect: true,\n maxReconnectAttempts: -1, // Unlimited reconnect attempts\n reconnectTimeWait: 2000, // Wait 2 seconds between reconnect attempts\n });\n\n if (!isMountedRef.current) {\n await nc.close();\n return;\n }\n\n connectionRef.current = nc;\n setNATS(nc);\n setNATSConnected(true);\n setIsRetrying(false);\n setRetryCount(0);\n isConnectingRef.current = false;\n setLoading(false);\n\n console.log(\"NATS connected:\", natsUrl);\n\n // Monitor connection status\n (async () => {\n for await (const status of nc.status()) {\n if (!isMountedRef.current) break;\n\n if (status.type === \"disconnect\") {\n console.log(\"NATS disconnected, will auto-reconnect...\");\n setNATSConnected(false);\n } else if (status.type === \"reconnect\") {\n console.log(\"NATS reconnected\");\n setNATSConnected(true);\n } else if (status.type === \"error\") {\n console.error(\"NATS error:\", status.data);\n }\n }\n })();\n } catch (error: any) {\n isConnectingRef.current = false;\n setLoading(false);\n\n if (!isMountedRef.current) return;\n\n const errorMessage =\n error.name === \"AbortError\" ? \"Auth request timed out\" : error;\n console.error(\n `NATS connection failed (attempt ${attempt + 1}/${MAX_RETRIES}):`,\n errorMessage\n );\n\n if (attempt < MAX_RETRIES - 1) {\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s\n const delay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);\n console.log(`Retrying NATS connection in ${delay / 1000}s...`);\n\n retryTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) {\n connectNATS(attempt + 1);\n }\n }, delay);\n } else {\n // Max retries reached\n setNATSError(error);\n setIsRetrying(false);\n console.error(\"NATS connection failed after max retries\");\n }\n }\n },\n [authApiUrl]\n );\n\n // Manual retry function exposed to consumers\n const retry = useCallback(() => {\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n connectionRef.current = null;\n isConnectingRef.current = false;\n setNATSError(undefined);\n connectNATS(0);\n }, [connectNATS]);\n\n useEffect(() => {\n isMountedRef.current = true;\n connectNATS(0);\n\n return () => {\n isMountedRef.current = false;\n\n if (retryTimeoutRef.current) {\n clearTimeout(retryTimeoutRef.current);\n }\n\n if (connectionRef.current) {\n connectionRef.current.close();\n connectionRef.current = null;\n }\n };\n }, [connectNATS]);\n\n async function request<R, S>(\n topic: string,\n data: R,\n headersObj: object = {}\n ): Promise<S> {\n if (!nats || !natsConnected) throw new Error(\"nats not connected !!\");\n\n const h = headers();\n Object.entries(headersObj).forEach(([key, value]) => {\n if (!value) return;\n h.append(key, value.toString());\n });\n\n const reqJC = JSONCodec<R>();\n const resJC = JSONCodec<S>();\n\n try {\n const msg = await nats.request(topic, reqJC.encode(data), {\n timeout: TIMEOUT,\n headers: h,\n });\n return resJC.decode(msg.data);\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseJson<T>(data: Uint8Array): T {\n const jc = JSONCodec<T>();\n try {\n return jc.decode(data) as unknown as T;\n } catch (error: any) {\n throw error;\n }\n }\n\n function parseString(data: Uint8Array): string {\n const sc = StringCodec();\n try {\n return sc.decode(data);\n } catch (error: any) {\n throw error;\n }\n }\n\n // publish data asynchronously\n async function publish(topic: string, data: any, headersObj: object = {}) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n // console.time(\"publish: \" + topic);\n const jc = JSONCodec();\n\n const h = headers();\n\n for (const [key, value] of Object.entries(headersObj)) {\n h.append(key, value);\n }\n\n nats.publish(topic, jc.encode(data), {\n headers: h,\n });\n // console.timeEnd(\"publish: \" + topic);\n }\n\n function encodePayLoad(data: unknown): Uint8Array {\n const jc = JSONCodec();\n return jc.encode(data);\n }\n\n async function subscribe<S>(\n topic: string,\n callbackFn: (data: S | Error) => void\n ) {\n if (!nats || !natsConnected) {\n console.log(\"nats not connected !!\");\n return;\n }\n\n nats.subscribe(topic, {\n callback: (err, msg) => {\n const jc = JSONCodec<S>();\n const data = jc.decode(msg.data);\n\n if (err) {\n callbackFn(err);\n return;\n }\n\n callbackFn(data);\n },\n });\n }\n\n function JetStream(): JetStreamClient {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n\n return nats.jetstream();\n }\n\n // todo: move to a separate hook\n async function KV(bucket: string): Promise<KV> {\n if (!nats || !natsConnected) {\n throw new Error(\"nats not connected !!\");\n }\n const js = JetStream();\n\n // if (js instanceof Error) {\n // throw js;\n // }\n\n return js.views.kv(bucket);\n }\n\n // todo: move to a separate hook\n async function ObjectStore(bucket: string): Promise<ObjectStore> {\n const js = JetStream();\n\n return js.views.os(bucket);\n }\n\n return {\n nats,\n JetStream,\n KV,\n ObjectStore,\n natsConnected,\n natsError,\n request,\n publish,\n subscribe,\n parseJson,\n parseString,\n encodePayLoad,\n loading,\n // New retry-related properties\n retry,\n retryCount,\n isRetrying,\n };\n};\n","export function stringToReadableStream(str: string) {\n let currentOffset = 0;\n const encoder = new TextEncoder(); // this is used to convert a string into Uint8Array\n const uint8Array = encoder.encode(str);\n\n return new ReadableStream({\n pull(controller) {\n // this method is called when the stream's internal queue is not full\n const chunkSize = 1; // adjust as per your needs\n const start = currentOffset;\n const end =\n start + chunkSize <= uint8Array.length\n ? start + chunkSize\n : uint8Array.length;\n\n controller.enqueue(uint8Array.slice(start, end)); // put data into the stream's internal queue\n\n currentOffset = end;\n if (currentOffset == uint8Array.length) {\n controller.close(); // close the stream if we've put all the data into the stream's internal queue\n }\n },\n });\n}\n\nexport async function readStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n "],"mappings":"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","names":["useEffect","useState","KV","ObjectStore","KV","ObjectStore","useState","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elqnt/nats",
3
- "version": "1.0.0",
3
+ "version": "1.0.5",
4
4
  "description": "NATS messaging integration for Eloquent platform",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",