@flamingo-stack/openframe-frontend-core 0.0.212 → 0.0.213

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 (91) hide show
  1. package/dist/{chunk-ZFBLC5GV.cjs → chunk-35XIT2CF.cjs} +17 -17
  2. package/dist/{chunk-ZFBLC5GV.cjs.map → chunk-35XIT2CF.cjs.map} +1 -1
  3. package/dist/{chunk-QKFBZLIR.js → chunk-3JWIJJ44.js} +2 -2
  4. package/dist/chunk-CZR7ARBA.js +698 -0
  5. package/dist/chunk-CZR7ARBA.js.map +1 -0
  6. package/dist/{chunk-UYQOPC57.js → chunk-HICZPTRR.js} +4 -351
  7. package/dist/chunk-HICZPTRR.js.map +1 -0
  8. package/dist/{chunk-5BNWGK6D.js → chunk-IK2X5YJU.js} +3 -3
  9. package/dist/{chunk-VTUIMMHO.cjs → chunk-OTKJASSX.cjs} +26 -26
  10. package/dist/{chunk-VTUIMMHO.cjs.map → chunk-OTKJASSX.cjs.map} +1 -1
  11. package/dist/chunk-OZ3GH6OQ.cjs +698 -0
  12. package/dist/chunk-OZ3GH6OQ.cjs.map +1 -0
  13. package/dist/{chunk-EH3RWVF3.cjs → chunk-WT5JV2GS.cjs} +8 -355
  14. package/dist/chunk-WT5JV2GS.cjs.map +1 -0
  15. package/dist/{chunk-WI76ZUBE.cjs → chunk-ZDF6F7ED.cjs} +544 -678
  16. package/dist/chunk-ZDF6F7ED.cjs.map +1 -0
  17. package/dist/{chunk-3E5ANY55.js → chunk-ZTJVRSN5.js} +409 -543
  18. package/dist/{chunk-3E5ANY55.js.map → chunk-ZTJVRSN5.js.map} +1 -1
  19. package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts.map +1 -1
  20. package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts +0 -9
  21. package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts.map +1 -1
  22. package/dist/components/chat/index.cjs +5 -4
  23. package/dist/components/chat/index.cjs.map +1 -1
  24. package/dist/components/chat/index.js +4 -3
  25. package/dist/components/contact/index.cjs +6 -5
  26. package/dist/components/contact/index.cjs.map +1 -1
  27. package/dist/components/contact/index.js +5 -4
  28. package/dist/components/features/index.cjs +5 -4
  29. package/dist/components/features/index.cjs.map +1 -1
  30. package/dist/components/features/index.js +4 -3
  31. package/dist/components/features/notifications/index.d.ts +2 -2
  32. package/dist/components/features/notifications/index.d.ts.map +1 -1
  33. package/dist/components/features/notifications/notifications-context.d.ts +16 -1
  34. package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
  35. package/dist/components/features/notifications/types.d.ts +4 -0
  36. package/dist/components/features/notifications/types.d.ts.map +1 -1
  37. package/dist/components/index.cjs +55 -54
  38. package/dist/components/index.cjs.map +1 -1
  39. package/dist/components/index.js +7 -6
  40. package/dist/components/index.js.map +1 -1
  41. package/dist/components/navigation/app-header.d.ts.map +1 -1
  42. package/dist/components/navigation/index.cjs +5 -4
  43. package/dist/components/navigation/index.cjs.map +1 -1
  44. package/dist/components/navigation/index.js +4 -3
  45. package/dist/components/tickets/index.cjs +66 -65
  46. package/dist/components/tickets/index.cjs.map +1 -1
  47. package/dist/components/tickets/index.js +6 -5
  48. package/dist/components/tickets/index.js.map +1 -1
  49. package/dist/components/ui/index.cjs +5 -4
  50. package/dist/components/ui/index.cjs.map +1 -1
  51. package/dist/components/ui/index.js +4 -3
  52. package/dist/embed-shims/index.cjs +3 -3
  53. package/dist/embed-shims/index.cjs.map +1 -1
  54. package/dist/embed-shims/index.js +4 -4
  55. package/dist/hooks/index.cjs +3 -2
  56. package/dist/hooks/index.cjs.map +1 -1
  57. package/dist/hooks/index.js +2 -1
  58. package/dist/index.cjs +5 -4
  59. package/dist/index.cjs.map +1 -1
  60. package/dist/index.js +4 -3
  61. package/dist/nats/index.cjs +28 -346
  62. package/dist/nats/index.cjs.map +1 -1
  63. package/dist/nats/index.d.ts +3 -0
  64. package/dist/nats/index.d.ts.map +1 -1
  65. package/dist/nats/index.js +30 -346
  66. package/dist/nats/index.js.map +1 -1
  67. package/dist/nats/nats-provider.d.ts +28 -0
  68. package/dist/nats/nats-provider.d.ts.map +1 -0
  69. package/dist/nats/nats.d.ts +1 -0
  70. package/dist/nats/nats.d.ts.map +1 -1
  71. package/dist/nats/shared-connection.d.ts +73 -0
  72. package/dist/nats/shared-connection.d.ts.map +1 -0
  73. package/dist/nats/use-nats-subscription.d.ts +18 -0
  74. package/dist/nats/use-nats-subscription.d.ts.map +1 -0
  75. package/package.json +1 -1
  76. package/src/components/chat/hooks/use-jetstream-dialog-subscription.ts +60 -207
  77. package/src/components/chat/hooks/use-nats-dialog-subscription.ts +71 -214
  78. package/src/components/features/notifications/index.ts +2 -1
  79. package/src/components/features/notifications/notifications-context.tsx +104 -6
  80. package/src/components/features/notifications/types.ts +5 -0
  81. package/src/components/navigation/app-header.tsx +7 -9
  82. package/src/nats/index.ts +3 -0
  83. package/src/nats/nats-provider.tsx +146 -0
  84. package/src/nats/nats.ts +2 -0
  85. package/src/nats/shared-connection.ts +285 -0
  86. package/src/nats/use-nats-subscription.ts +99 -0
  87. package/dist/chunk-EH3RWVF3.cjs.map +0 -1
  88. package/dist/chunk-UYQOPC57.js.map +0 -1
  89. package/dist/chunk-WI76ZUBE.cjs.map +0 -1
  90. /package/dist/{chunk-QKFBZLIR.js.map → chunk-3JWIJJ44.js.map} +0 -0
  91. /package/dist/{chunk-5BNWGK6D.js.map → chunk-IK2X5YJU.js.map} +0 -0
