@reifydb/react 0.4.6 → 0.4.8

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,4 +1,4 @@
1
- import { Column, SchemaNode, InferSchema } from '@reifydb/core';
1
+ import { Column, ShapeNode, InferShape } from '@reifydb/core';
2
2
  export * from '@reifydb/core';
3
3
  import { WsClientOptions, WsClient, HttpClient, JsonHttpClient, JsonWebsocketClient } from '@reifydb/client';
4
4
  export * from '@reifydb/client';
@@ -22,6 +22,7 @@ declare const DEFAULT_URL = "ws://127.0.0.1:8090";
22
22
  declare class Connection {
23
23
  private state;
24
24
  private config;
25
+ private connectPromise;
25
26
  constructor(config?: ConnectionConfig);
26
27
  setConfig(config: ConnectionConfig): void;
27
28
  getConfig(): ConnectionConfig;
@@ -86,21 +87,21 @@ declare function useQueryExecutor<T = any>(options?: QueryExecutorOptions): {
86
87
  results: QueryResult<T>[] | undefined;
87
88
  error: string | undefined;
88
89
  executionTime: number | undefined;
89
- query: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
90
+ query: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
90
91
  cancelQuery: () => void;
91
92
  };
92
93
 
93
94
  interface QueryOptions extends QueryExecutorOptions {
94
95
  connectionConfig?: ConnectionConfig;
95
96
  }
96
- declare function useQueryOne<S extends SchemaNode = any>(rql: string, params?: any, schema?: S, options?: QueryOptions): {
97
+ declare function useQueryOne<S extends ShapeNode = any>(rql: string, params?: any, shape?: S, options?: QueryOptions): {
97
98
  isExecuting: boolean;
98
- result: QueryResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
99
+ result: QueryResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
99
100
  error: string | undefined;
100
101
  };
101
- declare function useQueryMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: QueryOptions): {
102
+ declare function useQueryMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: QueryOptions): {
102
103
  isExecuting: boolean;
103
- results: QueryResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
104
+ results: QueryResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
104
105
  error: string | undefined;
105
106
  };
106
107
 
@@ -124,21 +125,21 @@ declare function useCommandExecutor<T = any>(options?: CommandExecutorOptions):
124
125
  results: CommandResult<T>[] | undefined;
125
126
  error: string | undefined;
126
127
  executionTime: number | undefined;
127
- command: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
128
+ command: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
128
129
  cancelCommand: () => void;
129
130
  };
130
131
 
131
132
  interface CommandOptions extends CommandExecutorOptions {
132
133
  connectionConfig?: ConnectionConfig;
133
134
  }
134
- declare function useCommandOne<S extends SchemaNode = any>(statement: string, params?: any, schema?: S, options?: CommandOptions): {
135
+ declare function useCommandOne<S extends ShapeNode = any>(statement: string, params?: any, shape?: S, options?: CommandOptions): {
135
136
  isExecuting: boolean;
136
- result: CommandResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
137
+ result: CommandResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
137
138
  error: string | undefined;
138
139
  };
139
- declare function useCommandMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: CommandOptions): {
140
+ declare function useCommandMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: CommandOptions): {
140
141
  isExecuting: boolean;
141
- results: CommandResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
142
+ results: CommandResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
142
143
  error: string | undefined;
143
144
  };
144
145
 
@@ -162,21 +163,21 @@ declare function useAdminExecutor<T = any>(options?: AdminExecutorOptions): {
162
163
  results: AdminResult<T>[] | undefined;
163
164
  error: string | undefined;
164
165
  executionTime: number | undefined;
165
- admin: (statements: string | string[], params?: any, schemas?: readonly SchemaNode[]) => void;
166
+ admin: (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]) => Promise<void>;
166
167
  cancelAdmin: () => void;
167
168
  };
168
169
 
169
170
  interface AdminOptions extends AdminExecutorOptions {
170
171
  connectionConfig?: ConnectionConfig;
171
172
  }
