@flamingo-stack/openframe-frontend-core 0.0.195 → 0.0.196

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.
Files changed (46) hide show
  1. package/dist/{chunk-PJ5KFD2V.js → chunk-4ML3NA2L.js} +75 -1
  2. package/dist/{chunk-PJ5KFD2V.js.map → chunk-4ML3NA2L.js.map} +1 -1
  3. package/dist/{chunk-U6AJSRJP.js → chunk-BXPH5SOL.js} +707 -354
  4. package/dist/chunk-BXPH5SOL.js.map +1 -0
  5. package/dist/{chunk-IQM3G2I6.cjs → chunk-E6AWU7EI.cjs} +753 -400
  6. package/dist/chunk-E6AWU7EI.cjs.map +1 -0
  7. package/dist/{chunk-CVMSC7M4.cjs → chunk-OII2IERE.cjs} +77 -3
  8. package/dist/chunk-OII2IERE.cjs.map +1 -0
  9. package/dist/components/chat/hooks/index.d.ts +1 -0
  10. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  11. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts +15 -0
  12. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts.map +1 -0
  13. package/dist/components/chat/types/api.types.d.ts +43 -0
  14. package/dist/components/chat/types/api.types.d.ts.map +1 -1
  15. package/dist/components/chat/types/network.types.d.ts +4 -0
  16. package/dist/components/chat/types/network.types.d.ts.map +1 -1
  17. package/dist/components/features/index.cjs +3 -3
  18. package/dist/components/features/index.js +2 -2
  19. package/dist/components/index.cjs +5 -3
  20. package/dist/components/index.cjs.map +1 -1
  21. package/dist/components/index.js +4 -2
  22. package/dist/components/navigation/index.cjs +3 -3
  23. package/dist/components/navigation/index.js +2 -2
  24. package/dist/components/ui/index.cjs +5 -3
  25. package/dist/components/ui/index.cjs.map +1 -1
  26. package/dist/components/ui/index.js +4 -2
  27. package/dist/hooks/index.cjs +2 -2
  28. package/dist/hooks/index.js +1 -1
  29. package/dist/index.cjs +5 -3
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +4 -2
  32. package/dist/nats/index.cjs +73 -0
  33. package/dist/nats/index.cjs.map +1 -1
  34. package/dist/nats/index.js +73 -0
  35. package/dist/nats/index.js.map +1 -1
  36. package/dist/nats/nats.d.ts +22 -1
  37. package/dist/nats/nats.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/src/components/chat/hooks/index.ts +1 -0
  40. package/src/components/chat/hooks/use-jetstream-dialog-subscription.ts +474 -0
  41. package/src/components/chat/types/api.types.ts +45 -0
  42. package/src/components/chat/types/network.types.ts +4 -0
  43. package/src/nats/nats.ts +117 -0
  44. package/dist/chunk-CVMSC7M4.cjs.map +0 -1
  45. package/dist/chunk-IQM3G2I6.cjs.map +0 -1
  46. package/dist/chunk-U6AJSRJP.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n ConnectionOptions,\n MsgHdrs as NatsHeaders,\n Msg,\n NatsConnection,\n Subscription,\n} from 'nats.ws'\n\nexport interface NatsClientOptions {\n /**\n * NATS server URL(s), for example:\n * - \"wss://nats.example.com:443\"\n * - [\"wss://nats-1.example.com:443\", \"wss://nats-2.example.com:443\"]\n */\n servers: string | string[]\n\n /**\n * Connection name (shows up in NATS monitoring).\n */\n name?: string\n\n /**\n * Auth options (pick one: token or user/pass).\n */\n token?: string\n user?: string\n pass?: string\n\n /**\n * Reconnect behavior.\n */\n reconnect?: boolean\n maxReconnectAttempts?: number\n reconnectTimeWaitMs?: number\n\n /**\n * Exponential backoff for reconnect delays.\n * When set, uses `reconnectDelayHandler` from nats.ws under the hood,\n * overriding `reconnectTimeWaitMs`.\n */\n exponentialBackoff?: {\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Maximum delay cap in ms (default: 30000) */\n maxDelayMs?: number\n /** Multiplier per attempt (default: 2) */\n multiplier?: number\n /** Add random jitter 0-50% of delay to prevent thundering herd (default: true) */\n jitter?: boolean\n }\n\n /**\n * Ping behavior (keep-alive).\n */\n pingIntervalMs?: number\n maxPingOut?: number\n\n /**\n * Optional inbox prefix (useful if you want to isolate request/reply inboxes).\n */\n inboxPrefix?: string\n\n /**\n * Connection timeout in milliseconds (maps to `nats.ws` connect option `timeout`).\n * If you see `NatsError: TIMEOUT` during connect, increase this.\n */\n connectTimeoutMs?: number\n}\n\nexport interface NatsSubscribeOptions {\n /**\n * Queue group for load-balancing messages across subscribers.\n */\n queue?: string\n\n /**\n * Auto-unsubscribe after receiving this many messages.\n */\n max?: number\n\n /**\n * Abort signal to stop message iteration and unsubscribe.\n */\n signal?: AbortSignal\n}\n\nexport type NatsHeadersInit = Record<string, string> | NatsHeaders | undefined\n\nexport interface NatsPublishOptions {\n headers?: NatsHeadersInit\n}\n\nexport interface NatsRequestOptions {\n timeoutMs?: number\n headers?: NatsHeadersInit\n}\n\nexport interface NatsSubscriptionHandle {\n readonly subscription: Subscription\n unsubscribe(): void\n}\n\nexport type NatsStatus =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'closed'\n | 'error'\n\nexport interface NatsStatusEvent {\n status: NatsStatus\n data?: unknown\n}\n\nexport interface NatsClient {\n connect(): Promise<void>\n close(): Promise<void>\n\n isConnected(): boolean\n\n publishBytes(subject: string, payload: Uint8Array, options?: NatsPublishOptions): void\n publishString(subject: string, payload: string, options?: NatsPublishOptions): void\n publishJson<T>(subject: string, payload: T, options?: NatsPublishOptions): void\n\n requestBytes(subject: string, payload: Uint8Array, options?: NatsRequestOptions): Promise<Msg>\n requestString(subject: string, payload: string, options?: NatsRequestOptions): Promise<string>\n requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n options?: NatsRequestOptions,\n ): Promise<TResponse>\n\n subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n\n onStatus(listener: (event: NatsStatusEvent) => void): () => void\n}\n\nfunction assertClientSide(): void {\n // This wrapper is meant for browser/Tauri usage via WebSockets.\n // Keep it safe to import from Next.js server bundles by throwing only when used.\n if (typeof window === 'undefined') {\n throw new Error('NATS client can only connect from the browser/runtime with WebSocket support (window is undefined).')\n }\n}\n\nasync function importNats(): Promise<typeof import('nats.ws')> {\n // Browser/Tauri only: always use the websocket client (no Node-only deps).\n return await import('nats.ws')\n}\n\nfunction toNatsHeaders(nats: typeof import('nats.ws'), init: NatsHeadersInit): NatsHeaders | undefined {\n if (!init) return undefined\n if (typeof (init as NatsHeaders).get === 'function') return init as NatsHeaders\n\n const h = nats.headers()\n for (const [k, v] of Object.entries(init as Record<string, string>)) {\n if (v !== undefined && v !== null) h.set(k, String(v))\n }\n return h\n}\n\n/** Returns a cryptographically random float in [0, 1). */\nfunction cryptoRandom(): number {\n const buf = new Uint32Array(1)\n crypto.getRandomValues(buf)\n return buf[0] / (0xffffffff + 1)\n}\n\ninterface ExponentialBackoffHandle {\n handler: () => number\n reset: () => void\n}\n\nfunction createExponentialBackoffHandler(opts: NonNullable<NatsClientOptions['exponentialBackoff']>): ExponentialBackoffHandle {\n const initialDelay = opts.initialDelayMs ?? 1000\n const maxDelay = opts.maxDelayMs ?? 30_000\n const multiplier = opts.multiplier ?? 2\n const jitter = opts.jitter ?? true\n\n let attempt = 0\n\n return {\n handler: (): number => {\n const delay = Math.min(initialDelay * multiplier ** attempt, maxDelay)\n attempt++\n return jitter ? delay * (0.5 + cryptoRandom() * 0.5) : delay\n },\n reset: () => {\n attempt = 0\n },\n }\n}\n\nfunction mapOptionsToConnectionOptions(\n opts: NatsClientOptions,\n backoff?: ExponentialBackoffHandle,\n): ConnectionOptions {\n return {\n servers: opts.servers,\n name: opts.name,\n token: opts.token,\n user: opts.user,\n pass: opts.pass,\n timeout: opts.connectTimeoutMs ?? 15000,\n reconnect: opts.reconnect ?? true,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n reconnectTimeWait: opts.reconnectTimeWaitMs,\n reconnectDelayHandler: backoff?.handler,\n pingInterval: opts.pingIntervalMs,\n maxPingOut: opts.maxPingOut,\n inboxPrefix: opts.inboxPrefix,\n }\n}\n\nfunction mapNatsTypeToStatus(type: unknown): NatsStatus | null {\n const t = String(type).toLowerCase()\n if (t.includes('disconnect')) return 'disconnected'\n if (t === 'reconnecting') return 'reconnecting'\n if (t === 'reconnect' || t.includes('connect')) return 'connected'\n if (t.includes('error')) return 'error'\n if (t.includes('close')) return 'closed'\n return null\n}\n\nexport function createNatsClient(options: NatsClientOptions): NatsClient {\n let nc: NatsConnection | null = null\n let statusLoopAbort: AbortController | null = null\n let connectInFlight: Promise<void> | null = null\n\n const backoff = options.exponentialBackoff\n ? createExponentialBackoffHandler(options.exponentialBackoff)\n : undefined\n\n const statusListeners = new Set<(event: NatsStatusEvent) => void>()\n\n function emitStatus(event: NatsStatusEvent) {\n for (const listener of statusListeners) {\n try {\n listener(event)\n } catch {\n // ignore listener failures\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (nc && !nc.isClosed()) return\n if (connectInFlight) return connectInFlight\n assertClientSide()\n\n connectInFlight = (async () => {\n try {\n emitStatus({ status: 'connecting' })\n\n const nats = await importNats()\n const conn = await nats.connect(mapOptionsToConnectionOptions(options, backoff))\n nc = conn\n\n emitStatus({ status: 'connected' })\n\n statusLoopAbort = new AbortController()\n const signal = statusLoopAbort.signal\n\n ;(async () => {\n try {\n for await (const s of conn.status()) {\n if (signal.aborted) return\n const mapped = mapNatsTypeToStatus((s as any)?.type)\n if (mapped) {\n if (mapped === 'connected' && backoff) {\n backoff.reset()\n }\n emitStatus({ status: mapped, data: (s as any)?.data })\n if (mapped === 'closed') {\n nc = null\n }\n }\n }\n } catch (e) {\n if (!signal.aborted) {\n emitStatus({ status: 'error', data: e })\n nc = null\n }\n }\n })().catch(() => {\n // ignore\n })\n } finally {\n connectInFlight = null\n }\n })()\n\n return connectInFlight\n }\n\n async function close(): Promise<void> {\n const conn = nc\n nc = null\n\n if (statusLoopAbort) {\n try {\n statusLoopAbort.abort()\n } catch {\n // ignore\n }\n statusLoopAbort = null\n }\n\n if (!conn) return\n try {\n await conn.drain()\n } finally {\n try {\n await conn.close()\n } finally {\n emitStatus({ status: 'closed' })\n }\n }\n }\n\n function requireConnection(): NatsConnection {\n if (!nc) throw new Error('NATS is not connected. Call client.connect() first.')\n return nc\n }\n\n function isConnected(): boolean {\n return Boolean(nc) && !nc!.isClosed()\n }\n\n function publishBytes(subject: string, payload: Uint8Array, opts?: NatsPublishOptions): void {\n const conn = requireConnection()\n ;(async () => {\n const nats = await importNats()\n conn.publish(subject, payload, { headers: toNatsHeaders(nats, opts?.headers) })\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishString(subject: string, payload: string, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n publishBytes(subject, sc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishJson<T>(subject: string, payload: T, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n publishBytes(subject, jc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n async function requestBytes(subject: string, payload: Uint8Array, opts?: NatsRequestOptions): Promise<Msg> {\n const conn = requireConnection()\n const nats = await importNats()\n const msg = await conn.request(subject, payload, {\n timeout: opts?.timeoutMs ?? 2000,\n headers: toNatsHeaders(nats, opts?.headers),\n })\n return msg\n }\n\n async function requestString(subject: string, payload: string, opts?: NatsRequestOptions): Promise<string> {\n const nats = await importNats()\n const sc = nats.StringCodec()\n const msg = await requestBytes(subject, sc.encode(payload), opts)\n return sc.decode(msg.data)\n }\n\n async function requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n opts?: NatsRequestOptions,\n ): Promise<TResponse> {\n const nats = await importNats()\n const reqCodec = nats.JSONCodec<TRequest>()\n const resCodec = nats.JSONCodec<TResponse>()\n const msg = await requestBytes(subject, reqCodec.encode(payload), opts)\n return resCodec.decode(msg.data)\n }\n\n function subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n const conn = requireConnection()\n const sub = conn.subscribe(subject, { queue: opts?.queue })\n if (typeof opts?.max === 'number') sub.unsubscribe(opts.max)\n\n const abortController = new AbortController()\n const signal = opts?.signal ?? abortController.signal\n\n ;(async () => {\n try {\n for await (const msg of sub) {\n if (signal.aborted) break\n await onMessage(msg)\n }\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n } finally {\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n subscription: sub,\n unsubscribe() {\n try {\n abortController.abort()\n } catch {\n // ignore\n }\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n },\n }\n }\n\n function subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n await onMessage(sc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n await onMessage(jc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function onStatus(listener: (event: NatsStatusEvent) => void): () => void {\n statusListeners.add(listener)\n return () => statusListeners.delete(listener)\n }\n\n return {\n connect,\n close,\n isConnected,\n publishBytes,\n publishString,\n publishJson,\n requestBytes,\n requestString,\n requestJson,\n subscribeBytes,\n subscribeString,\n subscribeJson,\n onStatus,\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n ConnectionOptions,\n Consumer,\n ConsumerMessages,\n JsMsg,\n MsgHdrs as NatsHeaders,\n Msg,\n NatsConnection,\n Subscription,\n} from 'nats.ws'\n\nexport type JetStreamDeliverPolicy = 'new' | 'byStartSequence'\n\nexport interface JetStreamOrderedSubscribeOptions {\n streamName: string\n filterSubject: string\n deliverPolicy: JetStreamDeliverPolicy\n /** Required when deliverPolicy === 'byStartSequence'. */\n optStartSeq?: number\n /** Auto-cleanup the ephemeral consumer after this idle time. Default: 5 minutes. */\n inactiveThresholdMs?: number\n /** AbortSignal to tear down the consumer. */\n signal?: AbortSignal\n}\n\nexport interface JetStreamSubscriptionHandle {\n unsubscribe(): void\n}\n\nexport interface NatsClientOptions {\n /**\n * NATS server URL(s), for example:\n * - \"wss://nats.example.com:443\"\n * - [\"wss://nats-1.example.com:443\", \"wss://nats-2.example.com:443\"]\n */\n servers: string | string[]\n\n /**\n * Connection name (shows up in NATS monitoring).\n */\n name?: string\n\n /**\n * Auth options (pick one: token or user/pass).\n */\n token?: string\n user?: string\n pass?: string\n\n /**\n * Reconnect behavior.\n */\n reconnect?: boolean\n maxReconnectAttempts?: number\n reconnectTimeWaitMs?: number\n\n /**\n * Exponential backoff for reconnect delays.\n * When set, uses `reconnectDelayHandler` from nats.ws under the hood,\n * overriding `reconnectTimeWaitMs`.\n */\n exponentialBackoff?: {\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Maximum delay cap in ms (default: 30000) */\n maxDelayMs?: number\n /** Multiplier per attempt (default: 2) */\n multiplier?: number\n /** Add random jitter 0-50% of delay to prevent thundering herd (default: true) */\n jitter?: boolean\n }\n\n /**\n * Ping behavior (keep-alive).\n */\n pingIntervalMs?: number\n maxPingOut?: number\n\n /**\n * Optional inbox prefix (useful if you want to isolate request/reply inboxes).\n */\n inboxPrefix?: string\n\n /**\n * Connection timeout in milliseconds (maps to `nats.ws` connect option `timeout`).\n * If you see `NatsError: TIMEOUT` during connect, increase this.\n */\n connectTimeoutMs?: number\n}\n\nexport interface NatsSubscribeOptions {\n /**\n * Queue group for load-balancing messages across subscribers.\n */\n queue?: string\n\n /**\n * Auto-unsubscribe after receiving this many messages.\n */\n max?: number\n\n /**\n * Abort signal to stop message iteration and unsubscribe.\n */\n signal?: AbortSignal\n}\n\nexport type NatsHeadersInit = Record<string, string> | NatsHeaders | undefined\n\nexport interface NatsPublishOptions {\n headers?: NatsHeadersInit\n}\n\nexport interface NatsRequestOptions {\n timeoutMs?: number\n headers?: NatsHeadersInit\n}\n\nexport interface NatsSubscriptionHandle {\n readonly subscription: Subscription\n unsubscribe(): void\n}\n\nexport type NatsStatus =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'closed'\n | 'error'\n\nexport interface NatsStatusEvent {\n status: NatsStatus\n data?: unknown\n}\n\nexport interface NatsClient {\n connect(): Promise<void>\n close(): Promise<void>\n\n isConnected(): boolean\n\n publishBytes(subject: string, payload: Uint8Array, options?: NatsPublishOptions): void\n publishString(subject: string, payload: string, options?: NatsPublishOptions): void\n publishJson<T>(subject: string, payload: T, options?: NatsPublishOptions): void\n\n requestBytes(subject: string, payload: Uint8Array, options?: NatsRequestOptions): Promise<Msg>\n requestString(subject: string, payload: string, options?: NatsRequestOptions): Promise<string>\n requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n options?: NatsRequestOptions,\n ): Promise<TResponse>\n\n subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n\n /**\n * Subscribe to a JetStream subject via an ephemeral OrderedConsumer (no acks).\n * Use `optStartSeq` with `deliverPolicy: 'byStartSequence'` to resume from a known offset,\n * or `deliverPolicy: 'new'` to live-tail.\n */\n subscribeJetStreamOrdered(\n onMessage: (msg: JsMsg) => void | Promise<void>,\n options: JetStreamOrderedSubscribeOptions,\n ): Promise<JetStreamSubscriptionHandle>\n\n onStatus(listener: (event: NatsStatusEvent) => void): () => void\n}\n\nfunction assertClientSide(): void {\n // This wrapper is meant for browser/Tauri usage via WebSockets.\n // Keep it safe to import from Next.js server bundles by throwing only when used.\n if (typeof window === 'undefined') {\n throw new Error('NATS client can only connect from the browser/runtime with WebSocket support (window is undefined).')\n }\n}\n\nasync function importNats(): Promise<typeof import('nats.ws')> {\n // Browser/Tauri only: always use the websocket client (no Node-only deps).\n return await import('nats.ws')\n}\n\nfunction toNatsHeaders(nats: typeof import('nats.ws'), init: NatsHeadersInit): NatsHeaders | undefined {\n if (!init) return undefined\n if (typeof (init as NatsHeaders).get === 'function') return init as NatsHeaders\n\n const h = nats.headers()\n for (const [k, v] of Object.entries(init as Record<string, string>)) {\n if (v !== undefined && v !== null) h.set(k, String(v))\n }\n return h\n}\n\n/** Returns a cryptographically random float in [0, 1). */\nfunction cryptoRandom(): number {\n const buf = new Uint32Array(1)\n crypto.getRandomValues(buf)\n return buf[0] / (0xffffffff + 1)\n}\n\ninterface ExponentialBackoffHandle {\n handler: () => number\n reset: () => void\n}\n\nfunction createExponentialBackoffHandler(opts: NonNullable<NatsClientOptions['exponentialBackoff']>): ExponentialBackoffHandle {\n const initialDelay = opts.initialDelayMs ?? 1000\n const maxDelay = opts.maxDelayMs ?? 30_000\n const multiplier = opts.multiplier ?? 2\n const jitter = opts.jitter ?? true\n\n let attempt = 0\n\n return {\n handler: (): number => {\n const delay = Math.min(initialDelay * multiplier ** attempt, maxDelay)\n attempt++\n return jitter ? delay * (0.5 + cryptoRandom() * 0.5) : delay\n },\n reset: () => {\n attempt = 0\n },\n }\n}\n\nfunction mapOptionsToConnectionOptions(\n opts: NatsClientOptions,\n backoff?: ExponentialBackoffHandle,\n): ConnectionOptions {\n return {\n servers: opts.servers,\n name: opts.name,\n token: opts.token,\n user: opts.user,\n pass: opts.pass,\n timeout: opts.connectTimeoutMs ?? 15000,\n reconnect: opts.reconnect ?? true,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n reconnectTimeWait: opts.reconnectTimeWaitMs,\n reconnectDelayHandler: backoff?.handler,\n pingInterval: opts.pingIntervalMs,\n maxPingOut: opts.maxPingOut,\n inboxPrefix: opts.inboxPrefix,\n }\n}\n\nfunction mapNatsTypeToStatus(type: unknown): NatsStatus | null {\n const t = String(type).toLowerCase()\n if (t.includes('disconnect')) return 'disconnected'\n if (t === 'reconnecting') return 'reconnecting'\n if (t === 'reconnect' || t.includes('connect')) return 'connected'\n if (t.includes('error')) return 'error'\n if (t.includes('close')) return 'closed'\n return null\n}\n\nexport function createNatsClient(options: NatsClientOptions): NatsClient {\n let nc: NatsConnection | null = null\n let statusLoopAbort: AbortController | null = null\n let connectInFlight: Promise<void> | null = null\n\n const backoff = options.exponentialBackoff\n ? createExponentialBackoffHandler(options.exponentialBackoff)\n : undefined\n\n const statusListeners = new Set<(event: NatsStatusEvent) => void>()\n\n function emitStatus(event: NatsStatusEvent) {\n for (const listener of statusListeners) {\n try {\n listener(event)\n } catch {\n // ignore listener failures\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (nc && !nc.isClosed()) return\n if (connectInFlight) return connectInFlight\n assertClientSide()\n\n connectInFlight = (async () => {\n try {\n emitStatus({ status: 'connecting' })\n\n const nats = await importNats()\n const conn = await nats.connect(mapOptionsToConnectionOptions(options, backoff))\n nc = conn\n\n emitStatus({ status: 'connected' })\n\n statusLoopAbort = new AbortController()\n const signal = statusLoopAbort.signal\n\n ;(async () => {\n try {\n for await (const s of conn.status()) {\n if (signal.aborted) return\n const mapped = mapNatsTypeToStatus((s as any)?.type)\n if (mapped) {\n if (mapped === 'connected' && backoff) {\n backoff.reset()\n }\n emitStatus({ status: mapped, data: (s as any)?.data })\n if (mapped === 'closed') {\n nc = null\n }\n }\n }\n } catch (e) {\n if (!signal.aborted) {\n emitStatus({ status: 'error', data: e })\n nc = null\n }\n }\n })().catch(() => {\n // ignore\n })\n } finally {\n connectInFlight = null\n }\n })()\n\n return connectInFlight\n }\n\n async function close(): Promise<void> {\n const conn = nc\n nc = null\n\n if (statusLoopAbort) {\n try {\n statusLoopAbort.abort()\n } catch {\n // ignore\n }\n statusLoopAbort = null\n }\n\n if (!conn) return\n try {\n await conn.drain()\n } finally {\n try {\n await conn.close()\n } finally {\n emitStatus({ status: 'closed' })\n }\n }\n }\n\n function requireConnection(): NatsConnection {\n if (!nc) throw new Error('NATS is not connected. Call client.connect() first.')\n return nc\n }\n\n function isConnected(): boolean {\n return Boolean(nc) && !nc!.isClosed()\n }\n\n function publishBytes(subject: string, payload: Uint8Array, opts?: NatsPublishOptions): void {\n const conn = requireConnection()\n ;(async () => {\n const nats = await importNats()\n conn.publish(subject, payload, { headers: toNatsHeaders(nats, opts?.headers) })\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishString(subject: string, payload: string, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n publishBytes(subject, sc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishJson<T>(subject: string, payload: T, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n publishBytes(subject, jc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n async function requestBytes(subject: string, payload: Uint8Array, opts?: NatsRequestOptions): Promise<Msg> {\n const conn = requireConnection()\n const nats = await importNats()\n const msg = await conn.request(subject, payload, {\n timeout: opts?.timeoutMs ?? 2000,\n headers: toNatsHeaders(nats, opts?.headers),\n })\n return msg\n }\n\n async function requestString(subject: string, payload: string, opts?: NatsRequestOptions): Promise<string> {\n const nats = await importNats()\n const sc = nats.StringCodec()\n const msg = await requestBytes(subject, sc.encode(payload), opts)\n return sc.decode(msg.data)\n }\n\n async function requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n opts?: NatsRequestOptions,\n ): Promise<TResponse> {\n const nats = await importNats()\n const reqCodec = nats.JSONCodec<TRequest>()\n const resCodec = nats.JSONCodec<TResponse>()\n const msg = await requestBytes(subject, reqCodec.encode(payload), opts)\n return resCodec.decode(msg.data)\n }\n\n function subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n const conn = requireConnection()\n const sub = conn.subscribe(subject, { queue: opts?.queue })\n if (typeof opts?.max === 'number') sub.unsubscribe(opts.max)\n\n const abortController = new AbortController()\n const signal = opts?.signal ?? abortController.signal\n\n ;(async () => {\n try {\n for await (const msg of sub) {\n if (signal.aborted) break\n await onMessage(msg)\n }\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n } finally {\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n subscription: sub,\n unsubscribe() {\n try {\n abortController.abort()\n } catch {\n // ignore\n }\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n },\n }\n }\n\n function subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n await onMessage(sc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n await onMessage(jc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n async function subscribeJetStreamOrdered(\n onMessage: (msg: JsMsg) => void | Promise<void>,\n opts: JetStreamOrderedSubscribeOptions,\n ): Promise<JetStreamSubscriptionHandle> {\n const conn = requireConnection()\n if (opts.signal?.aborted) {\n return { unsubscribe() {} }\n }\n\n const nats = await importNats()\n if (opts.signal?.aborted) {\n return { unsubscribe() {} }\n }\n\n const inactiveThresholdNs =\n (opts.inactiveThresholdMs ?? 5 * 60_000) * 1_000_000\n\n const js = conn.jetstream()\n const consumer: Consumer = await js.consumers.get(opts.streamName, {\n filterSubjects: opts.filterSubject,\n deliver_policy: nats.DeliverPolicy.StartSequence,\n opt_start_seq: opts.optStartSeq ?? 0,\n inactive_threshold: inactiveThresholdNs,\n })\n\n const iterRef: { current: ConsumerMessages | null } = { current: null }\n let closed = false\n\n const onAbort = () => {\n void teardown()\n }\n opts.signal?.addEventListener('abort', onAbort, { once: true })\n\n async function teardown(): Promise<void> {\n if (closed) return\n closed = true\n opts.signal?.removeEventListener('abort', onAbort)\n const iter = iterRef.current\n iterRef.current = null\n if (iter) {\n try {\n await iter.close()\n } catch {\n // ignore\n }\n }\n }\n\n if (opts.signal?.aborted) {\n void teardown()\n return { unsubscribe() {} }\n }\n\n ;(async () => {\n try {\n const iter = await consumer.consume()\n if (closed) {\n try {\n await iter.close()\n } catch {\n // ignore\n }\n return\n }\n iterRef.current = iter\n for await (const msg of iter) {\n if (closed) break\n try {\n await onMessage(msg)\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n }\n }\n } catch (e) {\n if (!closed) emitStatus({ status: 'error', data: e })\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n unsubscribe() {\n void teardown()\n },\n }\n }\n\n function onStatus(listener: (event: NatsStatusEvent) => void): () => void {\n statusListeners.add(listener)\n return () => statusListeners.delete(listener)\n }\n\n return {\n connect,\n close,\n isConnected,\n publishBytes,\n publishString,\n publishJson,\n requestBytes,\n requestString,\n requestJson,\n subscribeBytes,\n subscribeString,\n subscribeJson,\n subscribeJetStreamOrdered,\n onStatus,\n }\n}\n"]}
@@ -248,6 +248,78 @@ function createNatsClient(options) {
248
248
  opts
249
249
  );
250
250
  }
