@calimero-network/mero-js 1.0.2 → 1.2.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.
Files changed (57) hide show
  1. package/dist/admin-api/admin-client.d.ts +29 -27
  2. package/dist/admin-api/admin-client.d.ts.map +1 -1
  3. package/dist/admin-api/admin-client.js +70 -58
  4. package/dist/admin-api/admin-client.js.map +1 -1
  5. package/dist/admin-api/admin-types.d.ts +57 -159
  6. package/dist/admin-api/admin-types.d.ts.map +1 -1
  7. package/dist/admin-api/admin-types.js +1 -1
  8. package/dist/admin-api/admin-types.js.map +1 -1
  9. package/dist/auth/index.d.ts +26 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +51 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/events/index.d.ts +5 -0
  14. package/dist/events/index.d.ts.map +1 -0
  15. package/dist/events/index.js +3 -0
  16. package/dist/events/index.js.map +1 -0
  17. package/dist/events/sse.d.ts +41 -0
  18. package/dist/events/sse.d.ts.map +1 -0
  19. package/dist/events/sse.js +237 -0
  20. package/dist/events/sse.js.map +1 -0
  21. package/dist/events/ws.d.ts +42 -0
  22. package/dist/events/ws.d.ts.map +1 -0
  23. package/dist/events/ws.js +178 -0
  24. package/dist/events/ws.js.map +1 -0
  25. package/dist/http-client/http-factory.d.ts +18 -0
  26. package/dist/http-client/http-factory.d.ts.map +1 -1
  27. package/dist/http-client/http-factory.js +2 -0
  28. package/dist/http-client/http-factory.js.map +1 -1
  29. package/dist/http-client/http-types.d.ts +6 -0
  30. package/dist/http-client/http-types.d.ts.map +1 -1
  31. package/dist/http-client/web-client.d.ts +2 -0
  32. package/dist/http-client/web-client.d.ts.map +1 -1
  33. package/dist/http-client/web-client.js +129 -58
  34. package/dist/http-client/web-client.js.map +1 -1
  35. package/dist/index.browser.mjs +2 -1
  36. package/dist/index.browser.mjs.map +4 -4
  37. package/dist/index.cjs +784 -148
  38. package/dist/index.cjs.map +4 -4
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +8 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +784 -148
  44. package/dist/index.mjs.map +4 -4
  45. package/dist/mero-js.d.ts +47 -1
  46. package/dist/mero-js.d.ts.map +1 -1
  47. package/dist/mero-js.js +132 -16
  48. package/dist/mero-js.js.map +1 -1
  49. package/dist/rpc/index.d.ts +21 -0
  50. package/dist/rpc/index.d.ts.map +1 -0
  51. package/dist/rpc/index.js +39 -0
  52. package/dist/rpc/index.js.map +1 -0
  53. package/dist/token-store/index.d.ts +20 -0
  54. package/dist/token-store/index.d.ts.map +1 -0
  55. package/dist/token-store/index.js +62 -0
  56. package/dist/token-store/index.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Parse an auth callback URL hash fragment.
