@memori.ai/memori-react 8.40.3 → 8.41.0

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.
@@ -1,5 +1,6 @@
1
- import { useEffect, useRef } from 'react';
1
+ import { useEffect, useRef, useState } from 'react';
2
2
  import { wsconnect } from '@nats-io/nats-core';
3
+ import { jetstream, DeliverPolicy, } from '@nats-io/jetstream';
3
4
  function readString(raw, camelKey, snakeKey) {
4
5
  var _a;
5
6
  const value = (_a = raw[camelKey]) !== null && _a !== void 0 ? _a : raw[snakeKey];
@@ -57,24 +58,123 @@ export function normalizeNatsEvent(raw) {
57
58
  correlationID,
58
59
  };
59
60
  }
60
- export function useNatsSession(sessionId, natsWsUrl, natsToken, onMessage) {
61
+ function decodeMessage(subject, received, raw, onMessage) {
62
+ const payload = normalizeNatsEvent(raw);
63
+ console.debug(`[NATS] message #${received} on ${subject} (eventType=${payload.eventType})`, payload);
64
+ onMessage(payload);
65
+ }
66
+ async function consumeCoreSubscription(nc, subject, onMessage) {
67
+ const sub = nc.subscribe(subject);
68
+ console.info('[NATS] subscribed to subject', subject);
69
+ let received = 0;
70
+ for await (const msg of sub) {
71
+ received += 1;
72
+ try {
73
+ decodeMessage(subject, received, msg.json(), onMessage);
74
+ }
75
+ catch (err) {
76
+ console.error('[NATS] message decode error', err);
77
+ }
78
+ }
79
+ console.info(`[NATS] subscription on ${subject} closed (received ${received} messages)`);
80
+ }
81
+ async function consumeJetStream(nc, config, subject, mode, onMessage, setConsumerMessages) {
82
+ const js = jetstream(nc);
83
+ const consumer = config.consumer
84
+ ? await js.consumers.get(config.stream, config.consumer)
85
+ : await js.consumers.get(config.stream, {
86
+ filter_subjects: [subject],
87
+ deliver_policy: mode === 'catch-up'
88
+ ? DeliverPolicy.LastPerSubject
89
+ : DeliverPolicy.New,
90
+ });
91
+ console.info('[NATS] JetStream consumer ready', config.consumer
92
+ ? { stream: config.stream, consumer: config.consumer, subject, mode }
93
+ : { stream: config.stream, subject, mode });
94
+ const messages = await consumer.consume();
95
+ setConsumerMessages(messages);
96
+ let received = 0;
97
+ for await (const msg of messages) {
98
+ received += 1;
99
+ try {
100
+ decodeMessage(subject, received, msg.json(), onMessage);
101
+ }
102
+ catch (err) {
103
+ console.error('[NATS] message decode error', err);
104
+ }
105
+ }
106
+ console.info(`[NATS] JetStream consumer on ${subject} closed (received ${received} messages)`);
107
+ }
108
+ function closeNatsSession(consumerMessagesRef, connRef) {
109
+ var _a, _b;
110
+ (_a = consumerMessagesRef.current) === null || _a === void 0 ? void 0 : _a.stop();
111
+ consumerMessagesRef.current = null;
112
+ (_b = connRef.current) === null || _b === void 0 ? void 0 : _b.close();
113
+ connRef.current = null;
114
+ }
115
+ export function useNatsSession(sessionId, config, onMessage) {
61
116
  const connRef = useRef(null);
117
+ const consumerMessagesRef = useRef(null);
62
118
  const onMessageRef = useRef(onMessage);
119
+ const wasHiddenRef = useRef(false);
120
+ const [resumeGeneration, setResumeGeneration] = useState(0);
63
121
  useEffect(() => {
64
122
  onMessageRef.current = onMessage;
65
123
  }, [onMessage]);
66
124
  useEffect(() => {
67
- if (!sessionId || !natsWsUrl || !natsToken) {
68
- console.debug('[NATS] subscription skipped (missing sessionId/url/token)', { sessionId, hasUrl: !!natsWsUrl, hasToken: !!natsToken });
125
+ if (!sessionId || !(config === null || config === void 0 ? void 0 : config.stream)) {
126
+ return;
127
+ }
128
+ const requestResume = () => {
129
+ if (document.visibilityState !== 'visible') {
130
+ return;
131
+ }
132
+ console.info('[NATS] resuming JetStream after visibility/network change');
133
+ setResumeGeneration(generation => generation + 1);
134
+ };
135
+ const onVisibilityChange = () => {
136
+ if (document.visibilityState === 'hidden') {
137
+ wasHiddenRef.current = true;
138
+ return;
139
+ }
140
+ if (wasHiddenRef.current) {
141
+ wasHiddenRef.current = false;
142
+ requestResume();
143
+ }
144
+ };
145
+ const onPageShow = (event) => {
146
+ if (event.persisted) {
147
+ requestResume();
148
+ }
149
+ };
150
+ document.addEventListener('visibilitychange', onVisibilityChange);
151
+ window.addEventListener('online', requestResume);
152
+ window.addEventListener('pageshow', onPageShow);
153
+ return () => {
154
+ document.removeEventListener('visibilitychange', onVisibilityChange);
155
+ window.removeEventListener('online', requestResume);
156
+ window.removeEventListener('pageshow', onPageShow);
157
+ };
158
+ }, [sessionId, config === null || config === void 0 ? void 0 : config.stream]);
159
+ useEffect(() => {
160
+ var _a;
161
+ if (!sessionId || !(config === null || config === void 0 ? void 0 : config.url) || !config.token) {
162
+ console.debug('[NATS] subscription skipped (missing sessionId/url/token)', {
163
+ sessionId,
164
+ hasUrl: !!(config === null || config === void 0 ? void 0 : config.url),
165
+ hasToken: !!(config === null || config === void 0 ? void 0 : config.token),
166
+ });
69
167
  return;
70
168
  }
71
169
  let closed = false;
72
- const subject = sessionId;
170
+ const subject = (_a = config.subject) !== null && _a !== void 0 ? _a : `sessions.${sessionId}`;
171
+ const useJetStream = !!config.stream;
172
+ const jetStreamMode = useJetStream && resumeGeneration > 0 ? 'catch-up' : 'live';
73
173
  (async () => {
74
- console.info('[NATS] connecting to', natsWsUrl, 'for session', sessionId);
174
+ console.info('[NATS] connecting to', config.url, 'for session', sessionId, useJetStream ? `(JetStream/${jetStreamMode})` : '(core)');
75
175
  const nc = await wsconnect({
76
- servers: [natsWsUrl],
77
- token: natsToken,
176
+ servers: [config.url],
177
+ token: config.token,
78
178
  });
79
179
  if (closed) {
80
180
  console.debug('[NATS] connection established after cleanup, closing immediately');
@@ -83,29 +183,26 @@ export function useNatsSession(sessionId, natsWsUrl, natsToken, onMessage) {
83
183
  }
84
184
  connRef.current = nc;
85
185
  console.info('[NATS] connected to', nc.getServer());
86
- const sub = nc.subscribe(subject);
87
- console.info('[NATS] subscribed to subject', subject);
88
- let received = 0;
89
- for await (const msg of sub) {
90
- received += 1;
91
- try {
92
- const payload = normalizeNatsEvent(msg.json());
93
- console.debug(`[NATS] message #${received} on ${subject} (eventType=${payload.eventType})`, payload);
94
- onMessageRef.current(payload);
95
- }
96
- catch (err) {
97
- console.error('[NATS] message decode error', err);
98
- }
186
+ const dispatch = (event) => {
187
+ onMessageRef.current(event);
188
+ };
189
+ if (useJetStream) {
190
+ await consumeJetStream(nc, config, subject, jetStreamMode, dispatch, messages => {
191
+ consumerMessagesRef.current = messages;
192
+ });
193
+ }
194
+ else {
195
+ await consumeCoreSubscription(nc, subject, dispatch);
99
196
  }
100
- console.info(`[NATS] subscription on ${subject} closed (received ${received} messages)`);
101
197
  })().catch(err => console.error('[NATS] connection error', err));
102
198
  return () => {
103
- var _a;
104
199
  console.info('[NATS] cleanup: closing connection for subject', subject);
105
200
  closed = true;
106
- (_a = connRef.current) === null || _a === void 0 ? void 0 : _a.close();
107
- connRef.current = null;
201
+ closeNatsSession(consumerMessagesRef, connRef);
108
202
  };
109
- }, [sessionId, natsWsUrl, natsToken]);
203
+ }, [sessionId, config, resumeGeneration]);
204
+ useEffect(() => {
205
+ setResumeGeneration(0);
206
+ }, [sessionId]);
110
207
  }
111
208
  //# sourceMappingURL=useNatsSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useNatsSession.js","sourceRoot":"","sources":["../../../src/helpers/nats/useNatsSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useNatsSession.js","sourceRoot":"","sources":["../../../src/helpers/nats/useNatsSession.ts"],"names":[],"mappings":"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"}
package/esm/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "8.40.3";
1
+ export declare const version = "8.41.0";
package/esm/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '8.40.3';
1
+ export const version = '8.41.0';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "8.40.3",
2
+ "version": "8.41.0",
3
3
  "name": "@memori.ai/memori-react",
4
4
  "author": "Memori Srl",
5
5
  "main": "dist/index.js",
@@ -294,11 +294,12 @@
294
294
  "dependencies": {
295
295
  "@headlessui/react": "1.7.4",
296
296
  "@memori.ai/memori-api-client": "6.24.1",
297
+ "@nats-io/jetstream": "^3.4.0",
297
298
  "@nats-io/nats-core": "^3.4.0",
298
299
  "@react-three/drei": "8.20.2",
299
300
  "@react-three/fiber": "7.0.25",
300
301
  "classnames": "2.5.1",
301
- "dompurify": "^3.4.0",
302
+ "dompurify": "^3.4.11",
302
303
  "ellipsed": "1.6.0",
303
304
  "i18next": "22.0.6",
304
305
  "katex": "^0.16.11",
@@ -2930,17 +2930,29 @@ const MemoriWidget = ({
2930
2930
  [memoriPwd, memori, memoriTokens, birthDate, sessionId, userLang, position]
2931
2931
  );
2932
2932
 
2933
+ // check if owner has enough credits
2934
+ const needsCredits = tenant?.billingDelegation;
2935
+ const [hasEnoughCredits, setHasEnoughCredits] = useState<boolean>(true);
2936
+
2933
2937
  useEffect(() => {
2934
2938
  if (
2935
2939
  !clickedStart &&
2936
2940
  !sessionStartingRef.current &&
2937
2941
  !sessionId &&
2938
2942
  autoStart &&
2939
- selectedLayout !== 'HIDDEN_CHAT'
2943
+ selectedLayout !== 'HIDDEN_CHAT' &&
2944
+ (!needsCredits || hasEnoughCredits)
2940
2945
  ) {
2941
2946
  onClickStart();
2942
2947
  }
2943
- }, [clickedStart, autoStart, selectedLayout, sessionId]);
2948
+ }, [
2949
+ clickedStart,
2950
+ autoStart,
2951
+ selectedLayout,
2952
+ sessionId,
2953
+ needsCredits,
2954
+ hasEnoughCredits,
2955
+ ]);
2944
2956
 
2945
2957
  useEffect(() => {
2946
2958
  const targetNode =
@@ -3012,9 +3024,6 @@ const MemoriWidget = ({
3012
3024
  !!user?.userID &&
3013
3025
  user?.pAndCUAccepted;
3014
3026
 
3015
- // check if owner has enough credits
3016
- const needsCredits = tenant?.billingDelegation;
3017
- const [hasEnoughCredits, setHasEnoughCredits] = useState<boolean>(true);
3018
3027
  const handleNotEnoughCredits = useCallback(() => {
3019
3028
  setHasEnoughCredits(false);
3020
3029
  setAuthModalState(null);
@@ -9,6 +9,87 @@ export interface NatsConfig {
9
9
  url: string;
10
10
  /** Bearer token used to authenticate the WebSocket connection. */
11
11
  token: string;
12
+ /**
13
+ * JetStream stream that stores session events. When set, the client consumes
14
+ * via JetStream instead of core NATS subscribe.
15
+ */
16
+ stream?: string;
17
+ /**
18
+ * Optional durable consumer name. When omitted, an ordered ephemeral consumer
19
+ * filtered to the session subject is used.
20
+ */
21
+ consumer?: string;
22
+ /**
23
+ * Subject to subscribe or filter on. Defaults to `sessions.<sessionId>` when omitted.
24
+ */
25
+ subject?: string;
26
+ }
27
+
28
+ function readStringField(
29
+ raw: Record<string, unknown>,
30
+ ...keys: string[]
31
+ ): string | undefined {
32
+ for (const key of keys) {
33
+ const value = raw[key];
34
+ if (typeof value === 'string' && value.length > 0) {
35
+ return value;
36
+ }
37
+ }
38
+ return undefined;
39
+ }
40
+
41
+ function readBooleanField(
42
+ raw: Record<string, unknown>,
43
+ ...keys: string[]
44
+ ): boolean | undefined {
45
+ for (const key of keys) {
46
+ const value = raw[key];
47
+ if (typeof value === 'boolean') {
48
+ return value;
49
+ }
50
+ }
51
+ return undefined;
52
+ }
53
+
54
+ /**
55
+ * Normalizes raw `/api/nats` payloads (camelCase or snake_case) into {@link NatsConfig}.
56
+ */
57
+ export function parseNatsConfig(raw: Record<string, unknown>): NatsConfig {
58
+ const url = readStringField(raw, 'url');
59
+ const token = readStringField(raw, 'token');
60
+
61
+ if (!url || !token) {
62
+ throw new Error('Invalid response from NATS config service');
63
+ }
64
+
65
+ const useJetStream = readBooleanField(raw, 'useJetStream', 'use_jetstream');
66
+ const stream = readStringField(raw, 'stream', 'streamName', 'stream_name');
67
+ const consumer = readStringField(
68
+ raw,
69
+ 'consumer',
70
+ 'consumerName',
71
+ 'consumer_name',
72
+ 'durableName',
73
+ 'durable_name'
74
+ );
75
+ const subject = readStringField(
76
+ raw,
77
+ 'subject',
78
+ 'filterSubject',
79
+ 'filter_subject'
80
+ );
81
+
82
+ if (useJetStream && !stream) {
83
+ throw new Error('Invalid response from NATS config service: JetStream enabled but stream missing');
84
+ }
85
+
86
+ return {
87
+ url,
88
+ token,
89
+ ...(stream ? { stream } : {}),
90
+ ...(consumer ? { consumer } : {}),
91
+ ...(subject ? { subject } : {}),
92
+ };
12
93
  }
13
94
 
14
95
  /**
@@ -59,11 +140,6 @@ export async function getNatsConfig(
59
140
  }
60
141
  }
61
142
 
62
- const data = (await response.json()) as Partial<NatsConfig>;
63
-
64
- if (!data.url || !data.token) {
65
- throw new Error('Invalid response from NATS config service');
66
- }
67
-
68
- return { url: data.url, token: data.token };
143
+ const data = (await response.json()) as Record<string, unknown>;
144
+ return parseNatsConfig(data);
69
145
  }
@@ -4,7 +4,7 @@
4
4
  // this hook *receives* asynchronous events on the session channel (progress /
5
5
  // dialog.text_entered_response / error).
6
6
  import { useEffect, useRef, useState, useCallback } from 'react';
7
- import { getNatsConfig } from './getNatsConfig';
7
+ import { getNatsConfig, NatsConfig } from './getNatsConfig';
8
8
  import {
9
9
  useNatsSession,
10
10
  NatsSessionEvent,
@@ -39,9 +39,7 @@ export function useNats({
39
39
  onDialogResponse,
40
40
  onError,
41
41
  }: UseNatsOptions) {
42
- const [config, setConfig] = useState<{ url: string; token: string } | null>(
43
- null
44
- );
42
+ const [config, setConfig] = useState<NatsConfig | null>(null);
45
43
  const [configError, setConfigError] = useState<Error | null>(null);
46
44
 
47
45
  // Keep callbacks in refs so the dispatcher identity stays stable.
@@ -75,7 +73,11 @@ export function useNats({
75
73
  getNatsConfig(baseUrl, sessionId, controller.signal)
76
74
  .then(cfg => {
77
75
  if (!cancelled) {
78
- console.info('[NATS] config received, server url:', cfg.url);
76
+ console.info('[NATS] config received', {
77
+ url: cfg.url,
78
+ jetStream: !!cfg.stream,
79
+ stream: cfg.stream,
80
+ });
79
81
  setConfig(cfg);
80
82
  setConfigError(null);
81
83
  }
@@ -111,7 +113,7 @@ export function useNats({
111
113
  }
112
114
  }, []);
113
115
 
114
- useNatsSession(sessionId, config?.url, config?.token, handleMessage);
116
+ useNatsSession(sessionId, config ?? undefined, handleMessage);
115
117
 
116
118
  return {
117
119
  /** True once connection config has been retrieved. */