@grafema/rfdb-client 0.2.12-beta → 0.3.1-beta
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/base-client.d.ts +156 -0
- package/dist/base-client.d.ts.map +1 -0
- package/dist/base-client.js +591 -0
- package/dist/base-client.js.map +1 -0
- package/dist/client.d.ts +14 -319
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +20 -740
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/websocket-client.d.ts +41 -0
- package/dist/websocket-client.d.ts.map +1 -0
- package/dist/websocket-client.js +144 -0
- package/dist/websocket-client.js.map +1 -0
- package/package.json +2 -2
- package/ts/base-client.ts +737 -0
- package/ts/client.ts +28 -863
- package/ts/index.ts +2 -0
- package/ts/rfdb-client-locking.test.ts +897 -0
- package/ts/rfdb-websocket-client.test.ts +572 -0
- package/ts/websocket-client.ts +174 -0
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseRFDBClient - Abstract base class for RFDB transport clients
|
|
3
|
+
*
|
|
4
|
+
* Contains all graph operation methods that delegate to abstract _send().
|
|
5
|
+
* Subclasses provide the transport layer (Unix socket, WebSocket, etc.)
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Default timeout for operations (60 seconds).
|
|
10
|
+
* Flush/compact may take time for large graphs, but should not hang indefinitely.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
13
|
+
export class BaseRFDBClient extends EventEmitter {
|
|
14
|
+
/**
|
|
15
|
+
* Whether the connected server supports streaming responses.
|
|
16
|
+
* Defaults to false. Unix socket subclass may set this after hello().
|
|
17
|
+
*/
|
|
18
|
+
get supportsStreaming() {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
// Batch state
|
|
22
|
+
_batching = false;
|
|
23
|
+
_batchNodes = [];
|
|
24
|
+
_batchEdges = [];
|
|
25
|
+
_batchFiles = new Set();
|
|
26
|
+
// ===========================================================================
|
|
27
|
+
// Write Operations
|
|
28
|
+
// ===========================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Add nodes to the graph.
|
|
31
|
+
* Extra properties beyond id/type/name/file/exported/metadata are merged into metadata.
|
|
32
|
+
*/
|
|
33
|
+
async addNodes(nodes) {
|
|
34
|
+
const wireNodes = nodes.map(n => {
|
|
35
|
+
const nodeRecord = n;
|
|
36
|
+
const { id, type, node_type, nodeType, name, file, exported, metadata, semanticId, semantic_id, ...rest } = nodeRecord;
|
|
37
|
+
const existingMeta = typeof metadata === 'string' ? JSON.parse(metadata) : (metadata || {});
|
|
38
|
+
const combinedMeta = { ...existingMeta, ...rest };
|
|
39
|
+
const wire = {
|
|
40
|
+
id: String(id),
|
|
41
|
+
nodeType: (node_type || nodeType || type || 'UNKNOWN'),
|
|
42
|
+
name: name || '',
|
|
43
|
+
file: file || '',
|
|
44
|
+
exported: exported || false,
|
|
45
|
+
metadata: JSON.stringify(combinedMeta),
|
|
46
|
+
};
|
|
47
|
+
const sid = semanticId || semantic_id;
|
|
48
|
+
if (sid) {
|
|
49
|
+
wire.semanticId = String(sid);
|
|
50
|
+
}
|
|
51
|
+
return wire;
|
|
52
|
+
});
|
|
53
|
+
if (this._batching) {
|
|
54
|
+
this._batchNodes.push(...wireNodes);
|
|
55
|
+
for (const node of wireNodes) {
|
|
56
|
+
if (node.file)
|
|
57
|
+
this._batchFiles.add(node.file);
|
|
58
|
+
}
|
|
59
|
+
return { ok: true };
|
|
60
|
+
}
|
|
61
|
+
return this._send('addNodes', { nodes: wireNodes });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add edges to the graph.
|
|
65
|
+
* Extra properties beyond src/dst/type are merged into metadata.
|
|
66
|
+
*/
|
|
67
|
+
async addEdges(edges, skipValidation = false) {
|
|
68
|
+
const wireEdges = edges.map(e => {
|
|
69
|
+
const edge = e;
|
|
70
|
+
const { src, dst, type, edge_type, edgeType, metadata, ...rest } = edge;
|
|
71
|
+
const existingMeta = typeof metadata === 'string' ? JSON.parse(metadata) : (metadata || {});
|
|
72
|
+
const combinedMeta = { ...existingMeta, ...rest };
|
|
73
|
+
return {
|
|
74
|
+
src: String(src),
|
|
75
|
+
dst: String(dst),
|
|
76
|
+
edgeType: (edge_type || edgeType || type || e.edgeType || 'UNKNOWN'),
|
|
77
|
+
metadata: JSON.stringify(combinedMeta),
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
if (this._batching) {
|
|
81
|
+
this._batchEdges.push(...wireEdges);
|
|
82
|
+
return { ok: true };
|
|
83
|
+
}
|
|
84
|
+
return this._send('addEdges', { edges: wireEdges, skipValidation });
|
|
85
|
+
}
|
|
86
|
+
async deleteNode(id) {
|
|
87
|
+
return this._send('deleteNode', { id: String(id) });
|
|
88
|
+
}
|
|
89
|
+
async deleteEdge(src, dst, edgeType) {
|
|
90
|
+
return this._send('deleteEdge', {
|
|
91
|
+
src: String(src),
|
|
92
|
+
dst: String(dst),
|
|
93
|
+
edgeType,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// ===========================================================================
|
|
97
|
+
// Read Operations
|
|
98
|
+
// ===========================================================================
|
|
99
|
+
async getNode(id) {
|
|
100
|
+
const response = await this._send('getNode', { id: String(id) });
|
|
101
|
+
return response.node || null;
|
|
102
|
+
}
|
|
103
|
+
async nodeExists(id) {
|
|
104
|
+
const response = await this._send('nodeExists', { id: String(id) });
|
|
105
|
+
return response.value;
|
|
106
|
+
}
|
|
107
|
+
async findByType(nodeType) {
|
|
108
|
+
const response = await this._send('findByType', { nodeType });
|
|
109
|
+
return response.ids || [];
|
|
110
|
+
}
|
|
111
|
+
async findByAttr(query) {
|
|
112
|
+
const response = await this._send('findByAttr', { query });
|
|
113
|
+
return response.ids || [];
|
|
114
|
+
}
|
|
115
|
+
// ===========================================================================
|
|
116
|
+
// Graph Traversal
|
|
117
|
+
// ===========================================================================
|
|
118
|
+
async neighbors(id, edgeTypes = []) {
|
|
119
|
+
const response = await this._send('neighbors', {
|
|
120
|
+
id: String(id),
|
|
121
|
+
edgeTypes,
|
|
122
|
+
});
|
|
123
|
+
return response.ids || [];
|
|
124
|
+
}
|
|
125
|
+
async bfs(startIds, maxDepth, edgeTypes = []) {
|
|
126
|
+
const response = await this._send('bfs', {
|
|
127
|
+
startIds: startIds.map(String),
|
|
128
|
+
maxDepth,
|
|
129
|
+
edgeTypes,
|
|
130
|
+
});
|
|
131
|
+
return response.ids || [];
|
|
132
|
+
}
|
|
133
|
+
async dfs(startIds, maxDepth, edgeTypes = []) {
|
|
134
|
+
const response = await this._send('dfs', {
|
|
135
|
+
startIds: startIds.map(String),
|
|
136
|
+
maxDepth,
|
|
137
|
+
edgeTypes,
|
|
138
|
+
});
|
|
139
|
+
return response.ids || [];
|
|
140
|
+
}
|
|
141
|
+
async reachability(startIds, maxDepth, edgeTypes = [], backward = false) {
|
|
142
|
+
const response = await this._send('reachability', {
|
|
143
|
+
startIds: startIds.map(String),
|
|
144
|
+
maxDepth,
|
|
145
|
+
edgeTypes,
|
|
146
|
+
backward,
|
|
147
|
+
});
|
|
148
|
+
return response.ids || [];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get outgoing edges from a node.
|
|
152
|
+
* Parses metadata JSON and spreads it onto the edge object for convenience.
|
|
153
|
+
*/
|
|
154
|
+
async getOutgoingEdges(id, edgeTypes = null) {
|
|
155
|
+
const response = await this._send('getOutgoingEdges', {
|
|
156
|
+
id: String(id),
|
|
157
|
+
edgeTypes,
|
|
158
|
+
});
|
|
159
|
+
const edges = response.edges || [];
|
|
160
|
+
return edges.map(e => {
|
|
161
|
+
let meta = {};
|
|
162
|
+
try {
|
|
163
|
+
meta = e.metadata ? JSON.parse(e.metadata) : {};
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Keep empty metadata on parse error
|
|
167
|
+
}
|
|
168
|
+
return { ...e, type: e.edgeType, ...meta };
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get incoming edges to a node.
|
|
173
|
+
* Parses metadata JSON and spreads it onto the edge object for convenience.
|
|
174
|
+
*/
|
|
175
|
+
async getIncomingEdges(id, edgeTypes = null) {
|
|
176
|
+
const response = await this._send('getIncomingEdges', {
|
|
177
|
+
id: String(id),
|
|
178
|
+
edgeTypes,
|
|
179
|
+
});
|
|
180
|
+
const edges = response.edges || [];
|
|
181
|
+
return edges.map(e => {
|
|
182
|
+
let meta = {};
|
|
183
|
+
try {
|
|
184
|
+
meta = e.metadata ? JSON.parse(e.metadata) : {};
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Keep empty metadata on parse error
|
|
188
|
+
}
|
|
189
|
+
return { ...e, type: e.edgeType, ...meta };
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// ===========================================================================
|
|
193
|
+
// Stats
|
|
194
|
+
// ===========================================================================
|
|
195
|
+
async nodeCount() {
|
|
196
|
+
const response = await this._send('nodeCount');
|
|
197
|
+
return response.count;
|
|
198
|
+
}
|
|
199
|
+
async edgeCount() {
|
|
200
|
+
const response = await this._send('edgeCount');
|
|
201
|
+
return response.count;
|
|
202
|
+
}
|
|
203
|
+
async countNodesByType(types = null) {
|
|
204
|
+
const response = await this._send('countNodesByType', { types });
|
|
205
|
+
return response.counts || {};
|
|
206
|
+
}
|
|
207
|
+
async countEdgesByType(edgeTypes = null) {
|
|
208
|
+
const response = await this._send('countEdgesByType', { edgeTypes });
|
|
209
|
+
return response.counts || {};
|
|
210
|
+
}
|
|
211
|
+
async getStats() {
|
|
212
|
+
const response = await this._send('getStats');
|
|
213
|
+
return response;
|
|
214
|
+
}
|
|
215
|
+
// ===========================================================================
|
|
216
|
+
// Control
|
|
217
|
+
// ===========================================================================
|
|
218
|
+
async flush() {
|
|
219
|
+
return this._send('flush');
|
|
220
|
+
}
|
|
221
|
+
async compact() {
|
|
222
|
+
return this._send('compact');
|
|
223
|
+
}
|
|
224
|
+
async clear() {
|
|
225
|
+
return this._send('clear');
|
|
226
|
+
}
|
|
227
|
+
// ===========================================================================
|
|
228
|
+
// Bulk Read Operations
|
|
229
|
+
// ===========================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Build a server query object from an AttrQuery.
|
|
232
|
+
*/
|
|
233
|
+
_buildServerQuery(query) {
|
|
234
|
+
const serverQuery = {};
|
|
235
|
+
if (query.nodeType)
|
|
236
|
+
serverQuery.nodeType = query.nodeType;
|
|
237
|
+
if (query.type)
|
|
238
|
+
serverQuery.nodeType = query.type;
|
|
239
|
+
if (query.name)
|
|
240
|
+
serverQuery.name = query.name;
|
|
241
|
+
if (query.file)
|
|
242
|
+
serverQuery.file = query.file;
|
|
243
|
+
if (query.exported !== undefined)
|
|
244
|
+
serverQuery.exported = query.exported;
|
|
245
|
+
if (query.substringMatch)
|
|
246
|
+
serverQuery.substringMatch = query.substringMatch;
|
|
247
|
+
return serverQuery;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Query nodes (async generator).
|
|
251
|
+
* Default implementation fetches all matching nodes in a single request.
|
|
252
|
+
* Subclasses with streaming support can override.
|
|
253
|
+
*/
|
|
254
|
+
async *queryNodes(query) {
|
|
255
|
+
const serverQuery = this._buildServerQuery(query);
|
|
256
|
+
const response = await this._send('queryNodes', { query: serverQuery });
|
|
257
|
+
const nodes = response.nodes || [];
|
|
258
|
+
for (const node of nodes) {
|
|
259
|
+
yield node;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Stream nodes matching query.
|
|
264
|
+
* Default implementation delegates to queryNodes().
|
|
265
|
+
* Subclasses with streaming support can override.
|
|
266
|
+
*/
|
|
267
|
+
async *queryNodesStream(query) {
|
|
268
|
+
yield* this.queryNodes(query);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get all nodes matching query.
|
|
272
|
+
*/
|
|
273
|
+
async getAllNodes(query = {}) {
|
|
274
|
+
const nodes = [];
|
|
275
|
+
for await (const node of this.queryNodes(query)) {
|
|
276
|
+
nodes.push(node);
|
|
277
|
+
}
|
|
278
|
+
return nodes;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get all edges.
|
|
282
|
+
* Parses metadata JSON and spreads it onto the edge object for convenience.
|
|
283
|
+
*/
|
|
284
|
+
async getAllEdges() {
|
|
285
|
+
const response = await this._send('getAllEdges');
|
|
286
|
+
const edges = response.edges || [];
|
|
287
|
+
return edges.map(e => {
|
|
288
|
+
let meta = {};
|
|
289
|
+
try {
|
|
290
|
+
meta = e.metadata ? JSON.parse(e.metadata) : {};
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// Keep empty metadata on parse error
|
|
294
|
+
}
|
|
295
|
+
return { ...e, type: e.edgeType, ...meta };
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
// ===========================================================================
|
|
299
|
+
// Node Utility Methods
|
|
300
|
+
// ===========================================================================
|
|
301
|
+
async isEndpoint(id) {
|
|
302
|
+
const response = await this._send('isEndpoint', { id: String(id) });
|
|
303
|
+
return response.value;
|
|
304
|
+
}
|
|
305
|
+
async getNodeIdentifier(id) {
|
|
306
|
+
const response = await this._send('getNodeIdentifier', { id: String(id) });
|
|
307
|
+
return response.identifier || null;
|
|
308
|
+
}
|
|
309
|
+
async updateNodeVersion(id, version) {
|
|
310
|
+
return this._send('updateNodeVersion', { id: String(id), version });
|
|
311
|
+
}
|
|
312
|
+
async declareFields(fields) {
|
|
313
|
+
const response = await this._send('declareFields', { fields });
|
|
314
|
+
return response.count || 0;
|
|
315
|
+
}
|
|
316
|
+
// ===========================================================================
|
|
317
|
+
// Datalog API
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
async datalogLoadRules(source) {
|
|
320
|
+
const response = await this._send('datalogLoadRules', { source });
|
|
321
|
+
return response.count;
|
|
322
|
+
}
|
|
323
|
+
async datalogClearRules() {
|
|
324
|
+
return this._send('datalogClearRules');
|
|
325
|
+
}
|
|
326
|
+
_parseExplainResponse(response) {
|
|
327
|
+
const r = response;
|
|
328
|
+
return {
|
|
329
|
+
bindings: r.bindings || [],
|
|
330
|
+
stats: r.stats,
|
|
331
|
+
profile: r.profile,
|
|
332
|
+
explainSteps: r.explainSteps || [],
|
|
333
|
+
warnings: r.warnings || [],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
async datalogQuery(query, explain) {
|
|
337
|
+
const payload = { query };
|
|
338
|
+
if (explain)
|
|
339
|
+
payload.explain = true;
|
|
340
|
+
const response = await this._send('datalogQuery', payload);
|
|
341
|
+
if (explain) {
|
|
342
|
+
return this._parseExplainResponse(response);
|
|
343
|
+
}
|
|
344
|
+
return response.results || [];
|
|
345
|
+
}
|
|
346
|
+
async checkGuarantee(ruleSource, explain) {
|
|
347
|
+
const payload = { ruleSource };
|
|
348
|
+
if (explain)
|
|
349
|
+
payload.explain = true;
|
|
350
|
+
const response = await this._send('checkGuarantee', payload);
|
|
351
|
+
if (explain) {
|
|
352
|
+
return this._parseExplainResponse(response);
|
|
353
|
+
}
|
|
354
|
+
return response.violations || [];
|
|
355
|
+
}
|
|
356
|
+
async executeDatalog(source, explain) {
|
|
357
|
+
const payload = { source };
|
|
358
|
+
if (explain)
|
|
359
|
+
payload.explain = true;
|
|
360
|
+
const response = await this._send('executeDatalog', payload);
|
|
361
|
+
if (explain) {
|
|
362
|
+
return this._parseExplainResponse(response);
|
|
363
|
+
}
|
|
364
|
+
return response.results || [];
|
|
365
|
+
}
|
|
366
|
+
async cypherQuery(query) {
|
|
367
|
+
const response = await this._send('cypherQuery', { query });
|
|
368
|
+
return response;
|
|
369
|
+
}
|
|
370
|
+
async ping() {
|
|
371
|
+
const response = await this._send('ping');
|
|
372
|
+
return response.pong && response.version ? response.version : false;
|
|
373
|
+
}
|
|
374
|
+
// ===========================================================================
|
|
375
|
+
// Protocol v2 - Multi-Database Commands
|
|
376
|
+
// ===========================================================================
|
|
377
|
+
async hello(protocolVersion = 3) {
|
|
378
|
+
const response = await this._send('hello', { protocolVersion });
|
|
379
|
+
return response;
|
|
380
|
+
}
|
|
381
|
+
async createDatabase(name, ephemeral = false) {
|
|
382
|
+
const response = await this._send('createDatabase', { name, ephemeral });
|
|
383
|
+
return response;
|
|
384
|
+
}
|
|
385
|
+
async openDatabase(name, mode = 'rw') {
|
|
386
|
+
const response = await this._send('openDatabase', { name, mode });
|
|
387
|
+
return response;
|
|
388
|
+
}
|
|
389
|
+
async closeDatabase() {
|
|
390
|
+
return this._send('closeDatabase');
|
|
391
|
+
}
|
|
392
|
+
async dropDatabase(name) {
|
|
393
|
+
return this._send('dropDatabase', { name });
|
|
394
|
+
}
|
|
395
|
+
async listDatabases() {
|
|
396
|
+
const response = await this._send('listDatabases');
|
|
397
|
+
return response;
|
|
398
|
+
}
|
|
399
|
+
async currentDatabase() {
|
|
400
|
+
const response = await this._send('currentDatabase');
|
|
401
|
+
return response;
|
|
402
|
+
}
|
|
403
|
+
// ===========================================================================
|
|
404
|
+
// Snapshot Operations
|
|
405
|
+
// ===========================================================================
|
|
406
|
+
/**
|
|
407
|
+
* Convert a SnapshotRef to wire format payload fields.
|
|
408
|
+
*/
|
|
409
|
+
_resolveSnapshotRef(ref) {
|
|
410
|
+
if (typeof ref === 'number')
|
|
411
|
+
return { version: ref };
|
|
412
|
+
return { tagKey: ref.tag, tagValue: ref.value };
|
|
413
|
+
}
|
|
414
|
+
async diffSnapshots(from, to) {
|
|
415
|
+
const response = await this._send('diffSnapshots', {
|
|
416
|
+
from: this._resolveSnapshotRef(from),
|
|
417
|
+
to: this._resolveSnapshotRef(to),
|
|
418
|
+
});
|
|
419
|
+
return response.diff;
|
|
420
|
+
}
|
|
421
|
+
async tagSnapshot(version, tags) {
|
|
422
|
+
await this._send('tagSnapshot', { version, tags });
|
|
423
|
+
}
|
|
424
|
+
async findSnapshot(tagKey, tagValue) {
|
|
425
|
+
const response = await this._send('findSnapshot', { tagKey, tagValue });
|
|
426
|
+
return response.version;
|
|
427
|
+
}
|
|
428
|
+
async listSnapshots(filterTag) {
|
|
429
|
+
const payload = {};
|
|
430
|
+
if (filterTag !== undefined)
|
|
431
|
+
payload.filterTag = filterTag;
|
|
432
|
+
const response = await this._send('listSnapshots', payload);
|
|
433
|
+
return response.snapshots;
|
|
434
|
+
}
|
|
435
|
+
// ===========================================================================
|
|
436
|
+
// Batch Operations
|
|
437
|
+
// ===========================================================================
|
|
438
|
+
beginBatch() {
|
|
439
|
+
if (this._batching)
|
|
440
|
+
throw new Error('Batch already in progress');
|
|
441
|
+
this._batching = true;
|
|
442
|
+
this._batchNodes = [];
|
|
443
|
+
this._batchEdges = [];
|
|
444
|
+
this._batchFiles = new Set();
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Synchronously batch a single node.
|
|
448
|
+
*/
|
|
449
|
+
batchNode(node) {
|
|
450
|
+
if (!this._batching)
|
|
451
|
+
throw new Error('No batch in progress');
|
|
452
|
+
const nodeRecord = node;
|
|
453
|
+
const { id, type, node_type, nodeType, name, file, exported, metadata, semanticId, semantic_id, ...rest } = nodeRecord;
|
|
454
|
+
const existingMeta = typeof metadata === 'string' ? JSON.parse(metadata) : (metadata || {});
|
|
455
|
+
const combinedMeta = { ...existingMeta, ...rest };
|
|
456
|
+
const wire = {
|
|
457
|
+
id: String(id),
|
|
458
|
+
nodeType: (node_type || nodeType || type || 'UNKNOWN'),
|
|
459
|
+
name: name || '',
|
|
460
|
+
file: file || '',
|
|
461
|
+
exported: exported || false,
|
|
462
|
+
metadata: JSON.stringify(combinedMeta),
|
|
463
|
+
};
|
|
464
|
+
const sid = semanticId || semantic_id;
|
|
465
|
+
if (sid) {
|
|
466
|
+
wire.semanticId = String(sid);
|
|
467
|
+
}
|
|
468
|
+
this._batchNodes.push(wire);
|
|
469
|
+
if (wire.file)
|
|
470
|
+
this._batchFiles.add(wire.file);
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Synchronously batch a single edge.
|
|
474
|
+
*/
|
|
475
|
+
batchEdge(edge) {
|
|
476
|
+
if (!this._batching)
|
|
477
|
+
throw new Error('No batch in progress');
|
|
478
|
+
const edgeRecord = edge;
|
|
479
|
+
const { src, dst, type, edge_type, edgeType, metadata, ...rest } = edgeRecord;
|
|
480
|
+
const existingMeta = typeof metadata === 'string' ? JSON.parse(metadata) : (metadata || {});
|
|
481
|
+
const combinedMeta = { ...existingMeta, ...rest };
|
|
482
|
+
this._batchEdges.push({
|
|
483
|
+
src: String(src),
|
|
484
|
+
dst: String(dst),
|
|
485
|
+
edgeType: (edge_type || edgeType || type || edge.edgeType || 'UNKNOWN'),
|
|
486
|
+
metadata: JSON.stringify(combinedMeta),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
async commitBatch(tags, deferIndex, protectedTypes, overrideChangedFiles) {
|
|
490
|
+
if (!this._batching)
|
|
491
|
+
throw new Error('No batch in progress');
|
|
492
|
+
const allNodes = this._batchNodes;
|
|
493
|
+
const allEdges = this._batchEdges;
|
|
494
|
+
const changedFiles = overrideChangedFiles ?? [...this._batchFiles];
|
|
495
|
+
this._batching = false;
|
|
496
|
+
this._batchNodes = [];
|
|
497
|
+
this._batchEdges = [];
|
|
498
|
+
this._batchFiles = new Set();
|
|
499
|
+
return this._sendCommitBatch(changedFiles, allNodes, allEdges, tags, deferIndex, protectedTypes);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Internal helper: send a commitBatch with chunking for large payloads.
|
|
503
|
+
* @internal
|
|
504
|
+
*/
|
|
505
|
+
async _sendCommitBatch(changedFiles, allNodes, allEdges, tags, deferIndex, protectedTypes) {
|
|
506
|
+
const CHUNK = 10_000;
|
|
507
|
+
if (allNodes.length <= CHUNK && allEdges.length <= CHUNK) {
|
|
508
|
+
const response = await this._send('commitBatch', {
|
|
509
|
+
changedFiles, nodes: allNodes, edges: allEdges, tags,
|
|
510
|
+
...(deferIndex ? { deferIndex: true } : {}),
|
|
511
|
+
...(protectedTypes?.length ? { protectedTypes } : {}),
|
|
512
|
+
});
|
|
513
|
+
return response.delta;
|
|
514
|
+
}
|
|
515
|
+
const merged = {
|
|
516
|
+
changedFiles,
|
|
517
|
+
nodesAdded: 0, nodesRemoved: 0,
|
|
518
|
+
edgesAdded: 0, edgesRemoved: 0,
|
|
519
|
+
changedNodeTypes: [], changedEdgeTypes: [],
|
|
520
|
+
};
|
|
521
|
+
const nodeTypes = new Set();
|
|
522
|
+
const edgeTypes = new Set();
|
|
523
|
+
const maxI = Math.max(Math.ceil(allNodes.length / CHUNK), Math.ceil(allEdges.length / CHUNK), 1);
|
|
524
|
+
for (let i = 0; i < maxI; i++) {
|
|
525
|
+
const nodes = allNodes.slice(i * CHUNK, (i + 1) * CHUNK);
|
|
526
|
+
const edges = allEdges.slice(i * CHUNK, (i + 1) * CHUNK);
|
|
527
|
+
const response = await this._send('commitBatch', {
|
|
528
|
+
changedFiles: i === 0 ? changedFiles : [],
|
|
529
|
+
nodes, edges, tags,
|
|
530
|
+
...(deferIndex ? { deferIndex: true } : {}),
|
|
531
|
+
...(i === 0 && protectedTypes?.length ? { protectedTypes } : {}),
|
|
532
|
+
});
|
|
533
|
+
const d = response.delta;
|
|
534
|
+
merged.nodesAdded += d.nodesAdded;
|
|
535
|
+
merged.nodesRemoved += d.nodesRemoved;
|
|
536
|
+
merged.edgesAdded += d.edgesAdded;
|
|
537
|
+
merged.edgesRemoved += d.edgesRemoved;
|
|
538
|
+
for (const t of d.changedNodeTypes)
|
|
539
|
+
nodeTypes.add(t);
|
|
540
|
+
for (const t of d.changedEdgeTypes)
|
|
541
|
+
edgeTypes.add(t);
|
|
542
|
+
}
|
|
543
|
+
merged.changedNodeTypes = [...nodeTypes];
|
|
544
|
+
merged.changedEdgeTypes = [...edgeTypes];
|
|
545
|
+
return merged;
|
|
546
|
+
}
|
|
547
|
+
async rebuildIndexes() {
|
|
548
|
+
await this._send('rebuildIndexes', {});
|
|
549
|
+
}
|
|
550
|
+
abortBatch() {
|
|
551
|
+
this._batching = false;
|
|
552
|
+
this._batchNodes = [];
|
|
553
|
+
this._batchEdges = [];
|
|
554
|
+
this._batchFiles = new Set();
|
|
555
|
+
}
|
|
556
|
+
isBatching() {
|
|
557
|
+
return this._batching;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Find files that depend on the given changed files.
|
|
561
|
+
*/
|
|
562
|
+
async findDependentFiles(changedFiles) {
|
|
563
|
+
const nodeIds = [];
|
|
564
|
+
for (const file of changedFiles) {
|
|
565
|
+
const ids = await this.findByAttr({ file });
|
|
566
|
+
nodeIds.push(...ids);
|
|
567
|
+
}
|
|
568
|
+
if (nodeIds.length === 0)
|
|
569
|
+
return [];
|
|
570
|
+
const reachable = await this.reachability(nodeIds, 2, ['IMPORTS_FROM', 'DEPENDS_ON', 'CALLS'], true);
|
|
571
|
+
const changedSet = new Set(changedFiles);
|
|
572
|
+
const files = new Set();
|
|
573
|
+
for (const id of reachable) {
|
|
574
|
+
const node = await this.getNode(id);
|
|
575
|
+
if (node?.file && !changedSet.has(node.file)) {
|
|
576
|
+
files.add(node.file);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
return [...files];
|
|
580
|
+
}
|
|
581
|
+
async shutdown() {
|
|
582
|
+
try {
|
|
583
|
+
await this._send('shutdown');
|
|
584
|
+
}
|
|
585
|
+
catch {
|
|
586
|
+
// Expected - server closes connection
|
|
587
|
+
}
|
|
588
|
+
await this.close();
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=base-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-client.js","sourceRoot":"","sources":["../ts/base-client.ts"],"names":[],"mappings":"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"}
|