@reifydb/client 0.1.7 → 0.3.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 +72 -15
- package/dist/index.js +204 -22
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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,21 +107,26 @@ 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
|
-
|
|
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;
|
|
114
|
+
/**
|
|
115
|
+
* Coerce a value to the expected primitive type based on schema.
|
|
116
|
+
* This handles cases where the server returns a smaller integer type
|
|
117
|
+
* but the schema expects a bigint type (Int8, Int16, Uint8, Uint16).
|
|
118
|
+
*/
|
|
119
|
+
private coerceToPrimitiveType;
|
|
60
120
|
disconnect(): void;
|
|
61
121
|
private handleDisconnect;
|
|
62
122
|
private attemptReconnect;
|
|
123
|
+
private resubscribeAll;
|
|
124
|
+
private handleChangeMessage;
|
|
125
|
+
private frameToRows;
|
|
63
126
|
private setupSocketHandlers;
|
|
64
127
|
private rejectAllPendingRequests;
|
|
65
128
|
}
|
|
66
129
|
|
|
67
|
-
/**
|
|
68
|
-
* MIT License
|
|
69
|
-
* Copyright (c) 2025 ReifyDB
|
|
70
|
-
* See license.md file for full license text
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
130
|
declare class Client {
|
|
74
131
|
/**
|
|
75
132
|
* Connect to ReifyDB via WebSocket
|
|
@@ -80,4 +137,4 @@ declare class Client {
|
|
|
80
137
|
static connect_ws(url: string, options?: Omit<WsClientOptions, 'url'>): Promise<WsClient>;
|
|
81
138
|
}
|
|
82
139
|
|
|
83
|
-
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 {
|
|
10
|
+
import { NONE_VALUE } from "@reifydb/core";
|
|
11
11
|
function encodeValue(value) {
|
|
12
12
|
if (value === null || value === void 0) {
|
|
13
|
-
return { type: "
|
|
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:
|
|
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:
|
|
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) {
|
|
@@ -236,13 +324,9 @@ var WsClient = class _WsClient {
|
|
|
236
324
|
if (propertySchema && propertySchema.kind === "primitive") {
|
|
237
325
|
if (value && typeof value === "object" && typeof value.valueOf === "function") {
|
|
238
326
|
const rawValue = value.valueOf();
|
|
239
|
-
|
|
240
|
-
transformedRow[key] = BigInt(rawValue);
|
|
241
|
-
} else {
|
|
242
|
-
transformedRow[key] = rawValue;
|
|
243
|
-
}
|
|
327
|
+
transformedRow[key] = this.coerceToPrimitiveType(rawValue, propertySchema.type);
|
|
244
328
|
} else {
|
|
245
|
-
transformedRow[key] = value;
|
|
329
|
+
transformedRow[key] = this.coerceToPrimitiveType(value, propertySchema.type);
|
|
246
330
|
}
|
|
247
331
|
} else if (propertySchema && propertySchema.kind === "value") {
|
|
248
332
|
transformedRow[key] = value;
|
|
@@ -254,13 +338,9 @@ var WsClient = class _WsClient {
|
|
|
254
338
|
}
|
|
255
339
|
if (resultSchema && resultSchema.kind === "primitive") {
|
|
256
340
|
if (row && typeof row === "object" && typeof row.valueOf === "function") {
|
|
257
|
-
|
|
258
|
-
if (resultSchema.type === "RowNumber" && typeof rawValue === "number") {
|
|
259
|
-
return BigInt(rawValue);
|
|
260
|
-
}
|
|
261
|
-
return rawValue;
|
|
341
|
+
return this.coerceToPrimitiveType(row.valueOf(), resultSchema.type);
|
|
262
342
|
}
|
|
263
|
-
return row;
|
|
343
|
+
return this.coerceToPrimitiveType(row, resultSchema.type);
|
|
264
344
|
}
|
|
265
345
|
if (resultSchema && resultSchema.kind === "value") {
|
|
266
346
|
return row;
|
|
@@ -279,8 +359,32 @@ var WsClient = class _WsClient {
|
|
|
279
359
|
}
|
|
280
360
|
return row;
|
|
281
361
|
}
|
|
362
|
+
/**
|
|
363
|
+
* Coerce a value to the expected primitive type based on schema.
|
|
364
|
+
* This handles cases where the server returns a smaller integer type
|
|
365
|
+
* but the schema expects a bigint type (Int8, Int16, Uint8, Uint16).
|
|
366
|
+
*/
|
|
367
|
+
coerceToPrimitiveType(value, schemaType) {
|
|
368
|
+
if (value === void 0 || value === null) {
|
|
369
|
+
return value;
|
|
370
|
+
}
|
|
371
|
+
const bigintTypes = ["Int8", "Int16", "Uint8", "Uint16"];
|
|
372
|
+
if (bigintTypes.includes(schemaType)) {
|
|
373
|
+
if (typeof value === "bigint") {
|
|
374
|
+
return value;
|
|
375
|
+
}
|
|
376
|
+
if (typeof value === "number") {
|
|
377
|
+
return BigInt(Math.trunc(value));
|
|
378
|
+
}
|
|
379
|
+
if (typeof value === "string") {
|
|
380
|
+
return BigInt(value);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return value;
|
|
384
|
+
}
|
|
282
385
|
disconnect() {
|
|
283
386
|
this.shouldReconnect = false;
|
|
387
|
+
this.subscriptions.clear();
|
|
284
388
|
this.socket.close();
|
|
285
389
|
}
|
|
286
390
|
handleDisconnect() {
|
|
@@ -300,19 +404,27 @@ var WsClient = class _WsClient {
|
|
|
300
404
|
this.reconnectAttempts++;
|
|
301
405
|
const baseDelay = this.options.reconnectDelayMs ?? 1e3;
|
|
302
406
|
const delay = baseDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
303
|
-
|
|
304
|
-
console.log(`Attempting reconnection (${this.reconnectAttempts}/${maxAttempts}): waiting ${delay}ms with exponential backoff`);
|
|
407
|
+
console.log(`Attempting reconnection in ${delay}ms`);
|
|
305
408
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
306
409
|
try {
|
|
307
410
|
const socket = await createWebSocket(this.options.url);
|
|
308
411
|
if (socket.readyState !== 1) {
|
|
412
|
+
const connectionTimeoutMs = 3e4;
|
|
309
413
|
await new Promise((resolve, reject) => {
|
|
414
|
+
const connectionTimeout = setTimeout(() => {
|
|
415
|
+
socket.removeEventListener("open", onOpen);
|
|
416
|
+
socket.removeEventListener("error", onError);
|
|
417
|
+
socket.close();
|
|
418
|
+
reject(new Error(`WebSocket reconnection timeout after ${connectionTimeoutMs}ms`));
|
|
419
|
+
}, connectionTimeoutMs);
|
|
310
420
|
const onOpen = () => {
|
|
421
|
+
clearTimeout(connectionTimeout);
|
|
311
422
|
socket.removeEventListener("open", onOpen);
|
|
312
423
|
socket.removeEventListener("error", onError);
|
|
313
424
|
resolve();
|
|
314
425
|
};
|
|
315
426
|
const onError = () => {
|
|
427
|
+
clearTimeout(connectionTimeout);
|
|
316
428
|
socket.removeEventListener("open", onOpen);
|
|
317
429
|
socket.removeEventListener("error", onError);
|
|
318
430
|
reject(new Error("WebSocket connection failed"));
|
|
@@ -326,16 +438,86 @@ var WsClient = class _WsClient {
|
|
|
326
438
|
this.setupSocketHandlers();
|
|
327
439
|
this.reconnectAttempts = 0;
|
|
328
440
|
this.isReconnecting = false;
|
|
329
|
-
|
|
441
|
+
await this.resubscribeAll();
|
|
330
442
|
} catch (error) {
|
|
331
|
-
console.error("Reconnection attempt failed:", error);
|
|
332
443
|
this.isReconnecting = false;
|
|
333
444
|
this.handleDisconnect();
|
|
334
445
|
}
|
|
335
446
|
}
|
|
447
|
+
async resubscribeAll() {
|
|
448
|
+
const subscriptionsToReestablish = Array.from(this.subscriptions.values());
|
|
449
|
+
this.subscriptions.clear();
|
|
450
|
+
for (const state of subscriptionsToReestablish) {
|
|
451
|
+
try {
|
|
452
|
+
await this.subscribe(state.query, state.params, state.schema, state.callbacks);
|
|
453
|
+
} catch (err) {
|
|
454
|
+
console.error(`Failed to resubscribe to ${state.query}:`, err);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
handleChangeMessage(msg) {
|
|
459
|
+
const { subscription_id, frame } = msg.payload;
|
|
460
|
+
const state = this.subscriptions.get(subscription_id);
|
|
461
|
+
if (!state) {
|
|
462
|
+
console.error("No state for subscription_id:", subscription_id);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
const opColumn = frame.columns.find((c) => c.name === "_op");
|
|
466
|
+
if (!opColumn || opColumn.data.length === 0) {
|
|
467
|
+
console.error("Missing or empty _op column:", { opColumn, frame });
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const rows = this.frameToRows(frame, state.schema);
|
|
471
|
+
const batches = [];
|
|
472
|
+
for (let i = 0; i < rows.length; i++) {
|
|
473
|
+
const opValue = parseInt(opColumn.data[i]);
|
|
474
|
+
const operation = opValue === 1 ? "INSERT" : opValue === 2 ? "UPDATE" : opValue === 3 ? "REMOVE" : "INSERT";
|
|
475
|
+
const { _op, ...cleanRow } = rows[i];
|
|
476
|
+
if (batches.length > 0 && batches[batches.length - 1].op === operation) {
|
|
477
|
+
batches[batches.length - 1].rows.push(cleanRow);
|
|
478
|
+
} else {
|
|
479
|
+
batches.push({ op: operation, rows: [cleanRow] });
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
for (const batch of batches) {
|
|
483
|
+
switch (batch.op) {
|
|
484
|
+
case "INSERT":
|
|
485
|
+
state.callbacks.onInsert?.(batch.rows);
|
|
486
|
+
break;
|
|
487
|
+
case "UPDATE":
|
|
488
|
+
state.callbacks.onUpdate?.(batch.rows);
|
|
489
|
+
break;
|
|
490
|
+
case "REMOVE":
|
|
491
|
+
state.callbacks.onRemove?.(batch.rows);
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
frameToRows(frame, schema) {
|
|
497
|
+
if (!frame.columns || frame.columns.length === 0) return [];
|
|
498
|
+
const rowCount = frame.columns[0].data.length;
|
|
499
|
+
const rows = [];
|
|
500
|
+
for (let i = 0; i < rowCount; i++) {
|
|
501
|
+
const row = {};
|
|
502
|
+
for (const col of frame.columns) {
|
|
503
|
+
row[col.name] = decode({ type: col.type, value: col.data[i] });
|
|
504
|
+
}
|
|
505
|
+
rows.push(row);
|
|
506
|
+
}
|
|
507
|
+
if (schema) {
|
|
508
|
+
return rows.map((row) => this.transformResult(row, schema));
|
|
509
|
+
}
|
|
510
|
+
return rows;
|
|
511
|
+
}
|
|
336
512
|
setupSocketHandlers() {
|
|
337
513
|
this.socket.onmessage = (event) => {
|
|
338
514
|
const msg = JSON.parse(event.data);
|
|
515
|
+
if (!msg.id) {
|
|
516
|
+
if (msg.type === "Change") {
|
|
517
|
+
this.handleChangeMessage(msg);
|
|
518
|
+
}
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
339
521
|
const { id, type, payload } = msg;
|
|
340
522
|
const handler = this.pending.get(id);
|
|
341
523
|
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 // Special handling for RowNumber - ensure it's returned as bigint\n if (propertySchema.type === 'RowNumber' && typeof rawValue === 'number') {\n transformedRow[key] = BigInt(rawValue);\n } else {\n transformedRow[key] = rawValue;\n }\n } else {\n transformedRow[key] = value;\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 const rawValue = row.valueOf();\n // Special handling for RowNumber - ensure it's returned as bigint\n if (resultSchema.type === 'RowNumber' && typeof rawValue === 'number') {\n return BigInt(rawValue);\n }\n return rawValue;\n }\n return row;\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 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":";AAKA;AAAA,EACI;AAAA,OAEG;;;ACGP,SAAS,kBAAkB;;;ACL3B,SAAc,uBAAsB;AAO7B,SAAS,YAAY,OAA2B;AAEnD,MAAI,UAAU,QAAQ,UAAU,QAAW;AACvC,WAAO,EAAE,MAAM,aAAa,OAAO,gBAAgB;AAAA,EACvD;AAEA,MAAI,SAAS,OAAO,UAAU,YAAY,YAAY,SAAS,OAAO,MAAM,WAAW,YAAY;AAC/F,WAAO,MAAM,OAAO;AAAA,EACxB;AAEA,MAAI,OAAO,UAAU,WAAW;AAC5B,WAAO,EAAE,MAAM,WAAW,OAAO,MAAM,SAAS,EAAE;AAAA,EACtD;AAEA,MAAI,OAAO,UAAU,UAAU;AAC3B,QAAI,OAAO,UAAU,KAAK,GAAG;AAEzB,UAAI,SAAS,QAAQ,SAAS,KAAK;AAC/B,eAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AAAA,MACnD,WAAW,SAAS,UAAU,SAAS,OAAO;AAC1C,eAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AAAA,MACnD,WAAW,SAAS,eAAe,SAAS,YAAY;AACpD,eAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AAAA,MACnD,OAAO;AACH,eAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AAAA,MACnD;AAAA,IACJ,OAAO;AAEH,aAAO,EAAE,MAAM,UAAU,OAAO,MAAM,SAAS,EAAE;AAAA,IACrD;AAAA,EACJ;AAEA,MAAI,OAAO,UAAU,UAAU;AAC3B,QAAI,4EAA4E,KAAK,KAAK,GAAG;AACzF,YAAM,UAAU,MAAM,EAAE;AACxB,UAAI,YAAY,KAAK;AACjB,eAAO,EAAE,MAAM,SAAS,MAAa;AAAA,MACzC,WAAW,YAAY,KAAK;AACxB,eAAO,EAAE,MAAM,SAAS,MAAa;AAAA,MACzC;AAAA,IACJ;AACA,WAAO,EAAE,MAAM,QAAQ,MAAa;AAAA,EACxC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC3B,QAAI,SAAS,OAAO,CAAC,GAAG;AACpB,UAAI,SAAS,OAAO,GAAG,GAAG;AACtB,eAAO,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAAA,MACpD,WAAW,SAAS,OAAO,KAAK,GAAG;AAC/B,eAAO,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAAA,MACpD,WAAW,SAAS,OAAO,UAAU,GAAG;AACpC,eAAO,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAAA,MACpD,WAAW,SAAS,OAAO,sBAAsB,GAAG;AAChD,eAAO,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAAA,MACpD,OAAO;AACH,eAAO,EAAE,MAAM,UAAU,OAAO,MAAM,SAAS,EAAE;AAAA,MACrD;AAAA,IACJ,OAAO;AACH,UAAI,SAAS,OAAO,sBAAsB,GAAG;AACzC,eAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,SAAS,EAAE;AAAA,MACnD,OAAO;AACH,eAAO,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,EAAE;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,iBAAiB,MAAM;AACvB,WAAO,EAAE,MAAM,YAAY,OAAO,MAAM,YAAY,EAAE;AAAA,EAC1D;AAGA,MAAI,iBAAiB,YAAY;AAC7B,UAAM,MAAM,MAAM,KAAK,KAAK,EACvB,IAAI,OAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EACxC,KAAK,EAAE;AACZ,WAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,IAAI;AAAA,EAC7C;AAEA,MAAI,iBAAiB,aAAa;AAC9B,UAAM,aAAa,IAAI,WAAW,KAAK;AACvC,UAAM,MAAM,MAAM,KAAK,UAAU,EAC5B,IAAI,OAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EACxC,KAAK,EAAE;AACZ,WAAO,EAAE,MAAM,QAAQ,OAAO,OAAO,IAAI;AAAA,EAC7C;AAEA,QAAM,IAAI,MAAM,+BAA+B,OAAO,KAAK,KAAK,KAAK,EAAE;AAC3E;AAEO,SAAS,aAAa,QAA8D;AACvF,MAAI,WAAW,UAAa,WAAW,MAAM;AACzC,WAAO,CAAC;AAAA,EACZ;AAEA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,WAAO,OAAO,IAAI,WAAS,YAAY,KAAK,CAAC;AAAA,EACjD,WAAW,OAAO,WAAW,UAAU;AACnC,UAAM,UAAyC,CAAC;AAChD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,cAAQ,GAAG,IAAI,YAAY,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACX;AAEA,QAAM,IAAI,MAAM,0DAA0D,OAAO,MAAM,EAAE;AAC7F;;;AF/EA,eAAe,gBAAgB,KAAiC;AAC5D,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,cAAc,aAAa;AAC1E,WAAO,IAAI,UAAU,GAAG;AAAA,EAC5B,OAAO;AAEH,UAAM,WAAW,MAAM,OAAO,IAAI;AAClC,WAAO,IAAI,SAAS,UAAU,GAAG;AAAA,EACrC;AACJ;AAGO,IAAM,WAAN,MAAM,UAAS;AAAA,EASV,YAAY,QAAmB,SAA0B;AALjE,SAAQ,UAAU,oBAAI,IAAiD;AACvE,SAAQ,oBAA4B;AACpC,SAAQ,kBAA2B;AACnC,SAAQ,iBAA0B;AAG9B,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,SAAS;AAEd,SAAK,oBAAoB;AAAA,EAC7B;AAAA,EAEA,aAAa,QAAQ,SAA6C;AAC9D,YAAQ,IAAI,8BAA8B,QAAQ,GAAG,EAAE;AACvD,UAAM,SAAS,MAAM,gBAAgB,QAAQ,GAAG;AAGhD,QAAI,OAAO,eAAe,GAAG;AACzB,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACzC,cAAM,SAAS,MAAM;AACjB,iBAAO,oBAAoB,QAAQ,MAAM;AACzC,iBAAO,oBAAoB,SAAS,OAAO;AAC3C,kBAAQ;AAAA,QACZ;AAEA,cAAM,UAAU,MAAM;AAClB,iBAAO,oBAAoB,QAAQ,MAAM;AACzC,iBAAO,oBAAoB,SAAS,OAAO;AAC3C,iBAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,QACnD;AAEA,eAAO,iBAAiB,QAAQ,MAAM;AACtC,eAAO,iBAAiB,SAAS,OAAO;AAAA,MAC5C,CAAC;AAAA,IACL;AAEA,WAAO,KAAK,mEAAiF;AAE7F,YAAQ,IAAI,qCAAqC;AACjD,WAAO,IAAI,UAAS,QAAQ,OAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QACF,YACA,QACA,SACwB;AACxB,UAAM,KAAK,OAAO,KAAK,QAAQ;AAG/B,UAAM,iBAAiB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAG3E,UAAM,gBAAgB,WAAW,UAAa,WAAW,OACnD,aAAa,MAAM,IACnB;AAEN,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC3B;AAAA,MACA,MAAM;AAAA,MACN,SAAS;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AAGD,UAAM,oBAAoB,OAAO,IAAI,CAAC,OAAY,eAAuB;AACrE,YAAM,cAAc,QAAQ,UAAU;AACtC,UAAI,CAAC,aAAa;AACd,eAAO;AAAA,MACX;AACA,aAAO,MAAM,IAAI,CAAC,QAAa,KAAK,gBAAgB,KAAK,WAAW,CAAC;AAAA,IACzE,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MACF,YACA,QACA,SACwB;AACxB,UAAM,KAAK,OAAO,KAAK,QAAQ;AAG/B,UAAM,iBAAiB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAG3E,UAAM,gBAAgB,WAAW,UAAa,WAAW,OACnD,aAAa,MAAM,IACnB;AAEN,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC3B;AAAA,MACA,MAAM;AAAA,MACN,SAAS;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AAGD,UAAM,oBAAoB,OAAO,IAAI,CAAC,OAAY,eAAuB;AACrE,YAAM,cAAc,QAAQ,UAAU;AACtC,UAAI,CAAC,aAAa;AACd,eAAO;AAAA,MACX;AACA,aAAO,MAAM,IAAI,CAAC,QAAa,KAAK,gBAAgB,KAAK,WAAW,CAAC;AAAA,IACzE,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,KAAK,KAAkD;AACzD,UAAM,KAAK,IAAI;AAEf,QAAI,KAAK,OAAO,eAAe,GAAG;AAC9B,YAAM,IAAI,WAAW;AAAA,QACjB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,UACL,YAAY;AAAA,YACR,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO,CAAC;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,WAAW,MAAM,IAAI,QAAyB,CAAC,SAAS,WAAW;AACrE,YAAM,UAAU,WAAW,MAAM;AAC7B,aAAK,QAAQ,OAAO,EAAE;AACtB,eAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,MAC7C,GAAG,KAAK,QAAQ,SAAS;AAEzB,WAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ;AAC1B,qBAAa,OAAO;AACpB,gBAAQ,GAAG;AAAA,MACf,CAAC;AAED,WAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACxC,CAAC;AAED,QAAI,SAAS,SAAS,OAAO;AACzB,YAAM,IAAI,WAAW,QAAQ;AAAA,IAEjC;AAEA,QAAI,SAAS,SAAS,IAAI,MAAM;AAC5B,YAAM,IAAI,MAAM,6BAA6B,SAAS,IAAI,EAAE;AAAA,IAChE;AAEA,WAAO,SAAS,QAAQ,OAAO;AAAA,MAAI,CAAC,UAChC,cAAc,MAAM,OAAO;AAAA,IAC/B;AAAA,EACJ;AAAA,EAGQ,gBAAgB,KAAU,cAAwB;AAEtD,QAAI,gBAAgB,aAAa,SAAS,YAAY,aAAa,YAAY;AAC3E,YAAM,iBAAsB,CAAC;AAC7B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,cAAM,iBAAiB,aAAa,WAAW,GAAG;AAClD,YAAI,kBAAkB,eAAe,SAAS,aAAa;AAGvD,cAAI,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAc,YAAY,YAAY;AACpF,kBAAM,WAAY,MAAc,QAAQ;AAExC,gBAAI,eAAe,SAAS,eAAe,OAAO,aAAa,UAAU;AACrE,6BAAe,GAAG,IAAI,OAAO,QAAQ;AAAA,YACzC,OAAO;AACH,6BAAe,GAAG,IAAI;AAAA,YAC1B;AAAA,UACJ,OAAO;AACH,2BAAe,GAAG,IAAI;AAAA,UAC1B;AAAA,QACJ,WAAW,kBAAkB,eAAe,SAAS,SAAS;AAE1D,yBAAe,GAAG,IAAI;AAAA,QAC1B,OAAO;AAEH,yBAAe,GAAG,IAAI,iBAAiB,KAAK,gBAAgB,OAAO,cAAc,IAAI;AAAA,QACzF;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAGA,QAAI,gBAAgB,aAAa,SAAS,aAAa;AAGnD,UAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,YAAY,YAAY;AACrE,cAAM,WAAW,IAAI,QAAQ;AAE7B,YAAI,aAAa,SAAS,eAAe,OAAO,aAAa,UAAU;AACnE,iBAAO,OAAO,QAAQ;AAAA,QAC1B;AACA,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX;AAGA,QAAI,gBAAgB,aAAa,SAAS,SAAS;AAC/C,aAAO;AAAA,IACX;AAGA,QAAI,gBAAgB,aAAa,SAAS,SAAS;AAC/C,UAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,eAAO,IAAI,IAAI,CAAC,SAAc,KAAK,gBAAgB,MAAM,aAAa,KAAK,CAAC;AAAA,MAChF;AACA,aAAO;AAAA,IACX;AAGA,QAAI,gBAAgB,aAAa,SAAS,YAAY;AAClD,UAAI,QAAQ,UAAa,QAAQ,MAAM;AACnC,eAAO;AAAA,MACX;AACA,aAAO,KAAK,gBAAgB,KAAK,aAAa,MAAM;AAAA,IACxD;AAGA,WAAO;AAAA,EACX;AAAA,EAEA,aAAa;AACT,SAAK,kBAAkB;AACvB,SAAK,OAAO,MAAM;AAAA,EACtB;AAAA,EAEQ,mBAAmB;AACvB,SAAK,yBAAyB;AAE9B,QAAI,CAAC,KAAK,mBAAmB,KAAK,gBAAgB;AAC9C;AAAA,IACJ;AAEA,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,QAAI,KAAK,qBAAqB,aAAa;AACvC,cAAQ,MAAM,8BAA8B,WAAW,WAAW;AAClE;AAAA,IACJ;AAEA,SAAK,iBAAiB;AAAA,EAC1B;AAAA,EAEA,MAAc,mBAAmB;AAC7B,SAAK,iBAAiB;AACtB,SAAK;AAEL,UAAM,YAAY,KAAK,QAAQ,oBAAoB;AACnD,UAAM,QAAQ,YAAY,KAAK,IAAI,GAAG,KAAK,oBAAoB,CAAC;AAChE,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AAEzD,YAAQ,IAAI,4BAA4B,KAAK,iBAAiB,IAAI,WAAW,cAAc,KAAK,6BAA6B;AAE7H,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,KAAK,CAAC;AAEvD,QAAI;AACA,YAAM,SAAS,MAAM,gBAAgB,KAAK,QAAQ,GAAG;AAErD,UAAI,OAAO,eAAe,GAAG;AACzB,cAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACzC,gBAAM,SAAS,MAAM;AACjB,mBAAO,oBAAoB,QAAQ,MAAM;AACzC,mBAAO,oBAAoB,SAAS,OAAO;AAC3C,oBAAQ;AAAA,UACZ;AAEA,gBAAM,UAAU,MAAM;AAClB,mBAAO,oBAAoB,QAAQ,MAAM;AACzC,mBAAO,oBAAoB,SAAS,OAAO;AAC3C,mBAAO,IAAI,MAAM,6BAA6B,CAAC;AAAA,UACnD;AAEA,iBAAO,iBAAiB,QAAQ,MAAM;AACtC,iBAAO,iBAAiB,SAAS,OAAO;AAAA,QAC5C,CAAC;AAAA,MACL;AAEA,aAAO,KAAK,mEAAiF;AAE7F,WAAK,SAAS;AACd,WAAK,oBAAoB;AACzB,WAAK,oBAAoB;AACzB,WAAK,iBAAiB;AACtB,cAAQ,IAAI,uCAAuC;AAAA,IACvD,SAAS,OAAO;AACZ,cAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAK,iBAAiB;AACtB,WAAK,iBAAiB;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEQ,sBAAsB;AAC1B,SAAK,OAAO,YAAY,CAAC,UAAU;AAC/B,YAAM,MAAM,KAAK,MAAM,MAAM,IAAI;AACjC,YAAM,EAAC,IAAI,MAAM,QAAO,IAAI;AAE5B,YAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;AACnC,UAAI,CAAC,SAAS;AACV;AAAA,MACJ;AAEA,WAAK,QAAQ,OAAO,EAAE;AACtB,cAAQ,EAAC,IAAI,MAAM,QAAO,CAAC;AAAA,IAC/B;AAEA,SAAK,OAAO,UAAU,CAAC,QAAQ;AAC3B,cAAQ,MAAM,mBAAmB,GAAG;AAAA,IACxC;AAEA,SAAK,OAAO,UAAU,MAAM;AACxB,WAAK,iBAAiB;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEQ,2BAA2B;AAC/B,UAAM,QAAuB;AAAA,MACzB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,QACL,YAAY;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO,CAAC;AAAA,QACZ;AAAA,MACJ;AAAA,IACJ;AAEA,eAAW,WAAW,KAAK,QAAQ,OAAO,GAAG;AACzC,cAAQ,KAAK;AAAA,IACjB;AACA,SAAK,QAAQ,MAAM;AAAA,EACvB;AACJ;AAGA,SAAS,cAAc,SAA4C;AAC/D,QAAM,WAAW,QAAQ,CAAC,GAAG,KAAK,UAAU;AAC5C,SAAO,MAAM,KAAK,EAAC,QAAQ,SAAQ,GAAG,CAAC,GAAG,MAAM;AAC5C,UAAM,MAA6B,CAAC;AACpC,eAAW,OAAO,SAAS;AACvB,UAAI,IAAI,IAAI,IAAI,OAAO,EAAC,MAAM,IAAI,MAAM,OAAO,IAAI,KAAK,CAAC,EAAC,CAAC;AAAA,IAC/D;AACA,WAAO;AAAA,EACX,CAAC;AACL;;;AGjZA,SAAQ,cAAAA,aAAY,sBAAqB;AAZlC,IAAM,SAAN,MAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,aAAa,WAAW,KAAa,UAAwC,CAAC,GAAsB;AAChG,WAAO,SAAS,QAAQ,EAAC,KAAK,GAAG,QAAO,CAAC;AAAA,EAC7C;AACJ;","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 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.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.
|
|
3
|
+
"version": "0.3.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.
|
|
10
|
+
"@reifydb/core": "0.3.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:
|
|
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",
|