@fatagnus/dink-web 2.22.0 → 2.23.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.
package/dist/client.d.ts CHANGED
@@ -1,13 +1,16 @@
1
- import type { DinkWebConfig, ServiceCaller, Subscription, ConnectionStatus, ConnectionStats } from './types.js';
1
+ import type { DinkWebConfig, ServiceCaller, StreamSubscription, StreamOptions, ConnectionStatus, ConnectionStats, EdgeInfo, Channel, ChannelOptions } from './types.js';
2
2
  /**
3
3
  * DinkWebClient connects to dinkd via NATS WebSocket from the browser.
4
4
  * Implements ServiceCaller so generated client code works unchanged.
5
5
  *
6
6
  * Features:
7
+ * - Correct inbox-based streaming protocol (matches Node.js SDK)
7
8
  * - Auto token refresh before expiry (requires tokenRefresher config)
8
9
  * - Connection quality monitoring (RTT, reconnect count)
9
10
  * - Automatic reconnection (built into nats.ws)
10
11
  * - Center and edge service calls
12
+ * - Raw binary subscription mode for high-throughput streams
13
+ * - Edge discovery from the browser
11
14
  */
12
15
  export declare class DinkWebClient implements ServiceCaller {
13
16
  private nc;
@@ -35,10 +38,49 @@ export declare class DinkWebClient implements ServiceCaller {
35
38
  */
36
39
  callCenter<Req, Resp>(service: string, method: string, req: Req): Promise<Resp>;
37
40
  /**
38
- * Subscribe to a streaming edge service.
39
- * Subject: edge.{appId}.{edgeId}.services.{service}.{method}.stream
41
+ * Subscribe to a streaming edge service using the correct inbox-based protocol.
42
+ *
43
+ * Protocol:
44
+ * 1. Create a unique inbox subject
45
+ * 2. Subscribe to inbox (data) and inbox.done (completion)
46
+ * 3. Send { reply_subject, data } envelope via request to the .stream subject
47
+ * 4. Edge acks with { status, cancelSubject }
48
+ * 5. Edge publishes stream data to the inbox, then inbox.done when finished
49
+ * 6. On cancel/unsubscribe, publish to cancelSubject to abort the stream
40
50
  */
41
- subscribe<Req, Resp>(edgeId: string, service: string, method: string, req: Req, handler: (resp: Resp) => void): Promise<Subscription>;
51
+ subscribe<Req, Resp>(edgeId: string, service: string, method: string, req: Req, handler: (resp: Resp) => void, options?: StreamOptions): Promise<StreamSubscription>;
52
+ /**
53
+ * Subscribe to a streaming edge service in raw binary mode.
54
+ * Skips JSON encode/decode — handler receives raw Uint8Array payloads.
55
+ * Ideal for high-throughput binary streams (PTY output, file transfers).
56
+ *
57
+ * Uses the same inbox-based streaming protocol as subscribe().
58
+ */
59
+ subscribeRaw(edgeId: string, service: string, method: string, req: unknown, handler: (data: Uint8Array) => void, options?: StreamOptions): Promise<StreamSubscription>;
60
+ /**
61
+ * Open a bidirectional raw byte channel to an edge service.
62
+ * Returns a Channel object for sending/receiving raw Uint8Array data.
63
+ *
64
+ * Protocol:
65
+ * 1. Create two unique inbox subjects (output for receiving, input for sending)
66
+ * 2. Subscribe to output inbox (data) and output inbox.done (completion)
67
+ * 3. Send { reply_subject, input_subject, data } envelope via request to .channel subject
68
+ * 4. Edge acks with { status, cancelSubject }
69
+ * 5. Bidirectional raw byte flow over the two inboxes
70
+ * 6. Either side can close: client publishes to cancelSubject, edge publishes to outputInbox.done
71
+ */
72
+ openChannel(edgeId: string, service: string, method: string, request?: unknown, options?: ChannelOptions): Promise<Channel>;
73
+ /**
74
+ * Discover edges in the current app.
75
+ * Subject: center.{appId}.edges.discover
76
+ *
77
+ * This is a convenience for browser apps that need to find edges
78
+ * without a Convex backend intermediary.
79
+ */
80
+ discoverEdges(filter?: {
81
+ labels?: Record<string, string>;
82
+ service?: string;
83
+ }): Promise<EdgeInfo[]>;
42
84
  /**
43
85
  * Create a typed service client for an edge.
44
86
  * Usage: const svc = client.service('edge-1', MyServiceClient);
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEf,MAAM,YAAY,CAAC;AAKpB;;;;;;;;;GASG;AACH,qBAAa,aAAc,YAAW,aAAa;IAClD,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,MAAM,CAA2E;IACzF,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAA+C;gBAEvD,MAAM,EAAE,aAAa;IAQjC,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,oCAAoC;IACpC,IAAI,KAAK,IAAI,eAAe,CAO3B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,IAAI,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACN,OAAO,CAAC,IAAI,CAAC;IAUhB;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,IAAI,EACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACN,OAAO,CAAC,IAAI,CAAC;IAUhB;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC3B,OAAO,CAAC,YAAY,CAAC;IAyBxB;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,CAAC,GAAG,CAAC;IAMxF,OAAO,CAAC,oBAAoB;YAiBd,YAAY;IAwC1B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;CAGd"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,eAAe,EAEf,QAAQ,EACR,OAAO,EACP,cAAc,EACd,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,aAAa;IAClD,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,MAAM,CAA2E;IACzF,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAA+C;gBAEvD,MAAM,EAAE,aAAa;IAQjC,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,oCAAoC;IACpC,IAAI,KAAK,IAAI,eAAe,CAO3B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,IAAI,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACN,OAAO,CAAC,IAAI,CAAC;IAUhB;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,IAAI,EACzB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACN,OAAO,CAAC,IAAI,CAAC;IAUhB;;;;;;;;;;OAUG;IACG,SAAS,CAAC,GAAG,EAAE,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAC7B,OAAO,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC;IAgG9B;;;;;;OAMG;IACG,YAAY,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,EACnC,OAAO,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC;IA0E9B;;;;;;;;;;;OAWG;IACG,WAAW,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC;IAuHnB;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,CAAC,EAAE;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUvB;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,CAAC,GAAG,CAAC;IAMxF,OAAO,CAAC,oBAAoB;YAiBd,YAAY;IAwC1B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;CAGd"}
package/dist/client.js CHANGED
@@ -1,15 +1,19 @@
1
- import { connect } from 'nats.ws';
1
+ import { connect, createInbox } from 'nats.ws';
2
2
  const DEFAULT_TIMEOUT = 30_000;
3
3
  const DEFAULT_REFRESH_BEFORE_EXPIRY_MS = 60_000; // 1 minute before expiry
4
+ const DEFAULT_MAX_PAYLOAD = 1_048_576; // 1MB, NATS default max payload
4
5
  /**
5
6
  * DinkWebClient connects to dinkd via NATS WebSocket from the browser.
6
7
  * Implements ServiceCaller so generated client code works unchanged.
7
8
  *
8
9
  * Features:
10
+ * - Correct inbox-based streaming protocol (matches Node.js SDK)
9
11
  * - Auto token refresh before expiry (requires tokenRefresher config)
10
12
  * - Connection quality monitoring (RTT, reconnect count)
11
13
  * - Automatic reconnection (built into nats.ws)
12
14
  * - Center and edge service calls
15
+ * - Raw binary subscription mode for high-throughput streams
16
+ * - Edge discovery from the browser
13
17
  */
14
18
  export class DinkWebClient {
15
19
  nc = null;
@@ -93,31 +97,312 @@ export class DinkWebClient {
93
97
  return this.decode(msg);
94
98
  }
95
99
  /**
96
- * Subscribe to a streaming edge service.
97
- * Subject: edge.{appId}.{edgeId}.services.{service}.{method}.stream
100
+ * Subscribe to a streaming edge service using the correct inbox-based protocol.
101
+ *
102
+ * Protocol:
103
+ * 1. Create a unique inbox subject
104
+ * 2. Subscribe to inbox (data) and inbox.done (completion)
105
+ * 3. Send { reply_subject, data } envelope via request to the .stream subject
106
+ * 4. Edge acks with { status, cancelSubject }
107
+ * 5. Edge publishes stream data to the inbox, then inbox.done when finished
108
+ * 6. On cancel/unsubscribe, publish to cancelSubject to abort the stream
98
109
  */
99
- async subscribe(edgeId, service, method, req, handler) {
110
+ async subscribe(edgeId, service, method, req, handler, options) {
100
111
  this.ensureConnected();
101
- const subject = `edge.${this.config.appId}.${edgeId}.services.${service}.${method}.stream`;
102
- const inbox = this.nc.subscribe(subject);
103
- const payload = this.encode(req);
104
- this.nc.publish(subject, payload);
105
- (async () => {
106
- for await (const msg of inbox) {
112
+ const nc = this.nc;
113
+ const replySubject = createInbox();
114
+ let dataSub = null;
115
+ let doneSub = null;
116
+ let unsubscribed = false;
117
+ let cancelSubject;
118
+ const cleanup = () => {
119
+ if (unsubscribed)
120
+ return;
121
+ unsubscribed = true;
122
+ dataSub?.unsubscribe();
123
+ doneSub?.unsubscribe();
124
+ };
125
+ const cancel = () => {
126
+ if (cancelSubject && !unsubscribed) {
127
+ try {
128
+ nc.publish(cancelSubject, this.encode({}));
129
+ }
130
+ catch {
131
+ /* connection may be closed */
132
+ }
133
+ }
134
+ cleanup();
135
+ };
136
+ // Subscribe to data messages on the inbox
137
+ dataSub = nc.subscribe(replySubject, {
138
+ callback: (err, msg) => {
139
+ if (err || unsubscribed)
140
+ return;
107
141
  try {
108
- const resp = this.decode(msg);
142
+ const rawResp = JSON.parse(new TextDecoder().decode(msg.data));
143
+ // Check for error response from edge
144
+ if (rawResp.success === false && rawResp.error) {
145
+ options?.onError?.(new Error(rawResp.error.message));
146
+ cleanup();
147
+ return;
148
+ }
149
+ // Unwrap the result field (edge wraps responses in { result: ... })
150
+ const resp = rawResp.result !== undefined ? rawResp.result : rawResp;
109
151
  handler(resp);
110
152
  }
153
+ catch (e) {
154
+ options?.onError?.(e instanceof Error ? e : new Error(String(e)));
155
+ cleanup();
156
+ }
157
+ },
158
+ });
159
+ // Subscribe to the .done signal
160
+ doneSub = nc.subscribe(`${replySubject}.done`, {
161
+ callback: () => {
162
+ options?.onDone?.();
163
+ cleanup();
164
+ },
165
+ });
166
+ // Build the stream request envelope (matches Node.js SDK protocol)
167
+ const streamReq = {
168
+ reply_subject: replySubject,
169
+ data: req,
170
+ };
171
+ const subject = `edge.${this.config.appId}.${edgeId}.services.${service}.${method}.stream`;
172
+ try {
173
+ const ackMsg = await nc.request(subject, this.encode(streamReq), {
174
+ timeout: this.config.timeout ?? DEFAULT_TIMEOUT,
175
+ });
176
+ // Extract the cancel subject from the edge's ack response
177
+ try {
178
+ const ack = JSON.parse(new TextDecoder().decode(ackMsg.data));
179
+ cancelSubject = ack.cancelSubject;
180
+ }
181
+ catch {
182
+ /* backwards compatible — older edges may not send structured ack */
183
+ }
184
+ }
185
+ catch (err) {
186
+ // Request failed (timeout, no responders, etc.) — clean up subs
187
+ cleanup();
188
+ throw err;
189
+ }
190
+ return { unsubscribe: cancel, cancel };
191
+ }
192
+ /**
193
+ * Subscribe to a streaming edge service in raw binary mode.
194
+ * Skips JSON encode/decode — handler receives raw Uint8Array payloads.
195
+ * Ideal for high-throughput binary streams (PTY output, file transfers).
196
+ *
197
+ * Uses the same inbox-based streaming protocol as subscribe().
198
+ */
199
+ async subscribeRaw(edgeId, service, method, req, handler, options) {
200
+ this.ensureConnected();
201
+ const nc = this.nc;
202
+ const replySubject = createInbox();
203
+ let dataSub = null;
204
+ let doneSub = null;
205
+ let unsubscribed = false;
206
+ let cancelSubject;
207
+ const cleanup = () => {
208
+ if (unsubscribed)
209
+ return;
210
+ unsubscribed = true;
211
+ dataSub?.unsubscribe();
212
+ doneSub?.unsubscribe();
213
+ };
214
+ const cancel = () => {
215
+ if (cancelSubject && !unsubscribed) {
216
+ try {
217
+ nc.publish(cancelSubject, this.encode({}));
218
+ }
111
219
  catch {
112
- // Skip malformed messages
220
+ /* connection may be closed */
113
221
  }
114
222
  }
115
- })().catch(() => { });
116
- return {
117
- unsubscribe: () => {
118
- inbox.unsubscribe();
223
+ cleanup();
224
+ };
225
+ // Subscribe to raw data on the inbox — no JSON parsing
226
+ dataSub = nc.subscribe(replySubject, {
227
+ callback: (err, msg) => {
228
+ if (err || unsubscribed)
229
+ return;
230
+ if (msg.data) {
231
+ handler(msg.data);
232
+ }
233
+ },
234
+ });
235
+ // Subscribe to the .done signal
236
+ doneSub = nc.subscribe(`${replySubject}.done`, {
237
+ callback: () => {
238
+ options?.onDone?.();
239
+ cleanup();
240
+ },
241
+ });
242
+ const streamReq = {
243
+ reply_subject: replySubject,
244
+ data: req,
245
+ };
246
+ const subject = `edge.${this.config.appId}.${edgeId}.services.${service}.${method}.stream`;
247
+ try {
248
+ const ackMsg = await nc.request(subject, this.encode(streamReq), {
249
+ timeout: this.config.timeout ?? DEFAULT_TIMEOUT,
250
+ });
251
+ try {
252
+ const ack = JSON.parse(new TextDecoder().decode(ackMsg.data));
253
+ cancelSubject = ack.cancelSubject;
254
+ }
255
+ catch {
256
+ /* backwards compatible */
257
+ }
258
+ }
259
+ catch (err) {
260
+ cleanup();
261
+ throw err;
262
+ }
263
+ return { unsubscribe: cancel, cancel };
264
+ }
265
+ /**
266
+ * Open a bidirectional raw byte channel to an edge service.
267
+ * Returns a Channel object for sending/receiving raw Uint8Array data.
268
+ *
269
+ * Protocol:
270
+ * 1. Create two unique inbox subjects (output for receiving, input for sending)
271
+ * 2. Subscribe to output inbox (data) and output inbox.done (completion)
272
+ * 3. Send { reply_subject, input_subject, data } envelope via request to .channel subject
273
+ * 4. Edge acks with { status, cancelSubject }
274
+ * 5. Bidirectional raw byte flow over the two inboxes
275
+ * 6. Either side can close: client publishes to cancelSubject, edge publishes to outputInbox.done
276
+ */
277
+ async openChannel(edgeId, service, method, request, options) {
278
+ this.ensureConnected();
279
+ const nc = this.nc;
280
+ const outputInbox = createInbox();
281
+ const inputInbox = createInbox();
282
+ let closed = false;
283
+ let cancelSubject;
284
+ const dataHandlers = [];
285
+ const closeHandlers = [];
286
+ const cleanup = (reason) => {
287
+ if (closed)
288
+ return;
289
+ closed = true;
290
+ dataSub?.unsubscribe();
291
+ doneSub?.unsubscribe();
292
+ for (const h of closeHandlers) {
293
+ try {
294
+ h(reason);
295
+ }
296
+ catch {
297
+ /* ignore handler errors */
298
+ }
299
+ }
300
+ };
301
+ // Subscribe to incoming data from edge
302
+ const dataSub = nc.subscribe(outputInbox, {
303
+ callback: (err, msg) => {
304
+ if (err || closed)
305
+ return;
306
+ if (msg.data) {
307
+ for (const h of dataHandlers) {
308
+ try {
309
+ h(msg.data);
310
+ }
311
+ catch (e) {
312
+ options?.onError?.(e instanceof Error ? e : new Error(String(e)));
313
+ }
314
+ }
315
+ }
316
+ },
317
+ });
318
+ // Subscribe to done signal from edge
319
+ const doneSub = nc.subscribe(`${outputInbox}.done`, {
320
+ callback: (_err, msg) => {
321
+ let reason;
322
+ if (msg.data?.length) {
323
+ try {
324
+ const parsed = JSON.parse(new TextDecoder().decode(msg.data));
325
+ reason = parsed.reason;
326
+ }
327
+ catch {
328
+ /* ignore parse errors */
329
+ }
330
+ }
331
+ cleanup(reason);
332
+ },
333
+ });
334
+ // Build handshake request
335
+ const channelReq = {
336
+ reply_subject: outputInbox,
337
+ input_subject: inputInbox,
338
+ data: request ?? {},
339
+ };
340
+ const subject = `edge.${this.config.appId}.${edgeId}.services.${service}.${method}.channel`;
341
+ try {
342
+ const ackMsg = await nc.request(subject, this.encode(channelReq), {
343
+ timeout: this.config.timeout ?? DEFAULT_TIMEOUT,
344
+ });
345
+ try {
346
+ const ack = JSON.parse(new TextDecoder().decode(ackMsg.data));
347
+ cancelSubject = ack.cancelSubject;
348
+ }
349
+ catch {
350
+ /* backwards compatible */
351
+ }
352
+ }
353
+ catch (err) {
354
+ cleanup();
355
+ throw err;
356
+ }
357
+ const channel = {
358
+ write(data) {
359
+ if (closed)
360
+ throw new Error('Channel is closed');
361
+ if (data.byteLength > DEFAULT_MAX_PAYLOAD) {
362
+ throw new Error(`Channel write: payload size ${data.byteLength} exceeds max ${DEFAULT_MAX_PAYLOAD} bytes`);
363
+ }
364
+ nc.publish(inputInbox, data);
365
+ },
366
+ onData(handler) {
367
+ dataHandlers.push(handler);
368
+ },
369
+ close() {
370
+ if (closed)
371
+ return;
372
+ if (cancelSubject) {
373
+ try {
374
+ nc.publish(cancelSubject, new Uint8Array());
375
+ }
376
+ catch {
377
+ /* connection may be closed */
378
+ }
379
+ }
380
+ cleanup('client closed');
381
+ },
382
+ onClose(handler) {
383
+ closeHandlers.push(handler);
384
+ },
385
+ get isOpen() {
386
+ return !closed;
119
387
  },
120
388
  };
389
+ return channel;
390
+ }
391
+ /**
392
+ * Discover edges in the current app.
393
+ * Subject: center.{appId}.edges.discover
394
+ *
395
+ * This is a convenience for browser apps that need to find edges
396
+ * without a Convex backend intermediary.
397
+ */
398
+ async discoverEdges(filter) {
399
+ this.ensureConnected();
400
+ const subject = `center.${this.config.appId}.edges.discover`;
401
+ const msg = await this.nc.request(subject, this.encode(filter ?? {}), {
402
+ timeout: this.config.timeout ?? DEFAULT_TIMEOUT,
403
+ });
404
+ const resp = this.decode(msg);
405
+ return resp.edges ?? [];
121
406
  }
122
407
  /**
123
408
  * Create a typed service client for an edge.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiC,MAAM,SAAS,CAAC;AAUjE,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,gCAAgC,GAAG,MAAM,CAAC,CAAC,yBAAyB;AAE1E;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IACjB,EAAE,GAA0B,IAAI,CAAC;IACjC,MAAM,CAA2E;IACjF,OAAO,GAAqB,YAAY,CAAC;IACzC,eAAe,GAAG,CAAC,CAAC;IACpB,MAAM,GAAkB,IAAI,CAAC;IAC7B,eAAe,GAAgB,IAAI,CAAC;IACpC,aAAa,GAAyC,IAAI,CAAC;IAC3D,YAAY,GAA0C,IAAI,CAAC;IAEnE,YAAY,MAAqB;QAChC,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe;gBACnB,MAAM,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK;QACR,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,cAAc,EAAE,IAAI,CAAC,eAAe;SACpC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC7B,IAAI,CAAC;YACJ,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC;gBACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;gBACxB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,oBAAoB,EAAE,CAAC,CAAC;gBACxB,iBAAiB,EAAE,IAAI;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAE5B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CACT,MAAc,EACd,OAAe,EACf,MAAc,EACd,GAAQ;QAER,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,aAAa,OAAO,IAAI,MAAM,EAAE,CAAC;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE;YACpD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe;SAC/C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAO,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACf,OAAe,EACf,MAAc,EACd,GAAQ;QAER,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,aAAa,OAAO,IAAI,MAAM,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE;YACpD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,eAAe;SAC/C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAO,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACd,MAAc,EACd,OAAe,EACf,MAAc,EACd,GAAQ,EACR,OAA6B;QAE7B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,aAAa,OAAO,IAAI,MAAM,SAAS,CAAC;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,EAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnC,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACJ,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAO,GAAG,CAAC,CAAC;oBACpC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACR,0BAA0B;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErB,OAAO;YACN,WAAW,EAAE,GAAG,EAAE;gBACjB,KAAK,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;SACD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO,CAAI,MAAc,EAAE,OAAyD;QACnF,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,mEAAmE;IAE3D,oBAAoB;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAEjE,MAAM,eAAe,GACpB,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,gCAAgC,CAAC;QACvE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClE,MAAM,cAAc,GAAG,aAAa,GAAG,eAAe,CAAC;QAEvD,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;YACzB,oDAAoD;YACpD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5E,CAAC;IAEO,KAAK,CAAC,YAAY;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;YAAE,OAAO;QAExC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAqB,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAClE,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEjD,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,KAAK,WAAW,CAAC;YAClD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YAC/B,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC;oBACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;oBACxB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;oBACxB,oBAAoB,EAAE,CAAC,CAAC;oBACxB,iBAAiB,EAAE,IAAI;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACR,iCAAiC;YACjC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;QACpE,CAAC;IACF,CAAC;IAED,mEAAmE;IAE3D,aAAa;QACpB,kEAAkE;QAClE,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW;gBAAE,OAAO;YACrD,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,CAAC;QACF,CAAC,CAAC;QAEF,gBAAgB;QAChB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,mEAAmE;IAE3D,aAAa;QACpB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QACrB,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAG,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,cAAc;wBAClB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;wBAC/B,MAAM;oBACP,KAAK,WAAW;wBACf,IAAI,CAAC,eAAe,EAAE,CAAC;wBACvB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBAC5B,MAAM;oBACP,KAAK,YAAY,CAAC;oBAClB,KAAK,OAAO;wBACX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;wBACxB,MAAM;gBACR,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtB,CAAC;IAEO,UAAU;QACjB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAEO,SAAS,CAAC,MAAwB;QACzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEO,eAAe;QACtB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;IACF,CAAC;IAEO,MAAM,CAAC,IAAa;QAC3B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,MAAM,CAAI,GAAQ;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAM,CAAC;IAC5D,CAAC;CACD"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { DinkWebClient } from './client.js';
2
- export type { DinkWebConfig, ServiceCaller, Subscription, ServiceDefinition, ConnectionStatus, ConnectionStats, WebTokenResponse, TokenRefresher, } from './types.js';
2
+ export type { DinkWebConfig, ServiceCaller, Subscription, StreamSubscription, StreamOptions, ServiceDefinition, ConnectionStatus, ConnectionStats, WebTokenResponse, TokenRefresher, EdgeInfo, Channel, ChannelOptions, } from './types.js';
3
+ export { DinkWebProvider, useDinkWeb, useDinkService, useChannel, type DinkWebProviderProps, type UseChannelOptions } from './react.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,GACd,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,OAAO,EACP,cAAc,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  // @fatagnus/dink-web - Browser SDK for Dink edge mesh via NATS WebSocket
2
2
  export { DinkWebClient } from './client.js';
3
+ export { DinkWebProvider, useDinkWeb, useDinkService, useChannel } from './react.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiB5C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAqD,MAAM,YAAY,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * React hooks for DinkWebClient.
3
+ *
4
+ * Provides DinkWebProvider for connection lifecycle management,
5
+ * useDinkWeb for accessing client + status, and useDinkService
6
+ * for typed service client access with auto-edge binding.
7
+ *
8
+ * @module @fatagnus/dink-web/react
9
+ */
10
+ import { type ReactNode } from 'react';
11
+ import { DinkWebClient } from './client.js';
12
+ import type { ConnectionStatus, ConnectionStats, ServiceCaller, TokenRefresher, Channel, ChannelOptions } from './types.js';
13
+ interface DinkWebContextValue {
14
+ client: DinkWebClient | null;
15
+ status: ConnectionStatus;
16
+ stats: ConnectionStats;
17
+ }
18
+ export interface DinkWebProviderProps {
19
+ /** WebSocket URL (e.g., "wss://host:9222") */
20
+ url: string;
21
+ /** Authentication token */
22
+ token: string;
23
+ /** Token expiry (ISO string or Date) */
24
+ expiresAt?: string | Date;
25
+ /** App ID for subject routing */
26
+ appId: string;
27
+ /** Request timeout in ms */
28
+ timeout?: number;
29
+ /** Callback to fetch a fresh token before expiry */
30
+ tokenRefresher?: TokenRefresher;
31
+ /** Ms before expiry to trigger refresh (default: 60000) */
32
+ refreshBeforeExpiryMs?: number;
33
+ children: ReactNode;
34
+ }
35
+ /**
36
+ * Provider that manages DinkWebClient lifecycle.
37
+ * Creates and connects the client on mount, drains on unmount.
38
+ * Reconnects when url/token/appId change.
39
+ */
40
+ export declare function DinkWebProvider({ url, token, expiresAt, appId, timeout, tokenRefresher, refreshBeforeExpiryMs, children, }: DinkWebProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<DinkWebContextValue | null>>;
41
+ /**
42
+ * Access the DinkWebClient instance, connection status, and stats.
43
+ *
44
+ * @throws Error if used outside DinkWebProvider
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * function StatusBar() {
49
+ * const { client, status, stats } = useDinkWeb();
50
+ * return <div>Status: {status}, RTT: {stats.rttMs}ms</div>;
51
+ * }
52
+ * ```
53
+ */
54
+ export declare function useDinkWeb(): DinkWebContextValue;
55
+ /**
56
+ * Get a typed service client bound to a specific edge.
57
+ * Memoized — returns the same instance as long as edgeId and client don't change.
58
+ *
59
+ * @param edgeId - Edge to bind the service client to
60
+ * @param factory - Generated service client class (e.g., TerminalServiceClient)
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * function Terminal({ edgeId }: { edgeId: string }) {
65
+ * const svc = useDinkService(edgeId, TerminalServiceClient);
66
+ * // svc.StreamOutput(...), svc.SendInput(...), etc.
67
+ * }
68
+ * ```
69
+ */
70
+ export declare function useDinkService<T>(edgeId: string, factory: new (edgeId: string, caller: ServiceCaller) => T): T | null;
71
+ /**
72
+ * Options for the useChannel hook.
73
+ */
74
+ export interface UseChannelOptions extends ChannelOptions {
75
+ /** If false, the channel will not be opened. Default: true. */
76
+ enabled?: boolean;
77
+ }
78
+ /**
79
+ * Open a bidirectional raw byte channel to an edge service.
80
+ * Manages channel lifecycle — opens on mount/deps change, closes on unmount.
81
+ *
82
+ * @param edgeId - Edge to connect to
83
+ * @param service - Service name
84
+ * @param method - Method name
85
+ * @param request - Initial request payload
86
+ * @param options - Channel options
87
+ *
88
+ * @example
89
+ * ```tsx
90
+ * function Terminal({ edgeId }: { edgeId: string }) {
91
+ * const { channel, isOpen, error } = useChannel(
92
+ * edgeId, 'TerminalService', 'shell',
93
+ * { shell: '/bin/bash', cols: 80, rows: 24 }
94
+ * );
95
+ *
96
+ * useEffect(() => {
97
+ * if (!channel) return;
98
+ * channel.onData((data) => term.write(data));
99
+ * }, [channel]);
100
+ * }
101
+ * ```
102
+ */
103
+ export declare function useChannel(edgeId: string, service: string, method: string, request?: unknown, options?: UseChannelOptions): {
104
+ channel: Channel | null;
105
+ isOpen: boolean;
106
+ error: Error | null;
107
+ };
108
+ export {};
109
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAON,KAAK,SAAS,EAEd,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EACX,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,OAAO,EACP,cAAc,EACd,MAAM,YAAY,CAAC;AAIpB,UAAU,mBAAmB;IAC5B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;CACvB;AAMD,MAAM,WAAW,oBAAoB;IACpC,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,SAAS,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC/B,GAAG,EACH,KAAK,EACL,SAAS,EACT,KAAK,EACL,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,QAAQ,GACR,EAAE,oBAAoB,uGA4DtB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,IAAI,mBAAmB,CAMhD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,CAAC,GACvD,CAAC,GAAG,IAAI,CAOV;AAKD;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACxD,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE,iBAAiB,GACzB;IAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAwDnE"}
package/dist/react.js ADDED
@@ -0,0 +1,191 @@
1
+ /**
2
+ * React hooks for DinkWebClient.
3
+ *
4
+ * Provides DinkWebProvider for connection lifecycle management,
5
+ * useDinkWeb for accessing client + status, and useDinkService
6
+ * for typed service client access with auto-edge binding.
7
+ *
8
+ * @module @fatagnus/dink-web/react
9
+ */
10
+ import { createContext, useContext, useEffect, useRef, useState, useMemo, createElement, } from 'react';
11
+ import { DinkWebClient } from './client.js';
12
+ const DinkWebContext = createContext(null);
13
+ /**
14
+ * Provider that manages DinkWebClient lifecycle.
15
+ * Creates and connects the client on mount, drains on unmount.
16
+ * Reconnects when url/token/appId change.
17
+ */
18
+ export function DinkWebProvider({ url, token, expiresAt, appId, timeout, tokenRefresher, refreshBeforeExpiryMs, children, }) {
19
+ const [status, setStatus] = useState('connecting');
20
+ const [stats, setStats] = useState({
21
+ status: 'connecting',
22
+ reconnectCount: 0,
23
+ rttMs: null,
24
+ tokenExpiresAt: null,
25
+ });
26
+ const clientRef = useRef(null);
27
+ useEffect(() => {
28
+ const client = new DinkWebClient({
29
+ url,
30
+ token,
31
+ expiresAt,
32
+ appId,
33
+ timeout,
34
+ tokenRefresher,
35
+ refreshBeforeExpiryMs,
36
+ onStatusChange: (s) => {
37
+ setStatus(s);
38
+ },
39
+ });
40
+ clientRef.current = client;
41
+ client
42
+ .connect()
43
+ .then(() => {
44
+ setStatus(client.status);
45
+ setStats(client.stats);
46
+ })
47
+ .catch(() => {
48
+ setStatus('error');
49
+ });
50
+ // Poll stats while connected (RTT updates every 30s anyway)
51
+ const statsInterval = setInterval(() => {
52
+ if (clientRef.current) {
53
+ setStats(clientRef.current.stats);
54
+ }
55
+ }, 5000);
56
+ return () => {
57
+ clearInterval(statsInterval);
58
+ clientRef.current = null;
59
+ client.close().catch(() => { });
60
+ };
61
+ }, [url, token, appId]); // Reconnect on identity change
62
+ const value = useMemo(() => ({
63
+ client: clientRef.current,
64
+ status,
65
+ stats,
66
+ }), [status, stats]);
67
+ return createElement(DinkWebContext.Provider, { value }, children);
68
+ }
69
+ // ── Hooks ───────────────────────────────────────────────────────────
70
+ /**
71
+ * Access the DinkWebClient instance, connection status, and stats.
72
+ *
73
+ * @throws Error if used outside DinkWebProvider
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * function StatusBar() {
78
+ * const { client, status, stats } = useDinkWeb();
79
+ * return <div>Status: {status}, RTT: {stats.rttMs}ms</div>;
80
+ * }
81
+ * ```
82
+ */
83
+ export function useDinkWeb() {
84
+ const ctx = useContext(DinkWebContext);
85
+ if (!ctx) {
86
+ throw new Error('useDinkWeb must be used within a <DinkWebProvider>');
87
+ }
88
+ return ctx;
89
+ }
90
+ /**
91
+ * Get a typed service client bound to a specific edge.
92
+ * Memoized — returns the same instance as long as edgeId and client don't change.
93
+ *
94
+ * @param edgeId - Edge to bind the service client to
95
+ * @param factory - Generated service client class (e.g., TerminalServiceClient)
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * function Terminal({ edgeId }: { edgeId: string }) {
100
+ * const svc = useDinkService(edgeId, TerminalServiceClient);
101
+ * // svc.StreamOutput(...), svc.SendInput(...), etc.
102
+ * }
103
+ * ```
104
+ */
105
+ export function useDinkService(edgeId, factory) {
106
+ const { client } = useDinkWeb();
107
+ return useMemo(() => {
108
+ if (!client)
109
+ return null;
110
+ return client.service(edgeId, factory);
111
+ }, [client, edgeId, factory]);
112
+ }
113
+ /**
114
+ * Open a bidirectional raw byte channel to an edge service.
115
+ * Manages channel lifecycle — opens on mount/deps change, closes on unmount.
116
+ *
117
+ * @param edgeId - Edge to connect to
118
+ * @param service - Service name
119
+ * @param method - Method name
120
+ * @param request - Initial request payload
121
+ * @param options - Channel options
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * function Terminal({ edgeId }: { edgeId: string }) {
126
+ * const { channel, isOpen, error } = useChannel(
127
+ * edgeId, 'TerminalService', 'shell',
128
+ * { shell: '/bin/bash', cols: 80, rows: 24 }
129
+ * );
130
+ *
131
+ * useEffect(() => {
132
+ * if (!channel) return;
133
+ * channel.onData((data) => term.write(data));
134
+ * }, [channel]);
135
+ * }
136
+ * ```
137
+ */
138
+ export function useChannel(edgeId, service, method, request, options) {
139
+ const { client } = useDinkWeb();
140
+ const [channel, setChannel] = useState(null);
141
+ const [isOpen, setIsOpen] = useState(false);
142
+ const [error, setError] = useState(null);
143
+ const requestRef = useRef(request);
144
+ requestRef.current = request;
145
+ const enabled = options?.enabled !== false;
146
+ useEffect(() => {
147
+ if (!client || !enabled)
148
+ return;
149
+ let cancelled = false;
150
+ let ch = null;
151
+ client
152
+ .openChannel(edgeId, service, method, requestRef.current, {
153
+ onError: (err) => {
154
+ if (!cancelled)
155
+ setError(err);
156
+ options?.onError?.(err);
157
+ },
158
+ })
159
+ .then((channel) => {
160
+ if (cancelled) {
161
+ channel.close();
162
+ return;
163
+ }
164
+ ch = channel;
165
+ setChannel(channel);
166
+ setIsOpen(true);
167
+ setError(null);
168
+ channel.onClose(() => {
169
+ if (!cancelled) {
170
+ setIsOpen(false);
171
+ setChannel(null);
172
+ }
173
+ });
174
+ })
175
+ .catch((err) => {
176
+ if (!cancelled) {
177
+ setError(err instanceof Error ? err : new Error(String(err)));
178
+ setIsOpen(false);
179
+ }
180
+ });
181
+ return () => {
182
+ cancelled = true;
183
+ if (ch)
184
+ ch.close();
185
+ setChannel(null);
186
+ setIsOpen(false);
187
+ };
188
+ }, [client, edgeId, service, method, enabled]);
189
+ return { channel, isOpen, error };
190
+ }
191
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,11 +1,28 @@
1
1
  export interface ServiceCaller {
2
2
  call<Req, Resp>(edgeId: string, service: string, method: string, req: Req): Promise<Resp>;
3
3
  callCenter<Req, Resp>(service: string, method: string, req: Req): Promise<Resp>;
4
- subscribe<Req, Resp>(edgeId: string, service: string, method: string, req: Req, handler: (resp: Resp) => void): Promise<Subscription>;
4
+ subscribe<Req, Resp>(edgeId: string, service: string, method: string, req: Req, handler: (resp: Resp) => void, options?: StreamOptions): Promise<StreamSubscription>;
5
5
  }
6
6
  export interface Subscription {
7
7
  unsubscribe(): void;
8
8
  }
9
+ /**
10
+ * Extended subscription handle for streaming RPCs.
11
+ * Supports cancellation and lifecycle callbacks.
12
+ */
13
+ export interface StreamSubscription extends Subscription {
14
+ /** Send a cancel signal to the edge to abort the stream. */
15
+ cancel(): void;
16
+ }
17
+ /**
18
+ * Options for streaming RPC subscriptions.
19
+ */
20
+ export interface StreamOptions {
21
+ /** Called when the stream completes normally. */
22
+ onDone?: () => void;
23
+ /** Called when the stream encounters an error. */
24
+ onError?: (err: Error) => void;
25
+ }
9
26
  export interface ServiceDefinition {
10
27
  name: string;
11
28
  version: string;
@@ -57,4 +74,30 @@ export interface ConnectionStats {
57
74
  tokenExpiresAt: Date | null;
58
75
  }
59
76
  export type ConnectionStatus = 'connecting' | 'connected' | 'reconnecting' | 'closed' | 'error';
77
+ /** Discovered edge information */
78
+ export interface EdgeInfo {
79
+ edgeId: string;
80
+ name?: string;
81
+ labels?: Record<string, string>;
82
+ services?: string[];
83
+ status?: string;
84
+ }
85
+ /** Bidirectional raw byte channel between browser and edge. */
86
+ export interface Channel {
87
+ /** Send raw bytes to the other side */
88
+ write(data: Uint8Array): void;
89
+ /** Register handler for incoming raw bytes */
90
+ onData(handler: (data: Uint8Array) => void): void;
91
+ /** Close the channel (either side can initiate) */
92
+ close(): void;
93
+ /** Called when the channel closes (by either side) */
94
+ onClose(handler: (reason?: string) => void): void;
95
+ /** True if channel is open */
96
+ readonly isOpen: boolean;
97
+ }
98
+ /** Options for opening a channel. */
99
+ export interface ChannelOptions {
100
+ /** Called when the channel encounters an error. */
101
+ onError?: (err: Error) => void;
102
+ }
60
103
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC7B,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE,IAAI,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC3B,OAAO,CAAC,YAAY,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,WAAW,IAAI,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC7B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,gCAAgC;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC7B,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE,IAAI,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAC7B,OAAO,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC5B,WAAW,IAAI,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD,4DAA4D;IAC5D,MAAM,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC7B,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,gCAAgC;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhG,kCAAkC;AAClC,MAAM,WAAW,QAAQ;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,OAAO;IACvB,uCAAuC;IACvC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAClD,mDAAmD;IACnD,KAAK,IAAI,IAAI,CAAC;IACd,sDAAsD;IACtD,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAClD,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC9B,mDAAmD;IACnD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fatagnus/dink-web",
3
- "version": "2.22.0",
3
+ "version": "2.23.0",
4
4
  "description": "Browser SDK for Dink edge mesh platform via NATS WebSocket",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,6 +10,10 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
12
  },
13
+ "./react": {
14
+ "types": "./dist/react.d.ts",
15
+ "import": "./dist/react.js"
16
+ },
13
17
  "./types": {
14
18
  "types": "./dist/types.d.ts",
15
19
  "import": "./dist/types.js"
@@ -17,6 +21,9 @@
17
21
  },
18
22
  "typesVersions": {
19
23
  "*": {
24
+ "react": [
25
+ "dist/react.d.ts"
26
+ ],
20
27
  "types": [
21
28
  "dist/types.d.ts"
22
29
  ]
@@ -48,6 +55,14 @@
48
55
  "bugs": {
49
56
  "url": "https://github.com/ozanturksever/dink/issues"
50
57
  },
58
+ "peerDependencies": {
59
+ "react": ">=18.0.0"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "react": {
63
+ "optional": true
64
+ }
65
+ },
51
66
  "publishConfig": {
52
67
  "access": "public"
53
68
  },
@@ -57,6 +72,7 @@
57
72
  },
58
73
  "devDependencies": {
59
74
  "@types/node": "^20.10.0",
75
+ "@types/react": "^19.2.14",
60
76
  "typescript": "^5.3.0"
61
77
  },
62
78
  "engines": {