@reifydb/client 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,12 +1,14 @@
1
- import { Params, SchemaNode, FrameResults } from '@reifydb/core';
1
+ import { Frame, Params, SchemaNode, FrameResults } from '@reifydb/core';
2
2
  export { Diagnostic, DiagnosticColumn, Fragment, FrameResults, ReifyError, SingleFrameResult, asFrameResults } from '@reifydb/core';
3
3
 
4
- /**
5
- * MIT License
6
- * Copyright (c) 2025 ReifyDB
7
- * See license.md file for full license text
8
- */
9
-
4
+ interface AdminRequest {
5
+ id: string;
6
+ type: "Admin";
7
+ payload: {
8
+ statements: string[];
9
+ params?: Params;
10
+ };
11
+ }
10
12
  interface CommandRequest {
11
13
  id: string;
12
14
  type: "Command";
@@ -23,6 +25,47 @@ interface QueryRequest {
23
25
  params?: Params;
24
26
  };
25
27
  }
28
+ interface SubscribeRequest {
29
+ id: string;
30
+ type: "Subscribe";
31
+ payload: {
32
+ query: string;
33
+ };
34
+ }
35
+ interface SubscribedResponse {
36
+ id: string;
37
+ type: "Subscribed";
38
+ payload: {
39
+ subscription_id: string;
40
+ };
41
+ }
42
+ interface UnsubscribeRequest {
43
+ id: string;
44
+ type: "Unsubscribe";
45
+ payload: {
46
+ subscription_id: string;
47
+ };
48
+ }
49
+ interface UnsubscribedResponse {
50
+ id: string;
51
+ type: "Unsubscribed";
52
+ payload: {
53
+ subscription_id: string;
54
+ };
55
+ }
56
+ interface ChangeMessage {
57
+ type: "Change";
58
+ payload: {
59
+ subscription_id: string;
60
+ frame: Frame;
61
+ };
62
+ }
63
+ type SubscriptionOperation = 'INSERT' | 'UPDATE' | 'REMOVE';
64
+ interface SubscriptionCallbacks<T = any> {
65
+ onInsert?: (rows: T[]) => void;
66
+ onUpdate?: (rows: T[]) => void;
67
+ onRemove?: (rows: T[]) => void;
68
+ }
26
69
 