@@ -1,349 +1,31 @@
1
- 'use strict';
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
- // src/nats/nats.ts
4
- function assertClientSide() {
5
- if (typeof window === "undefined") {
6
- throw new Error("NATS client can only connect from the browser/runtime with WebSocket support (window is undefined).");
7
- }
8
- }
9
- async function importNats() {
10
- return await import('nats.ws');
11
- }
12
- function toNatsHeaders(nats, init) {
13
- if (!init) return void 0;
14
- if (typeof init.get === "function") return init;
15
- const h = nats.headers();
16
- for (const [k, v] of Object.entries(init)) {
17
- if (v !== void 0 && v !== null) h.set(k, String(v));
18
- }
19
- return h;
20
- }
21
- function cryptoRandom() {
22
- const buf = new Uint32Array(1);
23
- crypto.getRandomValues(buf);
24
- return buf[0] / (4294967295 + 1);
25
- }
26
- function createExponentialBackoffHandler(opts) {
27
- const initialDelay = opts.initialDelayMs ?? 1e3;
28
- const maxDelay = opts.maxDelayMs ?? 3e4;
29
- const multiplier = opts.multiplier ?? 2;
30
- const jitter = opts.jitter ?? true;
31
- let attempt = 0;
32
- return {
33
- handler: () => {
34
- const delay = Math.min(initialDelay * multiplier ** attempt, maxDelay);
35
- attempt++;
36
- return jitter ? delay * (0.5 + cryptoRandom() * 0.5) : delay;
37
- },
38
- reset: () => {
39
- attempt = 0;
40
- }
41
- };
42
- }
43
- function mapOptionsToConnectionOptions(opts, backoff) {
44
- return {
45
- servers: opts.servers,
46
- name: opts.name,
47
- token: opts.token,
48
- user: opts.user,
49
- pass: opts.pass,
50
- timeout: opts.connectTimeoutMs ?? 15e3,
51
- reconnect: opts.reconnect ?? true,
52
- maxReconnectAttempts: opts.maxReconnectAttempts,
53
- reconnectTimeWait: opts.reconnectTimeWaitMs,
54
- reconnectDelayHandler: backoff?.handler,
55
- pingInterval: opts.pingIntervalMs,
56
- maxPingOut: opts.maxPingOut,
57
- inboxPrefix: opts.inboxPrefix
58
- };
59
- }
60
- function mapNatsTypeToStatus(type) {
61
- const t = String(type).toLowerCase();
62
- if (t.includes("disconnect")) return "disconnected";
63
- if (t === "reconnecting") return "reconnecting";
64
- if (t === "reconnect" || t.includes("connect")) return "connected";
65
- if (t.includes("error")) return "error";
66
- if (t.includes("close")) return "closed";
67
- return null;
68
- }
69
- function createNatsClient(options) {
70
- let nc = null;
71
- let statusLoopAbort = null;
72
- let connectInFlight = null;
73
- const backoff = options.exponentialBackoff ? createExponentialBackoffHandler(options.exponentialBackoff) : void 0;
74
- const statusListeners = /* @__PURE__ */ new Set();
75
- function emitStatus(event) {
76
- for (const listener of statusListeners) {
77
- try {
78
- listener(event);
79
- } catch {
80
- }
81
- }
82
- }
83
- async function connect() {
84
- if (nc && !nc.isClosed()) return;
85
- if (connectInFlight) return connectInFlight;
86
- assertClientSide();
87
- connectInFlight = (async () => {
88
- try {
89
- emitStatus({ status: "connecting" });
90
- const nats = await importNats();
91
- const conn = await nats.connect(mapOptionsToConnectionOptions(options, backoff));
92
- nc = conn;
93
- emitStatus({ status: "connected" });
94
- statusLoopAbort = new AbortController();
95
- const signal = statusLoopAbort.signal;
96
- (async () => {
97
- try {
98
- for await (const s of conn.status()) {
99
- if (signal.aborted) return;
100
- const mapped = mapNatsTypeToStatus(s?.type);
101
- if (mapped) {
102
- if (mapped === "connected" && backoff) {
103
- backoff.reset();
104
- }
105
- emitStatus({ status: mapped, data: s?.data });
106
- if (mapped === "closed") {
107
- nc = null;
108
- }
109
- }
110
- }
111
- } catch (e) {
112
- if (!signal.aborted) {
113
- emitStatus({ status: "error", data: e });
114
- nc = null;
115
- }
116
- }
117
- })().catch(() => {
118
- });
119
- } finally {
120
- connectInFlight = null;
121
- }
122
- })();
123
- return connectInFlight;
124
- }
125
- async function close() {
126
- const conn = nc;
127
- nc = null;
128
- if (statusLoopAbort) {
129
- try {
130
- statusLoopAbort.abort();
131
- } catch {
132
- }
133
- statusLoopAbort = null;
134
- }
135
- if (!conn) return;
136
- try {
137
- await conn.drain();
138
- } finally {
139
- try {
140
- await conn.close();
141
- } finally {
142
- emitStatus({ status: "closed" });
143
- }
144
- }
145
- }
146
- function requireConnection() {
147
- if (!nc) throw new Error("NATS is not connected. Call client.connect() first.");
148
- return nc;
149
- }
150
- function isConnected() {
151
- return Boolean(nc) && !nc.isClosed();
152
- }
153
- function publishBytes(subject, payload, opts) {
154
- const conn = requireConnection();
155
- (async () => {
156
- const nats = await importNats();
157
- conn.publish(subject, payload, { headers: toNatsHeaders(nats, opts?.headers) });
158
- })().catch((e) => emitStatus({ status: "error", data: e }));
159
- }
160
- function publishString(subject, payload, opts) {
161
- (async () => {
162
- const nats = await importNats();
163
- const sc = nats.StringCodec();
164
- publishBytes(subject, sc.encode(payload), opts);
165
- })().catch((e) => emitStatus({ status: "error", data: e }));
166
- }
167
- function publishJson(subject, payload, opts) {
168
- (async () => {
169
- const nats = await importNats();
170
- const jc = nats.JSONCodec();
171
- publishBytes(subject, jc.encode(payload), opts);
172
- })().catch((e) => emitStatus({ status: "error", data: e }));
173
- }
174
- async function requestBytes(subject, payload, opts) {
175
- const conn = requireConnection();
176
- const nats = await importNats();
177
- const msg = await conn.request(subject, payload, {
178
- timeout: opts?.timeoutMs ?? 2e3,
179
- headers: toNatsHeaders(nats, opts?.headers)
180
- });
181
- return msg;
182
- }
183
- async function requestString(subject, payload, opts) {
184
- const nats = await importNats();
185
- const sc = nats.StringCodec();
186
- const msg = await requestBytes(subject, sc.encode(payload), opts);
187
- return sc.decode(msg.data);
188
- }
189
- async function requestJson(subject, payload, opts) {
190
- const nats = await importNats();
191
- const reqCodec = nats.JSONCodec();
192
- const resCodec = nats.JSONCodec();
193
- const msg = await requestBytes(subject, reqCodec.encode(payload), opts);
194
- return resCodec.decode(msg.data);
195
- }
196
- function subscribeBytes(subject, onMessage, opts) {
197
- const conn = requireConnection();
198
- const sub = conn.subscribe(subject, { queue: opts?.queue });
199
- if (typeof opts?.max === "number") sub.unsubscribe(opts.max);
200
- const abortController = new AbortController();
201
- const signal = opts?.signal ?? abortController.signal;
202
- (async () => {
203
- try {
204
- for await (const msg of sub) {
205
- if (signal.aborted) break;
206
- await onMessage(msg);
207
- }
208
- } catch (e) {
209
- emitStatus({ status: "error", data: e });
210
- } finally {
211
- try {
212
- sub.unsubscribe();
213
- } catch {
214
- }
215
- }
216
- })().catch((e) => emitStatus({ status: "error", data: e }));
217
- return {
218
- subscription: sub,
219
- unsubscribe() {
220
- try {
221
- abortController.abort();
222
- } catch {
223
- }
224
- try {
225
- sub.unsubscribe();
226
- } catch {
227
- }
228
- }
229
- };
230
- }
231
- function subscribeString(subject, onMessage, opts) {
232
- return subscribeBytes(
233
- subject,
234
- async (msg) => {
235
- const nats = await importNats();
236
- const sc = nats.StringCodec();
237
- await onMessage(sc.decode(msg.data), msg);
238
- },
239
- opts
240
- );
241
- }
242
- function subscribeJson(subject, onMessage, opts) {
243
- return subscribeBytes(
244
- subject,
245
- async (msg) => {
246
- const nats = await importNats();
247
- const jc = nats.JSONCodec();
248
- await onMessage(jc.decode(msg.data), msg);
249
- },
250
- opts
251
- );
252
- }
253
- async function subscribeJetStreamOrdered(onMessage, opts) {
254
- const conn = requireConnection();
255
- if (opts.signal?.aborted) {
256
- return { unsubscribe() {
257
- } };
258
- }
259
- const nats = await importNats();
260
- if (opts.signal?.aborted) {
261
- return { unsubscribe() {
262
- } };
263
- }
264
- const inactiveThresholdNs = (opts.inactiveThresholdMs ?? 5 * 6e4) * 1e6;
265
- const js = conn.jetstream();
266
- const consumer = await js.consumers.get(opts.streamName, {
267
- filterSubjects: opts.filterSubject,
268
- deliver_policy: nats.DeliverPolicy.StartSequence,
269
- opt_start_seq: opts.optStartSeq ?? 0,
270
- inactive_threshold: inactiveThresholdNs
271
- });
272
- const iterRef = { current: null };
273
- let closed = false;
274
- const onAbort = () => {
275
- void teardown();
276
- };
277
- opts.signal?.addEventListener("abort", onAbort, { once: true });
278
- async function teardown() {
279
- if (closed) return;
280
- closed = true;
281
- opts.signal?.removeEventListener("abort", onAbort);
282
- const iter = iterRef.current;
283
- iterRef.current = null;
284
- if (iter) {
285
- try {
286
- await iter.close();
287
- } catch {
288
- }
289
- }
290
- }
291
- if (opts.signal?.aborted) {
292
- void teardown();
293
- return { unsubscribe() {
294
- } };
295
- }
296
- (async () => {
297
- try {
298
- const iter = await consumer.consume();
299
- if (closed) {
300
- try {
301
- await iter.close();
302
- } catch {
303
- }
304
- return;
305
- }
306
- iterRef.current = iter;
307
- for await (const msg of iter) {
308
- if (closed) break;
309
- try {
310
- await onMessage(msg);
311
- } catch (e) {
312
- emitStatus({ status: "error", data: e });
313
- }
314
- }
315
- } catch (e) {
316
- if (!closed) emitStatus({ status: "error", data: e });
317
- }
318
- })().catch((e) => emitStatus({ status: "error", data: e }));
319
- return {
320
- unsubscribe() {
321
- void teardown();
322
- }
323
- };
324
- }
325
- function onStatus(listener) {
326
- statusListeners.add(listener);
327
- return () => statusListeners.delete(listener);
328
- }
329
- return {
330
- connect,
331
- close,
332
- isConnected,
333
- publishBytes,
334
- publishString,
335
- publishJson,
336
- requestBytes,
337
- requestString,
338
- requestJson,
339
- subscribeBytes,
340
- subscribeString,
341
- subscribeJson,
342
- subscribeJetStreamOrdered,
343
- onStatus
344
- };
345
- }
346
3
 
