@reifydb/react 0.4.2 → 0.4.7

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/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import { Column, SchemaNode, InferSchema } from '@reifydb/core';
2
2
  export * from '@reifydb/core';
3
- import { WsClientOptions, WsClient } from '@reifydb/client';
3
+ import { WsClientOptions, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient } from '@reifydb/client';
4
4
  export * from '@reifydb/client';
5
5
  import React, { ReactNode } from 'react';
6
6
 
7
7
  interface ConnectionState {
8
- client: WsClient | null;
8
+ client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;
9
9
  isConnected: boolean;
10
10
  isConnecting: boolean;
11
11
  connectionError: string | null;
@@ -13,9 +13,12 @@ interface ConnectionState {
13
13
  }
14
14
  interface ConnectionConfig {
15
15
  url?: string;
16
- options?: Omit<WsClientOptions, 'url'>;
16
+ token?: string;
17
+ format?: 'json';
18
+ options?: Omit<WsClientOptions, 'url' | 'token'>;
17
19
  }
18
20
  declare const DEFAULT_CONFIG: ConnectionConfig;
21
+ declare const DEFAULT_URL = "ws://127.0.0.1:8090";
19
22
  declare class Connection {
20
23
  private state;
21
24
  private config;
@@ -25,7 +28,7 @@ declare class Connection {
25
28
  connect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void>;
26
29
  disconnect(): Promise<void>;
27
30
  reconnect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void>;
28
- getClient(): WsClient | null;
31
+ getClient(): WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;
29
32
  isConnected(): boolean;
30
33
  isConnecting(): boolean;
31
34
  getConnectionError(): string | null;
@@ -57,7 +60,7 @@ declare function useConnection(overrideConfig?: ConnectionConfig): {
57
60
  connect: () => Promise<void>;
58
61
  disconnect: () => Promise<void>;
59
62
  reconnect: () => Promise<void>;
60
- client: WsClient | null;
63
+ client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;
61
64
  isConnected: boolean;
62
65
  isConnecting: boolean;
63
66
  connectionError: string | null;
@@ -83,7 +86,7 @@ declare function useQueryExecutor<T = any>(options?: QueryExecutorOptions): {
83
86
  results: QueryResult<T>[] | undefined;
84
87
  error: string | undefined;
85
88
  executionTime: number | undefined;
86
- query: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
89
+ query: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
87
90
  cancelQuery: () => void;
88
91
  };
89
92
 
@@ -121,7 +124,7 @@ declare function useCommandExecutor<T = any>(options?: CommandExecutorOptions):
121
124
  results: CommandResult<T>[] | undefined;
122
125
  error: string | undefined;
123
126
  executionTime: number | undefined;
124
- command: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
127
+ command: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
125
128
  cancelCommand: () => void;
126
129
  };
127
130
 
@@ -159,7 +162,7 @@ declare function useAdminExecutor<T = any>(options?: AdminExecutorOptions): {
159
162
  results: AdminResult<T>[] | undefined;
160
163
  error: string | undefined;
161
164
  executionTime: number | undefined;
162
- admin: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
165
+ admin: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => Promise<void>;
163
166
  cancelAdmin: () => void;
164
167
  };
165
168
 
@@ -223,4 +226,4 @@ interface TableInfo {
223
226
  }
224
227
  declare function useSchema(): [boolean, TableInfo[], string | undefined];
225
228
 
226
- export { type AdminExecutorOptions, type AdminOptions, type AdminResult, type AdminState, type ChangeEvent, type ColumnInfo, type CommandExecutorOptions, type CommandOptions, type CommandResult, type CommandState, Connection, type ConnectionConfig, ConnectionContext, ConnectionProvider, type ConnectionProviderProps, DEFAULT_CONFIG, type QueryExecutorOptions, type QueryOptions, type QueryResult, type QueryState, type SubscriptionExecutorOptions, type SubscriptionOptions, type SubscriptionState, type TableInfo, clearConnection, getConnection, useAdminExecutor, useAdminMany, useAdminOne, useCommandExecutor, useCommandMany, useCommandOne, useConnection, useQueryExecutor, useQueryMany, useQueryOne, useSchema, useSubscription, useSubscriptionExecutor };
229
+ export { type AdminExecutorOptions, type AdminOptions, type AdminResult, type AdminState, type ChangeEvent, type ColumnInfo, type CommandExecutorOptions, type CommandOptions, type CommandResult, type CommandState, Connection, type ConnectionConfig, ConnectionContext, ConnectionProvider, type ConnectionProviderProps, DEFAULT_CONFIG, DEFAULT_URL, type QueryExecutorOptions, type QueryOptions, type QueryResult, type QueryState, type SubscriptionExecutorOptions, type SubscriptionOptions, type SubscriptionState, type TableInfo, clearConnection, getConnection, useAdminExecutor, useAdminMany, useAdminOne, useCommandExecutor, useCommandMany, useCommandOne, useConnection, useQueryExecutor, useQueryMany, useQueryOne, useSchema, useSubscription, useSubscriptionExecutor };
package/dist/index.js CHANGED
@@ -6,12 +6,11 @@ export * from "@reifydb/client";
6
6
  import { Client } from "@reifydb/client";
7
7
  var DEFAULT_CONFIG = {
8
8
  url: "ws://127.0.0.1:8090",
9
- options: {
10
- timeoutMs: 1e3
11
- }
9
+ options: { timeoutMs: 3e4 }
12
10
  };
11
+ var DEFAULT_URL = "ws://127.0.0.1:8090";
13
12
  var Connection = class {
14
- constructor(config) {
13
+ constructor(config = DEFAULT_CONFIG) {
15
14
  this.state = {
16
15
  client: null,
17
16
  isConnected: false,
@@ -22,7 +21,7 @@ var Connection = class {
22
21
  this.config = { ...DEFAULT_CONFIG, ...config };
23
22
  }
24
23
  setConfig(config) {
25
- this.config = { ...DEFAULT_CONFIG, ...config };
24
+ this.config = config;
26
25
  }
27
26
  getConfig() {
28
27
  return this.config;
@@ -32,13 +31,20 @@ var Connection = class {
32
31
  return;
33
32
  }
34
33
  const connectUrl = url || this.config.url || DEFAULT_CONFIG.url;
35
- const connectOptions = { ...this.config.options, ...options };
34
+ const connectOptions = { token: this.config.token, ...this.config.options, ...options };
36
35
  this.updateState({
37
36
  isConnecting: true,
38
37
  connectionError: null
39
38
  });
40
39
  try {
41
- const client = await Client.connect_ws(connectUrl, connectOptions);
40
+ const isHttp = connectUrl.startsWith("http://") || connectUrl.startsWith("https://");
41
+ const isJson = this.config.format === "json";
42
+ let client;
43
+ if (isHttp) {
44
+ client = isJson ? Client.connect_json_http(connectUrl, connectOptions) : Client.connect_http(connectUrl, connectOptions);
45
+ } else {
46
+ client = isJson ? await Client.connect_json_ws(connectUrl, connectOptions) : await Client.connect_ws(connectUrl, connectOptions);
47
+ }
42
48
  this.updateState({
43
49
  client,
44
50
  isConnected: true,
@@ -60,8 +66,10 @@ var Connection = class {
60
66
  async disconnect() {
61
67
  if (this.state.client) {
62
68
  try {
63
- this.state.client.disconnect();
64
- await new Promise((resolve) => setTimeout(resolve, 10));
69
+ if ("disconnect" in this.state.client) {
70
+ this.state.client.disconnect();
71
+ await new Promise((resolve) => setTimeout(resolve, 10));
72
+ }
65
73
  } catch (err) {
66
74
  console.error("Error disconnecting:", err);
67
75
  }
@@ -114,14 +122,14 @@ var Connection = class {
114
122
  // src/connection/connection-pool.ts
115
123
  var defaultConnection = null;
116
124
  function getConnection(config) {
117
- const effectiveConfig = config ? { ...DEFAULT_CONFIG, ...config } : DEFAULT_CONFIG;
118
125
  if (!defaultConnection) {
119
- defaultConnection = new Connection(effectiveConfig);
126
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
127
+ defaultConnection = new Connection(mergedConfig);
120
128
  defaultConnection.connect().catch((err) => {
121
129
  console.error("[ConnectionPool] Eager connect failed:", err);
122
130
  });
123
- } else {
124
- defaultConnection.setConfig(effectiveConfig);
131
+ } else if (config) {
132
+ defaultConnection.setConfig({ ...DEFAULT_CONFIG, ...config });
125
133
  }
126
134
  return defaultConnection;
127
135
  }
@@ -163,7 +171,10 @@ function useConnection(overrideConfig) {
163
171
  if (overrideConfig) {
164
172
  return getConnection(overrideConfig);
165
173
  }
166
- return contextConnection || getConnection();
174
+ if (contextConnection) {
175
+ return contextConnection;
176
+ }
177
+ return getConnection();
167
178
  });
168
179
  const [state, setState] = useState(() => connection.getState());
169
180
  useEffect2(() => {
@@ -197,29 +208,32 @@ function useQueryExecutor(options) {
197
208
  error: void 0,
198
209
  executionTime: void 0
199
210
  });
200
- const abortControllerRef = useRef2(null);
211
+ const clientRef = useRef2(client);
212
+ clientRef.current = client;
201
213
  const isMountedRef = useRef2(true);
202
214
  useEffect3(() => {
203
215
  return () => {
204
216
  isMountedRef.current = false;
205
217
  };
206
218
  }, []);
219
+ const executionIdRef = useRef2(0);
220
+ const pendingRef = useRef2(null);
207
221
  const query = useCallback(
208
222
  (statements, params, schemas) => {
209
- if (abortControllerRef.current) {
210
- abortControllerRef.current.abort();
223
+ const currentClient = clientRef.current;
224
+ if (!currentClient) {
225
+ pendingRef.current = { statements, params, schemas };
226
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
227
+ return Promise.resolve();
211
228
  }
212
- abortControllerRef.current = new AbortController();
213
- setState({
214
- isExecuting: true,
215
- results: void 0,
216
- error: void 0,
217
- executionTime: void 0
218
- });
229
+ pendingRef.current = null;
230
+ const thisExecution = ++executionIdRef.current;
231
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
219
232
  const startTime = Date.now();
220
- (async () => {
233
+ return (async () => {
221
234
  try {
222
- const frameResults = await client?.query(statements, params || null, schemas || []) || [];
235
+ const frameResults = await currentClient.query(statements, params || null, schemas || []) || [];
236
+ if (executionIdRef.current !== thisExecution) return;
223
237
  const executionTime = Date.now() - startTime;
224
238
  const results = frameResults.map((frame) => {
225
239
  if (Array.isArray(frame) && frame.length > 0) {
@@ -233,15 +247,14 @@ function useQueryExecutor(options) {
233
247
  return {
234
248
  name: key,
235
249
  type: dataType,
236
- data: []
250
+ payload: []
237
251
  };
238
252
  });
239
253
  } else {
240
254
  columns = Object.keys(firstRow).map((key) => ({
241
255
  name: key,
242
256
  type: "Utf8",
243
- // Default type for plain objects
244
- data: []
257
+ payload: []
245
258
  }));
246
259
  }
247
260
  return {
@@ -265,6 +278,7 @@ function useQueryExecutor(options) {
265
278
  executionTime
266
279
  });
267
280
  } catch (err) {
281
+ if (executionIdRef.current !== thisExecution) return;
268
282
  const executionTime = Date.now() - startTime;
269
283
  let errorMessage = "Query execution failed";
270
284
  if (err instanceof Error) {
@@ -276,36 +290,36 @@ function useQueryExecutor(options) {
276
290
  }
277
291
  console.error("Query execution failed:", errorMessage);
278
292
  if (!isMountedRef.current) return;
279
- setState({
293
+ setState((prev) => ({
294
+ ...prev,
280
295
  isExecuting: false,
281
- results: void 0,
282
296
  error: errorMessage,
283
297
  executionTime
284
- });
285
- } finally {
286
- abortControllerRef.current = null;
298
+ }));
287
299
  }
288
300
  })();
289
301
  },
290
- [client]
302
+ []
291
303
  );
292
- const cancelQuery = useCallback(() => {
293
- if (abortControllerRef.current) {
294
- abortControllerRef.current.abort();
295
- setState((prev) => ({
296
- ...prev,
297
- isExecuting: false,
298
- error: "Query cancelled"
299
- }));
304
+ useEffect3(() => {
305
+ if (client && pendingRef.current) {
306
+ const { statements, params, schemas } = pendingRef.current;
307
+ query(statements, params, schemas);
300
308
  }
309
+ }, [client, query]);
310
+ const cancelQuery = useCallback(() => {
311
+ executionIdRef.current++;
312
+ setState((prev) => ({
313
+ ...prev,
314
+ isExecuting: false,
315
+ error: "Query cancelled"
316
+ }));
301
317
  }, []);
302
318
  return {
303
- // State
304
319
  isExecuting: state.isExecuting,
305
320
  results: state.results,
306
321
  error: state.error,
307
322
  executionTime: state.executionTime,
308
- // Actions
309
323
  query,
310
324
  cancelQuery
311
325
  };
@@ -352,29 +366,33 @@ function useCommandExecutor(options) {
352
366
  error: void 0,
353
367
  executionTime: void 0
354
368
  });
355
- const abortControllerRef = useRef3(null);
356
- const isMountedRef = useRef3(true);
369
+ const clientRef = useRef3(client);
370
+ clientRef.current = client;
371
+ const isMountedRef = useRef3(false);
357
372
  useEffect5(() => {
373
+ isMountedRef.current = true;
358
374
  return () => {
359
375
  isMountedRef.current = false;
360
376
  };
361
377
  }, []);
378
+ const executionIdRef = useRef3(0);
379
+ const pendingRef = useRef3(null);
362
380
  const command = useCallback2(
363
381
  (statements, params, schemas) => {
364
- if (abortControllerRef.current) {
365
- abortControllerRef.current.abort();
382
+ const currentClient = clientRef.current;
383
+ if (!currentClient) {
384
+ pendingRef.current = { statements, params, schemas };
385
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
386
+ return Promise.resolve();
366
387
  }
367
- abortControllerRef.current = new AbortController();
368
- setState({
369
- isExecuting: true,
370
- results: void 0,
371
- error: void 0,
372
- executionTime: void 0
373
- });
388
+ pendingRef.current = null;
389
+ const thisExecution = ++executionIdRef.current;
390
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
374
391
  const startTime = Date.now();
375
- (async () => {
392
+ return (async () => {
376
393
  try {
377
- const frameResults = await client?.command(statements, params || null, schemas || []) || [];
394
+ const frameResults = await currentClient.command(statements, params || null, schemas || []) || [];
395
+ if (executionIdRef.current !== thisExecution) return;
378
396
  const executionTime = Date.now() - startTime;
379
397
  const results = frameResults.map((frame) => {
380
398
  if (Array.isArray(frame) && frame.length > 0) {
@@ -388,15 +406,14 @@ function useCommandExecutor(options) {
388
406
  return {
389
407
  name: key,
390
408
  type: dataType,
391
- data: []
409
+ payload: []
392
410
  };
393
411
  });
394
412
  } else {
395
413
  columns = Object.keys(firstRow).map((key) => ({
396
414
  name: key,
397
415
  type: "Utf8",
398
- // Default type for plain objects
399
- data: []
416
+ payload: []
400
417
  }));
401
418
  }
402
419
  return {
@@ -421,6 +438,7 @@ function useCommandExecutor(options) {
421
438
  executionTime
422
439
  });
423
440
  } catch (err) {
441
+ if (executionIdRef.current !== thisExecution) return;
424
442
  const executionTime = Date.now() - startTime;
425
443
  let errorMessage = "Command execution failed";
426
444
  if (err instanceof Error) {
@@ -432,36 +450,36 @@ function useCommandExecutor(options) {
432
450
  }
433
451
  console.error("Command execution failed:", errorMessage);
434
452
  if (!isMountedRef.current) return;
435
- setState({
453
+ setState((prev) => ({
454
+ ...prev,
436
455
  isExecuting: false,
437
- results: void 0,
438
456
  error: errorMessage,
439
457
  executionTime
440
- });
441
- } finally {
442
- abortControllerRef.current = null;
458
+ }));
443
459
  }
444
460
  })();
445
461
  },
446
- [client]
462
+ []
447
463
  );
448
- const cancelCommand = useCallback2(() => {
449
- if (abortControllerRef.current) {
450
- abortControllerRef.current.abort();
451
- setState((prev) => ({
452
- ...prev,
453
- isExecuting: false,
454
- error: "Command cancelled"
455
- }));
464
+ useEffect5(() => {
465
+ if (client && pendingRef.current) {
466
+ const { statements, params, schemas } = pendingRef.current;
467
+ command(statements, params, schemas);
456
468
  }
469
+ }, [client, command]);
470
+ const cancelCommand = useCallback2(() => {
471
+ executionIdRef.current++;
472
+ setState((prev) => ({
473
+ ...prev,
474
+ isExecuting: false,
475
+ error: "Command cancelled"
476
+ }));
457
477
  }, []);
458
478
  return {
459
- // State
460
479
  isExecuting: state.isExecuting,
461
480
  results: state.results,
462
481
  error: state.error,
463
482
  executionTime: state.executionTime,
464
- // Actions
465
483
  command,
466
484
  cancelCommand
467
485
  };
@@ -508,29 +526,33 @@ function useAdminExecutor(options) {
508
526
  error: void 0,
509
527
  executionTime: void 0
510
528
  });
511
- const abortControllerRef = useRef4(null);
512
- const isMountedRef = useRef4(true);
529
+ const clientRef = useRef4(client);
530
+ clientRef.current = client;
531
+ const isMountedRef = useRef4(false);
513
532
  useEffect7(() => {
533
+ isMountedRef.current = true;
514
534
  return () => {
515
535
  isMountedRef.current = false;
516
536
  };
517
537
  }, []);
538
+ const executionIdRef = useRef4(0);
539
+ const pendingRef = useRef4(null);
518
540
  const admin = useCallback3(
519
541
  (statements, params, schemas) => {
520
- if (abortControllerRef.current) {
521
- abortControllerRef.current.abort();
542
+ const currentClient = clientRef.current;
543
+ if (!currentClient) {
544
+ pendingRef.current = { statements, params, schemas };
545
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
546
+ return Promise.resolve();
522
547
  }
523
- abortControllerRef.current = new AbortController();
524
- setState({
525
- isExecuting: true,
526
- results: void 0,
527
- error: void 0,
528
- executionTime: void 0
529
- });
548
+ pendingRef.current = null;
549
+ const thisExecution = ++executionIdRef.current;
550
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
530
551
  const startTime = Date.now();
531
- (async () => {
552
+ return (async () => {
532
553
  try {
533
- const frameResults = await client?.admin(statements, params || null, schemas || []) || [];
554
+ const frameResults = await currentClient.admin(statements, params || null, schemas || []) || [];
555
+ if (executionIdRef.current !== thisExecution) return;
534
556
  const executionTime = Date.now() - startTime;
535
557
  const results = frameResults.map((frame) => {
536
558
  if (Array.isArray(frame) && frame.length > 0) {
@@ -544,15 +566,14 @@ function useAdminExecutor(options) {
544
566
  return {
545
567
  name: key,
546
568
  type: dataType,
547
- data: []
569
+ payload: []
548
570
  };
549
571
  });
550
572
  } else {
551
573
  columns = Object.keys(firstRow).map((key) => ({
552
574
  name: key,
553
575
  type: "Utf8",
554
- // Default type for plain objects
555
- data: []
576
+ payload: []
556
577
  }));
557
578
  }
558
579
  return {
@@ -577,6 +598,7 @@ function useAdminExecutor(options) {
577
598
  executionTime
578
599
  });
579
600
  } catch (err) {
601
+ if (executionIdRef.current !== thisExecution) return;
580
602
  const executionTime = Date.now() - startTime;
581
603
  let errorMessage = "Admin execution failed";
582
604
  if (err instanceof Error) {
@@ -588,36 +610,37 @@ function useAdminExecutor(options) {
588
610
  }
589
611
  console.error("Admin execution failed:", errorMessage);
590
612
  if (!isMountedRef.current) return;
591
- setState({
613
+ setState((prev) => ({
614
+ ...prev,
592
615
  isExecuting: false,
593
- results: void 0,
594
616
  error: errorMessage,
595
617
  executionTime
596
- });
597
- } finally {
598
- abortControllerRef.current = null;
618
+ }));
599
619
  }
600
620
  })();
601
621
  },
602
- [client]
622
+ []
623
+ // stable — never recreates
603
624
  );
604
- const cancelAdmin = useCallback3(() => {
605
- if (abortControllerRef.current) {
606
- abortControllerRef.current.abort();
607
- setState((prev) => ({
608
- ...prev,
609
- isExecuting: false,
610
- error: "Admin cancelled"
611
- }));
625
+ useEffect7(() => {
626
+ if (client && pendingRef.current) {
627
+ const { statements, params, schemas } = pendingRef.current;
628
+ admin(statements, params, schemas);
612
629
  }
630
+ }, [client, admin]);
631
+ const cancelAdmin = useCallback3(() => {
632
+ executionIdRef.current++;
633
+ setState((prev) => ({
634
+ ...prev,
635
+ isExecuting: false,
636
+ error: "Admin cancelled"
637
+ }));
613
638
  }, []);
614
639
  return {
615
- // State
616
640
  isExecuting: state.isExecuting,
617
641
  results: state.results,
618
642
  error: state.error,
619
643
  executionTime: state.executionTime,
620
- // Actions
621
644
  admin,
622
645
  cancelAdmin
623
646
  };
@@ -704,6 +727,10 @@ function useSubscriptionExecutor(options) {
704
727
  setState((prev) => ({ ...prev, error: "Client not connected" }));
705
728
  return;
706
729
  }
730
+ if (!("subscribe" in currentClient)) {
731
+ setState((prev) => ({ ...prev, error: "Subscriptions require a WebSocket connection" }));
732
+ return;
733
+ }
707
734
  queryRef.current = query;
708
735
  paramsRef.current = params;
709
736
  schemaRef.current = schema;
@@ -736,6 +763,7 @@ function useSubscriptionExecutor(options) {
736
763
  const unsubscribe = useCallback4(async () => {
737
764
  const currentClient = clientRef.current;
738
765
  if (!currentClient || !subscriptionIdRef.current) return;
766
+ if (!("unsubscribe" in currentClient)) return;
739
767
  try {
740
768
  await currentClient.unsubscribe(subscriptionIdRef.current);
741
769
  subscriptionIdRef.current = void 0;
@@ -762,7 +790,7 @@ function useSubscriptionExecutor(options) {
762
790
  }, []);
763
791
  useEffect9(() => {
764
792
  return () => {
765
- if (subscriptionIdRef.current && clientRef.current) {
793
+ if (subscriptionIdRef.current && clientRef.current && "unsubscribe" in clientRef.current) {
766
794
  clientRef.current.unsubscribe(subscriptionIdRef.current).catch(console.error);
767
795
  }
768
796
  };
@@ -966,6 +994,7 @@ export {
966
994
  ConnectionContext,
967
995
  ConnectionProvider,
968
996
  DEFAULT_CONFIG,
997
+ DEFAULT_URL,
969
998
  clearConnection,
970
999
  getConnection,
971
1000
  useAdminExecutor,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/connection/connection.ts","../src/connection/connection-pool.ts","../src/connection/connection-context.tsx","../src/hooks/use-connection.ts","../src/hooks/use-query-executor.ts","../src/hooks/use-query.ts","../src/hooks/use-command-executor.ts","../src/hooks/use-command.ts","../src/hooks/use-admin-executor.ts","../src/hooks/use-admin.ts","../src/hooks/use-subscription-executor.ts","../src/hooks/use-subscription.ts","../src/hooks/use-schema.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nexport * from '@reifydb/core';\nexport * from '@reifydb/client';\n\n// Export connection utilities\nexport {Connection, type ConnectionConfig, DEFAULT_CONFIG} from './connection/connection';\nexport {getConnection, clearConnection} from './connection/connection-pool';\nexport {ConnectionProvider, ConnectionContext, type ConnectionProviderProps} from './connection/connection-context';\n\n// Export React hooks\nexport {useConnection} from './hooks/use-connection';\nexport {useQueryExecutor, type QueryResult, type QueryState, type QueryExecutorOptions} from './hooks/use-query-executor';\nexport {useQueryOne, useQueryMany, type QueryOptions} from './hooks/use-query';\nexport {useCommandExecutor, type CommandResult, type CommandState, type CommandExecutorOptions} from './hooks/use-command-executor';\nexport {useCommandOne, useCommandMany, type CommandOptions} from './hooks/use-command';\nexport {useAdminExecutor, type AdminResult, type AdminState, type AdminExecutorOptions} from './hooks/use-admin-executor';\nexport {useAdminOne, useAdminMany, type AdminOptions} from './hooks/use-admin';\nexport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type SubscriptionState,\n type ChangeEvent\n} from './hooks/use-subscription-executor';\nexport {\n useSubscription,\n type SubscriptionOptions\n} from './hooks/use-subscription';\nexport {useSchema, type TableInfo, type ColumnInfo} from './hooks/use-schema';","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {Client, WsClient, type WsClientOptions} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n listeners: Set<(state: ConnectionState) => void>;\n}\n\nexport interface ConnectionConfig {\n url?: string;\n options?: Omit<WsClientOptions, 'url'>;\n}\n\nexport const DEFAULT_CONFIG: ConnectionConfig = {\n url: 'ws://127.0.0.1:8090',\n options: {\n timeoutMs: 1000,\n }\n};\n\nexport class Connection {\n private state: ConnectionState = {\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n listeners: new Set(),\n };\n private config: ConnectionConfig;\n\n constructor(config?: ConnectionConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n setConfig(config: ConnectionConfig): void {\n this.config = {...DEFAULT_CONFIG, ...config};\n }\n\n getConfig(): ConnectionConfig {\n return this.config;\n }\n\n async connect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n // Don't connect if already connected or connecting\n if (this.state.isConnected || this.state.isConnecting) {\n return;\n }\n\n const connectUrl = url || this.config.url || DEFAULT_CONFIG.url!;\n const connectOptions = {...this.config.options, ...options};\n\n this.updateState({\n isConnecting: true,\n connectionError: null,\n });\n\n try {\n const client = await Client.connect_ws(connectUrl, connectOptions);\n\n this.updateState({\n client,\n isConnected: true,\n isConnecting: false,\n connectionError: null,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect to ReifyDB';\n console.error('[Connection] Connection failed:', errorMessage, err);\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: errorMessage,\n });\n throw err;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.state.client) {\n try {\n this.state.client.disconnect();\n // Small delay to ensure WebSocket closes cleanly\n await new Promise(resolve => setTimeout(resolve, 10));\n } catch (err) {\n console.error('Error disconnecting:', err);\n }\n }\n\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n });\n }\n\n async reconnect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n await this.disconnect();\n await this.connect(url, options);\n }\n\n getClient(): WsClient | null {\n return this.state.client;\n }\n\n isConnected(): boolean {\n return this.state.isConnected;\n }\n\n isConnecting(): boolean {\n return this.state.isConnecting;\n }\n\n getConnectionError(): string | null {\n return this.state.connectionError;\n }\n\n getState(): Omit<ConnectionState, 'listeners'> {\n const {listeners, ...state} = this.state;\n return state;\n }\n\n // Subscribe to state changes\n subscribe(listener: (state: ConnectionState) => void): () => void {\n this.state.listeners.add(listener);\n // Return unsubscribe function\n return () => {\n this.state.listeners.delete(listener);\n };\n }\n\n private updateState(updates: Partial<ConnectionState>): void {\n this.state = {\n ...this.state,\n ...updates,\n };\n\n // Notify all listeners\n this.state.listeners.forEach(listener => {\n listener(this.state);\n });\n }\n}\n\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { Connection, ConnectionConfig, DEFAULT_CONFIG } from './connection';\n\n/**\n * Singleton default connection instance.\n * This ensures a single global connection that gets reused and updated.\n */\nlet defaultConnection: Connection | null = null;\n\n/**\n * Get the singleton connection instance.\n * If a config is provided, the connection's config will be updated via setConfig().\n * @param config - Optional connection configuration\n * @returns The singleton Connection instance\n */\nexport function getConnection(config?: ConnectionConfig): Connection {\n const effectiveConfig = config ? { ...DEFAULT_CONFIG, ...config } : DEFAULT_CONFIG;\n\n // Create singleton on first call\n if (!defaultConnection) {\n defaultConnection = new Connection(effectiveConfig);\n // Start connection immediately - don't wait for React's useEffect\n defaultConnection.connect().catch(err => {\n console.error('[ConnectionPool] Eager connect failed:', err);\n });\n } else {\n // Update config on existing connection if provided\n defaultConnection.setConfig(effectiveConfig);\n }\n\n return defaultConnection;\n}\n\n/**\n * Clear the singleton connection\n */\nexport async function clearConnection(): Promise<void> {\n if (defaultConnection) {\n await defaultConnection.disconnect();\n defaultConnection = null;\n }\n}","import React, { createContext, useEffect, useRef, ReactNode } from 'react';\nimport { Connection, ConnectionConfig } from './connection';\nimport { getConnection } from './connection-pool';\n\nexport const ConnectionContext = createContext<Connection | null>(null);\n\nexport interface ConnectionProviderProps {\n config?: ConnectionConfig;\n children: ReactNode;\n}\n\nexport function ConnectionProvider({ config, children }: ConnectionProviderProps) {\n // Get the singleton connection - this always returns the same instance\n // but updates its config via setConfig()\n const connection = getConnection(config);\n\n // Track previous config to detect changes\n const prevConfigRef = useRef<string | undefined>(undefined);\n const currentConfigStr = JSON.stringify(config);\n\n useEffect(() => {\n const configChanged = prevConfigRef.current !== undefined &&\n prevConfigRef.current !== currentConfigStr;\n\n if (configChanged && connection.isConnected()) {\n // Config changed while connected - reconnect with new config\n connection.reconnect().catch(err => {\n console.error('[ConnectionProvider] Failed to reconnect:', err);\n });\n } else if (!connection.isConnected() && !connection.isConnecting()) {\n // Auto-connect if not connected\n connection.connect().catch(err => {\n console.error('[ConnectionProvider] Failed to connect:', err);\n });\n }\n\n // Update previous config reference\n prevConfigRef.current = currentConfigStr;\n }, [currentConfigStr, connection]);\n\n return (\n <ConnectionContext.Provider value={connection}>\n {children}\n </ConnectionContext.Provider>\n );\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useContext, useEffect, useState} from 'react';\nimport {ConnectionConfig} from '../connection/connection';\nimport {getConnection} from '../connection/connection-pool';\nimport {ConnectionContext} from '../connection/connection-context';\nimport {WsClient} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n}\n\nexport function useConnection(overrideConfig?: ConnectionConfig) {\n const contextConnection = useContext(ConnectionContext);\n\n // Use override config if provided, otherwise use context, otherwise get default\n const [connection] = useState(() => {\n if (overrideConfig) {\n return getConnection(overrideConfig);\n }\n return contextConnection || getConnection();\n });\n\n const [state, setState] = useState<ConnectionState>(() => connection.getState());\n\n useEffect(() => {\n // Get initial state immediately\n const currentState = connection.getState();\n setState(currentState);\n\n // Subscribe to connection state changes\n const unsubscribe = connection.subscribe((newState) => {\n setState({\n client: newState.client,\n isConnected: newState.isConnected,\n isConnecting: newState.isConnecting,\n connectionError: newState.connectionError,\n });\n });\n\n // No auto-connect - ConnectionProvider handles all auto-connection\n // Users must either wrap with ConnectionProvider or manually call connect()\n\n return unsubscribe;\n }, [connection]);\n\n return {\n ...state,\n connect: () => connection.connect(),\n disconnect: () => connection.disconnect(),\n reconnect: () => connection.reconnect(),\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface QueryResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface QueryState<T = any> {\n isExecuting: boolean;\n results: QueryResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useQueryExecutor<T = any>(options?: QueryExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<QueryState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const query = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): void => {\n // Cancel any ongoing query for THIS instance only\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setState({\n isExecuting: true,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const startTime = Date.now();\n\n (async () => {\n try {\n // Call client.query which returns FrameResults (array of frames)\n const frameResults = await client?.query(statements, params || null, schemas || []) || [];\n\n const executionTime = Date.now() - startTime;\n \n // Process each frame into a QueryResult\n const results: QueryResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n \n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' && \n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n \n if (hasValueObjects) {\n // We have Value objects - extract type info\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n data: [],\n };\n });\n } else {\n // Plain objects from schema conversion\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8', // Default type for plain objects\n data: [],\n }));\n }\n \n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n // Empty result\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Query execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Query execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results: undefined,\n error: errorMessage,\n executionTime,\n });\n } finally {\n abortControllerRef.current = null;\n }\n })();\n },\n [client]\n );\n\n const cancelQuery = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Query cancelled',\n }));\n }\n }, []);\n\n return {\n // State\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n\n // Actions\n query,\n cancelQuery,\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useQueryExecutor, type QueryResult, type QueryExecutorOptions} from './use-query-executor';\n\nexport interface QueryOptions extends QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single query hook - returns a single result\nexport function useQueryOne<S extends SchemaNode = any>(\n rql: string,\n params?: any,\n schema?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n result: QueryResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n query(rql, params, schemas);\n }, [rql, params, query]);\n\n // Extract first result for single query convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple query hook - returns multiple results\nexport function useQueryMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n results: QueryResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n query(statements, params, schemas);\n }, [statements, params, query]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface CommandResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface CommandState<T = any> {\n isExecuting: boolean;\n results: CommandResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useCommandExecutor<T = any>(options?: CommandExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<CommandState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const command = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): void => {\n // Cancel any ongoing command for THIS instance only\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setState({\n isExecuting: true,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const startTime = Date.now();\n\n (async () => {\n try {\n // Call client.command which returns FrameResults (array of frames)\n // Commands and queries both use the same command method\n const frameResults = await client?.command(statements, params || null, schemas || []) || [];\n\n const executionTime = Date.now() - startTime;\n \n // Process each frame into a CommandResult\n const results: CommandResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n \n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' && \n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n \n if (hasValueObjects) {\n // We have Value objects - extract type info\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n data: [],\n };\n });\n } else {\n // Plain objects from schema conversion\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8', // Default type for plain objects\n data: [],\n }));\n }\n \n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n // Empty result or rows affected\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Command execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Command execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results: undefined,\n error: errorMessage,\n executionTime,\n });\n } finally {\n abortControllerRef.current = null;\n }\n })();\n },\n [client]\n );\n\n const cancelCommand = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Command cancelled',\n }));\n }\n }, []);\n\n return {\n // State\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n\n // Actions\n command,\n cancelCommand,\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useCommandExecutor, type CommandResult, type CommandExecutorOptions} from './use-command-executor';\n\nexport interface CommandOptions extends CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single command hook - returns a single result\nexport function useCommandOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n result: CommandResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n command(statement, params, schemas);\n }, [statement, params, command]);\n\n // Extract first result for single command convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple command hook - returns multiple results\nexport function useCommandMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n results: CommandResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n command(statements, params, schemas);\n }, [statements, params, command]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface AdminResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface AdminState<T = any> {\n isExecuting: boolean;\n results: AdminResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useAdminExecutor<T = any>(options?: AdminExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<AdminState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const admin = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): void => {\n // Cancel any ongoing admin for THIS instance only\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setState({\n isExecuting: true,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const startTime = Date.now();\n\n (async () => {\n try {\n // Call client.admin which returns FrameResults (array of frames)\n // Commands and queries both use the same admin method\n const frameResults = await client?.admin(statements, params || null, schemas || []) || [];\n\n const executionTime = Date.now() - startTime;\n\n // Process each frame into a AdminResult\n const results: AdminResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n // We have Value objects - extract type info\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n data: [],\n };\n });\n } else {\n // Plain objects from schema conversion\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8', // Default type for plain objects\n data: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n // Empty result or rows affected\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Admin execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Admin execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results: undefined,\n error: errorMessage,\n executionTime,\n });\n } finally {\n abortControllerRef.current = null;\n }\n })();\n },\n [client]\n );\n\n const cancelAdmin = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Admin cancelled',\n }));\n }\n }, []);\n\n return {\n // State\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n\n // Actions\n admin,\n cancelAdmin,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useAdminExecutor, type AdminResult, type AdminExecutorOptions} from './use-admin-executor';\n\nexport interface AdminOptions extends AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single admin hook - returns a single result\nexport function useAdminOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n result: AdminResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n admin(statement, params, schemas);\n }, [statement, params, admin]);\n\n // Extract first result for single admin convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple admin hook - returns multiple results\nexport function useAdminMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n results: AdminResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n admin(statements, params, schemas);\n }, [statements, params, admin]);\n\n return {isExecuting, results, error};\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { SchemaNode } from '@reifydb/core';\nimport { useConnection } from './use-connection';\nimport type { ConnectionConfig } from '../connection/connection';\n\nexport interface SubscriptionExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport interface ChangeEvent<T> {\n operation: 'INSERT' | 'UPDATE' | 'REMOVE';\n rows: T[];\n timestamp: number;\n}\n\nexport interface SubscriptionState<T> {\n data: T[];\n changes: ChangeEvent<T>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n}\n\nexport function useSubscriptionExecutor<T = any>(\n options?: SubscriptionExecutorOptions\n) {\n const { client } = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<SubscriptionState<T>>({\n data: [],\n changes: [],\n isSubscribed: false,\n isSubscribing: false,\n error: undefined,\n subscriptionId: undefined\n });\n\n // Use a ref for client to avoid recreating callbacks when client changes\n const clientRef = useRef(client);\n\n const subscriptionIdRef = useRef<string | undefined>(undefined);\n const queryRef = useRef<string | undefined>(undefined);\n const paramsRef = useRef<any>(undefined);\n const schemaRef = useRef<SchemaNode | undefined>(undefined);\n\n // Keep clientRef in sync with client\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n // Helper to add change event\n const addChangeEvent = useCallback((\n operation: 'INSERT' | 'UPDATE' | 'REMOVE',\n rows: T[]\n ) => {\n setState(prev => {\n const newChange: ChangeEvent<T> = {\n operation,\n rows,\n timestamp: Date.now()\n };\n\n const newChanges = [...prev.changes, newChange];\n\n return {\n ...prev,\n data: prev.data,\n changes: newChanges\n };\n });\n }, []);\n\n // Separate callbacks for each operation type\n const handleInsert = useCallback((rows: T[]) => {\n addChangeEvent('INSERT', rows);\n }, [addChangeEvent]);\n\n const handleUpdate = useCallback((rows: T[]) => {\n addChangeEvent('UPDATE', rows);\n }, [addChangeEvent]);\n\n const handleRemove = useCallback((rows: T[]) => {\n addChangeEvent('REMOVE', rows);\n }, [addChangeEvent]);\n\n const subscribe = useCallback(async (\n query: string,\n params?: any,\n schema?: SchemaNode\n ) => {\n const currentClient = clientRef.current;\n if (!currentClient) {\n setState(prev => ({ ...prev, error: 'Client not connected' }));\n return;\n }\n\n // Store refs for reconnection\n queryRef.current = query;\n paramsRef.current = params;\n schemaRef.current = schema;\n\n setState(prev => ({\n ...prev,\n isSubscribing: true,\n error: undefined\n }));\n\n try {\n const subId = await currentClient.subscribe(query, params, schema, {\n onInsert: handleInsert,\n onUpdate: handleUpdate,\n onRemove: handleRemove\n });\n\n subscriptionIdRef.current = subId;\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n isSubscribed: true,\n subscriptionId: subId\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n error: err.message || 'Subscription failed'\n }));\n }\n }, [handleInsert, handleUpdate, handleRemove]);\n\n const unsubscribe = useCallback(async () => {\n const currentClient = clientRef.current;\n if (!currentClient || !subscriptionIdRef.current) return;\n\n try {\n await currentClient.unsubscribe(subscriptionIdRef.current);\n subscriptionIdRef.current = undefined;\n queryRef.current = undefined;\n paramsRef.current = undefined;\n schemaRef.current = undefined;\n\n setState(prev => ({\n ...prev,\n isSubscribed: false,\n subscriptionId: undefined\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n error: err.message || 'Unsubscribe failed'\n }));\n }\n }, []);\n\n const clearChanges = useCallback(() => {\n setState(prev => ({ ...prev, changes: [] }));\n }, []);\n\n const clearData = useCallback(() => {\n setState(prev => ({ ...prev, data: [] }));\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (subscriptionIdRef.current && clientRef.current) {\n clientRef.current.unsubscribe(subscriptionIdRef.current).catch(console.error);\n }\n };\n }, []);\n\n return {\n state,\n subscribe,\n unsubscribe,\n clearChanges,\n clearData\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useEffect, useMemo } from 'react';\nimport { SchemaNode, InferSchema } from '@reifydb/core';\nimport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type ChangeEvent\n} from './use-subscription-executor';\n\nexport interface SubscriptionOptions extends SubscriptionExecutorOptions {\n enabled?: boolean; // Auto-subscribe (default: true)\n}\n\nexport function useSubscription<S extends SchemaNode = any>(\n query: string,\n params?: any,\n schema?: S,\n options?: SubscriptionOptions\n): {\n data: InferSchema<S>[];\n changes: ChangeEvent<InferSchema<S>>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n} {\n const {\n state,\n subscribe,\n unsubscribe\n } = useSubscriptionExecutor<InferSchema<S>>(options);\n\n // Serialize params for stable comparison (objects create new refs each render)\n const paramsKey = useMemo(() => JSON.stringify(params), [params]);\n\n useEffect(() => {\n if (options?.enabled === false) return;\n\n subscribe(query, params, schema);\n\n return () => {\n unsubscribe();\n };\n }, [query, paramsKey, schema, options?.enabled, subscribe, unsubscribe]);\n\n return {\n data: state.data,\n changes: state.changes,\n isSubscribed: state.isSubscribed,\n isSubscribing: state.isSubscribing,\n error: state.error,\n subscriptionId: state.subscriptionId\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useState} from 'react';\nimport {Schema, InferSchema} from '@reifydb/core';\nimport {useQueryExecutor} from './use-query-executor';\n\nexport interface ColumnInfo {\n name: string;\n dataType: string;\n}\n\nexport interface TableInfo {\n name: string;\n columns: ColumnInfo[];\n}\n\nconst namespaceSchema = Schema.object({\n id: Schema.number(),\n name: Schema.string(),\n});\n\nconst tableSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n primary_key_id: Schema.number(),\n});\n\nconst viewSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n});\n\nconst columnSchema = Schema.object({\n id: Schema.number(),\n source_id: Schema.number(),\n source_type: Schema.number(),\n name: Schema.string(),\n type: Schema.number(),\n position: Schema.number(),\n auto_increment: Schema.boolean(),\n});\n\ntype NamespaceRow = InferSchema<typeof namespaceSchema>;\ntype TableRow = InferSchema<typeof tableSchema>;\ntype ViewRow = InferSchema<typeof viewSchema>;\ntype ColumnRow = InferSchema<typeof columnSchema>;\n\nexport function useSchema(): [boolean, TableInfo[], string | undefined] {\n const {isExecuting, results, error, query} = useQueryExecutor();\n const [schema, setSchema] = useState<TableInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!query) return;\n\n const fetchSchema = async () => {\n setIsLoading(true);\n\n try {\n await query(\n `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; FROM system::columns;`,\n undefined,\n [namespaceSchema, tableSchema, viewSchema, columnSchema]\n );\n } catch (err) {\n console.error('Failed to fetch schema:', err);\n }\n };\n\n fetchSchema();\n }, [query]);\n\n useEffect(() => {\n if (!results || results.length < 4) {\n setIsLoading(isExecuting);\n return;\n }\n\n const tablesResult = results[1];\n const viewsResult = results[2];\n const columnsResult = results[3];\n\n if (!tablesResult?.rows || !viewsResult?.rows || !columnsResult?.rows) {\n setIsLoading(false);\n return;\n }\n\n const namespacesResult = results[0];\n const namespaces = namespacesResult.rows as unknown as NamespaceRow[];\n const tables = tablesResult.rows as unknown as TableRow[];\n const views = viewsResult.rows as unknown as ViewRow[];\n const columns = columnsResult.rows as unknown as ColumnRow[];\n\n const namespaceMap = new Map<number, string>();\n namespaces.forEach((ns) => {\n const id = ns.id?.valueOf() as number;\n const name = ns.name?.valueOf() as string;\n if (id !== undefined && name) {\n namespaceMap.set(id, name);\n }\n });\n\n const tableInfoMap = new Map<number, TableInfo>();\n\n tables.forEach((table) => {\n const tableId = table.id?.valueOf() as number;\n const namespaceId = table.namespace_id?.valueOf() as number;\n const tableName = table.name?.valueOf() as string;\n\n if (tableId === undefined || !tableName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullTableName = `${namespace}::${tableName}`;\n\n tableInfoMap.set(tableId, {\n name: fullTableName,\n columns: [],\n });\n });\n\n views.forEach((view) => {\n const viewId = view.id?.valueOf() as number;\n const namespaceId = view.namespace_id?.valueOf() as number;\n const viewName = view.name?.valueOf() as string;\n\n if (viewId === undefined || !viewName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullViewName = `${namespace}::${viewName}`;\n\n tableInfoMap.set(viewId, {\n name: fullViewName,\n columns: [],\n });\n });\n\n const typeMap: Record<number, string> = {\n 0: 'None',\n 1: 'Float4',\n 2: 'Float8',\n 3: 'Int1',\n 4: 'Int2',\n 5: 'Int4',\n 6: 'Int8',\n 7: 'Int16',\n 8: 'Utf8',\n 9: 'Uint1',\n 10: 'Uint2',\n 11: 'Uint4',\n 12: 'Uint8',\n 13: 'Uint16',\n 14: 'Boolean',\n 15: 'Date',\n 16: 'DateTime',\n 17: 'Time',\n 18: 'Duration',\n 19: 'IdentityId',\n 20: 'Uuid4',\n 21: 'Uuid7',\n 22: 'Blob',\n 23: 'Int',\n 24: 'Decimal',\n 25: 'Uint',\n 26: 'Any',\n };\n\n // Create a map to collect columns with their positions\n const tableColumnsMap = new Map<number, Array<{name: string; dataType: string; position: number}>>();\n\n columns.forEach((column) => {\n const sourceId = column.source_id?.valueOf() as number;\n const sourceType = column.source_type?.valueOf() as number;\n const columnName = column.name?.valueOf() as string;\n const typeId = column.type?.valueOf() as number;\n const position = column.position?.valueOf() as number;\n\n if (sourceId === undefined || !columnName || typeId === undefined) return;\n if (sourceType !== 0 && sourceType !== 1) return;\n\n if (!tableColumnsMap.has(sourceId)) {\n tableColumnsMap.set(sourceId, []);\n }\n\n tableColumnsMap.get(sourceId)!.push({\n name: columnName,\n dataType: typeMap[typeId] || `Unknown(${typeId})`,\n position: position ?? 0,\n });\n });\n\n // Sort columns by position and add to table info\n tableColumnsMap.forEach((cols, sourceId) => {\n const tableInfo = tableInfoMap.get(sourceId);\n if (tableInfo) {\n cols.sort((a, b) => a.position - b.position);\n tableInfo.columns = cols.map((c) => ({name: c.name, dataType: c.dataType}));\n }\n });\n\n const schemaArray = Array.from(tableInfoMap.values())\n .filter((table) => table.name !== 'reifydb::flows')\n .sort((a, b) => a.name.localeCompare(b.name));\n\n setSchema(schemaArray);\n setIsLoading(false);\n }, [results, isExecuting]);\n\n return [isLoading, schema, error];\n}\n"],"mappings":"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","names":["useEffect","useEffect","useState","useRef","useEffect","useState","useRef","useEffect","useEffect","useEffect","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useMemo","useEffect","useEffect","useState","useState","useEffect"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/connection/connection.ts","../src/connection/connection-pool.ts","../src/connection/connection-context.tsx","../src/hooks/use-connection.ts","../src/hooks/use-query-executor.ts","../src/hooks/use-query.ts","../src/hooks/use-command-executor.ts","../src/hooks/use-command.ts","../src/hooks/use-admin-executor.ts","../src/hooks/use-admin.ts","../src/hooks/use-subscription-executor.ts","../src/hooks/use-subscription.ts","../src/hooks/use-schema.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nexport * from '@reifydb/core';\nexport * from '@reifydb/client';\n\n// Export connection utilities\nexport {Connection, type ConnectionConfig, DEFAULT_CONFIG, DEFAULT_URL} from './connection/connection';\nexport {getConnection, clearConnection} from './connection/connection-pool';\nexport {ConnectionProvider, ConnectionContext, type ConnectionProviderProps} from './connection/connection-context';\n\n// Export React hooks\nexport {useConnection} from './hooks/use-connection';\nexport {useQueryExecutor, type QueryResult, type QueryState, type QueryExecutorOptions} from './hooks/use-query-executor';\nexport {useQueryOne, useQueryMany, type QueryOptions} from './hooks/use-query';\nexport {useCommandExecutor, type CommandResult, type CommandState, type CommandExecutorOptions} from './hooks/use-command-executor';\nexport {useCommandOne, useCommandMany, type CommandOptions} from './hooks/use-command';\nexport {useAdminExecutor, type AdminResult, type AdminState, type AdminExecutorOptions} from './hooks/use-admin-executor';\nexport {useAdminOne, useAdminMany, type AdminOptions} from './hooks/use-admin';\nexport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type SubscriptionState,\n type ChangeEvent\n} from './hooks/use-subscription-executor';\nexport {\n useSubscription,\n type SubscriptionOptions\n} from './hooks/use-subscription';\nexport {useSchema, type TableInfo, type ColumnInfo} from './hooks/use-schema';","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {Client, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient, type WsClientOptions} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n listeners: Set<(state: ConnectionState) => void>;\n}\n\nexport interface ConnectionConfig {\n url?: string;\n token?: string;\n format?: 'json';\n options?: Omit<WsClientOptions, 'url' | 'token'>;\n}\n\nexport const DEFAULT_CONFIG: ConnectionConfig = {\n url: 'ws://127.0.0.1:8090',\n options: {timeoutMs: 30_000},\n};\n\nexport const DEFAULT_URL = 'ws://127.0.0.1:8090';\n\nexport class Connection {\n private state: ConnectionState = {\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n listeners: new Set(),\n };\n private config: ConnectionConfig;\n\n constructor(config: ConnectionConfig = DEFAULT_CONFIG) {\n this.config = {...DEFAULT_CONFIG, ...config};\n }\n\n setConfig(config: ConnectionConfig): void {\n this.config = config;\n }\n\n getConfig(): ConnectionConfig {\n return this.config;\n }\n\n async connect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n // Don't connect if already connected or connecting\n if (this.state.isConnected || this.state.isConnecting) {\n return;\n }\n\n const connectUrl = url || this.config.url || DEFAULT_CONFIG.url!;\n const connectOptions = {token: this.config.token, ...this.config.options, ...options};\n\n this.updateState({\n isConnecting: true,\n connectionError: null,\n });\n\n try {\n const isHttp = connectUrl.startsWith('http://') || connectUrl.startsWith('https://');\n const isJson = this.config.format === 'json';\n let client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient;\n if (isHttp) {\n client = isJson\n ? Client.connect_json_http(connectUrl, connectOptions)\n : Client.connect_http(connectUrl, connectOptions);\n } else {\n client = isJson\n ? await Client.connect_json_ws(connectUrl, connectOptions)\n : await Client.connect_ws(connectUrl, connectOptions);\n }\n this.updateState({\n client,\n isConnected: true,\n isConnecting: false,\n connectionError: null,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to connect to ReifyDB';\n console.error('[Connection] Connection failed:', errorMessage, err);\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: errorMessage,\n });\n throw err;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.state.client) {\n try {\n if ('disconnect' in this.state.client) {\n (this.state.client as WsClient).disconnect();\n // Small delay to ensure WebSocket closes cleanly\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n } catch (err) {\n console.error('Error disconnecting:', err);\n }\n }\n\n this.updateState({\n client: null,\n isConnected: false,\n isConnecting: false,\n connectionError: null,\n });\n }\n\n async reconnect(url?: string, options?: Omit<WsClientOptions, 'url'>): Promise<void> {\n await this.disconnect();\n await this.connect(url, options);\n }\n\n getClient(): WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null {\n return this.state.client;\n }\n\n isConnected(): boolean {\n return this.state.isConnected;\n }\n\n isConnecting(): boolean {\n return this.state.isConnecting;\n }\n\n getConnectionError(): string | null {\n return this.state.connectionError;\n }\n\n getState(): Omit<ConnectionState, 'listeners'> {\n const {listeners, ...state} = this.state;\n return state;\n }\n\n // Subscribe to state changes\n subscribe(listener: (state: ConnectionState) => void): () => void {\n this.state.listeners.add(listener);\n // Return unsubscribe function\n return () => {\n this.state.listeners.delete(listener);\n };\n }\n\n private updateState(updates: Partial<ConnectionState>): void {\n this.state = {\n ...this.state,\n ...updates,\n };\n\n // Notify all listeners\n this.state.listeners.forEach(listener => {\n listener(this.state);\n });\n }\n}\n\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { Connection, ConnectionConfig, DEFAULT_CONFIG } from './connection';\n\n/**\n * Singleton default connection instance.\n * This ensures a single global connection that gets reused and updated.\n */\nlet defaultConnection: Connection | null = null;\n\n/**\n * Get the singleton connection instance.\n * If a config is provided, the connection's config will be updated via setConfig().\n * @param config - Optional connection configuration\n * @returns The singleton Connection instance\n */\nexport function getConnection(config?: ConnectionConfig): Connection {\n // Create singleton on first call\n if (!defaultConnection) {\n const mergedConfig = {...DEFAULT_CONFIG, ...config};\n defaultConnection = new Connection(mergedConfig);\n // Start connection immediately - don't wait for React's useEffect\n defaultConnection.connect().catch(err => {\n console.error('[ConnectionPool] Eager connect failed:', err);\n });\n } else if (config) {\n // Only update config when explicitly provided, to avoid\n // stripping fields (e.g. token) that were set on creation.\n defaultConnection.setConfig({...DEFAULT_CONFIG, ...config});\n }\n\n return defaultConnection;\n}\n\n/**\n * Clear the singleton connection\n */\nexport async function clearConnection(): Promise<void> {\n if (defaultConnection) {\n await defaultConnection.disconnect();\n defaultConnection = null;\n }\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport React, { createContext, useEffect, useRef, ReactNode } from 'react';\nimport { Connection, ConnectionConfig } from './connection';\nimport { getConnection } from './connection-pool';\n\nexport const ConnectionContext = createContext<Connection | null>(null);\n\nexport interface ConnectionProviderProps {\n config?: ConnectionConfig;\n children: ReactNode;\n}\n\nexport function ConnectionProvider({ config, children }: ConnectionProviderProps) {\n // Get the singleton connection - this always returns the same instance\n // but updates its config via setConfig()\n const connection = getConnection(config);\n\n // Track previous config to detect changes\n const prevConfigRef = useRef<string | undefined>(undefined);\n const currentConfigStr = JSON.stringify(config);\n\n useEffect(() => {\n const configChanged = prevConfigRef.current !== undefined &&\n prevConfigRef.current !== currentConfigStr;\n\n if (configChanged && connection.isConnected()) {\n // Config changed while connected - reconnect with new config\n connection.reconnect().catch(err => {\n console.error('[ConnectionProvider] Failed to reconnect:', err);\n });\n } else if (!connection.isConnected() && !connection.isConnecting()) {\n // Auto-connect if not connected\n connection.connect().catch(err => {\n console.error('[ConnectionProvider] Failed to connect:', err);\n });\n }\n\n // Update previous config reference\n prevConfigRef.current = currentConfigStr;\n }, [currentConfigStr, connection]);\n\n return (\n <ConnectionContext.Provider value={connection}>\n {children}\n </ConnectionContext.Provider>\n );\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useContext, useEffect, useState} from 'react';\nimport {ConnectionConfig} from '../connection/connection';\nimport {getConnection} from '../connection/connection-pool';\nimport {ConnectionContext} from '../connection/connection-context';\nimport {WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient} from '@reifydb/client';\n\ninterface ConnectionState {\n client: WsClient | HttpClient | JsonHttpClient | JsonWebsocketClient | null;\n isConnected: boolean;\n isConnecting: boolean;\n connectionError: string | null;\n}\n\nexport function useConnection(overrideConfig?: ConnectionConfig) {\n const contextConnection = useContext(ConnectionContext);\n\n // Use override config if provided, otherwise use context, otherwise get default\n const [connection] = useState(() => {\n if (overrideConfig) {\n return getConnection(overrideConfig);\n }\n if (contextConnection) {\n return contextConnection;\n }\n return getConnection();\n });\n\n const [state, setState] = useState<ConnectionState>(() => connection.getState());\n\n useEffect(() => {\n // Get initial state immediately\n const currentState = connection.getState();\n setState(currentState);\n\n // Subscribe to connection state changes\n const unsubscribe = connection.subscribe((newState) => {\n setState({\n client: newState.client,\n isConnected: newState.isConnected,\n isConnecting: newState.isConnecting,\n connectionError: newState.connectionError,\n });\n });\n\n // No auto-connect - ConnectionProvider handles all auto-connection\n // Users must either wrap with ConnectionProvider or manually call connect()\n\n return unsubscribe;\n }, [connection]);\n\n return {\n ...state,\n connect: () => connection.connect(),\n disconnect: () => connection.disconnect(),\n reconnect: () => connection.reconnect(),\n };\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface QueryResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface QueryState<T = any> {\n isExecuting: boolean;\n results: QueryResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useQueryExecutor<T = any>(options?: QueryExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<QueryState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(true);\n useEffect(() => {\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const query = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.query(statements, params || null, schemas || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: QueryResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Query execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Query execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n query(statements, params, schemas);\n }\n }, [client, query]);\n\n const cancelQuery = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Query cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n query,\n cancelQuery,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useQueryExecutor, type QueryResult, type QueryExecutorOptions} from './use-query-executor';\n\nexport interface QueryOptions extends QueryExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single query hook - returns a single result\nexport function useQueryOne<S extends SchemaNode = any>(\n rql: string,\n params?: any,\n schema?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n result: QueryResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n query(rql, params, schemas);\n }, [rql, params, query]);\n\n // Extract first result for single query convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple query hook - returns multiple results\nexport function useQueryMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n results: QueryResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n query(statements, params, schemas);\n }, [statements, params, query]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface CommandResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface CommandState<T = any> {\n isExecuting: boolean;\n results: CommandResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useCommandExecutor<T = any>(options?: CommandExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<CommandState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n const executionIdRef = useRef(0);\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const command = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.command(statements, params || null, schemas || []) || [];\n\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n const results: CommandResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Command execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Command execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n []\n );\n\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n command(statements, params, schemas);\n }\n }, [client, command]);\n\n const cancelCommand = useCallback(() => {\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Command cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n command,\n cancelCommand,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useCommandExecutor, type CommandResult, type CommandExecutorOptions} from './use-command-executor';\n\nexport interface CommandOptions extends CommandExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single command hook - returns a single result\nexport function useCommandOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n result: CommandResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n command(statement, params, schemas);\n }, [statement, params, command]);\n\n // Extract first result for single command convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple command hook - returns multiple results\nexport function useCommandMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n results: CommandResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n command(statements, params, schemas);\n }, [statements, params, command]);\n\n return {isExecuting, results, error};\n}","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useState, useCallback, useRef, useEffect} from 'react';\nimport {Column, SchemaNode} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useConnection} from './use-connection';\n\nexport interface AdminResult<T = any> {\n columns: Column[];\n rows: T[];\n executionTimeMs: number;\n rowsAffected?: number;\n}\n\nexport interface AdminState<T = any> {\n isExecuting: boolean;\n results: AdminResult<T>[] | undefined;\n error: string | undefined;\n executionTime: number | undefined;\n}\n\nexport interface AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport function useAdminExecutor<T = any>(options?: AdminExecutorOptions) {\n const {client} = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<AdminState<T>>({\n isExecuting: false,\n results: undefined,\n error: undefined,\n executionTime: undefined,\n });\n\n // Stable refs so the callback never recreates\n const clientRef = useRef(client);\n clientRef.current = client;\n\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\n return () => { isMountedRef.current = false; };\n }, []);\n\n // Counter to detect superseded executions\n const executionIdRef = useRef(0);\n\n // Stash pending call if client isn't ready yet\n const pendingRef = useRef<{statements: string | string[], params?: any, schemas?: readonly SchemaNode[]} | null>(null);\n\n const admin = useCallback(\n (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n // If no client yet, stash the request for replay when client connects\n if (!currentClient) {\n pendingRef.current = {statements, params, schemas};\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n return Promise.resolve();\n }\n\n pendingRef.current = null;\n const thisExecution = ++executionIdRef.current;\n\n setState(prev => ({...prev, isExecuting: true, error: undefined}));\n\n const startTime = Date.now();\n\n return (async () => {\n try {\n const frameResults = await currentClient.admin(statements, params || null, schemas || []) || [];\n\n // If this execution was superseded by a newer one, discard results\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n\n // Process each frame into a AdminResult\n const results: AdminResult<T>[] = frameResults.map((frame: any) => {\n if (Array.isArray(frame) && frame.length > 0) {\n const firstRow = frame[0];\n let columns: Column[] = [];\n\n // Check if we have Value objects or plain objects\n const hasValueObjects = firstRow && typeof firstRow === 'object' &&\n Object.values(firstRow).some(v => v && typeof v === 'object' && 'type' in v);\n\n if (hasValueObjects) {\n columns = Object.keys(firstRow).map((key) => {\n const value = firstRow[key];\n const dataType = value?.type || 'Utf8';\n return {\n name: key,\n type: dataType,\n payload: [],\n };\n });\n } else {\n columns = Object.keys(firstRow).map((key) => ({\n name: key,\n type: 'Utf8',\n payload: [],\n }));\n }\n\n return {\n columns,\n rows: frame as T[],\n executionTimeMs: executionTime,\n };\n } else {\n return {\n columns: [],\n rows: [],\n executionTimeMs: executionTime,\n rowsAffected: typeof frame === 'number' ? frame : undefined,\n };\n }\n });\n\n if (!isMountedRef.current) return;\n setState({\n isExecuting: false,\n results,\n error: undefined,\n executionTime,\n });\n } catch (err) {\n if (executionIdRef.current !== thisExecution) return;\n\n const executionTime = Date.now() - startTime;\n let errorMessage = 'Admin execution failed';\n\n if (err instanceof Error) {\n errorMessage = err.message;\n } else if (typeof err === 'string') {\n errorMessage = err;\n } else if (err && typeof err === 'object' && 'message' in err) {\n errorMessage = (err as { message: string }).message;\n }\n\n console.error('Admin execution failed:', errorMessage);\n\n if (!isMountedRef.current) return;\n setState(prev => ({\n ...prev,\n isExecuting: false,\n error: errorMessage,\n executionTime,\n }));\n\n }\n })();\n },\n [] // stable — never recreates\n );\n\n // Replay pending request when client becomes available\n useEffect(() => {\n if (client && pendingRef.current) {\n const {statements, params, schemas} = pendingRef.current;\n admin(statements, params, schemas);\n }\n }, [client, admin]);\n\n const cancelAdmin = useCallback(() => {\n // Bump execution ID so any in-flight request is ignored on completion\n executionIdRef.current++;\n setState((prev) => ({\n ...prev,\n isExecuting: false,\n error: 'Admin cancelled',\n }));\n }, []);\n\n return {\n isExecuting: state.isExecuting,\n results: state.results,\n error: state.error,\n executionTime: state.executionTime,\n admin,\n cancelAdmin,\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useMemo} from 'react';\nimport {SchemaNode, InferSchema} from '@reifydb/core';\nimport {ConnectionConfig} from '../connection/connection';\nimport {useAdminExecutor, type AdminResult, type AdminExecutorOptions} from './use-admin-executor';\n\nexport interface AdminOptions extends AdminExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\n// Single admin hook - returns a single result\nexport function useAdminOne<S extends SchemaNode = any>(\n statement: string,\n params?: any,\n schema?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n result: AdminResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends SchemaNode ? InferSchema<S> : any>(options);\n\n useEffect(() => {\n // Pass schema as array for the executor\n const schemas = schema ? [schema] : undefined;\n admin(statement, params, schemas);\n }, [statement, params, admin]);\n\n // Extract first result for single admin convenience\n const result = useMemo(() => {\n return results && results.length > 0 ? results[0] : undefined;\n }, [results]);\n\n return {isExecuting, result, error};\n}\n\n// Multiple admin hook - returns multiple results\nexport function useAdminMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(\n statements: string | string[],\n params?: any,\n schemas?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n results: AdminResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>(options);\n\n useEffect(() => {\n admin(statements, params, schemas);\n }, [statements, params, admin]);\n\n return {isExecuting, results, error};\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { SchemaNode } from '@reifydb/core';\nimport { useConnection } from './use-connection';\nimport type { ConnectionConfig } from '../connection/connection';\n\nexport interface SubscriptionExecutorOptions {\n connectionConfig?: ConnectionConfig;\n}\n\nexport interface ChangeEvent<T> {\n operation: 'INSERT' | 'UPDATE' | 'REMOVE';\n rows: T[];\n timestamp: number;\n}\n\nexport interface SubscriptionState<T> {\n data: T[];\n changes: ChangeEvent<T>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n}\n\nexport function useSubscriptionExecutor<T = any>(\n options?: SubscriptionExecutorOptions\n) {\n const { client } = useConnection(options?.connectionConfig);\n\n const [state, setState] = useState<SubscriptionState<T>>({\n data: [],\n changes: [],\n isSubscribed: false,\n isSubscribing: false,\n error: undefined,\n subscriptionId: undefined\n });\n\n // Use a ref for client to avoid recreating callbacks when client changes\n const clientRef = useRef(client);\n\n const subscriptionIdRef = useRef<string | undefined>(undefined);\n const queryRef = useRef<string | undefined>(undefined);\n const paramsRef = useRef<any>(undefined);\n const schemaRef = useRef<SchemaNode | undefined>(undefined);\n\n // Keep clientRef in sync with client\n useEffect(() => {\n clientRef.current = client;\n }, [client]);\n\n // Helper to add change event\n const addChangeEvent = useCallback((\n operation: 'INSERT' | 'UPDATE' | 'REMOVE',\n rows: T[]\n ) => {\n setState(prev => {\n const newChange: ChangeEvent<T> = {\n operation,\n rows,\n timestamp: Date.now()\n };\n\n const newChanges = [...prev.changes, newChange];\n\n return {\n ...prev,\n data: prev.data,\n changes: newChanges\n };\n });\n }, []);\n\n // Separate callbacks for each operation type\n const handleInsert = useCallback((rows: T[]) => {\n addChangeEvent('INSERT', rows);\n }, [addChangeEvent]);\n\n const handleUpdate = useCallback((rows: T[]) => {\n addChangeEvent('UPDATE', rows);\n }, [addChangeEvent]);\n\n const handleRemove = useCallback((rows: T[]) => {\n addChangeEvent('REMOVE', rows);\n }, [addChangeEvent]);\n\n const subscribe = useCallback(async (\n query: string,\n params?: any,\n schema?: SchemaNode\n ) => {\n const currentClient = clientRef.current;\n if (!currentClient) {\n setState(prev => ({ ...prev, error: 'Client not connected' }));\n return;\n }\n\n if (!('subscribe' in currentClient)) {\n setState(prev => ({ ...prev, error: 'Subscriptions require a WebSocket connection' }));\n return;\n }\n\n // Store refs for reconnection\n queryRef.current = query;\n paramsRef.current = params;\n schemaRef.current = schema;\n\n setState(prev => ({\n ...prev,\n isSubscribing: true,\n error: undefined\n }));\n\n try {\n const subId = await currentClient.subscribe(query, params, schema, {\n onInsert: handleInsert,\n onUpdate: handleUpdate,\n onRemove: handleRemove\n });\n\n subscriptionIdRef.current = subId;\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n isSubscribed: true,\n subscriptionId: subId\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n isSubscribing: false,\n error: err.message || 'Subscription failed'\n }));\n }\n }, [handleInsert, handleUpdate, handleRemove]);\n\n const unsubscribe = useCallback(async () => {\n const currentClient = clientRef.current;\n if (!currentClient || !subscriptionIdRef.current) return;\n if (!('unsubscribe' in currentClient)) return;\n\n try {\n await currentClient.unsubscribe(subscriptionIdRef.current);\n subscriptionIdRef.current = undefined;\n queryRef.current = undefined;\n paramsRef.current = undefined;\n schemaRef.current = undefined;\n\n setState(prev => ({\n ...prev,\n isSubscribed: false,\n subscriptionId: undefined\n }));\n } catch (err: any) {\n setState(prev => ({\n ...prev,\n error: err.message || 'Unsubscribe failed'\n }));\n }\n }, []);\n\n const clearChanges = useCallback(() => {\n setState(prev => ({ ...prev, changes: [] }));\n }, []);\n\n const clearData = useCallback(() => {\n setState(prev => ({ ...prev, data: [] }));\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (subscriptionIdRef.current && clientRef.current && 'unsubscribe' in clientRef.current) {\n clientRef.current.unsubscribe(subscriptionIdRef.current).catch(console.error);\n }\n };\n }, []);\n\n return {\n state,\n subscribe,\n unsubscribe,\n clearChanges,\n clearData\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport { useEffect, useMemo } from 'react';\nimport { SchemaNode, InferSchema } from '@reifydb/core';\nimport {\n useSubscriptionExecutor,\n type SubscriptionExecutorOptions,\n type ChangeEvent\n} from './use-subscription-executor';\n\nexport interface SubscriptionOptions extends SubscriptionExecutorOptions {\n enabled?: boolean; // Auto-subscribe (default: true)\n}\n\nexport function useSubscription<S extends SchemaNode = any>(\n query: string,\n params?: any,\n schema?: S,\n options?: SubscriptionOptions\n): {\n data: InferSchema<S>[];\n changes: ChangeEvent<InferSchema<S>>[];\n isSubscribed: boolean;\n isSubscribing: boolean;\n error: string | undefined;\n subscriptionId: string | undefined;\n} {\n const {\n state,\n subscribe,\n unsubscribe\n } = useSubscriptionExecutor<InferSchema<S>>(options);\n\n // Serialize params for stable comparison (objects create new refs each render)\n const paramsKey = useMemo(() => JSON.stringify(params), [params]);\n\n useEffect(() => {\n if (options?.enabled === false) return;\n\n subscribe(query, params, schema);\n\n return () => {\n unsubscribe();\n };\n }, [query, paramsKey, schema, options?.enabled, subscribe, unsubscribe]);\n\n return {\n data: state.data,\n changes: state.changes,\n isSubscribed: state.isSubscribed,\n isSubscribing: state.isSubscribing,\n error: state.error,\n subscriptionId: state.subscriptionId\n };\n}\n","// SPDX-License-Identifier: Apache-2.0\n// Copyright (c) 2025 ReifyDB\n\nimport {useEffect, useState} from 'react';\nimport {Schema, InferSchema} from '@reifydb/core';\nimport {useQueryExecutor} from './use-query-executor';\n\nexport interface ColumnInfo {\n name: string;\n dataType: string;\n}\n\nexport interface TableInfo {\n name: string;\n columns: ColumnInfo[];\n}\n\nconst namespaceSchema = Schema.object({\n id: Schema.number(),\n name: Schema.string(),\n});\n\nconst tableSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n primary_key_id: Schema.number(),\n});\n\nconst viewSchema = Schema.object({\n id: Schema.number(),\n namespace_id: Schema.number(),\n name: Schema.string(),\n});\n\nconst columnSchema = Schema.object({\n id: Schema.number(),\n source_id: Schema.number(),\n source_type: Schema.number(),\n name: Schema.string(),\n type: Schema.number(),\n position: Schema.number(),\n auto_increment: Schema.boolean(),\n});\n\ntype NamespaceRow = InferSchema<typeof namespaceSchema>;\ntype TableRow = InferSchema<typeof tableSchema>;\ntype ViewRow = InferSchema<typeof viewSchema>;\ntype ColumnRow = InferSchema<typeof columnSchema>;\n\nexport function useSchema(): [boolean, TableInfo[], string | undefined] {\n const {isExecuting, results, error, query} = useQueryExecutor();\n const [schema, setSchema] = useState<TableInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!query) return;\n\n const fetchSchema = async () => {\n setIsLoading(true);\n\n try {\n await query(\n `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; FROM system::columns;`,\n undefined,\n [namespaceSchema, tableSchema, viewSchema, columnSchema]\n );\n } catch (err) {\n console.error('Failed to fetch schema:', err);\n }\n };\n\n fetchSchema();\n }, [query]);\n\n useEffect(() => {\n if (!results || results.length < 4) {\n setIsLoading(isExecuting);\n return;\n }\n\n const tablesResult = results[1];\n const viewsResult = results[2];\n const columnsResult = results[3];\n\n if (!tablesResult?.rows || !viewsResult?.rows || !columnsResult?.rows) {\n setIsLoading(false);\n return;\n }\n\n const namespacesResult = results[0];\n const namespaces = namespacesResult.rows as unknown as NamespaceRow[];\n const tables = tablesResult.rows as unknown as TableRow[];\n const views = viewsResult.rows as unknown as ViewRow[];\n const columns = columnsResult.rows as unknown as ColumnRow[];\n\n const namespaceMap = new Map<number, string>();\n namespaces.forEach((ns) => {\n const id = ns.id?.valueOf() as number;\n const name = ns.name?.valueOf() as string;\n if (id !== undefined && name) {\n namespaceMap.set(id, name);\n }\n });\n\n const tableInfoMap = new Map<number, TableInfo>();\n\n tables.forEach((table) => {\n const tableId = table.id?.valueOf() as number;\n const namespaceId = table.namespace_id?.valueOf() as number;\n const tableName = table.name?.valueOf() as string;\n\n if (tableId === undefined || !tableName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullTableName = `${namespace}::${tableName}`;\n\n tableInfoMap.set(tableId, {\n name: fullTableName,\n columns: [],\n });\n });\n\n views.forEach((view) => {\n const viewId = view.id?.valueOf() as number;\n const namespaceId = view.namespace_id?.valueOf() as number;\n const viewName = view.name?.valueOf() as string;\n\n if (viewId === undefined || !viewName || namespaceId === undefined) return;\n\n const namespace = namespaceMap.get(namespaceId);\n if (!namespace) return;\n\n const fullViewName = `${namespace}::${viewName}`;\n\n tableInfoMap.set(viewId, {\n name: fullViewName,\n columns: [],\n });\n });\n\n const typeMap: Record<number, string> = {\n 0: 'None',\n 1: 'Float4',\n 2: 'Float8',\n 3: 'Int1',\n 4: 'Int2',\n 5: 'Int4',\n 6: 'Int8',\n 7: 'Int16',\n 8: 'Utf8',\n 9: 'Uint1',\n 10: 'Uint2',\n 11: 'Uint4',\n 12: 'Uint8',\n 13: 'Uint16',\n 14: 'Boolean',\n 15: 'Date',\n 16: 'DateTime',\n 17: 'Time',\n 18: 'Duration',\n 19: 'IdentityId',\n 20: 'Uuid4',\n 21: 'Uuid7',\n 22: 'Blob',\n 23: 'Int',\n 24: 'Decimal',\n 25: 'Uint',\n 26: 'Any',\n };\n\n // Create a map to collect columns with their positions\n const tableColumnsMap = new Map<number, Array<{name: string; dataType: string; position: number}>>();\n\n columns.forEach((column) => {\n const sourceId = column.source_id?.valueOf() as number;\n const sourceType = column.source_type?.valueOf() as number;\n const columnName = column.name?.valueOf() as string;\n const typeId = column.type?.valueOf() as number;\n const position = column.position?.valueOf() as number;\n\n if (sourceId === undefined || !columnName || typeId === undefined) return;\n if (sourceType !== 0 && sourceType !== 1) return;\n\n if (!tableColumnsMap.has(sourceId)) {\n tableColumnsMap.set(sourceId, []);\n }\n\n tableColumnsMap.get(sourceId)!.push({\n name: columnName,\n dataType: typeMap[typeId] || `Unknown(${typeId})`,\n position: position ?? 0,\n });\n });\n\n // Sort columns by position and add to table info\n tableColumnsMap.forEach((cols, sourceId) => {\n const tableInfo = tableInfoMap.get(sourceId);\n if (tableInfo) {\n cols.sort((a, b) => a.position - b.position);\n tableInfo.columns = cols.map((c) => ({name: c.name, dataType: c.dataType}));\n }\n });\n\n const schemaArray = Array.from(tableInfoMap.values())\n .filter((table) => table.name !== 'reifydb::flows')\n .sort((a, b) => a.name.localeCompare(b.name));\n\n setSchema(schemaArray);\n setIsLoading(false);\n }, [results, isExecuting]);\n\n return [isLoading, schema, error];\n}\n"],"mappings":"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","names":["useEffect","useEffect","useState","useRef","useEffect","useState","useRef","useEffect","useEffect","useEffect","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useEffect","useMemo","useState","useCallback","useRef","useEffect","useState","useRef","useEffect","useCallback","useEffect","useMemo","useMemo","useEffect","useEffect","useState","useState","useEffect"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@reifydb/react",
3
- "version": "0.4.2",
3
+ "version": "0.4.7",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "dependencies": {
8
- "@reifydb/client": "0.4.2",
9
- "@reifydb/core": "0.4.2"
8
+ "@reifydb/client": "0.4.7",
9
+ "@reifydb/core": "0.4.7"
10
10
  },
11
11
  "peerDependencies": {
12
12
  "react": ">=16.8.0"
@@ -47,6 +47,6 @@
47
47
  "test:integration:coverage": "vitest run --coverage --config vitest.config.ts",
48
48
  "test:coverage": "pnpm test:integration:coverage",
49
49
  "pretest:integration": "pnpm build",
50
- "publish:npm": "pnpm publish --access public"
50
+ "publish:npm": "pnpm publish --access public --no-git-checks"
51
51
  }
52
52
  }