172
- declare function useAdminOne<S extends SchemaNode = any>(statement: string, params?: any, schema?: S, options?: AdminOptions): {
173
+ declare function useAdminOne<S extends ShapeNode = any>(statement: string, params?: any, shape?: S, options?: AdminOptions): {
173
174
  isExecuting: boolean;
174
- result: AdminResult<S extends SchemaNode ? InferSchema<S> : any> | undefined;
175
+ result: AdminResult<S extends ShapeNode ? InferShape<S> : any> | undefined;
175
176
  error: string | undefined;
176
177
  };
177
- declare function useAdminMany<S extends readonly SchemaNode[] = readonly SchemaNode[]>(statements: string | string[], params?: any, schemas?: S, options?: AdminOptions): {
178
+ declare function useAdminMany<S extends readonly ShapeNode[] = readonly ShapeNode[]>(statements: string | string[], params?: any, shapes?: S, options?: AdminOptions): {
178
179
  isExecuting: boolean;
179
- results: AdminResult<S extends readonly SchemaNode[] ? InferSchema<S[number]> : any>[] | undefined;
180
+ results: AdminResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;
180
181
  error: string | undefined;
181
182
  };
182
183
 
@@ -198,7 +199,7 @@ interface SubscriptionState<T> {
198
199
  }
199
200
  declare function useSubscriptionExecutor<T = any>(options?: SubscriptionExecutorOptions): {
200
201
  state: SubscriptionState<T>;
201
- subscribe: (query: string, params?: any, schema?: SchemaNode) => Promise<void>;
202
+ subscribe: (query: string, params?: any, shape?: ShapeNode) => Promise<void>;
202
203
  unsubscribe: () => Promise<void>;
203
204
  clearChanges: () => void;
204
205
  clearData: () => void;
@@ -207,9 +208,9 @@ declare function useSubscriptionExecutor<T = any>(options?: SubscriptionExecutor
207
208
  interface SubscriptionOptions extends SubscriptionExecutorOptions {
208
209
  enabled?: boolean;
209
210
  }
210
- declare function useSubscription<S extends SchemaNode = any>(query: string, params?: any, schema?: S, options?: SubscriptionOptions): {
211
- data: InferSchema<S>[];
212
- changes: ChangeEvent<InferSchema<S>>[];
211
+ declare function useSubscription<S extends ShapeNode = any>(query: string, params?: any, shape?: S, options?: SubscriptionOptions): {
212
+ data: InferShape<S>[];
213
+ changes: ChangeEvent<InferShape<S>>[];
213
214
  isSubscribed: boolean;
214
215
  isSubscribing: boolean;
215
216
  error: string | undefined;
@@ -224,6 +225,6 @@ interface TableInfo {
224
225
  name: string;
225
226
  columns: ColumnInfo[];
226
227
  }
227
- declare function useSchema(): [boolean, TableInfo[], string | undefined];
228
+ declare function useShape(): [boolean, TableInfo[], string | undefined];
228
229
 
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 };
230
+ 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, useShape, useSubscription, useSubscriptionExecutor };
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ var Connection = class {
18
18
  connectionError: null,
19
19
  listeners: /* @__PURE__ */ new Set()
20
20
  };
21
+ this.connectPromise = null;
21
22
  this.config = { ...DEFAULT_CONFIG, ...config };
22
23
  }
23
24
  setConfig(config) {
@@ -27,43 +28,52 @@ var Connection = class {
27
28
  return this.config;
28
29
  }
29
30
  async connect(url, options) {
30
- if (this.state.isConnected || this.state.isConnecting) {
31
+ if (this.state.isConnected) {
31
32
  return;
32
33
  }
34
+ if (this.connectPromise) {
35
+ return this.connectPromise;
36
+ }
33
37
  const connectUrl = url || this.config.url || DEFAULT_CONFIG.url;
34
38
  const connectOptions = { token: this.config.token, ...this.config.options, ...options };
35
39
  this.updateState({
36
40
  isConnecting: true,
37
41
  connectionError: null
38
42
  });
39
- try {
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);
43
+ this.connectPromise = (async () => {
44
+ try {
45
+ const isHttp = connectUrl.startsWith("http://") || connectUrl.startsWith("https://");
46
+ const isJson = this.config.format === "json";
47
+ let client;
48
+ if (isHttp) {
49
+ client = isJson ? Client.connect_json_http(connectUrl, connectOptions) : Client.connect_http(connectUrl, connectOptions);
50
+ } else {
51
+ client = isJson ? await Client.connect_json_ws(connectUrl, connectOptions) : await Client.connect_ws(connectUrl, connectOptions);
52
+ }
53
+ this.updateState({
54
+ client,
55
+ isConnected: true,
56
+ isConnecting: false,
57
+ connectionError: null
58
+ });
59
+ } catch (err) {
60
+ const errorMessage = err instanceof Error ? err.message : "Failed to connect to ReifyDB";
61
+ console.error("[Connection] Connection failed:", errorMessage, err);
62
+ this.updateState({
63
+ client: null,
64
+ isConnected: false,
65
+ isConnecting: false,
66
+ connectionError: errorMessage
67
+ });
68
+ throw err;
69
+ } finally {
70
+ this.connectPromise = null;
47
71
  }
48
- this.updateState({
49
- client,
50
- isConnected: true,
51
- isConnecting: false,
52
- connectionError: null
53
- });
54
- } catch (err) {
55
- const errorMessage = err instanceof Error ? err.message : "Failed to connect to ReifyDB";
56
- console.error("[Connection] Connection failed:", errorMessage, err);
57
- this.updateState({
58
- client: null,
59
- isConnected: false,
60
- isConnecting: false,
61
- connectionError: errorMessage
62
- });
63
- throw err;
64
- }
72
+ })();
73
+ return this.connectPromise;
65
74
  }
66
75
  async disconnect() {
76
+ this.connectPromise = null;
67
77
  if (this.state.client) {
68
78
  try {
69
79
  if ("disconnect" in this.state.client) {
@@ -208,32 +218,32 @@ function useQueryExecutor(options) {
208
218
  error: void 0,
209
219
  executionTime: void 0
210
220
  });
211
- const abortControllerRef = useRef2(null);
212
- const isMountedRef = useRef2(false);
221
+ const clientRef = useRef2(client);
222
+ clientRef.current = client;
223
+ const isMountedRef = useRef2(true);
213
224
  useEffect3(() => {
214
- isMountedRef.current = true;
215
225
  return () => {
216
226
  isMountedRef.current = false;
217
227
  };
218
228
  }, []);
229
+ const executionIdRef = useRef2(0);
230
+ const pendingRef = useRef2(null);
219
231
  const query = useCallback(
220
- (statements, params, schemas) => {
221
- if (abortControllerRef.current) {
222
- abortControllerRef.current.abort();
232
+ (statements, params, shapes) => {
233
+ const currentClient = clientRef.current;
234
+ if (!currentClient) {
235
+ pendingRef.current = { statements, params, shapes };
236
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
237
+ return Promise.resolve();
223
238
  }
224
- abortControllerRef.current = new AbortController();
225
- const currentController = abortControllerRef.current;
226
- setState({
227
- isExecuting: true,
228
- results: void 0,
229
- error: void 0,
230
- executionTime: void 0
231
- });
239
+ pendingRef.current = null;
240
+ const thisExecution = ++executionIdRef.current;
241
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
232
242
  const startTime = Date.now();
233
- (async () => {
243
+ return (async () => {
234
244
  try {
235
- const frameResults = await client?.query(statements, params || null, schemas || []) || [];
236
- if (currentController.signal.aborted) return;
245
+ const frameResults = await currentClient.query(statements, params || null, shapes || []) || [];
246
+ if (executionIdRef.current !== thisExecution) return;
237
247
  const executionTime = Date.now() - startTime;
238
248
  const results = frameResults.map((frame) => {
239
249
  if (Array.isArray(frame) && frame.length > 0) {
@@ -254,7 +264,6 @@ function useQueryExecutor(options) {
254
264
  columns = Object.keys(firstRow).map((key) => ({
255
265
  name: key,
256
266
  type: "Utf8",
257
- // Default type for plain objects
258
267
  payload: []
259
268
  }));
260
269
  }
@@ -279,7 +288,7 @@ function useQueryExecutor(options) {
279
288
  executionTime
280
289
  });
281
290
  } catch (err) {
282
- if (currentController.signal.aborted) return;
291
+ if (executionIdRef.current !== thisExecution) return;
283
292
  const executionTime = Date.now() - startTime;
284
293
  let errorMessage = "Query execution failed";
285
294
  if (err instanceof Error) {
@@ -291,36 +300,36 @@ function useQueryExecutor(options) {
291
300
  }
292
301
  console.error("Query execution failed:", errorMessage);
293
302
  if (!isMountedRef.current) return;
294
- setState({
303
+ setState((prev) => ({
304
+ ...prev,
295
305
  isExecuting: false,
296
- results: void 0,
297
306
  error: errorMessage,
298
307
  executionTime
299
- });
300
- } finally {
301
- abortControllerRef.current = null;
308
+ }));
302
309
  }
303
310
  })();
304
311
  },
305
- [client]
312
+ []
306
313
  );
307
- const cancelQuery = useCallback(() => {
308
- if (abortControllerRef.current) {
309
- abortControllerRef.current.abort();
310
- setState((prev) => ({
311
- ...prev,
312
- isExecuting: false,
313
- error: "Query cancelled"
314
- }));
314
+ useEffect3(() => {
315
+ if (client && pendingRef.current) {
316
+ const { statements, params, shapes } = pendingRef.current;
317
+ query(statements, params, shapes);
315
318
  }
319
+ }, [client, query]);
320
+ const cancelQuery = useCallback(() => {
321
+ executionIdRef.current++;
322
+ setState((prev) => ({
323
+ ...prev,
324
+ isExecuting: false,
325
+ error: "Query cancelled"
326
+ }));
316
327
  }, []);
317
328
  return {
318
- // State
319
329
  isExecuting: state.isExecuting,
320
330
  results: state.results,
321
331
  error: state.error,
322
332
  executionTime: state.executionTime,
323
- // Actions
324
333
  query,
325
334
  cancelQuery
326
335
  };
@@ -328,7 +337,7 @@ function useQueryExecutor(options) {
328
337
 
329
338
  // src/hooks/use-query.ts
330
339
  import { useEffect as useEffect4, useMemo } from "react";
331
- function useQueryOne(rql, params, schema, options) {
340
+ function useQueryOne(rql, params, shape, options) {
332
341
  const {
333
342
  isExecuting,
334
343
  results,
@@ -336,15 +345,15 @@ function useQueryOne(rql, params, schema, options) {
336
345
  query
337
346
  } = useQueryExecutor(options);
338
347
  useEffect4(() => {
339
- const schemas = schema ? [schema] : void 0;
340
- query(rql, params, schemas);
348
+ const shapes = shape ? [shape] : void 0;
349
+ query(rql, params, shapes);
341
350
  }, [rql, params, query]);
342
351
  const result = useMemo(() => {
343
352
  return results && results.length > 0 ? results[0] : void 0;
344
353
  }, [results]);
345
354
  return { isExecuting, result, error };
346
355
  }
347
- function useQueryMany(statements, params, schemas, options) {
356
+ function useQueryMany(statements, params, shapes, options) {
348
357
  const {
349
358
  isExecuting,
350
359
  results,
@@ -352,7 +361,7 @@ function useQueryMany(statements, params, schemas, options) {
352
361
  query
353
362
  } = useQueryExecutor(options);
354
363
  useEffect4(() => {
355
- query(statements, params, schemas);
364
+ query(statements, params, shapes);
356
365
  }, [statements, params, query]);
357
366
  return { isExecuting, results, error };
358
367
  }
@@ -367,31 +376,33 @@ function useCommandExecutor(options) {
367
376
  error: void 0,
368
377
  executionTime: void 0
369
378
  });
370
- const abortControllerRef = useRef3(null);
371
- const isMountedRef = useRef3(true);
379
+ const clientRef = useRef3(client);
380
+ clientRef.current = client;
381
+ const isMountedRef = useRef3(false);
372
382
  useEffect5(() => {
383
+ isMountedRef.current = true;
373
384
  return () => {
374
385
  isMountedRef.current = false;
375
386
  };
376
387
  }, []);
388
+ const executionIdRef = useRef3(0);
389
+ const pendingRef = useRef3(null);
377
390
  const command = useCallback2(
378
- (statements, params, schemas) => {
379
- if (abortControllerRef.current) {
380
- abortControllerRef.current.abort();
391
+ (statements, params, shapes) => {
392
+ const currentClient = clientRef.current;
393
+ if (!currentClient) {
394
+ pendingRef.current = { statements, params, shapes };
395
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
396
+ return Promise.resolve();
381
397
  }
382
- abortControllerRef.current = new AbortController();
383
- const currentController = abortControllerRef.current;
384
- setState({
385
- isExecuting: true,
386
- results: void 0,
387
- error: void 0,
388
- executionTime: void 0
389
- });
398
+ pendingRef.current = null;
399
+ const thisExecution = ++executionIdRef.current;
400
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
390
401
  const startTime = Date.now();
391
- (async () => {
402
+ return (async () => {
392
403
  try {
393
- const frameResults = await client?.command(statements, params || null, schemas || []) || [];
394
- if (currentController.signal.aborted) return;
404
+ const frameResults = await currentClient.command(statements, params || null, shapes || []) || [];
405
+ if (executionIdRef.current !== thisExecution) return;
395
406
  const executionTime = Date.now() - startTime;
396
407
  const results = frameResults.map((frame) => {
397
408
  if (Array.isArray(frame) && frame.length > 0) {
@@ -412,7 +423,6 @@ function useCommandExecutor(options) {
412
423
  columns = Object.keys(firstRow).map((key) => ({
413
424
  name: key,
414
425
  type: "Utf8",
415
- // Default type for plain objects
416
426
  payload: []
417
427
  }));
418
428
  }
@@ -438,7 +448,7 @@ function useCommandExecutor(options) {
438
448
  executionTime
439
449
  });
440
450
  } catch (err) {
441
- if (currentController.signal.aborted) return;
451
+ if (executionIdRef.current !== thisExecution) return;
442
452
  const executionTime = Date.now() - startTime;
443
453
  let errorMessage = "Command execution failed";
444
454
  if (err instanceof Error) {
@@ -450,36 +460,36 @@ function useCommandExecutor(options) {
450
460
  }
451
461
  console.error("Command execution failed:", errorMessage);
452
462
  if (!isMountedRef.current) return;
453
- setState({
463
+ setState((prev) => ({
464
+ ...prev,
454
465
  isExecuting: false,
455
- results: void 0,
456
466
  error: errorMessage,
457
467
  executionTime
458
- });
459
- } finally {
460
- abortControllerRef.current = null;
468
+ }));
461
469
  }
462
470
  })();
463
471
  },
464
- [client]
472
+ []
465
473
  );
466
- const cancelCommand = useCallback2(() => {
467
- if (abortControllerRef.current) {
468
- abortControllerRef.current.abort();
469
- setState((prev) => ({
470
- ...prev,
471
- isExecuting: false,
472
- error: "Command cancelled"
473
- }));
474
+ useEffect5(() => {
475
+ if (client && pendingRef.current) {
476
+ const { statements, params, shapes } = pendingRef.current;
477
+ command(statements, params, shapes);
474
478
  }
479
+ }, [client, command]);
480
+ const cancelCommand = useCallback2(() => {
481
+ executionIdRef.current++;
482
+ setState((prev) => ({
483
+ ...prev,
484
+ isExecuting: false,
485
+ error: "Command cancelled"
486
+ }));
475
487
  }, []);
476
488
  return {
477
- // State
478
489
  isExecuting: state.isExecuting,
479
490
  results: state.results,
480
491
  error: state.error,
481
492
  executionTime: state.executionTime,
482
- // Actions
483
493
  command,
484
494
  cancelCommand
485
495
  };
@@ -487,7 +497,7 @@ function useCommandExecutor(options) {
487
497
 
488
498
  // src/hooks/use-command.ts
489
499
  import { useEffect as useEffect6, useMemo as useMemo2 } from "react";
490
- function useCommandOne(statement, params, schema, options) {
500
+ function useCommandOne(statement, params, shape, options) {
491
501
  const {
492
502
  isExecuting,
493
503
  results,
@@ -495,15 +505,15 @@ function useCommandOne(statement, params, schema, options) {
495
505
  command
496
506
  } = useCommandExecutor(options);
497
507
  useEffect6(() => {
498
- const schemas = schema ? [schema] : void 0;
499
- command(statement, params, schemas);
508
+ const shapes = shape ? [shape] : void 0;
509
+ command(statement, params, shapes);
500
510
  }, [statement, params, command]);
501
511
  const result = useMemo2(() => {
502
512
  return results && results.length > 0 ? results[0] : void 0;
503
513
  }, [results]);
504
514
  return { isExecuting, result, error };
505
515
  }
506
- function useCommandMany(statements, params, schemas, options) {
516
+ function useCommandMany(statements, params, shapes, options) {
507
517
  const {
508
518
  isExecuting,
509
519
  results,
@@ -511,7 +521,7 @@ function useCommandMany(statements, params, schemas, options) {
511
521
  command
512
522
  } = useCommandExecutor(options);
513
523
  useEffect6(() => {
514
- command(statements, params, schemas);
524
+ command(statements, params, shapes);
515
525
  }, [statements, params, command]);
516
526
  return { isExecuting, results, error };
517
527
  }
@@ -526,31 +536,33 @@ function useAdminExecutor(options) {
526
536
  error: void 0,
527
537
  executionTime: void 0
528
538
  });
529
- const abortControllerRef = useRef4(null);
530
- const isMountedRef = useRef4(true);
539
+ const clientRef = useRef4(client);
540
+ clientRef.current = client;
541
+ const isMountedRef = useRef4(false);
531
542
  useEffect7(() => {
543
+ isMountedRef.current = true;
532
544
  return () => {
533
545
  isMountedRef.current = false;
534
546
  };
535
547
  }, []);
548
+ const executionIdRef = useRef4(0);
549
+ const pendingRef = useRef4(null);
536
550
  const admin = useCallback3(
537
- (statements, params, schemas) => {
538
- if (abortControllerRef.current) {
539
- abortControllerRef.current.abort();
551
+ (statements, params, shapes) => {
552
+ const currentClient = clientRef.current;
553
+ if (!currentClient) {
554
+ pendingRef.current = { statements, params, shapes };
555
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
556
+ return Promise.resolve();
540
557
  }
541
- abortControllerRef.current = new AbortController();
542
- const currentController = abortControllerRef.current;
543
- setState({
544
- isExecuting: true,
545
- results: void 0,
546
- error: void 0,
547
- executionTime: void 0
548
- });
558
+ pendingRef.current = null;
559
+ const thisExecution = ++executionIdRef.current;
560
+ setState((prev) => ({ ...prev, isExecuting: true, error: void 0 }));
549
561
  const startTime = Date.now();
550
- (async () => {
562
+ return (async () => {
551
563
  try {
552
- const frameResults = await client?.admin(statements, params || null, schemas || []) || [];
553
- if (currentController.signal.aborted) return;
564
+ const frameResults = await currentClient.admin(statements, params || null, shapes || []) || [];
565
+ if (executionIdRef.current !== thisExecution) return;
554
566
  const executionTime = Date.now() - startTime;
555
567
  const results = frameResults.map((frame) => {
556
568
  if (Array.isArray(frame) && frame.length > 0) {
@@ -571,7 +583,6 @@ function useAdminExecutor(options) {
571
583
  columns = Object.keys(firstRow).map((key) => ({
572
584
  name: key,
573
585
  type: "Utf8",
574
- // Default type for plain objects
575
586
  payload: []
576
587
  }));
577
588
  }
@@ -597,7 +608,7 @@ function useAdminExecutor(options) {
597
608
  executionTime
598
609
  });
599
610
  } catch (err) {
600
- if (currentController.signal.aborted) return;
611
+ if (executionIdRef.current !== thisExecution) return;
601
612
  const executionTime = Date.now() - startTime;
602
613
  let errorMessage = "Admin execution failed";
603
614
  if (err instanceof Error) {
@@ -609,36 +620,37 @@ function useAdminExecutor(options) {
609
620
  }
610
621
  console.error("Admin execution failed:", errorMessage);
611
622
  if (!isMountedRef.current) return;
612
- setState({
623
+ setState((prev) => ({
624
+ ...prev,
613
625
  isExecuting: false,
614
- results: void 0,
615
626
  error: errorMessage,
616
627
  executionTime
617
- });
618
- } finally {
619
- abortControllerRef.current = null;
628
+ }));
620
629
  }
621
630
  })();
622
631
  },
623
- [client]
632
+ []
633
+ // stable — never recreates
624
634
  );
625
- const cancelAdmin = useCallback3(() => {
626
- if (abortControllerRef.current) {
627
- abortControllerRef.current.abort();
628
- setState((prev) => ({
629
- ...prev,
630
- isExecuting: false,
631
- error: "Admin cancelled"
632
- }));
635
+ useEffect7(() => {
636
+ if (client && pendingRef.current) {
637
+ const { statements, params, shapes } = pendingRef.current;
638
+ admin(statements, params, shapes);
633
639
  }
640
+ }, [client, admin]);
641
+ const cancelAdmin = useCallback3(() => {
642
+ executionIdRef.current++;
643
+ setState((prev) => ({
644
+ ...prev,
645
+ isExecuting: false,
646
+ error: "Admin cancelled"
647
+ }));
634
648
  }, []);
635
649
  return {
636
- // State
637
650
  isExecuting: state.isExecuting,
638
651
  results: state.results,
639
652
  error: state.error,
640
653
  executionTime: state.executionTime,
641
- // Actions
642
654
  admin,
643
655
  cancelAdmin
644
656
  };
@@ -646,7 +658,7 @@ function useAdminExecutor(options) {
646
658
 
647
659
  // src/hooks/use-admin.ts
648
660
  import { useEffect as useEffect8, useMemo as useMemo3 } from "react";
649
- function useAdminOne(statement, params, schema, options) {
661
+ function useAdminOne(statement, params, shape, options) {
650
662
  const {
651
663
  isExecuting,
652
664
  results,
@@ -654,15 +666,15 @@ function useAdminOne(statement, params, schema, options) {
654
666
  admin
655
667
  } = useAdminExecutor(options);
656
668
  useEffect8(() => {
657
- const schemas = schema ? [schema] : void 0;
658
- admin(statement, params, schemas);
669
+ const shapes = shape ? [shape] : void 0;
670
+ admin(statement, params, shapes);
659
671
  }, [statement, params, admin]);
660
672
  const result = useMemo3(() => {
661
673
  return results && results.length > 0 ? results[0] : void 0;
662
674
  }, [results]);
663
675
  return { isExecuting, result, error };
664
676
  }
665
- function useAdminMany(statements, params, schemas, options) {
677
+ function useAdminMany(statements, params, shapes, options) {
666
678
  const {
667
679
  isExecuting,
668
680
  results,
@@ -670,7 +682,7 @@ function useAdminMany(statements, params, schemas, options) {
670
682
  admin
671
683
  } = useAdminExecutor(options);
672
684
  useEffect8(() => {
673
- admin(statements, params, schemas);
685
+ admin(statements, params, shapes);
674
686
  }, [statements, params, admin]);
675
687
  return { isExecuting, results, error };
676
688
  }
@@ -691,7 +703,7 @@ function useSubscriptionExecutor(options) {
691
703
  const subscriptionIdRef = useRef5(void 0);
692
704
  const queryRef = useRef5(void 0);
693
705
  const paramsRef = useRef5(void 0);
694
- const schemaRef = useRef5(void 0);
706
+ const shapeRef = useRef5(void 0);
695
707
  useEffect9(() => {
696
708
  clientRef.current = client;
697
709
  }, [client]);
@@ -719,7 +731,7 @@ function useSubscriptionExecutor(options) {
719
731
  const handleRemove = useCallback4((rows) => {
720
732
  addChangeEvent("REMOVE", rows);
721
733
  }, [addChangeEvent]);
722
- const subscribe = useCallback4(async (query, params, schema) => {
734
+ const subscribe = useCallback4(async (query, params, shape) => {
723
735
  const currentClient = clientRef.current;
724
736
  if (!currentClient) {
725
737
  setState((prev) => ({ ...prev, error: "Client not connected" }));
@@ -731,14 +743,14 @@ function useSubscriptionExecutor(options) {
731
743
  }
732
744
  queryRef.current = query;
733
745
  paramsRef.current = params;
734
- schemaRef.current = schema;
746
+ shapeRef.current = shape;
735
747
  setState((prev) => ({
736
748
  ...prev,
737
749
  isSubscribing: true,
738
750
  error: void 0
739
751
  }));
740
752
  try {
741
- const subId = await currentClient.subscribe(query, params, schema, {
753
+ const subId = await currentClient.subscribe(query, params, shape, {
742
754
  onInsert: handleInsert,
743
755
  onUpdate: handleUpdate,
744
756
  onRemove: handleRemove
@@ -767,7 +779,7 @@ function useSubscriptionExecutor(options) {
767
779
  subscriptionIdRef.current = void 0;
768
780
  queryRef.current = void 0;
769
781
  paramsRef.current = void 0;
770
- schemaRef.current = void 0;
782
+ shapeRef.current = void 0;
771
783
  setState((prev) => ({
772
784
  ...prev,
773
785
  isSubscribed: false,
@@ -804,7 +816,7 @@ function useSubscriptionExecutor(options) {
804
816
 
805
817
  // src/hooks/use-subscription.ts
806
818
  import { useEffect as useEffect10, useMemo as useMemo4 } from "react";
807
- function useSubscription(query, params, schema, options) {
819
+ function useSubscription(query, params, shape, options) {
808
820
  const {
809
821
  state,
810
822
  subscribe,
@@ -813,11 +825,11 @@ function useSubscription(query, params, schema, options) {
813
825
  const paramsKey = useMemo4(() => JSON.stringify(params), [params]);
814
826
  useEffect10(() => {
815
827
  if (options?.enabled === false) return;
816
- subscribe(query, params, schema);
828
+ subscribe(query, params, shape);
817
829
  return () => {
818
830
  unsubscribe();
819
831
  };
820
- }, [query, paramsKey, schema, options?.enabled, subscribe, unsubscribe]);
832
+ }, [query, paramsKey, shape, options?.enabled, subscribe, unsubscribe]);
821
833
  return {
822
834
  data: state.data,
823
835
  changes: state.changes,
@@ -828,52 +840,52 @@ function useSubscription(query, params, schema, options) {
828
840
  };
829
841
  }
830
842
 
831
- // src/hooks/use-schema.ts
843
+ // src/hooks/use-shape.ts
832
844
  import { useEffect as useEffect11, useState as useState6 } from "react";
833
- import { Schema } from "@reifydb/core";
834
- var namespaceSchema = Schema.object({
835
- id: Schema.number(),
836
- name: Schema.string()
845
+ import { Shape } from "@reifydb/core";
846
+ var namespaceShape = Shape.object({
847
+ id: Shape.number(),
848
+ name: Shape.string()
837
849
  });
838
- var tableSchema = Schema.object({
839
- id: Schema.number(),
840
- namespace_id: Schema.number(),
841
- name: Schema.string(),
842
- primary_key_id: Schema.number()
850
+ var tableShape = Shape.object({
851
+ id: Shape.number(),
852
+ namespace_id: Shape.number(),
853
+ name: Shape.string(),
854
+ primary_key_id: Shape.number()
843
855
  });
844
- var viewSchema = Schema.object({
845
- id: Schema.number(),
846
- namespace_id: Schema.number(),
847
- name: Schema.string()
856
+ var viewShape = Shape.object({
857
+ id: Shape.number(),
858
+ namespace_id: Shape.number(),
859
+ name: Shape.string()
848
860
  });
849
- var columnSchema = Schema.object({
850
- id: Schema.number(),
851
- source_id: Schema.number(),
852
- source_type: Schema.number(),
853
- name: Schema.string(),
854
- type: Schema.number(),
855
- position: Schema.number(),
856
- auto_increment: Schema.boolean()
861
+ var columnShape = Shape.object({
862
+ id: Shape.number(),
863
+ shape_id: Shape.number(),
864
+ shape_type: Shape.number(),
865
+ name: Shape.string(),
866
+ type: Shape.number(),
867
+ position: Shape.number(),
868
+ auto_increment: Shape.boolean()
857
869
  });
858
- function useSchema() {
870
+ function useShape() {
859
871
  const { isExecuting, results, error, query } = useQueryExecutor();
860
- const [schema, setSchema] = useState6([]);
872
+ const [shape, setShape] = useState6([]);
861
873
  const [isLoading, setIsLoading] = useState6(true);
862
874
  useEffect11(() => {
863
875
  if (!query) return;
864
- const fetchSchema = async () => {
876
+ const fetchShape = async () => {
865
877
  setIsLoading(true);
866
878
  try {
867
879
  await query(
868
- `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; FROM system::columns;`,
880
+ `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; OUTPUT FROM system::columns;`,
869
881
  void 0,
870
- [namespaceSchema, tableSchema, viewSchema, columnSchema]
882
+ [namespaceShape, tableShape, viewShape, columnShape]
871
883
  );
872
884
  } catch (err) {
873
- console.error("Failed to fetch schema:", err);
885
+ console.error("Failed to fetch shape:", err);
874
886
  }
875
887
  };
876
- fetchSchema();
888
+ fetchShape();
877
889
  }, [query]);
878
890
  useEffect11(() => {
879
891
  if (!results || results.length < 4) {
@@ -958,34 +970,34 @@ function useSchema() {
958
970
  };
959
971
  const tableColumnsMap = /* @__PURE__ */ new Map();
960
972
  columns.forEach((column) => {
961
- const sourceId = column.source_id?.valueOf();
962
- const sourceType = column.source_type?.valueOf();
973
+ const shapeId = column.shape_id?.valueOf();
974
+ const shapeType = column.shape_type?.valueOf();
963
975
  const columnName = column.name?.valueOf();
964
976
  const typeId = column.type?.valueOf();
965
977
  const position = column.position?.valueOf();
966
- if (sourceId === void 0 || !columnName || typeId === void 0) return;
967
- if (sourceType !== 0 && sourceType !== 1) return;
968
- if (!tableColumnsMap.has(sourceId)) {
969
- tableColumnsMap.set(sourceId, []);
978
+ if (shapeId === void 0 || !columnName || typeId === void 0) return;
979
+ if (shapeType !== 0 && shapeType !== 1) return;
980
+ if (!tableColumnsMap.has(shapeId)) {
981
+ tableColumnsMap.set(shapeId, []);
970
982
  }
971
- tableColumnsMap.get(sourceId).push({
983
+ tableColumnsMap.get(shapeId).push({
972
984
  name: columnName,
973
985
  dataType: typeMap[typeId] || `Unknown(${typeId})`,
974
986
  position: position ?? 0
975
987
  });
976
988
  });
977
- tableColumnsMap.forEach((cols, sourceId) => {
978
- const tableInfo = tableInfoMap.get(sourceId);
989
+ tableColumnsMap.forEach((cols, shapeId) => {
990
+ const tableInfo = tableInfoMap.get(shapeId);
979
991
  if (tableInfo) {
980
992
  cols.sort((a, b) => a.position - b.position);
981
993
  tableInfo.columns = cols.map((c) => ({ name: c.name, dataType: c.dataType }));
982
994
  }
983
995
  });
984
- const schemaArray = Array.from(tableInfoMap.values()).filter((table) => table.name !== "reifydb::flows").sort((a, b) => a.name.localeCompare(b.name));
985
- setSchema(schemaArray);
996
+ const shapeArray = Array.from(tableInfoMap.values()).filter((table) => table.name !== "reifydb::flows").sort((a, b) => a.name.localeCompare(b.name));
997
+ setShape(shapeArray);
986
998
  setIsLoading(false);
987
999
  }, [results, isExecuting]);
988
- return [isLoading, schema, error];
1000
+ return [isLoading, shape, error];
989
1001
  }
990
1002
  export {
991
1003
  Connection,
@@ -1005,7 +1017,7 @@ export {
1005
1017
  useQueryExecutor,
1006
1018
  useQueryMany,
1007
1019
  useQueryOne,
1008
- useSchema,
1020
+ useShape,
1009
1021
  useSubscription,
1010
1022
  useSubscriptionExecutor
1011
1023
  };
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, 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 abortControllerRef = useRef<AbortController | null>(null);\n const isMountedRef = useRef(false);\n useEffect(() => {\n isMountedRef.current = true;\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 const currentController = abortControllerRef.current;\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 // If this execution was superseded by a newer one, discard results\n if (currentController.signal.aborted) return;\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 payload: [],\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 payload: [],\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 // If this execution was superseded by a newer one, discard error\n if (currentController.signal.aborted) 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({\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 const currentController = abortControllerRef.current;\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 // If this execution was superseded by a newer one, discard results\n if (currentController.signal.aborted) return;\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 payload: [],\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 payload: [],\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 // If this execution was superseded by a newer one, discard error\n if (currentController.signal.aborted) 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({\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 const currentController = abortControllerRef.current;\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 // If this execution was superseded by a newer one, discard results\n if (currentController.signal.aborted) 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 // 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 payload: [],\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 payload: [],\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 // If this execution was superseded by a newer one, discard error\n if (currentController.signal.aborted) 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({\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 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"]}
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-shape.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 {useShape, type TableInfo, type ColumnInfo} from './hooks/use-shape';","// 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 private connectPromise: Promise<void> | null = null;\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 if (this.state.isConnected) {\n return;\n }\n\n // If already connecting, wait for the in-flight connection\n if (this.connectPromise) {\n return this.connectPromise;\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 this.connectPromise = (async () => {\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 } finally {\n this.connectPromise = null;\n }\n })();\n\n return this.connectPromise;\n }\n\n async disconnect(): Promise<void> {\n this.connectPromise = null;\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, ShapeNode} 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, shapes?: readonly ShapeNode[]} | null>(null);\n\n const query = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, shapes};\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, shapes || []) || [];\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, shapes} = pendingRef.current;\n query(statements, params, shapes);\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 {ShapeNode, InferShape} 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 ShapeNode = any>(\n rql: string,\n params?: any,\n shape?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n result: QueryResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n query(rql, params, shapes);\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 ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: QueryOptions\n): {\n isExecuting: boolean;\n results: QueryResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n query\n } = useQueryExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n query(statements, params, shapes);\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, ShapeNode} 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, shapes?: readonly ShapeNode[]} | null>(null);\n\n const command = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): Promise<void> => {\n const currentClient = clientRef.current;\n\n if (!currentClient) {\n pendingRef.current = {statements, params, shapes};\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, shapes || []) || [];\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, shapes} = pendingRef.current;\n command(statements, params, shapes);\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 {ShapeNode, InferShape} 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 ShapeNode = any>(\n statement: string,\n params?: any,\n shape?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n result: CommandResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n command(statement, params, shapes);\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 ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: CommandOptions\n): {\n isExecuting: boolean;\n results: CommandResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n command\n } = useCommandExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n command(statements, params, shapes);\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, ShapeNode} 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, shapes?: readonly ShapeNode[]} | null>(null);\n\n const admin = useCallback(\n (statements: string | string[], params?: any, shapes?: readonly ShapeNode[]): 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, shapes};\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, shapes || []) || [];\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, shapes} = pendingRef.current;\n admin(statements, params, shapes);\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 {ShapeNode, InferShape} 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 ShapeNode = any>(\n statement: string,\n params?: any,\n shape?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n result: AdminResult<S extends ShapeNode ? InferShape<S> : any> | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends ShapeNode ? InferShape<S> : any>(options);\n\n useEffect(() => {\n // Pass shape as array for the executor\n const shapes = shape ? [shape] : undefined;\n admin(statement, params, shapes);\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 ShapeNode[] = readonly ShapeNode[]>(\n statements: string | string[],\n params?: any,\n shapes?: S,\n options?: AdminOptions\n): {\n isExecuting: boolean;\n results: AdminResult<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>[] | undefined;\n error: string | undefined;\n} {\n const {\n isExecuting,\n results,\n error,\n admin\n } = useAdminExecutor<S extends readonly ShapeNode[] ? InferShape<S[number]> : any>(options);\n\n useEffect(() => {\n admin(statements, params, shapes);\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 { ShapeNode } 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 shapeRef = useRef<ShapeNode | 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 shape?: ShapeNode\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 shapeRef.current = shape;\n\n setState(prev => ({\n ...prev,\n isSubscribing: true,\n error: undefined\n }));\n\n try {\n const subId = await currentClient.subscribe(query, params, shape, {\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 shapeRef.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 { ShapeNode, InferShape } 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 ShapeNode = any>(\n query: string,\n params?: any,\n shape?: S,\n options?: SubscriptionOptions\n): {\n data: InferShape<S>[];\n changes: ChangeEvent<InferShape<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<InferShape<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, shape);\n\n return () => {\n unsubscribe();\n };\n }, [query, paramsKey, shape, 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 {Shape, InferShape} 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 namespaceShape = Shape.object({\n id: Shape.number(),\n name: Shape.string(),\n});\n\nconst tableShape = Shape.object({\n id: Shape.number(),\n namespace_id: Shape.number(),\n name: Shape.string(),\n primary_key_id: Shape.number(),\n});\n\nconst viewShape = Shape.object({\n id: Shape.number(),\n namespace_id: Shape.number(),\n name: Shape.string(),\n});\n\nconst columnShape = Shape.object({\n id: Shape.number(),\n shape_id: Shape.number(),\n shape_type: Shape.number(),\n name: Shape.string(),\n type: Shape.number(),\n position: Shape.number(),\n auto_increment: Shape.boolean(),\n});\n\ntype NamespaceRow = InferShape<typeof namespaceShape>;\ntype TableRow = InferShape<typeof tableShape>;\ntype ViewRow = InferShape<typeof viewShape>;\ntype ColumnRow = InferShape<typeof columnShape>;\n\nexport function useShape(): [boolean, TableInfo[], string | undefined] {\n const {isExecuting, results, error, query} = useQueryExecutor();\n const [shape, setShape] = useState<TableInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!query) return;\n\n const fetchShape = async () => {\n setIsLoading(true);\n\n try {\n await query(\n `OUTPUT FROM system::namespaces; OUTPUT FROM system::tables; OUTPUT FROM system::views; OUTPUT FROM system::columns;`,\n undefined,\n [namespaceShape, tableShape, viewShape, columnShape]\n );\n } catch (err) {\n console.error('Failed to fetch shape:', err);\n }\n };\n\n fetchShape();\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 shapeId = column.shape_id?.valueOf() as number;\n const shapeType = column.shape_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 (shapeId === undefined || !columnName || typeId === undefined) return;\n if (shapeType !== 0 && shapeType !== 1) return;\n\n if (!tableColumnsMap.has(shapeId)) {\n tableColumnsMap.set(shapeId, []);\n }\n\n tableColumnsMap.get(shapeId)!.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, shapeId) => {\n const tableInfo = tableInfoMap.get(shapeId);\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 shapeArray = Array.from(tableInfoMap.values())\n .filter((table) => table.name !== 'reifydb::flows')\n .sort((a, b) => a.name.localeCompare(b.name));\n\n setShape(shapeArray);\n setIsLoading(false);\n }, [results, isExecuting]);\n\n return [isLoading, shape, 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.6",
3
+ "version": "0.4.8",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "dependencies": {
8
- "@reifydb/core": "0.4.6",
9
- "@reifydb/client": "0.4.6"
8
+ "@reifydb/core": "0.4.8",
9
+ "@reifydb/client": "0.4.8"
10
10
  },
11
11
  "peerDependencies": {
12
12
  "react": ">=16.8.0"