347
- exports.createNatsClient = createNatsClient;
348
- //# sourceMappingURL=index.cjs.map
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ var _chunkOZ3GH6OQcjs = require('../chunk-OZ3GH6OQ.cjs');
16
+ require('../chunk-VRHGVLSL.cjs');
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ exports.NATS_DEFAULTS = _chunkOZ3GH6OQcjs.NATS_DEFAULTS; exports.NatsProvider = _chunkOZ3GH6OQcjs.NatsProvider; exports.acquireClient = _chunkOZ3GH6OQcjs.acquireClient; exports.createNatsClient = _chunkOZ3GH6OQcjs.createNatsClient; exports.getSharedConnection = _chunkOZ3GH6OQcjs.getSharedConnection; exports.getSharedConnectionFor = _chunkOZ3GH6OQcjs.getSharedConnectionFor; exports.releaseClient = _chunkOZ3GH6OQcjs.releaseClient; exports.startConnectionLifecycle = _chunkOZ3GH6OQcjs.startConnectionLifecycle; exports.useNats = _chunkOZ3GH6OQcjs.useNats; exports.useNatsJsonSubscription = _chunkOZ3GH6OQcjs.useNatsJsonSubscription; exports.useNatsSubscription = _chunkOZ3GH6OQcjs.useNatsSubscription; exports.useOptionalNats = _chunkOZ3GH6OQcjs.useOptionalNats;
349
31
  //# sourceMappingURL=index.cjs.map
@@ -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 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
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/nats/index.cjs"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,2vBAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/nats/index.cjs"}
@@ -1,2 +1,5 @@
1
1
  export * from './nats';
2
+ export * from './shared-connection';
3
+ export * from './nats-provider';
4
+ export * from './use-nats-subscription';
2
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nats/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nats/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA"}