@grafema/rfdb-client 0.2.5-beta → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -14
- package/dist/client.d.ts +113 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +364 -14
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +212 -0
- package/dist/client.test.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +1 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/stream-queue.d.ts +30 -0
- package/dist/stream-queue.d.ts.map +1 -0
- package/dist/stream-queue.js +74 -0
- package/dist/stream-queue.js.map +1 -0
- package/package.json +2 -2
- package/ts/client.test.ts +635 -0
- package/ts/client.ts +420 -15
- package/ts/index.ts +10 -0
- package/ts/protocol.ts +11 -0
- package/ts/stream-queue.test.ts +114 -0
- package/ts/stream-queue.ts +83 -0
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
*Named after the author's wife Regina (Rega for short). The Hebrew word רגע (rega, "moment") conveniently fits the concept — a flow of discrete moments captured in the graph.*
|
|
6
6
|
|
|
7
|
-
**Warning: This package is in
|
|
7
|
+
**Warning: This package is in beta stage and the API may change between minor versions.**
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
@@ -14,14 +14,16 @@ npm install @grafema/rfdb-client
|
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
|
-
High-performance TypeScript client for RFDB
|
|
17
|
+
High-performance TypeScript client for RFDB — a graph database optimized for code analysis. Communicates with RFDB server via Unix socket using MessagePack protocol.
|
|
18
18
|
|
|
19
19
|
## Features
|
|
20
20
|
|
|
21
21
|
- Socket-based client for out-of-process communication
|
|
22
22
|
- MessagePack binary protocol for efficiency
|
|
23
|
+
- Batch operations for high-throughput ingestion
|
|
23
24
|
- Full graph operations: nodes, edges, queries
|
|
24
25
|
- Datalog query support
|
|
26
|
+
- Streaming support for large result sets
|
|
25
27
|
|
|
26
28
|
## Quick Start
|
|
27
29
|
|
|
@@ -39,6 +41,9 @@ await client.addNode({
|
|
|
39
41
|
file: 'src/api/users.ts'
|
|
40
42
|
});
|
|
41
43
|
|
|
44
|
+
// Batch add for performance
|
|
45
|
+
await client.addNodes([node1, node2, node3]);
|
|
46
|
+
|
|
42
47
|
// Query nodes
|
|
43
48
|
const functions = await client.findByType('FUNCTION');
|
|
44
49
|
|
|
@@ -52,27 +57,33 @@ await client.close();
|
|
|
52
57
|
|
|
53
58
|
### Connection
|
|
54
59
|
|
|
55
|
-
- `connect()`
|
|
56
|
-
- `close()`
|
|
60
|
+
- `connect()` — Connect to RFDB server
|
|
61
|
+
- `close()` — Close connection
|
|
57
62
|
|
|
58
63
|
### Nodes
|
|
59
64
|
|
|
60
|
-
- `addNode(node)`
|
|
61
|
-
- `addNodes(nodes)`
|
|
62
|
-
- `getNode(id)`
|
|
63
|
-
- `findByType(type)`
|
|
64
|
-
- `queryNodes(query)`
|
|
65
|
+
- `addNode(node)` — Add a single node
|
|
66
|
+
- `addNodes(nodes)` — Batch add nodes
|
|
67
|
+
- `getNode(id)` — Get node by ID
|
|
68
|
+
- `findByType(type)` — Find nodes by type
|
|
69
|
+
- `queryNodes(query)` — Query nodes with filters
|
|
65
70
|
|
|
66
71
|
### Edges
|
|
67
72
|
|
|
68
|
-
- `addEdge(edge)`
|
|
69
|
-
- `addEdges(edges)`
|
|
70
|
-
- `getOutgoingEdges(nodeId, types?)`
|
|
71
|
-
- `getIncomingEdges(nodeId, types?)`
|
|
73
|
+
- `addEdge(edge)` — Add a single edge
|
|
74
|
+
- `addEdges(edges)` — Batch add edges
|
|
75
|
+
- `getOutgoingEdges(nodeId, types?)` — Get outgoing edges
|
|
76
|
+
- `getIncomingEdges(nodeId, types?)` — Get incoming edges
|
|
72
77
|
|
|
73
78
|
### Queries
|
|
74
79
|
|
|
75
|
-
- `queryDatalog(query)`
|
|
80
|
+
- `queryDatalog(query)` — Execute Datalog query
|
|
81
|
+
|
|
82
|
+
### Database Management
|
|
83
|
+
|
|
84
|
+
- `createDatabase(name)` — Create a new database
|
|
85
|
+
- `useDatabase(name)` — Switch to a database
|
|
86
|
+
- `clear()` — Clear all data
|
|
76
87
|
|
|
77
88
|
## License
|
|
78
89
|
|
package/dist/client.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* with a separate rfdb-server process over Unix socket + MessagePack.
|
|
6
6
|
*/
|
|
7
7
|
import { EventEmitter } from 'events';
|
|
8
|
-
import type { WireNode, WireEdge, RFDBResponse, IRFDBClient, AttrQuery, FieldDeclaration, DatalogResult, NodeType, EdgeType, HelloResponse, CreateDatabaseResponse, OpenDatabaseResponse, ListDatabasesResponse, CurrentDatabaseResponse } from '@grafema/types';
|
|
8
|
+
import type { WireNode, WireEdge, RFDBResponse, IRFDBClient, AttrQuery, FieldDeclaration, DatalogResult, NodeType, EdgeType, HelloResponse, CreateDatabaseResponse, OpenDatabaseResponse, ListDatabasesResponse, CurrentDatabaseResponse, SnapshotRef, SnapshotDiff, SnapshotInfo, CommitDelta } from '@grafema/types';
|
|
9
9
|
export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
10
10
|
readonly socketPath: string;
|
|
11
11
|
private socket;
|
|
@@ -13,7 +13,19 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
13
13
|
private pending;
|
|
14
14
|
private reqId;
|
|
15
15
|
private buffer;
|
|
16
|
+
private _batching;
|
|
17
|
+
private _batchNodes;
|
|
18
|
+
private _batchEdges;
|
|
19
|
+
private _batchFiles;
|
|
20
|
+
private _supportsStreaming;
|
|
21
|
+
private _pendingStreams;
|
|
22
|
+
private _streamTimers;
|
|
16
23
|
constructor(socketPath?: string);
|
|
24
|
+
/**
|
|
25
|
+
* Whether the connected server supports streaming responses.
|
|
26
|
+
* Set after calling hello(). Defaults to false.
|
|
27
|
+
*/
|
|
28
|
+
get supportsStreaming(): boolean;
|
|
17
29
|
/**
|
|
18
30
|
* Connect to RFDB server
|
|
19
31
|
*/
|
|
@@ -27,9 +39,25 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
27
39
|
*/
|
|
28
40
|
private _handleData;
|
|
29
41
|
/**
|
|
30
|
-
* Handle decoded response
|
|
42
|
+
* Handle decoded response — match by requestId, route streaming chunks
|
|
43
|
+
* to StreamQueue or resolve single-response Promise.
|
|
31
44
|
*/
|
|
32
45
|
private _handleResponse;
|
|
46
|
+
/**
|
|
47
|
+
* Handle a response for a streaming request.
|
|
48
|
+
* Routes chunk data to StreamQueue and manages stream lifecycle.
|
|
49
|
+
* Resets per-chunk timeout on each successful chunk arrival.
|
|
50
|
+
*/
|
|
51
|
+
private _handleStreamingResponse;
|
|
52
|
+
/**
|
|
53
|
+
* Reset the per-chunk timeout for a streaming request.
|
|
54
|
+
*/
|
|
55
|
+
private _resetStreamTimer;
|
|
56
|
+
/**
|
|
57
|
+
* Clean up all state for a completed/failed streaming request.
|
|
58
|
+
*/
|
|
59
|
+
private _cleanupStream;
|
|
60
|
+
private _parseRequestId;
|
|
33
61
|
/**
|
|
34
62
|
* Default timeout for operations (60 seconds)
|
|
35
63
|
* Flush/compact may take time for large graphs, but should not hang indefinitely
|
|
@@ -136,6 +164,22 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
136
164
|
* Query nodes (async generator)
|
|
137
165
|
*/
|
|
138
166
|
queryNodes(query: AttrQuery): AsyncGenerator<WireNode, void, unknown>;
|
|
167
|
+
/**
|
|
168
|
+
* Build a server query object from an AttrQuery.
|
|
169
|
+
*/
|
|
170
|
+
private _buildServerQuery;
|
|
171
|
+
/**
|
|
172
|
+
* Stream nodes matching query with true streaming support.
|
|
173
|
+
*
|
|
174
|
+
* Behavior depends on server capabilities:
|
|
175
|
+
* - Server supports streaming (protocol v3): receives chunked NodesChunk
|
|
176
|
+
* responses via StreamQueue. Nodes are yielded as they arrive.
|
|
177
|
+
* - Server does NOT support streaming (fallback): delegates to queryNodes()
|
|
178
|
+
* which yields nodes one by one from bulk response.
|
|
179
|
+
*
|
|
180
|
+
* The generator can be aborted by breaking out of the loop or calling .return().
|
|
181
|
+
*/
|
|
182
|
+
queryNodesStream(query: AttrQuery): AsyncGenerator<WireNode, void, unknown>;
|
|
139
183
|
/**
|
|
140
184
|
* Get all nodes matching query
|
|
141
185
|
*/
|
|
@@ -179,6 +223,11 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
179
223
|
* Check a guarantee (Datalog rule) and return violations
|
|
180
224
|
*/
|
|
181
225
|
checkGuarantee(ruleSource: string): Promise<DatalogResult[]>;
|
|
226
|
+
/**
|
|
227
|
+
* Execute unified Datalog — handles both direct queries and rule-based programs.
|
|
228
|
+
* Auto-detects the head predicate instead of hardcoding violation(X).
|
|
229
|
+
*/
|
|
230
|
+
executeDatalog(source: string): Promise<DatalogResult[]>;
|
|
182
231
|
/**
|
|
183
232
|
* Ping the server
|
|
184
233
|
*/
|
|
@@ -218,6 +267,68 @@ export declare class RFDBClient extends EventEmitter implements IRFDBClient {
|
|
|
218
267
|
* Get current database for this session
|
|
219
268
|
*/
|
|
220
269
|
currentDatabase(): Promise<CurrentDatabaseResponse>;
|
|
270
|
+
/**
|
|
271
|
+
* Convert a SnapshotRef to wire format payload fields.
|
|
272
|
+
*
|
|
273
|
+
* - number -> { version: N }
|
|
274
|
+
* - { tag, value } -> { tagKey, tagValue }
|
|
275
|
+
*/
|
|
276
|
+
private _resolveSnapshotRef;
|
|
277
|
+
/**
|
|
278
|
+
* Compute diff between two snapshots.
|
|
279
|
+
* @param from - Source snapshot (version number or tag reference)
|
|
280
|
+
* @param to - Target snapshot (version number or tag reference)
|
|
281
|
+
* @returns SnapshotDiff with added/removed segments and stats
|
|
282
|
+
*/
|
|
283
|
+
diffSnapshots(from: SnapshotRef, to: SnapshotRef): Promise<SnapshotDiff>;
|
|
284
|
+
/**
|
|
285
|
+
* Tag a snapshot with key-value metadata.
|
|
286
|
+
* @param version - Snapshot version to tag
|
|
287
|
+
* @param tags - Key-value pairs to apply (e.g. { "release": "v1.0" })
|
|
288
|
+
*/
|
|
289
|
+
tagSnapshot(version: number, tags: Record<string, string>): Promise<void>;
|
|
290
|
+
/**
|
|
291
|
+
* Find a snapshot by tag key/value pair.
|
|
292
|
+
* @param tagKey - Tag key to search for
|
|
293
|
+
* @param tagValue - Tag value to match
|
|
294
|
+
* @returns Snapshot version number, or null if not found
|
|
295
|
+
*/
|
|
296
|
+
findSnapshot(tagKey: string, tagValue: string): Promise<number | null>;
|
|
297
|
+
/**
|
|
298
|
+
* List snapshots, optionally filtered by tag key.
|
|
299
|
+
* @param filterTag - Optional tag key to filter by (only snapshots with this tag)
|
|
300
|
+
* @returns Array of SnapshotInfo objects
|
|
301
|
+
*/
|
|
302
|
+
listSnapshots(filterTag?: string): Promise<SnapshotInfo[]>;
|
|
303
|
+
/**
|
|
304
|
+
* Begin a batch operation.
|
|
305
|
+
* While batching, addNodes/addEdges buffer locally instead of sending to server.
|
|
306
|
+
* Call commitBatch() to send all buffered data atomically.
|
|
307
|
+
*/
|
|
308
|
+
beginBatch(): void;
|
|
309
|
+
/**
|
|
310
|
+
* Commit the current batch to the server.
|
|
311
|
+
* Sends all buffered nodes/edges with the list of changed files.
|
|
312
|
+
* Server atomically replaces old data for changed files with new data.
|
|
313
|
+
*/
|
|
314
|
+
commitBatch(tags?: string[]): Promise<CommitDelta>;
|
|
315
|
+
/**
|
|
316
|
+
* Abort the current batch, discarding all buffered data.
|
|
317
|
+
*/
|
|
318
|
+
abortBatch(): void;
|
|
319
|
+
/**
|
|
320
|
+
* Check if a batch is currently in progress.
|
|
321
|
+
*/
|
|
322
|
+
isBatching(): boolean;
|
|
323
|
+
/**
|
|
324
|
+
* Find files that depend on the given changed files.
|
|
325
|
+
* Uses backward reachability to find dependent modules.
|
|
326
|
+
*
|
|
327
|
+
* Note: For large result sets, each reachable node requires a separate
|
|
328
|
+
* getNode RPC. A future server-side optimization could return file paths
|
|
329
|
+
* directly from the reachability query.
|
|
330
|
+
*/
|
|
331
|
+
findDependentFiles(changedFiles: string[]): Promise<string[]>;
|
|
221
332
|
/**
|
|
222
333
|
* Unref the socket so it doesn't keep the process alive.
|
|
223
334
|
*
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../ts/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../ts/client.ts"],"names":[],"mappings":"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"}
|