251
+ async function subscribeJetStreamOrdered(onMessage, opts) {
252
+ const conn = requireConnection();
253
+ if (opts.signal?.aborted) {
254
+ return { unsubscribe() {
255
+ } };
256
+ }
257
+ const nats = await importNats();
258
+ if (opts.signal?.aborted) {
259
+ return { unsubscribe() {
260
+ } };
261
+ }
262
+ const inactiveThresholdNs = (opts.inactiveThresholdMs ?? 5 * 6e4) * 1e6;
263
+ const js = conn.jetstream();
264
+ const consumer = await js.consumers.get(opts.streamName, {
265
+ filterSubjects: opts.filterSubject,
266
+ deliver_policy: nats.DeliverPolicy.StartSequence,
267
+ opt_start_seq: opts.optStartSeq ?? 0,
268
+ inactive_threshold: inactiveThresholdNs
269
+ });
270
+ const iterRef = { current: null };
271
+ let closed = false;
272
+ const onAbort = () => {
273
+ void teardown();
274
+ };
275
+ opts.signal?.addEventListener("abort", onAbort, { once: true });
276
+ async function teardown() {
277
+ if (closed) return;
278
+ closed = true;
279
+ opts.signal?.removeEventListener("abort", onAbort);
280
+ const iter = iterRef.current;
281
+ iterRef.current = null;
282
+ if (iter) {
283
+ try {
284
+ await iter.close();
285
+ } catch {
286
+ }
287
+ }
288
+ }
289
+ if (opts.signal?.aborted) {
290
+ void teardown();
291
+ return { unsubscribe() {
292
+ } };
293
+ }
294
+ (async () => {
295
+ try {
296
+ const iter = await consumer.consume();
297
+ if (closed) {
298
+ try {
299
+ await iter.close();
300
+ } catch {
301
+ }
302
+ return;
303
+ }
304
+ iterRef.current = iter;
305
+ for await (const msg of iter) {
306
+ if (closed) break;
307
+ try {
308
+ await onMessage(msg);
309
+ } catch (e) {
310
+ emitStatus({ status: "error", data: e });
311
+ }
312
+ }
313
+ } catch (e) {
314
+ if (!closed) emitStatus({ status: "error", data: e });
315
+ }
316
+ })().catch((e) => emitStatus({ status: "error", data: e }));
317
+ return {
318
+ unsubscribe() {
319
+ void teardown();
320
+ }
321
+ };
322
+ }
251
323
  function onStatus(listener) {
252
324
  statusListeners.add(listener);
253
325
  return () => statusListeners.delete(listener);
@@ -265,6 +337,7 @@ function createNatsClient(options) {
265
337
  subscribeBytes,
266
338
  subscribeString,
267
339
  subscribeJson,
340
+ subscribeJetStreamOrdered,
268
341
  onStatus
269
342
  };
270
343
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n ConnectionOptions,\n MsgHdrs as NatsHeaders,\n Msg,\n NatsConnection,\n Subscription,\n} from 'nats.ws'\n\nexport interface NatsClientOptions {\n /**\n * NATS server URL(s), for example:\n * - \"wss://nats.example.com:443\"\n * - [\"wss://nats-1.example.com:443\", \"wss://nats-2.example.com:443\"]\n */\n servers: string | string[]\n\n /**\n * Connection name (shows up in NATS monitoring).\n */\n name?: string\n\n /**\n * Auth options (pick one: token or user/pass).\n */\n token?: string\n user?: string\n pass?: string\n\n /**\n * Reconnect behavior.\n */\n reconnect?: boolean\n maxReconnectAttempts?: number\n reconnectTimeWaitMs?: number\n\n /**\n * Exponential backoff for reconnect delays.\n * When set, uses `reconnectDelayHandler` from nats.ws under the hood,\n * overriding `reconnectTimeWaitMs`.\n */\n exponentialBackoff?: {\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Maximum delay cap in ms (default: 30000) */\n maxDelayMs?: number\n /** Multiplier per attempt (default: 2) */\n multiplier?: number\n /** Add random jitter 0-50% of delay to prevent thundering herd (default: true) */\n jitter?: boolean\n }\n\n /**\n * Ping behavior (keep-alive).\n */\n pingIntervalMs?: number\n maxPingOut?: number\n\n /**\n * Optional inbox prefix (useful if you want to isolate request/reply inboxes).\n */\n inboxPrefix?: string\n\n /**\n * Connection timeout in milliseconds (maps to `nats.ws` connect option `timeout`).\n * If you see `NatsError: TIMEOUT` during connect, increase this.\n */\n connectTimeoutMs?: number\n}\n\nexport interface NatsSubscribeOptions {\n /**\n * Queue group for load-balancing messages across subscribers.\n */\n queue?: string\n\n /**\n * Auto-unsubscribe after receiving this many messages.\n */\n max?: number\n\n /**\n * Abort signal to stop message iteration and unsubscribe.\n */\n signal?: AbortSignal\n}\n\nexport type NatsHeadersInit = Record<string, string> | NatsHeaders | undefined\n\nexport interface NatsPublishOptions {\n headers?: NatsHeadersInit\n}\n\nexport interface NatsRequestOptions {\n timeoutMs?: number\n headers?: NatsHeadersInit\n}\n\nexport interface NatsSubscriptionHandle {\n readonly subscription: Subscription\n unsubscribe(): void\n}\n\nexport type NatsStatus =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'closed'\n | 'error'\n\nexport interface NatsStatusEvent {\n status: NatsStatus\n data?: unknown\n}\n\nexport interface NatsClient {\n connect(): Promise<void>\n close(): Promise<void>\n\n isConnected(): boolean\n\n publishBytes(subject: string, payload: Uint8Array, options?: NatsPublishOptions): void\n publishString(subject: string, payload: string, options?: NatsPublishOptions): void\n publishJson<T>(subject: string, payload: T, options?: NatsPublishOptions): void\n\n requestBytes(subject: string, payload: Uint8Array, options?: NatsRequestOptions): Promise<Msg>\n requestString(subject: string, payload: string, options?: NatsRequestOptions): Promise<string>\n requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n options?: NatsRequestOptions,\n ): Promise<TResponse>\n\n subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n\n onStatus(listener: (event: NatsStatusEvent) => void): () => void\n}\n\nfunction assertClientSide(): void {\n // This wrapper is meant for browser/Tauri usage via WebSockets.\n // Keep it safe to import from Next.js server bundles by throwing only when used.\n if (typeof window === 'undefined') {\n throw new Error('NATS client can only connect from the browser/runtime with WebSocket support (window is undefined).')\n }\n}\n\nasync function importNats(): Promise<typeof import('nats.ws')> {\n // Browser/Tauri only: always use the websocket client (no Node-only deps).\n return await import('nats.ws')\n}\n\nfunction toNatsHeaders(nats: typeof import('nats.ws'), init: NatsHeadersInit): NatsHeaders | undefined {\n if (!init) return undefined\n if (typeof (init as NatsHeaders).get === 'function') return init as NatsHeaders\n\n const h = nats.headers()\n for (const [k, v] of Object.entries(init as Record<string, string>)) {\n if (v !== undefined && v !== null) h.set(k, String(v))\n }\n return h\n}\n\n/** Returns a cryptographically random float in [0, 1). */\nfunction cryptoRandom(): number {\n const buf = new Uint32Array(1)\n crypto.getRandomValues(buf)\n return buf[0] / (0xffffffff + 1)\n}\n\ninterface ExponentialBackoffHandle {\n handler: () => number\n reset: () => void\n}\n\nfunction createExponentialBackoffHandler(opts: NonNullable<NatsClientOptions['exponentialBackoff']>): ExponentialBackoffHandle {\n const initialDelay = opts.initialDelayMs ?? 1000\n const maxDelay = opts.maxDelayMs ?? 30_000\n const multiplier = opts.multiplier ?? 2\n const jitter = opts.jitter ?? true\n\n let attempt = 0\n\n return {\n handler: (): number => {\n const delay = Math.min(initialDelay * multiplier ** attempt, maxDelay)\n attempt++\n return jitter ? delay * (0.5 + cryptoRandom() * 0.5) : delay\n },\n reset: () => {\n attempt = 0\n },\n }\n}\n\nfunction mapOptionsToConnectionOptions(\n opts: NatsClientOptions,\n backoff?: ExponentialBackoffHandle,\n): ConnectionOptions {\n return {\n servers: opts.servers,\n name: opts.name,\n token: opts.token,\n user: opts.user,\n pass: opts.pass,\n timeout: opts.connectTimeoutMs ?? 15000,\n reconnect: opts.reconnect ?? true,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n reconnectTimeWait: opts.reconnectTimeWaitMs,\n reconnectDelayHandler: backoff?.handler,\n pingInterval: opts.pingIntervalMs,\n maxPingOut: opts.maxPingOut,\n inboxPrefix: opts.inboxPrefix,\n }\n}\n\nfunction mapNatsTypeToStatus(type: unknown): NatsStatus | null {\n const t = String(type).toLowerCase()\n if (t.includes('disconnect')) return 'disconnected'\n if (t === 'reconnecting') return 'reconnecting'\n if (t === 'reconnect' || t.includes('connect')) return 'connected'\n if (t.includes('error')) return 'error'\n if (t.includes('close')) return 'closed'\n return null\n}\n\nexport function createNatsClient(options: NatsClientOptions): NatsClient {\n let nc: NatsConnection | null = null\n let statusLoopAbort: AbortController | null = null\n let connectInFlight: Promise<void> | null = null\n\n const backoff = options.exponentialBackoff\n ? createExponentialBackoffHandler(options.exponentialBackoff)\n : undefined\n\n const statusListeners = new Set<(event: NatsStatusEvent) => void>()\n\n function emitStatus(event: NatsStatusEvent) {\n for (const listener of statusListeners) {\n try {\n listener(event)\n } catch {\n // ignore listener failures\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (nc && !nc.isClosed()) return\n if (connectInFlight) return connectInFlight\n assertClientSide()\n\n connectInFlight = (async () => {\n try {\n emitStatus({ status: 'connecting' })\n\n const nats = await importNats()\n const conn = await nats.connect(mapOptionsToConnectionOptions(options, backoff))\n nc = conn\n\n emitStatus({ status: 'connected' })\n\n statusLoopAbort = new AbortController()\n const signal = statusLoopAbort.signal\n\n ;(async () => {\n try {\n for await (const s of conn.status()) {\n if (signal.aborted) return\n const mapped = mapNatsTypeToStatus((s as any)?.type)\n if (mapped) {\n if (mapped === 'connected' && backoff) {\n backoff.reset()\n }\n emitStatus({ status: mapped, data: (s as any)?.data })\n if (mapped === 'closed') {\n nc = null\n }\n }\n }\n } catch (e) {\n if (!signal.aborted) {\n emitStatus({ status: 'error', data: e })\n nc = null\n }\n }\n })().catch(() => {\n // ignore\n })\n } finally {\n connectInFlight = null\n }\n })()\n\n return connectInFlight\n }\n\n async function close(): Promise<void> {\n const conn = nc\n nc = null\n\n if (statusLoopAbort) {\n try {\n statusLoopAbort.abort()\n } catch {\n // ignore\n }\n statusLoopAbort = null\n }\n\n if (!conn) return\n try {\n await conn.drain()\n } finally {\n try {\n await conn.close()\n } finally {\n emitStatus({ status: 'closed' })\n }\n }\n }\n\n function requireConnection(): NatsConnection {\n if (!nc) throw new Error('NATS is not connected. Call client.connect() first.')\n return nc\n }\n\n function isConnected(): boolean {\n return Boolean(nc) && !nc!.isClosed()\n }\n\n function publishBytes(subject: string, payload: Uint8Array, opts?: NatsPublishOptions): void {\n const conn = requireConnection()\n ;(async () => {\n const nats = await importNats()\n conn.publish(subject, payload, { headers: toNatsHeaders(nats, opts?.headers) })\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishString(subject: string, payload: string, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n publishBytes(subject, sc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishJson<T>(subject: string, payload: T, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n publishBytes(subject, jc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n async function requestBytes(subject: string, payload: Uint8Array, opts?: NatsRequestOptions): Promise<Msg> {\n const conn = requireConnection()\n const nats = await importNats()\n const msg = await conn.request(subject, payload, {\n timeout: opts?.timeoutMs ?? 2000,\n headers: toNatsHeaders(nats, opts?.headers),\n })\n return msg\n }\n\n async function requestString(subject: string, payload: string, opts?: NatsRequestOptions): Promise<string> {\n const nats = await importNats()\n const sc = nats.StringCodec()\n const msg = await requestBytes(subject, sc.encode(payload), opts)\n return sc.decode(msg.data)\n }\n\n async function requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n opts?: NatsRequestOptions,\n ): Promise<TResponse> {\n const nats = await importNats()\n const reqCodec = nats.JSONCodec<TRequest>()\n const resCodec = nats.JSONCodec<TResponse>()\n const msg = await requestBytes(subject, reqCodec.encode(payload), opts)\n return resCodec.decode(msg.data)\n }\n\n function subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n const conn = requireConnection()\n const sub = conn.subscribe(subject, { queue: opts?.queue })\n if (typeof opts?.max === 'number') sub.unsubscribe(opts.max)\n\n const abortController = new AbortController()\n const signal = opts?.signal ?? abortController.signal\n\n ;(async () => {\n try {\n for await (const msg of sub) {\n if (signal.aborted) break\n await onMessage(msg)\n }\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n } finally {\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n subscription: sub,\n unsubscribe() {\n try {\n abortController.abort()\n } catch {\n // ignore\n }\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n },\n }\n }\n\n function subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n await onMessage(sc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n await onMessage(jc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function onStatus(listener: (event: NatsStatusEvent) => void): () => void {\n statusListeners.add(listener)\n return () => statusListeners.delete(listener)\n }\n\n return {\n connect,\n close,\n isConnected,\n publishBytes,\n publishString,\n publishJson,\n requestBytes,\n requestString,\n requestJson,\n subscribeBytes,\n subscribeString,\n subscribeJson,\n onStatus,\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n ConnectionOptions,\n Consumer,\n ConsumerMessages,\n JsMsg,\n MsgHdrs as NatsHeaders,\n Msg,\n NatsConnection,\n Subscription,\n} from 'nats.ws'\n\nexport type JetStreamDeliverPolicy = 'new' | 'byStartSequence'\n\nexport interface JetStreamOrderedSubscribeOptions {\n streamName: string\n filterSubject: string\n deliverPolicy: JetStreamDeliverPolicy\n /** Required when deliverPolicy === 'byStartSequence'. */\n optStartSeq?: number\n /** Auto-cleanup the ephemeral consumer after this idle time. Default: 5 minutes. */\n inactiveThresholdMs?: number\n /** AbortSignal to tear down the consumer. */\n signal?: AbortSignal\n}\n\nexport interface JetStreamSubscriptionHandle {\n unsubscribe(): void\n}\n\nexport interface NatsClientOptions {\n /**\n * NATS server URL(s), for example:\n * - \"wss://nats.example.com:443\"\n * - [\"wss://nats-1.example.com:443\", \"wss://nats-2.example.com:443\"]\n */\n servers: string | string[]\n\n /**\n * Connection name (shows up in NATS monitoring).\n */\n name?: string\n\n /**\n * Auth options (pick one: token or user/pass).\n */\n token?: string\n user?: string\n pass?: string\n\n /**\n * Reconnect behavior.\n */\n reconnect?: boolean\n maxReconnectAttempts?: number\n reconnectTimeWaitMs?: number\n\n /**\n * Exponential backoff for reconnect delays.\n * When set, uses `reconnectDelayHandler` from nats.ws under the hood,\n * overriding `reconnectTimeWaitMs`.\n */\n exponentialBackoff?: {\n /** Initial delay in ms (default: 1000) */\n initialDelayMs?: number\n /** Maximum delay cap in ms (default: 30000) */\n maxDelayMs?: number\n /** Multiplier per attempt (default: 2) */\n multiplier?: number\n /** Add random jitter 0-50% of delay to prevent thundering herd (default: true) */\n jitter?: boolean\n }\n\n /**\n * Ping behavior (keep-alive).\n */\n pingIntervalMs?: number\n maxPingOut?: number\n\n /**\n * Optional inbox prefix (useful if you want to isolate request/reply inboxes).\n */\n inboxPrefix?: string\n\n /**\n * Connection timeout in milliseconds (maps to `nats.ws` connect option `timeout`).\n * If you see `NatsError: TIMEOUT` during connect, increase this.\n */\n connectTimeoutMs?: number\n}\n\nexport interface NatsSubscribeOptions {\n /**\n * Queue group for load-balancing messages across subscribers.\n */\n queue?: string\n\n /**\n * Auto-unsubscribe after receiving this many messages.\n */\n max?: number\n\n /**\n * Abort signal to stop message iteration and unsubscribe.\n */\n signal?: AbortSignal\n}\n\nexport type NatsHeadersInit = Record<string, string> | NatsHeaders | undefined\n\nexport interface NatsPublishOptions {\n headers?: NatsHeadersInit\n}\n\nexport interface NatsRequestOptions {\n timeoutMs?: number\n headers?: NatsHeadersInit\n}\n\nexport interface NatsSubscriptionHandle {\n readonly subscription: Subscription\n unsubscribe(): void\n}\n\nexport type NatsStatus =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'closed'\n | 'error'\n\nexport interface NatsStatusEvent {\n status: NatsStatus\n data?: unknown\n}\n\nexport interface NatsClient {\n connect(): Promise<void>\n close(): Promise<void>\n\n isConnected(): boolean\n\n publishBytes(subject: string, payload: Uint8Array, options?: NatsPublishOptions): void\n publishString(subject: string, payload: string, options?: NatsPublishOptions): void\n publishJson<T>(subject: string, payload: T, options?: NatsPublishOptions): void\n\n requestBytes(subject: string, payload: Uint8Array, options?: NatsRequestOptions): Promise<Msg>\n requestString(subject: string, payload: string, options?: NatsRequestOptions): Promise<string>\n requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n options?: NatsRequestOptions,\n ): Promise<TResponse>\n\n subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n options?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle\n\n /**\n * Subscribe to a JetStream subject via an ephemeral OrderedConsumer (no acks).\n * Use `optStartSeq` with `deliverPolicy: 'byStartSequence'` to resume from a known offset,\n * or `deliverPolicy: 'new'` to live-tail.\n */\n subscribeJetStreamOrdered(\n onMessage: (msg: JsMsg) => void | Promise<void>,\n options: JetStreamOrderedSubscribeOptions,\n ): Promise<JetStreamSubscriptionHandle>\n\n onStatus(listener: (event: NatsStatusEvent) => void): () => void\n}\n\nfunction assertClientSide(): void {\n // This wrapper is meant for browser/Tauri usage via WebSockets.\n // Keep it safe to import from Next.js server bundles by throwing only when used.\n if (typeof window === 'undefined') {\n throw new Error('NATS client can only connect from the browser/runtime with WebSocket support (window is undefined).')\n }\n}\n\nasync function importNats(): Promise<typeof import('nats.ws')> {\n // Browser/Tauri only: always use the websocket client (no Node-only deps).\n return await import('nats.ws')\n}\n\nfunction toNatsHeaders(nats: typeof import('nats.ws'), init: NatsHeadersInit): NatsHeaders | undefined {\n if (!init) return undefined\n if (typeof (init as NatsHeaders).get === 'function') return init as NatsHeaders\n\n const h = nats.headers()\n for (const [k, v] of Object.entries(init as Record<string, string>)) {\n if (v !== undefined && v !== null) h.set(k, String(v))\n }\n return h\n}\n\n/** Returns a cryptographically random float in [0, 1). */\nfunction cryptoRandom(): number {\n const buf = new Uint32Array(1)\n crypto.getRandomValues(buf)\n return buf[0] / (0xffffffff + 1)\n}\n\ninterface ExponentialBackoffHandle {\n handler: () => number\n reset: () => void\n}\n\nfunction createExponentialBackoffHandler(opts: NonNullable<NatsClientOptions['exponentialBackoff']>): ExponentialBackoffHandle {\n const initialDelay = opts.initialDelayMs ?? 1000\n const maxDelay = opts.maxDelayMs ?? 30_000\n const multiplier = opts.multiplier ?? 2\n const jitter = opts.jitter ?? true\n\n let attempt = 0\n\n return {\n handler: (): number => {\n const delay = Math.min(initialDelay * multiplier ** attempt, maxDelay)\n attempt++\n return jitter ? delay * (0.5 + cryptoRandom() * 0.5) : delay\n },\n reset: () => {\n attempt = 0\n },\n }\n}\n\nfunction mapOptionsToConnectionOptions(\n opts: NatsClientOptions,\n backoff?: ExponentialBackoffHandle,\n): ConnectionOptions {\n return {\n servers: opts.servers,\n name: opts.name,\n token: opts.token,\n user: opts.user,\n pass: opts.pass,\n timeout: opts.connectTimeoutMs ?? 15000,\n reconnect: opts.reconnect ?? true,\n maxReconnectAttempts: opts.maxReconnectAttempts,\n reconnectTimeWait: opts.reconnectTimeWaitMs,\n reconnectDelayHandler: backoff?.handler,\n pingInterval: opts.pingIntervalMs,\n maxPingOut: opts.maxPingOut,\n inboxPrefix: opts.inboxPrefix,\n }\n}\n\nfunction mapNatsTypeToStatus(type: unknown): NatsStatus | null {\n const t = String(type).toLowerCase()\n if (t.includes('disconnect')) return 'disconnected'\n if (t === 'reconnecting') return 'reconnecting'\n if (t === 'reconnect' || t.includes('connect')) return 'connected'\n if (t.includes('error')) return 'error'\n if (t.includes('close')) return 'closed'\n return null\n}\n\nexport function createNatsClient(options: NatsClientOptions): NatsClient {\n let nc: NatsConnection | null = null\n let statusLoopAbort: AbortController | null = null\n let connectInFlight: Promise<void> | null = null\n\n const backoff = options.exponentialBackoff\n ? createExponentialBackoffHandler(options.exponentialBackoff)\n : undefined\n\n const statusListeners = new Set<(event: NatsStatusEvent) => void>()\n\n function emitStatus(event: NatsStatusEvent) {\n for (const listener of statusListeners) {\n try {\n listener(event)\n } catch {\n // ignore listener failures\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (nc && !nc.isClosed()) return\n if (connectInFlight) return connectInFlight\n assertClientSide()\n\n connectInFlight = (async () => {\n try {\n emitStatus({ status: 'connecting' })\n\n const nats = await importNats()\n const conn = await nats.connect(mapOptionsToConnectionOptions(options, backoff))\n nc = conn\n\n emitStatus({ status: 'connected' })\n\n statusLoopAbort = new AbortController()\n const signal = statusLoopAbort.signal\n\n ;(async () => {\n try {\n for await (const s of conn.status()) {\n if (signal.aborted) return\n const mapped = mapNatsTypeToStatus((s as any)?.type)\n if (mapped) {\n if (mapped === 'connected' && backoff) {\n backoff.reset()\n }\n emitStatus({ status: mapped, data: (s as any)?.data })\n if (mapped === 'closed') {\n nc = null\n }\n }\n }\n } catch (e) {\n if (!signal.aborted) {\n emitStatus({ status: 'error', data: e })\n nc = null\n }\n }\n })().catch(() => {\n // ignore\n })\n } finally {\n connectInFlight = null\n }\n })()\n\n return connectInFlight\n }\n\n async function close(): Promise<void> {\n const conn = nc\n nc = null\n\n if (statusLoopAbort) {\n try {\n statusLoopAbort.abort()\n } catch {\n // ignore\n }\n statusLoopAbort = null\n }\n\n if (!conn) return\n try {\n await conn.drain()\n } finally {\n try {\n await conn.close()\n } finally {\n emitStatus({ status: 'closed' })\n }\n }\n }\n\n function requireConnection(): NatsConnection {\n if (!nc) throw new Error('NATS is not connected. Call client.connect() first.')\n return nc\n }\n\n function isConnected(): boolean {\n return Boolean(nc) && !nc!.isClosed()\n }\n\n function publishBytes(subject: string, payload: Uint8Array, opts?: NatsPublishOptions): void {\n const conn = requireConnection()\n ;(async () => {\n const nats = await importNats()\n conn.publish(subject, payload, { headers: toNatsHeaders(nats, opts?.headers) })\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishString(subject: string, payload: string, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n publishBytes(subject, sc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n function publishJson<T>(subject: string, payload: T, opts?: NatsPublishOptions): void {\n ;(async () => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n publishBytes(subject, jc.encode(payload), opts)\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n }\n\n async function requestBytes(subject: string, payload: Uint8Array, opts?: NatsRequestOptions): Promise<Msg> {\n const conn = requireConnection()\n const nats = await importNats()\n const msg = await conn.request(subject, payload, {\n timeout: opts?.timeoutMs ?? 2000,\n headers: toNatsHeaders(nats, opts?.headers),\n })\n return msg\n }\n\n async function requestString(subject: string, payload: string, opts?: NatsRequestOptions): Promise<string> {\n const nats = await importNats()\n const sc = nats.StringCodec()\n const msg = await requestBytes(subject, sc.encode(payload), opts)\n return sc.decode(msg.data)\n }\n\n async function requestJson<TResponse, TRequest = unknown>(\n subject: string,\n payload: TRequest,\n opts?: NatsRequestOptions,\n ): Promise<TResponse> {\n const nats = await importNats()\n const reqCodec = nats.JSONCodec<TRequest>()\n const resCodec = nats.JSONCodec<TResponse>()\n const msg = await requestBytes(subject, reqCodec.encode(payload), opts)\n return resCodec.decode(msg.data)\n }\n\n function subscribeBytes(\n subject: string,\n onMessage: (msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n const conn = requireConnection()\n const sub = conn.subscribe(subject, { queue: opts?.queue })\n if (typeof opts?.max === 'number') sub.unsubscribe(opts.max)\n\n const abortController = new AbortController()\n const signal = opts?.signal ?? abortController.signal\n\n ;(async () => {\n try {\n for await (const msg of sub) {\n if (signal.aborted) break\n await onMessage(msg)\n }\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n } finally {\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n subscription: sub,\n unsubscribe() {\n try {\n abortController.abort()\n } catch {\n // ignore\n }\n try {\n sub.unsubscribe()\n } catch {\n // ignore\n }\n },\n }\n }\n\n function subscribeString(\n subject: string,\n onMessage: (payload: string, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const sc = nats.StringCodec()\n await onMessage(sc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n function subscribeJson<T>(\n subject: string,\n onMessage: (payload: T, msg: Msg) => void | Promise<void>,\n opts?: NatsSubscribeOptions,\n ): NatsSubscriptionHandle {\n return subscribeBytes(\n subject,\n async (msg) => {\n const nats = await importNats()\n const jc = nats.JSONCodec<T>()\n await onMessage(jc.decode(msg.data), msg)\n },\n opts,\n )\n }\n\n async function subscribeJetStreamOrdered(\n onMessage: (msg: JsMsg) => void | Promise<void>,\n opts: JetStreamOrderedSubscribeOptions,\n ): Promise<JetStreamSubscriptionHandle> {\n const conn = requireConnection()\n if (opts.signal?.aborted) {\n return { unsubscribe() {} }\n }\n\n const nats = await importNats()\n if (opts.signal?.aborted) {\n return { unsubscribe() {} }\n }\n\n const inactiveThresholdNs =\n (opts.inactiveThresholdMs ?? 5 * 60_000) * 1_000_000\n\n const js = conn.jetstream()\n const consumer: Consumer = await js.consumers.get(opts.streamName, {\n filterSubjects: opts.filterSubject,\n deliver_policy: nats.DeliverPolicy.StartSequence,\n opt_start_seq: opts.optStartSeq ?? 0,\n inactive_threshold: inactiveThresholdNs,\n })\n\n const iterRef: { current: ConsumerMessages | null } = { current: null }\n let closed = false\n\n const onAbort = () => {\n void teardown()\n }\n opts.signal?.addEventListener('abort', onAbort, { once: true })\n\n async function teardown(): Promise<void> {\n if (closed) return\n closed = true\n opts.signal?.removeEventListener('abort', onAbort)\n const iter = iterRef.current\n iterRef.current = null\n if (iter) {\n try {\n await iter.close()\n } catch {\n // ignore\n }\n }\n }\n\n if (opts.signal?.aborted) {\n void teardown()\n return { unsubscribe() {} }\n }\n\n ;(async () => {\n try {\n const iter = await consumer.consume()\n if (closed) {\n try {\n await iter.close()\n } catch {\n // ignore\n }\n return\n }\n iterRef.current = iter\n for await (const msg of iter) {\n if (closed) break\n try {\n await onMessage(msg)\n } catch (e) {\n emitStatus({ status: 'error', data: e })\n }\n }\n } catch (e) {\n if (!closed) emitStatus({ status: 'error', data: e })\n }\n })().catch((e) => emitStatus({ status: 'error', data: e }))\n\n return {\n unsubscribe() {\n void teardown()\n },\n }\n }\n\n function onStatus(listener: (event: NatsStatusEvent) => void): () => void {\n statusListeners.add(listener)\n return () => statusListeners.delete(listener)\n }\n\n return {\n connect,\n close,\n isConnected,\n publishBytes,\n publishString,\n publishJson,\n requestBytes,\n requestString,\n requestJson,\n subscribeBytes,\n subscribeString,\n subscribeJson,\n subscribeJetStreamOrdered,\n onStatus,\n }\n}\n"]}
@@ -1,4 +1,19 @@
1
- import type { MsgHdrs as NatsHeaders, Msg, Subscription } from 'nats.ws';
1
+ import type { JsMsg, MsgHdrs as NatsHeaders, Msg, Subscription } from 'nats.ws';
2
+ export type JetStreamDeliverPolicy = 'new' | 'byStartSequence';
3
+ export interface JetStreamOrderedSubscribeOptions {
4
+ streamName: string;
5
+ filterSubject: string;
6
+ deliverPolicy: JetStreamDeliverPolicy;
7
+ /** Required when deliverPolicy === 'byStartSequence'. */
8
+ optStartSeq?: number;
9
+ /** Auto-cleanup the ephemeral consumer after this idle time. Default: 5 minutes. */
10
+ inactiveThresholdMs?: number;
11
+ /** AbortSignal to tear down the consumer. */
12
+ signal?: AbortSignal;
13
+ }
14
+ export interface JetStreamSubscriptionHandle {
15
+ unsubscribe(): void;
16
+ }
2
17
  export interface NatsClientOptions {
3
18
  /**
4
19
  * NATS server URL(s), for example:
@@ -96,6 +111,12 @@ export interface NatsClient {
96
111
  subscribeBytes(subject: string, onMessage: (msg: Msg) => void | Promise<void>, options?: NatsSubscribeOptions): NatsSubscriptionHandle;
97
112
  subscribeString(subject: string, onMessage: (payload: string, msg: Msg) => void | Promise<void>, options?: NatsSubscribeOptions): NatsSubscriptionHandle;
98
113
  subscribeJson<T>(subject: string, onMessage: (payload: T, msg: Msg) => void | Promise<void>, options?: NatsSubscribeOptions): NatsSubscriptionHandle;
114
+ /**
115
+ * Subscribe to a JetStream subject via an ephemeral OrderedConsumer (no acks).
116
+ * Use `optStartSeq` with `deliverPolicy: 'byStartSequence'` to resume from a known offset,
117
+ * or `deliverPolicy: 'new'` to live-tail.
118
+ */
119
+ subscribeJetStreamOrdered(onMessage: (msg: JsMsg) => void | Promise<void>, options: JetStreamOrderedSubscribeOptions): Promise<JetStreamSubscriptionHandle>;
99
120
  onStatus(listener: (event: NatsStatusEvent) => void): () => void;
100
121
  }
101
122
  export declare function createNatsClient(options: NatsClientOptions): NatsClient;
@@ -1 +1 @@
1
- {"version":3,"file":"nats.d.ts","sourceRoot":"","sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nats.d.ts","sourceRoot":"","sources":["../../src/nats/nats.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.195",
3
+ "version": "0.0.196",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -2,5 +2,6 @@
2
2
 
3
3
  export * from './use-chunk-catchup'
4
4
  export * from './use-collapsible'
5
+ export * from './use-jetstream-dialog-subscription'
5
6
  export * from './use-nats-dialog-subscription'
6
7
  export * from './use-realtime-chunk-processor'