27
70
  interface WsClientOptions {
28
71
  url: string;
@@ -39,8 +82,17 @@ declare class WsClient {
39
82
  private reconnectAttempts;
40
83
  private shouldReconnect;
41
84
  private isReconnecting;
85
+ private subscriptions;
42
86
  private constructor();
43
87
  static connect(options: WsClientOptions): Promise<WsClient>;
88
+ /**
89
+ * Execute admin operation(s) with schemas for each statement for proper type inference.
90
+ * Admin operations support DDL (CREATE TABLE, ALTER, etc.), DML, and queries.
91
+ * @param statements - Single statement or array of RQL statements
92
+ * @param params - Parameters for the statements (use null or {} if no params)
93
+ * @param schemas - Schema for each statement's result
94
+ */
95
+ admin<const S extends readonly SchemaNode[]>(statements: string | string[], params: any, schemas: S): Promise<FrameResults<S>>;
44
96
  /**
45
97
  * Execute command(s) with schemas for each statement for proper type inference
46
98
  * @param statements - Single statement or array of RQL commands
@@ -55,7 +107,9 @@ declare class WsClient {
55
107
  * @param schemas - Schema for each statement's result
56
108
  */
57
109
  query<const S extends readonly SchemaNode[]>(statements: string | string[], params: any, schemas: S): Promise<FrameResults<S>>;
58
- send(req: CommandRequest | QueryRequest): Promise<any>;
110
+ subscribe<T = any>(query: string, params: any, schema: SchemaNode | undefined, callbacks: SubscriptionCallbacks<T>): Promise<string>;
111
+ unsubscribe(subscriptionId: string): Promise<void>;
112
+ send(req: AdminRequest | CommandRequest | QueryRequest): Promise<any>;
59
113
  private transformResult;
60
114
  /**
61
115
  * Coerce a value to the expected primitive type based on schema.
@@ -66,16 +120,13 @@ declare class WsClient {
66
120
  disconnect(): void;
67
121
  private handleDisconnect;
68
122
  private attemptReconnect;
123
+ private resubscribeAll;
124
+ private handleChangeMessage;
125
+ private frameToRows;
69
126
  private setupSocketHandlers;
70
127
  private rejectAllPendingRequests;
71
128
  }
72
129
 
73
- /**
74
- * MIT License
75
- * Copyright (c) 2025 ReifyDB
76
- * See license.md file for full license text
77
- */
78
-
79
130
  declare class Client {
80
131
  /**
81
132
  * Connect to ReifyDB via WebSocket
@@ -86,4 +137,4 @@ declare class Client {
86
137
  static connect_ws(url: string, options?: Omit<WsClientOptions, 'url'>): Promise<WsClient>;
87
138
  }
88
139
 
89
- export { Client, WsClient, type WsClientOptions };
140
+ export { type ChangeMessage, Client, type SubscribeRequest, type SubscribedResponse, type SubscriptionCallbacks, type SubscriptionOperation, type UnsubscribeRequest, type UnsubscribedResponse, WsClient, type WsClientOptions };
package/dist/index.js CHANGED
@@ -7,10 +7,10 @@ import {
7
7
  import { ReifyError } from "@reifydb/core";
8
8
 
9
9
  // src/encoder.ts
10
- import { UNDEFINED_VALUE } from "@reifydb/core";
10
+ import { NONE_VALUE } from "@reifydb/core";
11
11
  function encodeValue(value) {
12
12
  if (value === null || value === void 0) {
13
- return { type: "Undefined", value: UNDEFINED_VALUE };
13
+ return { type: "None", value: NONE_VALUE };
14
14
  }
15
15
  if (value && typeof value === "object" && "encode" in value && typeof value.encode === "function") {
16
16
  return value.encode();
@@ -110,22 +110,31 @@ var WsClient = class _WsClient {
110
110
  this.reconnectAttempts = 0;
111
111
  this.shouldReconnect = true;
112
112
  this.isReconnecting = false;
113
+ this.subscriptions = /* @__PURE__ */ new Map();
113
114
  this.options = options;
114
115
  this.nextId = 1;
115
116
  this.socket = socket;
116
117
  this.setupSocketHandlers();
117
118
  }
118
119
  static async connect(options) {
119
- console.log(`Connecting to WebSocket at ${options.url}`);
120
120
  const socket = await createWebSocket(options.url);
121
121
  if (socket.readyState !== 1) {
122
+ const connectionTimeoutMs = 3e4;
122
123
  await new Promise((resolve, reject) => {
124
+ const connectionTimeout = setTimeout(() => {
125
+ socket.removeEventListener("open", onOpen);
126
+ socket.removeEventListener("error", onError);
127
+ socket.close();
128
+ reject(new Error(`WebSocket connection timeout after ${connectionTimeoutMs}ms`));
129
+ }, connectionTimeoutMs);
123
130
  const onOpen = () => {
131
+ clearTimeout(connectionTimeout);
124
132
  socket.removeEventListener("open", onOpen);
125
133
  socket.removeEventListener("error", onError);
126
134
  resolve();
127
135
  };
128
136
  const onError = () => {
137
+ clearTimeout(connectionTimeout);
129
138
  socket.removeEventListener("open", onOpen);
130
139
  socket.removeEventListener("error", onError);
131
140
  reject(new Error("WebSocket connection failed"));
@@ -135,9 +144,37 @@ var WsClient = class _WsClient {
135
144
  });
136
145
  }
137
146
  socket.send('{"id":"auth-1","type":"Auth","payload":{"token":"mysecrettoken"}}');
138
- console.log("Connected successfully to WebSocket");
139
147
  return new _WsClient(socket, options);
140
148
  }
149
+ /**
150
+ * Execute admin operation(s) with schemas for each statement for proper type inference.
151
+ * Admin operations support DDL (CREATE TABLE, ALTER, etc.), DML, and queries.
152
+ * @param statements - Single statement or array of RQL statements
153
+ * @param params - Parameters for the statements (use null or {} if no params)
154
+ * @param schemas - Schema for each statement's result
155
+ */
156
+ async admin(statements, params, schemas) {
157
+ const id = `req-${this.nextId++}`;
158
+ const statementArray = Array.isArray(statements) ? statements : [statements];
159
+ const outputStatements = statementArray.length > 1 ? statementArray.map((s) => s.trim() ? `OUTPUT ${s}` : s) : statementArray;
160
+ const encodedParams = params !== void 0 && params !== null ? encodeParams(params) : void 0;
161
+ const result = await this.send({
162
+ id,
163
+ type: "Admin",
164
+ payload: {
165
+ statements: outputStatements,
166
+ params: encodedParams
167
+ }
168
+ });
169
+ const transformedFrames = result.map((frame, frameIndex) => {
170
+ const frameSchema = schemas[frameIndex];
171
+ if (!frameSchema) {
172
+ return frame;
173
+ }
174
+ return frame.map((row) => this.transformResult(row, frameSchema));
175
+ });
176
+ return transformedFrames;
177
+ }
141
178
  /**
142
179
  * Execute command(s) with schemas for each statement for proper type inference
143
180
  * @param statements - Single statement or array of RQL commands
@@ -147,12 +184,13 @@ var WsClient = class _WsClient {
147
184
  async command(statements, params, schemas) {
148
185
  const id = `req-${this.nextId++}`;
149
186
  const statementArray = Array.isArray(statements) ? statements : [statements];
187
+ const outputStatements = statementArray.length > 1 ? statementArray.map((s) => s.trim() ? `OUTPUT ${s}` : s) : statementArray;
150
188
  const encodedParams = params !== void 0 && params !== null ? encodeParams(params) : void 0;
151
189
  const result = await this.send({
152
190
  id,
153
191
  type: "Command",
154
192
  payload: {
155
- statements: statementArray,
193
+ statements: outputStatements,
156
194
  params: encodedParams
157
195
  }
158
196
  });
@@ -174,12 +212,13 @@ var WsClient = class _WsClient {
174
212
  async query(statements, params, schemas) {
175
213
  const id = `req-${this.nextId++}`;
176
214
  const statementArray = Array.isArray(statements) ? statements : [statements];
215
+ const outputStatements = statementArray.length > 1 ? statementArray.map((s) => s.trim() ? `OUTPUT ${s}` : s) : statementArray;
177
216
  const encodedParams = params !== void 0 && params !== null ? encodeParams(params) : void 0;
178
217
  const result = await this.send({
179
218
  id,
180
219
  type: "Query",
181
220
  payload: {
182
- statements: statementArray,
221
+ statements: outputStatements,
183
222
  params: encodedParams
184
223
  }
185
224
  });
@@ -192,6 +231,55 @@ var WsClient = class _WsClient {
192
231
  });
193
232
  return transformedFrames;
194
233
  }
234
+ async subscribe(query, params, schema, callbacks) {
235
+ const id = `sub-${this.nextId++}`;
236
+ const request = {
237
+ id,
238
+ type: "Subscribe",
239
+ payload: { query }
240
+ };
241
+ return new Promise((resolve, reject) => {
242
+ this.pending.set(id, (response) => {
243
+ if (response.type === "Err") {
244
+ reject(new ReifyError(response));
245
+ } else if (response.type === "Subscribed") {
246
+ const subscriptionId = response.payload.subscription_id;
247
+ this.subscriptions.set(subscriptionId, {
248
+ subscriptionId,
249
+ query,
250
+ params,
251
+ schema,
252
+ callbacks
253
+ });
254
+ resolve(subscriptionId);
255
+ } else {
256
+ reject(new Error("Unexpected response type"));
257
+ }
258
+ });
259
+ this.socket.send(JSON.stringify(request));
260
+ });
261
+ }
262
+ async unsubscribe(subscriptionId) {
263
+ const id = `unsub-${this.nextId++}`;
264
+ const request = {
265
+ id,
266
+ type: "Unsubscribe",
267
+ payload: { subscription_id: subscriptionId }
268
+ };
269
+ return new Promise((resolve, reject) => {
270
+ this.pending.set(id, (response) => {
271
+ if (response.type === "Err") {
272
+ reject(new ReifyError(response));
273
+ } else if (response.type === "Unsubscribed") {
274
+ this.subscriptions.delete(subscriptionId);
275
+ resolve();
276
+ } else {
277
+ reject(new Error("Unexpected response type"));
278
+ }
279
+ });
280
+ this.socket.send(JSON.stringify(request));
281
+ });
282
+ }
195
283
  async send(req) {
196
284
  const id = req.id;
197
285
  if (this.socket.readyState !== 1) {
@@ -208,10 +296,11 @@ var WsClient = class _WsClient {
208
296
  });
209
297
  }
210
298
  const response = await new Promise((resolve, reject) => {
299
+ const timeoutMs = this.options.timeoutMs ?? 3e4;
211
300
  const timeout = setTimeout(() => {
212
301
  this.pending.delete(id);
213
302
  reject(new Error("ReifyDB query timeout"));
214
- }, this.options.timeoutMs);
303
+ }, timeoutMs);
215
304
  this.pending.set(id, (res) => {
216
305
  clearTimeout(timeout);
217
306
  resolve(res);
@@ -296,6 +385,7 @@ var WsClient = class _WsClient {
296
385
  }
297
386
  disconnect() {
298
387
  this.shouldReconnect = false;
388
+ this.subscriptions.clear();
299
389
  this.socket.close();
300
390
  }
301
391
  handleDisconnect() {
@@ -315,19 +405,27 @@ var WsClient = class _WsClient {
315
405
  this.reconnectAttempts++;
316
406
  const baseDelay = this.options.reconnectDelayMs ?? 1e3;
317
407
  const delay = baseDelay * Math.pow(2, this.reconnectAttempts - 1);
318
- const maxAttempts = this.options.maxReconnectAttempts ?? 5;
319
- console.log(`Attempting reconnection (${this.reconnectAttempts}/${maxAttempts}): waiting ${delay}ms with exponential backoff`);
408
+ console.log(`Attempting reconnection in ${delay}ms`);
320
409
  await new Promise((resolve) => setTimeout(resolve, delay));
321
410
  try {
322
411
  const socket = await createWebSocket(this.options.url);
323
412
  if (socket.readyState !== 1) {
413
+ const connectionTimeoutMs = 3e4;
324
414
  await new Promise((resolve, reject) => {
415
+ const connectionTimeout = setTimeout(() => {
416
+ socket.removeEventListener("open", onOpen);
417
+ socket.removeEventListener("error", onError);
418
+ socket.close();
419
+ reject(new Error(`WebSocket reconnection timeout after ${connectionTimeoutMs}ms`));
420
+ }, connectionTimeoutMs);
325
421
  const onOpen = () => {
422
+ clearTimeout(connectionTimeout);
326
423
  socket.removeEventListener("open", onOpen);
327
424
  socket.removeEventListener("error", onError);
328
425
  resolve();
329
426
  };
330
427
  const onError = () => {
428
+ clearTimeout(connectionTimeout);
331
429
  socket.removeEventListener("open", onOpen);
332
430
  socket.removeEventListener("error", onError);
333
431
  reject(new Error("WebSocket connection failed"));
@@ -341,16 +439,86 @@ var WsClient = class _WsClient {
341
439
  this.setupSocketHandlers();
342
440
  this.reconnectAttempts = 0;
343
441
  this.isReconnecting = false;
344
- console.log("Successfully reconnected to WebSocket");
442
+ await this.resubscribeAll();
345
443
  } catch (error) {
346
- console.error("Reconnection attempt failed:", error);
347
444
  this.isReconnecting = false;
348
445
  this.handleDisconnect();
349
446
  }
350
447
  }
448
+ async resubscribeAll() {
449
+ const subscriptionsToReestablish = Array.from(this.subscriptions.values());
450
+ this.subscriptions.clear();
451
+ for (const state of subscriptionsToReestablish) {
452
+ try {
453
+ await this.subscribe(state.query, state.params, state.schema, state.callbacks);
454
+ } catch (err) {
455
+ console.error(`Failed to resubscribe to ${state.query}:`, err);
456
+ }
457
+ }
458
+ }
459
+ handleChangeMessage(msg) {
460
+ const { subscription_id, frame } = msg.payload;
461
+ const state = this.subscriptions.get(subscription_id);
462
+ if (!state) {
463
+ console.error("No state for subscription_id:", subscription_id);
464
+ return;
465
+ }
466
+ const opColumn = frame.columns.find((c) => c.name === "_op");
467
+ if (!opColumn || opColumn.data.length === 0) {
468
+ console.error("Missing or empty _op column:", { opColumn, frame });
469
+ return;
470
+ }
471
+ const rows = this.frameToRows(frame, state.schema);
472
+ const batches = [];
473
+ for (let i = 0; i < rows.length; i++) {
474
+ const opValue = parseInt(opColumn.data[i]);
475
+ const operation = opValue === 1 ? "INSERT" : opValue === 2 ? "UPDATE" : opValue === 3 ? "REMOVE" : "INSERT";
476
+ const { _op, ...cleanRow } = rows[i];
477
+ if (batches.length > 0 && batches[batches.length - 1].op === operation) {
478
+ batches[batches.length - 1].rows.push(cleanRow);
479
+ } else {
480
+ batches.push({ op: operation, rows: [cleanRow] });
481
+ }
482
+ }
483
+ for (const batch of batches) {
484
+ switch (batch.op) {
485
+ case "INSERT":
486
+ state.callbacks.onInsert?.(batch.rows);
487
+ break;
488
+ case "UPDATE":
489
+ state.callbacks.onUpdate?.(batch.rows);
490
+ break;
491
+ case "REMOVE":
492
+ state.callbacks.onRemove?.(batch.rows);
493
+ break;
494
+ }
495
+ }
496
+ }
497
+ frameToRows(frame, schema) {
498
+ if (!frame.columns || frame.columns.length === 0) return [];
499
+ const rowCount = frame.columns[0].data.length;
500
+ const rows = [];
501
+ for (let i = 0; i < rowCount; i++) {
502
+ const row = {};
503
+ for (const col of frame.columns) {
504
+ row[col.name] = decode({ type: col.type, value: col.data[i] });
505
+ }
506
+ rows.push(row);
507
+ }
508
+ if (schema) {
509
+ return rows.map((row) => this.transformResult(row, schema));
510
+ }
511
+ return rows;
512
+ }
351
513
  setupSocketHandlers() {
352
514
  this.socket.onmessage = (event) => {
353
515
  const msg = JSON.parse(event.data);
516
+ if (!msg.id) {
517
+ if (msg.type === "Change") {
518
+ this.handleChangeMessage(msg);
519
+ }
520
+ return;
521
+ }
354
522
  const { id, type, payload } = msg;
355
523
  const handler = this.pending.get(id);
356
524
  if (!handler) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ws.ts","../src/types.ts","../src/encoder.ts","../src/index.ts"],"sourcesContent":["/*\n * MIT License\n * Copyright (c) 2025 ReifyDB\n * See license.md file for full license text\n */\nimport {\n decode,\n Value\n} from \"@reifydb/core\";\nimport type {\n SchemaNode,\n InferSchemas,\n FrameResults\n} from \"@reifydb/core\";\n\nimport type {\n CommandRequest,\n CommandResponse,\n QueryRequest,\n QueryResponse,\n Column,\n Params,\n ErrorResponse\n} from \"./types\";\nimport {\n ReifyError\n} from \"./types\";\nimport {encodeParams} from \"./encoder\";\n\nexport interface WsClientOptions {\n url: string;\n timeoutMs?: number;\n token?: string;\n maxReconnectAttempts?: number;\n reconnectDelayMs?: number;\n}\n\ntype ResponsePayload = ErrorResponse | CommandResponse | QueryResponse;\n\nasync function createWebSocket(url: string): Promise<WebSocket> {\n if (typeof window !== \"undefined\" && typeof window.WebSocket !== \"undefined\") {\n return new WebSocket(url);\n } else {\n //@ts-ignore\n const wsModule = await import(\"ws\");\n return new wsModule.WebSocket(url);\n }\n}\n\n\nexport class WsClient {\n private options: WsClientOptions;\n private nextId: number;\n private socket: WebSocket;\n private pending = new Map<string, (response: ResponsePayload) => void>();\n private reconnectAttempts: number = 0;\n private shouldReconnect: boolean = true;\n private isReconnecting: boolean = false;\n\n private constructor(socket: WebSocket, options: WsClientOptions) {\n this.options = options;\n this.nextId = 1;\n this.socket = socket;\n\n this.setupSocketHandlers();\n }\n\n static async connect(options: WsClientOptions): Promise<WsClient> {\n console.log(`Connecting to WebSocket at ${options.url}`);\n const socket = await createWebSocket(options.url);\n\n // Wait for connection to open if not already open\n if (socket.readyState !== 1) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n });\n }\n\n socket.send(\"{\\\"id\\\":\\\"auth-1\\\",\\\"type\\\":\\\"Auth\\\",\\\"payload\\\":{\\\"token\\\":\\\"mysecrettoken\\\"}}\");\n\n console.log(\"Connected successfully to WebSocket\");\n return new WsClient(socket, options);\n }\n\n /**\n * Execute command(s) with schemas for each statement for proper type inference\n * @param statements - Single statement or array of RQL commands\n * @param params - Parameters for the commands (use null or {} if no params)\n * @param schemas - Schema for each statement's result\n */\n async command<const S extends readonly SchemaNode[]>(\n statements: string | string[],\n params: any,\n schemas: S\n ): Promise<FrameResults<S>> {\n const id = `req-${this.nextId++}`;\n\n // Normalize statements to array\n const statementArray = Array.isArray(statements) ? statements : [statements];\n\n // Encode params without schema assumptions\n const encodedParams = params !== undefined && params !== null\n ? encodeParams(params)\n : undefined;\n\n const result = await this.send({\n id,\n type: \"Command\",\n payload: {\n statements: statementArray,\n params: encodedParams\n },\n });\n\n // Transform each frame with its corresponding schema\n const transformedFrames = result.map((frame: any, frameIndex: number) => {\n const frameSchema = schemas[frameIndex];\n if (!frameSchema) {\n return frame; // No schema for this frame, return as-is\n }\n return frame.map((row: any) => this.transformResult(row, frameSchema));\n });\n\n return transformedFrames as FrameResults<S>;\n }\n\n\n /**\n * Execute query(s) with schemas for each statement for proper type inference\n * @param statements - Single statement or array of RQL queries\n * @param params - Parameters for the queries (use null or {} if no params)\n * @param schemas - Schema for each statement's result\n */\n async query<const S extends readonly SchemaNode[]>(\n statements: string | string[],\n params: any,\n schemas: S\n ): Promise<FrameResults<S>> {\n const id = `req-${this.nextId++}`;\n\n // Normalize statements to array\n const statementArray = Array.isArray(statements) ? statements : [statements];\n\n // Encode params without schema assumptions\n const encodedParams = params !== undefined && params !== null\n ? encodeParams(params)\n : undefined;\n\n const result = await this.send({\n id,\n type: \"Query\",\n payload: {\n statements: statementArray,\n params: encodedParams\n },\n });\n\n // Transform each frame with its corresponding schema\n const transformedFrames = result.map((frame: any, frameIndex: number) => {\n const frameSchema = schemas[frameIndex];\n if (!frameSchema) {\n return frame; // No schema for this frame, return as-is\n }\n return frame.map((row: any) => this.transformResult(row, frameSchema));\n });\n\n return transformedFrames as FrameResults<S>;\n }\n\n async send(req: CommandRequest | QueryRequest): Promise<any> {\n const id = req.id;\n\n if (this.socket.readyState !== 1) {\n throw new ReifyError({\n id: \"connection-error\",\n type: \"Err\",\n payload: {\n diagnostic: {\n code: \"CONNECTION_LOST\",\n message: \"Connection lost\",\n notes: []\n }\n }\n });\n }\n\n const response = await new Promise<ResponsePayload>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(\"ReifyDB query timeout\"));\n }, this.options.timeoutMs);\n\n this.pending.set(id, (res) => {\n clearTimeout(timeout);\n resolve(res);\n });\n\n this.socket.send(JSON.stringify(req));\n });\n\n if (response.type === \"Err\") {\n throw new ReifyError(response);\n\n }\n\n if (response.type !== req.type) {\n throw new Error(`Unexpected response type: ${response.type}`);\n }\n\n return response.payload.frames.map((frame) =>\n columnsToRows(frame.columns)\n );\n }\n\n\n private transformResult(row: any, resultSchema: any): any {\n // Handle object schema with primitive or value properties\n if (resultSchema && resultSchema.kind === 'object' && resultSchema.properties) {\n const transformedRow: any = {};\n for (const [key, value] of Object.entries(row)) {\n const propertySchema = resultSchema.properties[key];\n if (propertySchema && propertySchema.kind === 'primitive') {\n // Convert Value objects to primitives for primitive schema properties\n // Check if it's a Value instance by checking for valueOf method\n if (value && typeof value === 'object' && typeof (value as any).valueOf === 'function') {\n const rawValue = (value as any).valueOf();\n transformedRow[key] = this.coerceToPrimitiveType(rawValue, propertySchema.type);\n } else {\n transformedRow[key] = this.coerceToPrimitiveType(value, propertySchema.type);\n }\n } else if (propertySchema && propertySchema.kind === 'value') {\n // Keep Value objects as-is for value schema properties\n transformedRow[key] = value;\n } else {\n // Recursively transform nested structures\n transformedRow[key] = propertySchema ? this.transformResult(value, propertySchema) : value;\n }\n }\n return transformedRow;\n }\n\n // Handle primitive schema transformation\n if (resultSchema && resultSchema.kind === 'primitive') {\n // Single primitive value - extract from Value object if needed\n // Check if it's a Value instance by checking for valueOf method\n if (row && typeof row === 'object' && typeof row.valueOf === 'function') {\n return this.coerceToPrimitiveType(row.valueOf(), resultSchema.type);\n }\n return this.coerceToPrimitiveType(row, resultSchema.type);\n }\n\n // Handle value schema transformation - keep Value objects as-is\n if (resultSchema && resultSchema.kind === 'value') {\n return row;\n }\n\n // Handle array schema\n if (resultSchema && resultSchema.kind === 'array') {\n if (Array.isArray(row)) {\n return row.map((item: any) => this.transformResult(item, resultSchema.items));\n }\n return row;\n }\n\n // Handle optional schema\n if (resultSchema && resultSchema.kind === 'optional') {\n if (row === undefined || row === null) {\n return undefined;\n }\n return this.transformResult(row, resultSchema.schema);\n }\n\n // Default: return as-is\n return row;\n }\n\n /**\n * Coerce a value to the expected primitive type based on schema.\n * This handles cases where the server returns a smaller integer type\n * but the schema expects a bigint type (Int8, Int16, Uint8, Uint16).\n */\n private coerceToPrimitiveType(value: any, schemaType: string): any {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Bigint types: Int8, Int16, Uint8, Uint16\n const bigintTypes = ['Int8', 'Int16', 'Uint8', 'Uint16'];\n if (bigintTypes.includes(schemaType)) {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return BigInt(Math.trunc(value));\n }\n if (typeof value === 'string') {\n return BigInt(value);\n }\n }\n\n return value;\n }\n\n disconnect() {\n this.shouldReconnect = false;\n this.socket.close();\n }\n\n private handleDisconnect() {\n this.rejectAllPendingRequests();\n\n if (!this.shouldReconnect || this.isReconnecting) {\n return;\n }\n\n const maxAttempts = this.options.maxReconnectAttempts ?? 5;\n if (this.reconnectAttempts >= maxAttempts) {\n console.error(`Max reconnection attempts (${maxAttempts}) reached`);\n return;\n }\n\n this.attemptReconnect();\n }\n\n private async attemptReconnect() {\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n const baseDelay = this.options.reconnectDelayMs ?? 1000;\n const delay = baseDelay * Math.pow(2, this.reconnectAttempts - 1);\n const maxAttempts = this.options.maxReconnectAttempts ?? 5;\n\n console.log(`Attempting reconnection (${this.reconnectAttempts}/${maxAttempts}): waiting ${delay}ms with exponential backoff`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n try {\n const socket = await createWebSocket(this.options.url);\n\n if (socket.readyState !== 1) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n });\n }\n\n socket.send(\"{\\\"id\\\":\\\"auth-1\\\",\\\"type\\\":\\\"Auth\\\",\\\"payload\\\":{\\\"token\\\":\\\"mysecrettoken\\\"}}\");\n\n this.socket = socket;\n this.setupSocketHandlers();\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n console.log(\"Successfully reconnected to WebSocket\");\n } catch (error) {\n console.error(\"Reconnection attempt failed:\", error);\n this.isReconnecting = false;\n this.handleDisconnect();\n }\n }\n\n private setupSocketHandlers() {\n this.socket.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n const {id, type, payload} = msg;\n\n const handler = this.pending.get(id);\n if (!handler) {\n return;\n }\n\n this.pending.delete(id);\n handler({id, type, payload});\n };\n\n this.socket.onerror = (err) => {\n console.error(\"WebSocket error\", err);\n };\n\n this.socket.onclose = () => {\n this.handleDisconnect();\n };\n }\n\n private rejectAllPendingRequests() {\n const error: ErrorResponse = {\n id: \"connection-error\",\n type: \"Err\",\n payload: {\n diagnostic: {\n code: \"CONNECTION_LOST\",\n message: \"Connection lost\",\n notes: []\n }\n }\n };\n\n for (const handler of this.pending.values()) {\n handler(error);\n }\n this.pending.clear();\n }\n}\n\n\nfunction columnsToRows(columns: Column[]): Record<string, Value>[] {\n const rowCount = columns[0]?.data.length ?? 0;\n return Array.from({length: rowCount}, (_, i) => {\n const row: Record<string, Value> = {};\n for (const col of columns) {\n row[col.name] = decode({type: col.type, value: col.data[i]});\n }\n return row;\n });\n}","/**\n * MIT License\n * Copyright (c) 2025 ReifyDB\n * See license.md file for full license text\n */\n\nimport type { Params, Frame, Column, ErrorResponse } from \"@reifydb/core\";\nimport { ReifyError } from \"@reifydb/core\";\n\n// Re-export types that are actually available in flow\nexport type { Params, Frame, Column, ErrorResponse } from \"@reifydb/core\";\nexport { ReifyError } from \"@reifydb/core\";\n\nexport interface CommandRequest {\n id: string;\n type: \"Command\";\n payload: {\n statements: string[];\n params?: Params;\n }\n}\n\nexport interface CommandResponse {\n id: string;\n type: \"Command\";\n payload: {\n frames: Frame[];\n };\n}\n\nexport interface QueryRequest {\n id: string;\n type: \"Query\";\n payload: {\n statements: string[];\n params?: Params;\n }\n}\n\nexport interface QueryResponse {\n id: string;\n type: \"Query\";\n payload: {\n frames: Frame[];\n };\n}","/**\n * MIT License\n * Copyright (c) 2025 ReifyDB\n * See license.md file for full license text\n */\n\nimport {Type, UNDEFINED_VALUE} from \"@reifydb/core\";\n\nexport interface TypeValuePair {\n type: Type;\n value: string;\n}\n\nexport function encodeValue(value: any): TypeValuePair {\n\n if (value === null || value === undefined) {\n return { type: 'Undefined', value: UNDEFINED_VALUE };\n }\n \n if (value && typeof value === 'object' && 'encode' in value && typeof value.encode === 'function') {\n return value.encode();\n }\n \n if (typeof value === 'boolean') {\n return { type: 'Boolean', value: value.toString() };\n }\n \n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n // Choose appropriate integer type based on value range\n if (value >= -128 && value <= 127) {\n return { type: 'Int1', value: value.toString() };\n } else if (value >= -32768 && value <= 32767) {\n return { type: 'Int2', value: value.toString() };\n } else if (value >= -2147483648 && value <= 2147483647) {\n return { type: 'Int4', value: value.toString() };\n } else {\n return { type: 'Int8', value: value.toString() };\n }\n } else {\n // Floating point number\n return { type: 'Float8', value: value.toString() };\n }\n }\n \n if (typeof value === 'string') {\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[47][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) {\n const version = value[14];\n if (version === '4') {\n return { type: 'Uuid4', value: value };\n } else if (version === '7') {\n return { type: 'Uuid7', value: value };\n }\n }\n return { type: 'Utf8', value: value };\n }\n \n if (typeof value === 'bigint') {\n if (value >= BigInt(0)) {\n if (value <= BigInt(255)) {\n return { type: 'Uint1', value: value.toString() };\n } else if (value <= BigInt(65535)) {\n return { type: 'Uint2', value: value.toString() };\n } else if (value <= BigInt(4294967295)) {\n return { type: 'Uint4', value: value.toString() };\n } else if (value <= BigInt('18446744073709551615')) {\n return { type: 'Uint8', value: value.toString() };\n } else {\n return { type: 'Uint16', value: value.toString() };\n }\n } else {\n if (value >= BigInt('-9223372036854775808')) {\n return { type: 'Int8', value: value.toString() };\n } else {\n return { type: 'Int16', value: value.toString() };\n }\n }\n }\n \n if (value instanceof Date) {\n return { type: 'DateTime', value: value.toISOString() };\n }\n\n \n if (value instanceof Uint8Array) {\n const hex = Array.from(value)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return { type: 'Blob', value: '0x' + hex };\n }\n \n if (value instanceof ArrayBuffer) {\n const uint8Array = new Uint8Array(value);\n const hex = Array.from(uint8Array)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return { type: 'Blob', value: '0x' + hex };\n }\n \n throw new Error(`Cannot encode value of type ${typeof value}: ${value}`);\n}\n\nexport function encodeParams(params: any): TypeValuePair[] | Record<string, TypeValuePair> {\n if (params === undefined || params === null) {\n return [];\n }\n \n if (Array.isArray(params)) {\n return params.map(param => encodeValue(param));\n } else if (typeof params === 'object') {\n const encoded: Record<string, TypeValuePair> = {};\n for (const [key, value] of Object.entries(params)) {\n encoded[key] = encodeValue(value);\n }\n return encoded;\n }\n \n throw new Error(`Invalid parameters type: expected array or object, got ${typeof params}`);\n}","/**\n * MIT License\n * Copyright (c) 2025 ReifyDB\n * See license.md file for full license text\n */\n\nimport {WsClient, WsClientOptions} from \"./ws\";\n\nexport class Client {\n /**\n * Connect to ReifyDB via WebSocket\n * @param url WebSocket URL\n * @param options Optional configuration\n * @returns Connected WebSocket client\n */\n static async connect_ws(url: string, options: Omit<WsClientOptions, 'url'> = {}): Promise<WsClient> {\n return WsClient.connect({url, ...options});\n }\n}\n\nexport {ReifyError, asFrameResults} from \"@reifydb/core\";\nexport type {FrameResults, SingleFrameResult, Diagnostic, Fragment, DiagnosticColumn} from \"@reifydb/core\";\nexport {WsClient} from \"./ws\";\nexport type {WsClientOptions} from \"./ws\";"],"mappings":"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","names":["ReifyError"]}
1
+ {"version":3,"sources":["../src/ws.ts","../src/types.ts","../src/encoder.ts","../src/index.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2025 ReifyDB\nimport {\n decode,\n Value\n} from \"@reifydb/core\";\nimport type {\n SchemaNode,\n FrameResults,\n} from \"@reifydb/core\";\n\nimport type {\n AdminRequest,\n AdminResponse,\n CommandRequest,\n CommandResponse,\n QueryRequest,\n QueryResponse,\n Column,\n ErrorResponse,\n SubscribeRequest,\n SubscribedResponse,\n UnsubscribeRequest,\n UnsubscribedResponse,\n ChangeMessage,\n SubscriptionCallbacks\n} from \"./types\";\nimport {\n ReifyError\n} from \"./types\";\nimport {encodeParams} from \"./encoder\";\n\nexport interface WsClientOptions {\n url: string;\n timeoutMs?: number;\n token?: string;\n maxReconnectAttempts?: number;\n reconnectDelayMs?: number;\n}\n\ninterface SubscriptionState<T = any> {\n subscriptionId: string;\n query: string;\n params?: any;\n schema?: SchemaNode;\n callbacks: SubscriptionCallbacks<T>;\n}\n\ntype ResponsePayload = ErrorResponse | AdminResponse | CommandResponse | QueryResponse | SubscribedResponse | UnsubscribedResponse;\n\nasync function createWebSocket(url: string): Promise<WebSocket> {\n if (typeof window !== \"undefined\" && typeof window.WebSocket !== \"undefined\") {\n return new WebSocket(url);\n } else {\n //@ts-ignore\n const wsModule = await import(\"ws\");\n return new wsModule.WebSocket(url);\n }\n}\n\n\nexport class WsClient {\n private options: WsClientOptions;\n private nextId: number;\n private socket: WebSocket;\n private pending = new Map<string, (response: ResponsePayload) => void>();\n private reconnectAttempts: number = 0;\n private shouldReconnect: boolean = true;\n private isReconnecting: boolean = false;\n private subscriptions = new Map<string, SubscriptionState>();\n\n private constructor(socket: WebSocket, options: WsClientOptions) {\n this.options = options;\n this.nextId = 1;\n this.socket = socket;\n\n this.setupSocketHandlers();\n }\n\n static async connect(options: WsClientOptions): Promise<WsClient> {\n const socket = await createWebSocket(options.url);\n\n // Wait for connection to open if not already open, with timeout\n if (socket.readyState !== 1) {\n const connectionTimeoutMs = 30000; // 30 second connection timeout\n await new Promise<void>((resolve, reject) => {\n const connectionTimeout = setTimeout(() => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n socket.close();\n reject(new Error(`WebSocket connection timeout after ${connectionTimeoutMs}ms`));\n }, connectionTimeoutMs);\n\n const onOpen = () => {\n clearTimeout(connectionTimeout);\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n clearTimeout(connectionTimeout);\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n });\n }\n\n socket.send(\"{\\\"id\\\":\\\"auth-1\\\",\\\"type\\\":\\\"Auth\\\",\\\"payload\\\":{\\\"token\\\":\\\"mysecrettoken\\\"}}\");\n\n return new WsClient(socket, options);\n }\n\n /**\n * Execute admin operation(s) with schemas for each statement for proper type inference.\n * Admin operations support DDL (CREATE TABLE, ALTER, etc.), DML, and queries.\n * @param statements - Single statement or array of RQL statements\n * @param params - Parameters for the statements (use null or {} if no params)\n * @param schemas - Schema for each statement's result\n */\n async admin<const S extends readonly SchemaNode[]>(\n statements: string | string[],\n params: any,\n schemas: S\n ): Promise<FrameResults<S>> {\n const id = `req-${this.nextId++}`;\n\n // Normalize statements to array\n const statementArray = Array.isArray(statements) ? statements : [statements];\n // When multiple array elements, mark each with OUTPUT so all results are returned\n const outputStatements = statementArray.length > 1\n ? statementArray.map(s => s.trim() ? `OUTPUT ${s}` : s)\n : statementArray;\n\n // Encode params without schema assumptions\n const encodedParams = params !== undefined && params !== null\n ? encodeParams(params)\n : undefined;\n\n const result = await this.send({\n id,\n type: \"Admin\",\n payload: {\n statements: outputStatements,\n params: encodedParams\n },\n });\n\n // Transform each frame with its corresponding schema\n const transformedFrames = result.map((frame: any, frameIndex: number) => {\n const frameSchema = schemas[frameIndex];\n if (!frameSchema) {\n return frame; // No schema for this frame, return as-is\n }\n return frame.map((row: any) => this.transformResult(row, frameSchema));\n });\n\n return transformedFrames as FrameResults<S>;\n }\n\n /**\n * Execute command(s) with schemas for each statement for proper type inference\n * @param statements - Single statement or array of RQL commands\n * @param params - Parameters for the commands (use null or {} if no params)\n * @param schemas - Schema for each statement's result\n */\n async command<const S extends readonly SchemaNode[]>(\n statements: string | string[],\n params: any,\n schemas: S\n ): Promise<FrameResults<S>> {\n const id = `req-${this.nextId++}`;\n\n // Normalize statements to array\n const statementArray = Array.isArray(statements) ? statements : [statements];\n // When multiple array elements, mark each with OUTPUT so all results are returned\n const outputStatements = statementArray.length > 1\n ? statementArray.map(s => s.trim() ? `OUTPUT ${s}` : s)\n : statementArray;\n\n // Encode params without schema assumptions\n const encodedParams = params !== undefined && params !== null\n ? encodeParams(params)\n : undefined;\n\n const result = await this.send({\n id,\n type: \"Command\",\n payload: {\n statements: outputStatements,\n params: encodedParams\n },\n });\n\n // Transform each frame with its corresponding schema\n const transformedFrames = result.map((frame: any, frameIndex: number) => {\n const frameSchema = schemas[frameIndex];\n if (!frameSchema) {\n return frame; // No schema for this frame, return as-is\n }\n return frame.map((row: any) => this.transformResult(row, frameSchema));\n });\n\n return transformedFrames as FrameResults<S>;\n }\n\n\n /**\n * Execute query(s) with schemas for each statement for proper type inference\n * @param statements - Single statement or array of RQL queries\n * @param params - Parameters for the queries (use null or {} if no params)\n * @param schemas - Schema for each statement's result\n */\n async query<const S extends readonly SchemaNode[]>(\n statements: string | string[],\n params: any,\n schemas: S\n ): Promise<FrameResults<S>> {\n const id = `req-${this.nextId++}`;\n\n // Normalize statements to array\n const statementArray = Array.isArray(statements) ? statements : [statements];\n // When multiple array elements, mark each with OUTPUT so all results are returned\n const outputStatements = statementArray.length > 1\n ? statementArray.map(s => s.trim() ? `OUTPUT ${s}` : s)\n : statementArray;\n\n // Encode params without schema assumptions\n const encodedParams = params !== undefined && params !== null\n ? encodeParams(params)\n : undefined;\n\n const result = await this.send({\n id,\n type: \"Query\",\n payload: {\n statements: outputStatements,\n params: encodedParams\n },\n });\n\n // Transform each frame with its corresponding schema\n const transformedFrames = result.map((frame: any, frameIndex: number) => {\n const frameSchema = schemas[frameIndex];\n if (!frameSchema) {\n return frame; // No schema for this frame, return as-is\n }\n return frame.map((row: any) => this.transformResult(row, frameSchema));\n });\n\n return transformedFrames as FrameResults<S>;\n }\n\n async subscribe<T = any>(\n query: string,\n params: any,\n schema: SchemaNode | undefined,\n callbacks: SubscriptionCallbacks<T>\n ): Promise<string> {\n const id = `sub-${this.nextId++}`;\n\n const request: SubscribeRequest = {\n id,\n type: \"Subscribe\",\n payload: {query}\n };\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, (response) => {\n if (response.type === \"Err\") {\n reject(new ReifyError(response));\n } else if (response.type === \"Subscribed\") {\n const subscriptionId = response.payload.subscription_id;\n\n // Store subscription state\n this.subscriptions.set(subscriptionId, {\n subscriptionId,\n query,\n params,\n schema,\n callbacks\n });\n\n resolve(subscriptionId);\n } else {\n reject(new Error(\"Unexpected response type\"));\n }\n });\n\n this.socket.send(JSON.stringify(request));\n });\n }\n\n async unsubscribe(subscriptionId: string): Promise<void> {\n const id = `unsub-${this.nextId++}`;\n\n const request: UnsubscribeRequest = {\n id,\n type: \"Unsubscribe\",\n payload: {subscription_id: subscriptionId}\n };\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, (response) => {\n if (response.type === \"Err\") {\n reject(new ReifyError(response));\n } else if (response.type === \"Unsubscribed\") {\n this.subscriptions.delete(subscriptionId);\n resolve();\n } else {\n reject(new Error(\"Unexpected response type\"));\n }\n });\n\n this.socket.send(JSON.stringify(request));\n });\n }\n\n async send(req: AdminRequest | CommandRequest | QueryRequest): Promise<any> {\n const id = req.id;\n\n if (this.socket.readyState !== 1) {\n throw new ReifyError({\n id: \"connection-error\",\n type: \"Err\",\n payload: {\n diagnostic: {\n code: \"CONNECTION_LOST\",\n message: \"Connection lost\",\n notes: []\n }\n }\n });\n }\n\n const response = await new Promise<ResponsePayload>((resolve, reject) => {\n const timeoutMs = this.options.timeoutMs ?? 30_000;\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(\"ReifyDB query timeout\"));\n }, timeoutMs);\n\n this.pending.set(id, (res) => {\n clearTimeout(timeout);\n resolve(res);\n });\n\n this.socket.send(JSON.stringify(req));\n });\n\n if (response.type === \"Err\") {\n throw new ReifyError(response);\n\n }\n\n if (response.type !== req.type) {\n throw new Error(`Unexpected response type: ${response.type}`);\n }\n\n return response.payload.frames.map((frame) =>\n columnsToRows(frame.columns)\n );\n }\n\n\n private transformResult(row: any, resultSchema: any): any {\n // Handle object schema with primitive or value properties\n if (resultSchema && resultSchema.kind === 'object' && resultSchema.properties) {\n const transformedRow: any = {};\n for (const [key, value] of Object.entries(row)) {\n const propertySchema = resultSchema.properties[key];\n if (propertySchema && propertySchema.kind === 'primitive') {\n // Convert Value objects to primitives for primitive schema properties\n // Check if it's a Value instance by checking for valueOf method\n if (value && typeof value === 'object' && typeof (value as any).valueOf === 'function') {\n const rawValue = (value as any).valueOf();\n transformedRow[key] = this.coerceToPrimitiveType(rawValue, propertySchema.type);\n } else {\n transformedRow[key] = this.coerceToPrimitiveType(value, propertySchema.type);\n }\n } else if (propertySchema && propertySchema.kind === 'value') {\n // Keep Value objects as-is for value schema properties\n transformedRow[key] = value;\n } else {\n // Recursively transform nested structures\n transformedRow[key] = propertySchema ? this.transformResult(value, propertySchema) : value;\n }\n }\n return transformedRow;\n }\n\n // Handle primitive schema transformation\n if (resultSchema && resultSchema.kind === 'primitive') {\n // Single primitive value - extract from Value object if needed\n // Check if it's a Value instance by checking for valueOf method\n if (row && typeof row === 'object' && typeof row.valueOf === 'function') {\n return this.coerceToPrimitiveType(row.valueOf(), resultSchema.type);\n }\n return this.coerceToPrimitiveType(row, resultSchema.type);\n }\n\n // Handle value schema transformation - keep Value objects as-is\n if (resultSchema && resultSchema.kind === 'value') {\n return row;\n }\n\n // Handle array schema\n if (resultSchema && resultSchema.kind === 'array') {\n if (Array.isArray(row)) {\n return row.map((item: any) => this.transformResult(item, resultSchema.items));\n }\n return row;\n }\n\n // Handle optional schema\n if (resultSchema && resultSchema.kind === 'optional') {\n if (row === undefined || row === null) {\n return undefined;\n }\n return this.transformResult(row, resultSchema.schema);\n }\n\n // Default: return as-is\n return row;\n }\n\n /**\n * Coerce a value to the expected primitive type based on schema.\n * This handles cases where the server returns a smaller integer type\n * but the schema expects a bigint type (Int8, Int16, Uint8, Uint16).\n */\n private coerceToPrimitiveType(value: any, schemaType: string): any {\n if (value === undefined || value === null) {\n return value;\n }\n\n // Bigint types: Int8, Int16, Uint8, Uint16\n const bigintTypes = ['Int8', 'Int16', 'Uint8', 'Uint16'];\n if (bigintTypes.includes(schemaType)) {\n if (typeof value === 'bigint') {\n return value;\n }\n if (typeof value === 'number') {\n return BigInt(Math.trunc(value));\n }\n if (typeof value === 'string') {\n return BigInt(value);\n }\n }\n\n return value;\n }\n\n disconnect() {\n this.shouldReconnect = false;\n this.subscriptions.clear();\n this.socket.close();\n }\n\n private handleDisconnect() {\n this.rejectAllPendingRequests();\n\n if (!this.shouldReconnect || this.isReconnecting) {\n return;\n }\n\n const maxAttempts = this.options.maxReconnectAttempts ?? 5;\n if (this.reconnectAttempts >= maxAttempts) {\n console.error(`Max reconnection attempts (${maxAttempts}) reached`);\n return;\n }\n\n this.attemptReconnect();\n }\n\n private async attemptReconnect() {\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n const baseDelay = this.options.reconnectDelayMs ?? 1000;\n const delay = baseDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(`Attempting reconnection in ${delay}ms`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n try {\n const socket = await createWebSocket(this.options.url);\n\n if (socket.readyState !== 1) {\n const connectionTimeoutMs = 30000; // 30 second connection timeout\n await new Promise<void>((resolve, reject) => {\n const connectionTimeout = setTimeout(() => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n socket.close();\n reject(new Error(`WebSocket reconnection timeout after ${connectionTimeoutMs}ms`));\n }, connectionTimeoutMs);\n\n const onOpen = () => {\n clearTimeout(connectionTimeout);\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n clearTimeout(connectionTimeout);\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n });\n }\n\n socket.send(\"{\\\"id\\\":\\\"auth-1\\\",\\\"type\\\":\\\"Auth\\\",\\\"payload\\\":{\\\"token\\\":\\\"mysecrettoken\\\"}}\");\n\n this.socket = socket;\n this.setupSocketHandlers();\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n\n // Re-establish all active subscriptions\n await this.resubscribeAll();\n } catch (error) {\n this.isReconnecting = false;\n this.handleDisconnect();\n }\n }\n\n private async resubscribeAll(): Promise<void> {\n const subscriptionsToReestablish = Array.from(this.subscriptions.values());\n\n // Clear current subscriptions map (will be repopulated)\n this.subscriptions.clear();\n\n for (const state of subscriptionsToReestablish) {\n try {\n // Re-subscribe with same parameters\n // Cast to avoid overload resolution issues in internal call\n await (this.subscribe as any)(state.query, state.params, state.schema, state.callbacks);\n } catch (err) {\n console.error(`Failed to resubscribe to ${state.query}:`, err);\n }\n }\n }\n\n private handleChangeMessage(msg: ChangeMessage): void {\n const {subscription_id, frame} = msg.payload;\n const state = this.subscriptions.get(subscription_id);\n\n if (!state) {\n console.error('No state for subscription_id:', subscription_id);\n return;\n }\n\n // Extract _op column to determine operation type\n const opColumn = frame.columns.find(c => c.name === \"_op\");\n if (!opColumn || opColumn.data.length === 0) {\n console.error('Missing or empty _op column:', { opColumn, frame });\n return;\n }\n\n // Transform frame to rows using existing transformResult logic\n const rows = this.frameToRows(frame, state.schema);\n\n // Group rows by operation type (defensive - usually all same type)\n // Process in order to maintain sequential execution\n const batches: Array<{ op: 'INSERT' | 'UPDATE' | 'REMOVE'; rows: any[] }> = [];\n\n for (let i = 0; i < rows.length; i++) {\n const opValue = parseInt(opColumn.data[i]);\n const operation: 'INSERT' | 'UPDATE' | 'REMOVE' =\n opValue === 1 ? 'INSERT' :\n opValue === 2 ? 'UPDATE' :\n opValue === 3 ? 'REMOVE' : 'INSERT';\n\n // Remove _op from this row\n const {_op, ...cleanRow} = rows[i];\n\n // Batch consecutive rows of same operation type\n if (batches.length > 0 && batches[batches.length - 1].op === operation) {\n batches[batches.length - 1].rows.push(cleanRow);\n } else {\n batches.push({op: operation, rows: [cleanRow]});\n }\n }\n\n // Execute callbacks sequentially in order\n for (const batch of batches) {\n switch (batch.op) {\n case 'INSERT':\n state.callbacks.onInsert?.(batch.rows);\n break;\n case 'UPDATE':\n state.callbacks.onUpdate?.(batch.rows);\n break;\n case 'REMOVE':\n state.callbacks.onRemove?.(batch.rows);\n break;\n }\n }\n }\n\n private frameToRows(frame: any, schema?: SchemaNode): any[] {\n // Convert frame columns to array of row objects\n if (!frame.columns || frame.columns.length === 0) return [];\n\n const rowCount = frame.columns[0].data.length;\n const rows: any[] = [];\n\n for (let i = 0; i < rowCount; i++) {\n const row: any = {};\n for (const col of frame.columns) {\n row[col.name] = decode({type: col.type, value: col.data[i]});\n }\n rows.push(row);\n }\n\n // Apply schema transformation if provided\n if (schema) {\n return rows.map(row => this.transformResult(row, schema));\n }\n\n return rows;\n }\n\n private setupSocketHandlers() {\n this.socket.onmessage = (event) => {\n const msg = JSON.parse(event.data);\n\n // Handle server-initiated messages (no id)\n if (!msg.id) {\n if (msg.type === \"Change\") {\n this.handleChangeMessage(msg);\n }\n return;\n }\n\n const {id, type, payload} = msg;\n\n const handler = this.pending.get(id);\n if (!handler) {\n return;\n }\n\n this.pending.delete(id);\n handler({id, type, payload});\n };\n\n this.socket.onerror = (err) => {\n console.error(\"WebSocket error\", err);\n };\n\n this.socket.onclose = () => {\n this.handleDisconnect();\n };\n }\n\n private rejectAllPendingRequests() {\n const error: ErrorResponse = {\n id: \"connection-error\",\n type: \"Err\",\n payload: {\n diagnostic: {\n code: \"CONNECTION_LOST\",\n message: \"Connection lost\",\n notes: []\n }\n }\n };\n\n for (const handler of this.pending.values()) {\n handler(error);\n }\n this.pending.clear();\n }\n}\n\n\nfunction columnsToRows(columns: Column[]): Record<string, Value>[] {\n const rowCount = columns[0]?.data.length ?? 0;\n return Array.from({length: rowCount}, (_, i) => {\n const row: Record<string, Value> = {};\n for (const col of columns) {\n row[col.name] = decode({type: col.type, value: col.data[i]});\n }\n return row;\n });\n}","// SPDX-License-Identifier: MIT\n// Copyright (c) 2025 ReifyDB\nimport type { Params, Frame, Column, ErrorResponse } from \"@reifydb/core\";\nimport { ReifyError } from \"@reifydb/core\";\n\n// Re-export types that are actually available in flow\nexport type { Params, Frame, Column, ErrorResponse } from \"@reifydb/core\";\nexport { ReifyError } from \"@reifydb/core\";\n\nexport interface AdminRequest {\n id: string;\n type: \"Admin\";\n payload: {\n statements: string[];\n params?: Params;\n }\n}\n\nexport interface AdminResponse {\n id: string;\n type: \"Admin\";\n payload: {\n frames: Frame[];\n };\n}\n\nexport interface CommandRequest {\n id: string;\n type: \"Command\";\n payload: {\n statements: string[];\n params?: Params;\n }\n}\n\nexport interface CommandResponse {\n id: string;\n type: \"Command\";\n payload: {\n frames: Frame[];\n };\n}\n\nexport interface QueryRequest {\n id: string;\n type: \"Query\";\n payload: {\n statements: string[];\n params?: Params;\n }\n}\n\nexport interface QueryResponse {\n id: string;\n type: \"Query\";\n payload: {\n frames: Frame[];\n };\n}\n\nexport interface SubscribeRequest {\n id: string;\n type: \"Subscribe\";\n payload: {\n query: string;\n };\n}\n\nexport interface SubscribedResponse {\n id: string;\n type: \"Subscribed\";\n payload: {\n subscription_id: string;\n };\n}\n\nexport interface UnsubscribeRequest {\n id: string;\n type: \"Unsubscribe\";\n payload: {\n subscription_id: string;\n };\n}\n\nexport interface UnsubscribedResponse {\n id: string;\n type: \"Unsubscribed\";\n payload: {\n subscription_id: string;\n };\n}\n\nexport interface ChangeMessage {\n // No id field - server-initiated\n type: \"Change\";\n payload: {\n subscription_id: string;\n frame: Frame;\n };\n}\n\nexport type SubscriptionOperation = 'INSERT' | 'UPDATE' | 'REMOVE';\n\nexport interface SubscriptionCallbacks<T = any> {\n onInsert?: (rows: T[]) => void;\n onUpdate?: (rows: T[]) => void;\n onRemove?: (rows: T[]) => void;\n}","// SPDX-License-Identifier: MIT\n// Copyright (c) 2025 ReifyDB\nimport {NONE_VALUE, TypeValuePair} from \"@reifydb/core\";\n\nexport function encodeValue(value: any): TypeValuePair {\n\n if (value === null || value === undefined) {\n return { type: 'None', value: NONE_VALUE };\n }\n\n if (value && typeof value === 'object' && 'encode' in value && typeof value.encode === 'function') {\n return value.encode();\n }\n\n if (typeof value === 'boolean') {\n return { type: 'Boolean', value: value.toString() };\n }\n\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n // Choose appropriate integer type based on value range\n if (value >= -128 && value <= 127) {\n return { type: 'Int1', value: value.toString() };\n } else if (value >= -32768 && value <= 32767) {\n return { type: 'Int2', value: value.toString() };\n } else if (value >= -2147483648 && value <= 2147483647) {\n return { type: 'Int4', value: value.toString() };\n } else {\n return { type: 'Int8', value: value.toString() };\n }\n } else {\n // Floating point number\n return { type: 'Float8', value: value.toString() };\n }\n }\n\n if (typeof value === 'string') {\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[47][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) {\n const version = value[14];\n if (version === '4') {\n return { type: 'Uuid4', value: value };\n } else if (version === '7') {\n return { type: 'Uuid7', value: value };\n }\n }\n return { type: 'Utf8', value: value };\n }\n\n if (typeof value === 'bigint') {\n if (value >= BigInt(0)) {\n if (value <= BigInt(255)) {\n return { type: 'Uint1', value: value.toString() };\n } else if (value <= BigInt(65535)) {\n return { type: 'Uint2', value: value.toString() };\n } else if (value <= BigInt(4294967295)) {\n return { type: 'Uint4', value: value.toString() };\n } else if (value <= BigInt('18446744073709551615')) {\n return { type: 'Uint8', value: value.toString() };\n } else {\n return { type: 'Uint16', value: value.toString() };\n }\n } else {\n if (value >= BigInt('-9223372036854775808')) {\n return { type: 'Int8', value: value.toString() };\n } else {\n return { type: 'Int16', value: value.toString() };\n }\n }\n }\n\n if (value instanceof Date) {\n return { type: 'DateTime', value: value.toISOString() };\n }\n\n\n if (value instanceof Uint8Array) {\n const hex = Array.from(value)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return { type: 'Blob', value: '0x' + hex };\n }\n\n if (value instanceof ArrayBuffer) {\n const uint8Array = new Uint8Array(value);\n const hex = Array.from(uint8Array)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return { type: 'Blob', value: '0x' + hex };\n }\n\n throw new Error(`Cannot encode value of type ${typeof value}: ${value}`);\n}\n\nexport function encodeParams(params: any): TypeValuePair[] | Record<string, TypeValuePair> {\n if (params === undefined || params === null) {\n return [];\n }\n\n if (Array.isArray(params)) {\n return params.map(param => encodeValue(param));\n } else if (typeof params === 'object') {\n const encoded: Record<string, TypeValuePair> = {};\n for (const [key, value] of Object.entries(params)) {\n encoded[key] = encodeValue(value);\n }\n return encoded;\n }\n\n throw new Error(`Invalid parameters type: expected array or object, got ${typeof params}`);\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2025 ReifyDB\nimport {WsClient, WsClientOptions} from \"./ws\";\n\nexport class Client {\n /**\n * Connect to ReifyDB via WebSocket\n * @param url WebSocket URL\n * @param options Optional configuration\n * @returns Connected WebSocket client\n */\n static async connect_ws(url: string, options: Omit<WsClientOptions, 'url'> = {}): Promise<WsClient> {\n return WsClient.connect({url, ...options});\n }\n}\n\nexport {ReifyError, asFrameResults} from \"@reifydb/core\";\nexport type {FrameResults, SingleFrameResult, Diagnostic, Fragment, DiagnosticColumn} from \"@reifydb/core\";\nexport {WsClient} from \"./ws\";\nexport type {WsClientOptions} from \"./ws\";\nexport type {\n SubscribeRequest,\n SubscribedResponse,\n UnsubscribeRequest,\n UnsubscribedResponse,\n ChangeMessage,\n SubscriptionCallbacks,\n SubscriptionOperation\n} from './types';"],"mappings":"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","names":["ReifyError"]}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@reifydb/client",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "dependencies": {
8
8
  "uuid": "^11.1.0",
9
9
  "ws": "^8.18.3",
10
- "@reifydb/core": "0.2.0"
10
+ "@reifydb/core": "0.4.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^24.0.10",
@@ -48,7 +48,9 @@
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsup src/index.ts --dts --format esm --sourcemap",
51
- "test": "pnpm test:integration",
51
+ "test": "pnpm test:unit",
52
+ "test:unit": "vitest run --config vitest.unit.config.ts",
53
+ "test:unit:watch": "vitest --config vitest.unit.config.ts",
52
54
  "test:integration": "vitest run --config vitest.config.ts",
53
55
  "test:integration:watch": "vitest --config vitest.config.ts",
54
56
  "test:integration:coverage": "vitest run --coverage --config vitest.config.ts",