3
+ * Returns null if access_token is missing.
4
+ */
5
+ export function parseAuthCallback(url) {
6
+ try {
7
+ const hashIndex = url.indexOf('#');
8
+ if (hashIndex === -1)
9
+ return null;
10
+ const hash = url.substring(hashIndex + 1);
11
+ const params = new URLSearchParams(hash);
12
+ const accessToken = params.get('access_token');
13
+ if (!accessToken)
14
+ return null;
15
+ return {
16
+ accessToken,
17
+ refreshToken: params.get('refresh_token') ?? '',
18
+ applicationId: params.get('application_id') ?? '',
19
+ contextId: params.get('context_id') ?? '',
20
+ contextIdentity: params.get('context_identity') ?? '',
21
+ nodeUrl: params.get('node_url') ?? '',
22
+ };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ /**
29
+ * Build the auth login URL for redirecting users to the node's auth page.
30
+ */
31
+ export function buildAuthLoginUrl(nodeUrl, opts) {
32
+ const params = new URLSearchParams();
33
+ params.set('callback-url', opts.callbackUrl);
34
+ if (opts.permissions && opts.permissions.length > 0) {
35
+ params.set('permissions', opts.permissions.join(','));
36
+ }
37
+ params.set('mode', opts.mode);
38
+ if (opts.packageName) {
39
+ params.set('package-name', opts.packageName);
40
+ if (opts.packageVersion) {
41
+ params.set('package-version', opts.packageVersion);
42
+ }
43
+ if (opts.registryUrl) {
44
+ params.set('registry-url', opts.registryUrl);
45
+ }
46
+ }
47
+ // Trim trailing slash from nodeUrl
48
+ const base = nodeUrl.replace(/\/+$/, '');
49
+ return `${base}/auth/login?${params.toString()}`;
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI;QACF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAE9B,OAAO;YACL,WAAW;YACX,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE;YAC/C,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;YACjD,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE;YACzC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;YACrD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;SACtC,CAAC;KACH;IAAC,MAAM;QACN,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAsB;IACvE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QACnD,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KACvD;IAED,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,IAAI,CAAC,WAAW,EAAE;QACpB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;SACpD;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SAC9C;KACF;IAED,mCAAmC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,IAAI,eAAe,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { SseClient } from './sse';
2
+ export type { SseEventData } from './sse';
3
+ export { WsClient } from './ws';
4
+ export type { WsEventData } from './ws';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { SseClient } from './sse';
2
+ export { WsClient } from './ws';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface SseEventData {
2
+ contextId: string;
3
+ data: unknown;
4
+ }
5
+ type SseEventHandler = (event: SseEventData) => void;
6
+ type SseConnectHandler = (sessionId: string) => void;
7
+ type SseErrorHandler = (error: Error) => void;
8
+ export declare class SseClient {
9
+ private baseUrl;
10
+ private getAuthToken;
11
+ private reconnectDelayMs;
12
+ private sessionId;
13
+ private abortController;
14
+ private reconnectTimer;
15
+ private subscribedContextIds;
16
+ private closed;
17
+ private listeners;
18
+ constructor(opts: {
19
+ baseUrl: string;
20
+ getAuthToken: () => Promise<string>;
21
+ reconnectDelayMs?: number;
22
+ });
23
+ on(event: 'connect', handler: SseConnectHandler): void;
24
+ on(event: 'event', handler: SseEventHandler): void;
25
+ on(event: 'error', handler: SseErrorHandler): void;
26
+ off(event: 'connect', handler: SseConnectHandler): void;
27
+ off(event: 'event', handler: SseEventHandler): void;
28
+ off(event: 'error', handler: SseErrorHandler): void;
29
+ private emit;
30
+ connect(): Promise<void>;
31
+ private readStream;
32
+ private handleMessage;
33
+ subscribe(contextIds: string[]): Promise<void>;
34
+ unsubscribe(contextIds: string[]): Promise<void>;
35
+ private sendSubscription;
36
+ private forceReconnect;
37
+ private scheduleReconnect;
38
+ close(): void;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/events/sse.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AACrD,KAAK,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;AACrD,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAQ9C,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuD;gBAE5D,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAMD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IACtD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAClD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAUlD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IACvD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IACnD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAWnD,OAAO,CAAC,IAAI;IAiBN,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAwChB,UAAU;IA6CxB,OAAO,CAAC,aAAa;IAuCf,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAUxC,gBAAgB;IAuB9B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,iBAAiB;IAWzB,KAAK,IAAI,IAAI;CAad"}
@@ -0,0 +1,237 @@
1
+ export class SseClient {
2
+ constructor(opts) {
3
+ this.sessionId = null;
4
+ this.abortController = null;
5
+ this.reconnectTimer = null;
6
+ this.subscribedContextIds = new Set();
7
+ this.closed = false;
8
+ this.listeners = { connect: [], event: [], error: [] };
9
+ this.baseUrl = opts.baseUrl.replace(/\/+$/, '');
10
+ this.getAuthToken = opts.getAuthToken;
11
+ this.reconnectDelayMs = opts.reconnectDelayMs ?? 3000;
12
+ }
13
+ on(event, handler) {
14
+ const key = event;
15
+ if (key in this.listeners) {
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ const arr = this.listeners[key];
18
+ if (!arr.includes(handler))
19
+ arr.push(handler);
20
+ }
21
+ }
22
+ off(event, handler) {
23
+ const key = event;
24
+ if (key in this.listeners) {
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ const arr = this.listeners[key];
27
+ const idx = arr.indexOf(handler);
28
+ if (idx !== -1)
29
+ arr.splice(idx, 1);
30
+ }
31
+ }
32
+ emit(event, arg) {
33
+ const key = event;
34
+ if (key in this.listeners) {
35
+ for (const handler of this.listeners[key]) {
36
+ try {
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ handler(arg);
39
+ }
40
+ catch {
41
+ // Swallow handler errors
42
+ }
43
+ }
44
+ }
45
+ }
46
+ async connect() {
47
+ // Already connected — don't reconnect
48
+ if (this.abortController && !this.closed) {
49
+ return;
50
+ }
51
+ this.closed = false;
52
+ this.abortController = new AbortController();
53
+ try {
54
+ const token = await this.getAuthToken();
55
+ const response = await fetch(`${this.baseUrl}/sse`, {
56
+ headers: {
57
+ 'Authorization': `Bearer ${token}`,
58
+ 'Accept': 'text/event-stream',
59
+ },
60
+ signal: this.abortController.signal,
61
+ });
62
+ if (!response.ok) {
63
+ throw new Error(`SSE connection failed: ${response.status}`);
64
+ }
65
+ if (!response.body) {
66
+ throw new Error('SSE response has no body');
67
+ }
68
+ this.readStream(response.body).catch((err) => {
69
+ if (this.closed)
70
+ return;
71
+ const error = err instanceof Error ? err : new Error(String(err));
72
+ this.emit('error', error);
73
+ this.scheduleReconnect();
74
+ });
75
+ }
76
+ catch (err) {
77
+ if (this.closed)
78
+ return;
79
+ const error = err instanceof Error ? err : new Error(String(err));
80
+ this.emit('error', error);
81
+ this.scheduleReconnect();
82
+ }
83
+ }
84
+ async readStream(body) {
85
+ const reader = body.getReader();
86
+ const decoder = new TextDecoder();
87
+ let buffer = '';
88
+ try {
89
+ for (;;) {
90
+ const { done, value } = await reader.read();
91
+ if (done)
92
+ break;
93
+ buffer += decoder.decode(value, { stream: true });
94
+ const lines = buffer.split('\n');
95
+ // Keep the last partial line in the buffer
96
+ buffer = lines.pop() ?? '';
97
+ for (const line of lines) {
98
+ if (line.startsWith('data:')) {
99
+ const jsonStr = line.slice(5).trim();
100
+ if (jsonStr) {
101
+ this.handleMessage(jsonStr);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // Flush remaining bytes from the decoder
107
+ buffer += decoder.decode();
108
+ if (buffer.startsWith('data:')) {
109
+ const jsonStr = buffer.slice(5).trim();
110
+ if (jsonStr) {
111
+ this.handleMessage(jsonStr);
112
+ }
113
+ }
114
+ }
115
+ catch (err) {
116
+ if (this.closed)
117
+ return;
118
+ const error = err instanceof Error ? err : new Error(String(err));
119
+ this.emit('error', error);
120
+ }
121
+ // Stream ended, reconnect
122
+ if (!this.closed) {
123
+ this.scheduleReconnect();
124
+ }
125
+ }
126
+ handleMessage(jsonStr) {
127
+ try {
128
+ const msg = JSON.parse(jsonStr);
129
+ // Connection message
130
+ if (msg.type === 'connect' && msg.session_id) {
131
+ this.sessionId = msg.session_id;
132
+ this.emit('connect', msg.session_id);
133
+ // Re-subscribe after reconnect
134
+ if (this.subscribedContextIds.size > 0) {
135
+ this.sendSubscription('subscribe', [...this.subscribedContextIds]);
136
+ }
137
+ return;
138
+ }
139
+ // Context event message
140
+ if (msg.result && msg.result.contextId) {
141
+ let eventData = msg.result.data;
142
+ // Decode byte-array data if needed
143
+ if (Array.isArray(eventData)) {
144
+ try {
145
+ const bytes = new Uint8Array(eventData);
146
+ const text = new TextDecoder().decode(bytes);
147
+ eventData = JSON.parse(text);
148
+ }
149
+ catch {
150
+ // Keep raw data
151
+ }
152
+ }
153
+ this.emit('event', {
154
+ contextId: msg.result.contextId,
155
+ data: eventData,
156
+ });
157
+ }
158
+ }
159
+ catch {
160
+ // Invalid JSON, ignore
161
+ }
162
+ }
163
+ async subscribe(contextIds) {
164
+ const newIds = contextIds.filter(id => !this.subscribedContextIds.has(id));
165
+ for (const id of contextIds) {
166
+ this.subscribedContextIds.add(id);
167
+ }
168
+ if (newIds.length > 0 && this.sessionId) {
169
+ await this.sendSubscription('subscribe', newIds);
170
+ }
171
+ }
172
+ async unsubscribe(contextIds) {
173
+ const hadIds = contextIds.filter(id => this.subscribedContextIds.has(id));
174
+ for (const id of contextIds) {
175
+ this.subscribedContextIds.delete(id);
176
+ }
177
+ if (hadIds.length > 0 && this.sessionId) {
178
+ await this.sendSubscription('unsubscribe', hadIds);
179
+ }
180
+ }
181
+ async sendSubscription(method, contextIds) {
182
+ try {
183
+ const token = await this.getAuthToken();
184
+ const response = await fetch(`${this.baseUrl}/sse/subscription`, {
185
+ method: 'POST',
186
+ headers: {
187
+ 'Authorization': `Bearer ${token}`,
188
+ 'Content-Type': 'application/json',
189
+ },
190
+ body: JSON.stringify({
191
+ id: this.sessionId,
192
+ method,
193
+ params: { contextIds },
194
+ }),
195
+ });
196
+ if (!response.ok) {
197
+ this.emit('error', new Error(`SSE ${method} failed: ${response.status}`));
198
+ }
199
+ }
200
+ catch (err) {
201
+ this.emit('error', err instanceof Error ? err : new Error(`SSE ${method} failed`));
202
+ }
203
+ }
204
+ forceReconnect() {
205
+ if (this.abortController) {
206
+ this.abortController.abort();
207
+ this.abortController = null;
208
+ }
209
+ this.sessionId = null;
210
+ this.connect();
211
+ }
212
+ scheduleReconnect() {
213
+ if (this.closed)
214
+ return;
215
+ if (this.reconnectTimer) {
216
+ clearTimeout(this.reconnectTimer);
217
+ }
218
+ this.reconnectTimer = setTimeout(() => {
219
+ this.reconnectTimer = null;
220
+ this.forceReconnect();
221
+ }, this.reconnectDelayMs);
222
+ }
223
+ close() {
224
+ this.closed = true;
225
+ if (this.abortController) {
226
+ this.abortController.abort();
227
+ this.abortController = null;
228
+ }
229
+ if (this.reconnectTimer) {
230
+ clearTimeout(this.reconnectTimer);
231
+ this.reconnectTimer = null;
232
+ }
233
+ this.sessionId = null;
234
+ this.subscribedContextIds.clear();
235
+ }
236
+ }
237
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/events/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface WsEventData {
2
+ contextId: string;
3
+ data: unknown;
4
+ }
5
+ type WsEventHandler = (event: WsEventData) => void;
6
+ type WsConnectHandler = () => void;
7
+ type WsErrorHandler = (error: Error) => void;
8
+ /**
9
+ * @experimental WebSocket event client. The SSE client (`SseClient`) is the
10
+ * recommended transport for production — use `MeroJs.events` instead of `MeroJs.ws`.
11
+ */
12
+ export declare class WsClient {
13
+ private baseUrl;
14
+ private getAuthToken;
15
+ private ws;
16
+ private closed;
17
+ private reconnectAttempt;
18
+ private reconnectTimer;
19
+ private subscribedContextIds;
20
+ private listeners;
21
+ private static readonly MAX_BACKOFF_MS;
22
+ constructor(opts: {
23
+ baseUrl: string;
24
+ getAuthToken: () => Promise<string>;
25
+ });
26
+ on(event: 'connect', handler: WsConnectHandler): void;
27
+ on(event: 'event', handler: WsEventHandler): void;
28
+ on(event: 'error', handler: WsErrorHandler): void;
29
+ off(event: 'connect', handler: WsConnectHandler): void;
30
+ off(event: 'event', handler: WsEventHandler): void;
31
+ off(event: 'error', handler: WsErrorHandler): void;
32
+ private emit;
33
+ connect(): Promise<void>;
34
+ private handleMessage;
35
+ subscribe(contextIds: string[]): void;
36
+ unsubscribe(contextIds: string[]): void;
37
+ private sendMessage;
38
+ private scheduleReconnect;
39
+ close(): void;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/events/ws.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AACnD,KAAK,gBAAgB,GAAG,MAAM,IAAI,CAAC;AACnC,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAQ7C;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,SAAS,CAAsD;IAEvE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAEnC,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;KACrC;IAKD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IACrD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IACjD,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAUjD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IACtD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAClD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAWlD,OAAO,CAAC,IAAI;IAiBN,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD9B,OAAO,CAAC,aAAa;IA4BrB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAcrC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAcvC,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,iBAAiB;IAgBzB,KAAK,IAAI,IAAI;CAad"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * @experimental WebSocket event client. The SSE client (`SseClient`) is the
3
+ * recommended transport for production — use `MeroJs.events` instead of `MeroJs.ws`.
4
+ */
5
+ export class WsClient {
6
+ constructor(opts) {
7
+ this.ws = null;
8
+ this.closed = false;
9
+ this.reconnectAttempt = 0;
10
+ this.reconnectTimer = null;
11
+ this.subscribedContextIds = new Set();
12
+ this.listeners = { connect: [], event: [], error: [] };
13
+ this.baseUrl = opts.baseUrl.replace(/\/+$/, '');
14
+ this.getAuthToken = opts.getAuthToken;
15
+ }
16
+ on(event, handler) {
17
+ const key = event;
18
+ if (key in this.listeners) {
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ const arr = this.listeners[key];
21
+ if (!arr.includes(handler))
22
+ arr.push(handler);
23
+ }
24
+ }
25
+ off(event, handler) {
26
+ const key = event;
27
+ if (key in this.listeners) {
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ const arr = this.listeners[key];
30
+ const idx = arr.indexOf(handler);
31
+ if (idx !== -1)
32
+ arr.splice(idx, 1);
33
+ }
34
+ }
35
+ emit(event, arg) {
36
+ const key = event;
37
+ if (key in this.listeners) {
38
+ for (const handler of this.listeners[key]) {
39
+ try {
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ handler(arg);
42
+ }
43
+ catch {
44
+ // Swallow handler errors
45
+ }
46
+ }
47
+ }
48
+ }
49
+ async connect() {
50
+ if (this.ws && (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN)) {
51
+ return;
52
+ }
53
+ this.closed = false;
54
+ try {
55
+ const token = await this.getAuthToken();
56
+ if (!token) {
57
+ throw new Error('No authentication token available for WebSocket connection');
58
+ }
59
+ // Browser WebSocket API can't set headers, use query param
60
+ const wsUrl = this.baseUrl.replace(/^http/, 'ws');
61
+ this.ws = new WebSocket(`${wsUrl}/ws?token=${encodeURIComponent(token)}`);
62
+ this.ws.onopen = () => {
63
+ this.reconnectAttempt = 0;
64
+ this.emit('connect');
65
+ // Re-subscribe on reconnect
66
+ if (this.subscribedContextIds.size > 0) {
67
+ this.sendMessage({
68
+ id: null,
69
+ method: 'subscribe',
70
+ params: { contextIds: [...this.subscribedContextIds] },
71
+ });
72
+ }
73
+ };
74
+ this.ws.onmessage = (event) => {
75
+ this.handleMessage(event.data);
76
+ };
77
+ this.ws.onerror = () => {
78
+ this.emit('error', new Error('WebSocket error'));
79
+ };
80
+ this.ws.onclose = () => {
81
+ if (!this.closed) {
82
+ this.scheduleReconnect();
83
+ }
84
+ };
85
+ }
86
+ catch (err) {
87
+ if (this.closed)
88
+ return;
89
+ const error = err instanceof Error ? err : new Error(String(err));
90
+ this.emit('error', error);
91
+ this.scheduleReconnect();
92
+ }
93
+ }
94
+ handleMessage(raw) {
95
+ if (typeof raw !== 'string')
96
+ return;
97
+ try {
98
+ const msg = JSON.parse(raw);
99
+ if (msg.result && msg.result.contextId) {
100
+ let eventData = msg.result.data;
101
+ if (Array.isArray(eventData)) {
102
+ try {
103
+ const bytes = new Uint8Array(eventData);
104
+ const text = new TextDecoder().decode(bytes);
105
+ eventData = JSON.parse(text);
106
+ }
107
+ catch {
108
+ // Keep raw data
109
+ }
110
+ }
111
+ this.emit('event', {
112
+ contextId: msg.result.contextId,
113
+ data: eventData,
114
+ });
115
+ }
116
+ }
117
+ catch {
118
+ // Invalid JSON, ignore
119
+ }
120
+ }
121
+ subscribe(contextIds) {
122
+ for (const id of contextIds) {
123
+ this.subscribedContextIds.add(id);
124
+ }
125
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
126
+ this.sendMessage({
127
+ id: null,
128
+ method: 'subscribe',
129
+ params: { contextIds },
130
+ });
131
+ }
132
+ }
133
+ unsubscribe(contextIds) {
134
+ for (const id of contextIds) {
135
+ this.subscribedContextIds.delete(id);
136
+ }
137
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
138
+ this.sendMessage({
139
+ id: null,
140
+ method: 'unsubscribe',
141
+ params: { contextIds },
142
+ });
143
+ }
144
+ }
145
+ sendMessage(msg) {
146
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
147
+ this.ws.send(JSON.stringify(msg));
148
+ }
149
+ }
150
+ scheduleReconnect() {
151
+ if (this.closed)
152
+ return;
153
+ if (this.reconnectTimer) {
154
+ clearTimeout(this.reconnectTimer);
155
+ }
156
+ const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempt), WsClient.MAX_BACKOFF_MS);
157
+ this.reconnectAttempt++;
158
+ this.reconnectTimer = setTimeout(() => {
159
+ this.reconnectTimer = null;
160
+ this.connect();
161
+ }, delay);
162
+ }
163
+ close() {
164
+ this.closed = true;
165
+ if (this.reconnectTimer) {
166
+ clearTimeout(this.reconnectTimer);
167
+ this.reconnectTimer = null;
168
+ }
169
+ if (this.ws) {
170
+ this.ws.onclose = null;
171
+ this.ws.close();
172
+ this.ws = null;
173
+ }
174
+ this.subscribedContextIds.clear();
175
+ }
176
+ }
177
+ WsClient.MAX_BACKOFF_MS = 30000;
178
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/events/ws.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@ export declare function createBrowserHttpClient(options: {
4
4
  baseUrl: string;
5
5
  getAuthToken?: () => Promise<string | undefined>;
6
6
  onTokenRefresh?: (newToken: string) => Promise<void>;
7
+ /**
8
+ * Callback to refresh the access token when a 401 error with 'token_expired' is detected.
9
+ * Should return the new access token, or throw an error if refresh fails.
10
+ * If provided, the client will automatically retry the request after a successful refresh.
11
+ */
12
+ refreshToken?: () => Promise<string>;
7
13
  defaultHeaders?: Record<string, string>;
8
14
  timeoutMs?: number;
9
15
  credentials?: RequestCredentials;
@@ -14,6 +20,12 @@ export declare function createNodeHttpClient(options: {
14
20
  fetch?: typeof fetch;
15
21
  getAuthToken?: () => Promise<string | undefined>;
16
22
  onTokenRefresh?: (newToken: string) => Promise<void>;
23
+ /**
24
+ * Callback to refresh the access token when a 401 error with 'token_expired' is detected.
25
+ * Should return the new access token, or throw an error if refresh fails.
26
+ * If provided, the client will automatically retry the request after a successful refresh.
27
+ */
28
+ refreshToken?: () => Promise<string>;
17
29
  defaultHeaders?: Record<string, string>;
18
30
  timeoutMs?: number;
19
31
  credentials?: RequestCredentials;
@@ -24,6 +36,12 @@ export declare function createUniversalHttpClient(options: {
24
36
  fetch?: typeof fetch;
25
37
  getAuthToken?: () => Promise<string | undefined>;
26
38
  onTokenRefresh?: (newToken: string) => Promise<void>;
39
+ /**
40
+ * Callback to refresh the access token when a 401 error with 'token_expired' is detected.
41
+ * Should return the new access token, or throw an error if refresh fails.
42
+ * If provided, the client will automatically retry the request after a successful refresh.
43
+ */
44
+ refreshToken?: () => Promise<string>;
27
45
  defaultHeaders?: Record<string, string>;
28
46
  timeoutMs?: number;
29
47
  credentials?: RequestCredentials;
@@ -1 +1 @@
1
- {"version":3,"file":"http-factory.d.ts","sourceRoot":"","sources":["../../src/http-client/http-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAEjE;AAGD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAeb;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAiCb;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CASb"}
1
+ {"version":3,"file":"http-factory.d.ts","sourceRoot":"","sources":["../../src/http-client/http-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAEjE;AAGD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAgBb;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAkCb;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CASb"}