@loradb/lora-wasm 0.4.0 → 0.5.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/README.md +71 -7
- package/dist/index.d.ts +71 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +169 -12
- package/dist/index.js.map +1 -1
- package/dist/snapshot.d.ts +22 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +107 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/worker-client.d.ts +28 -0
- package/dist/worker-client.d.ts.map +1 -1
- package/dist/worker-client.js +100 -0
- package/dist/worker-client.js.map +1 -1
- package/dist/worker-protocol.d.ts +24 -1
- package/dist/worker-protocol.d.ts.map +1 -1
- package/dist/worker.js +52 -0
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/pkg-bundler/README.md +71 -7
- package/pkg-bundler/lora_wasm.d.ts +17 -0
- package/pkg-bundler/lora_wasm_bg.js +82 -0
- package/pkg-bundler/lora_wasm_bg.wasm +0 -0
- package/pkg-bundler/lora_wasm_bg.wasm.d.ts +6 -0
- package/pkg-bundler/package.json +1 -1
- package/pkg-node/README.md +71 -7
- package/pkg-node/lora_wasm.d.ts +17 -0
- package/pkg-node/lora_wasm.js +83 -0
- package/pkg-node/lora_wasm_bg.wasm +0 -0
- package/pkg-node/lora_wasm_bg.wasm.d.ts +6 -0
- package/pkg-node/package.json +1 -1
- package/pkg-web/README.md +71 -7
- package/pkg-web/lora_wasm.d.ts +23 -0
- package/pkg-web/lora_wasm.js +82 -0
- package/pkg-web/lora_wasm_bg.wasm +0 -0
- package/pkg-web/lora_wasm_bg.wasm.d.ts +6 -0
- package/pkg-web/package.json +1 -1
package/dist/worker-client.d.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { LoraParams, LoraValue, QueryResult } from "./types.js";
|
|
9
9
|
import type { Response } from "./worker-protocol.js";
|
|
10
|
+
import type { RowStream, SnapshotMeta, TransactionMode, TransactionStatement } from "./index.js";
|
|
11
|
+
import type { WasmSnapshotSource } from "./snapshot.js";
|
|
10
12
|
export interface WorkerLike {
|
|
11
13
|
postMessage(message: unknown): void;
|
|
12
14
|
terminate(): void;
|
|
@@ -22,6 +24,32 @@ export interface WorkerLike {
|
|
|
22
24
|
}
|
|
23
25
|
export interface WorkerDatabase {
|
|
24
26
|
execute<T extends Record<string, LoraValue> = Record<string, LoraValue>>(query: string, params?: LoraParams): Promise<QueryResult<T>>;
|
|
27
|
+
stream<T extends Record<string, LoraValue> = Record<string, LoraValue>>(query: string, params?: LoraParams): RowStream<T>;
|
|
28
|
+
rows<T extends Record<string, LoraValue> = Record<string, LoraValue>>(query: string, params?: LoraParams): RowStream<T>;
|
|
29
|
+
transaction<T extends Record<string, LoraValue> = Record<string, LoraValue>>(statements: TransactionStatement[], mode?: TransactionMode): Promise<Array<QueryResult<T>>>;
|
|
30
|
+
saveSnapshotToBytes(): Promise<Uint8Array>;
|
|
31
|
+
saveSnapshot(): Promise<Uint8Array>;
|
|
32
|
+
saveSnapshot(format: "binary"): Promise<Uint8Array>;
|
|
33
|
+
saveSnapshot(format: "base64"): Promise<string>;
|
|
34
|
+
saveSnapshot(format: "blob"): Promise<Blob>;
|
|
35
|
+
saveSnapshot(format: "download"): Promise<void>;
|
|
36
|
+
saveSnapshot(options: {
|
|
37
|
+
format: "binary";
|
|
38
|
+
}): Promise<Uint8Array>;
|
|
39
|
+
saveSnapshot(options: {
|
|
40
|
+
format: "base64";
|
|
41
|
+
}): Promise<string>;
|
|
42
|
+
saveSnapshot(options: {
|
|
43
|
+
format: "blob";
|
|
44
|
+
mimeType?: string;
|
|
45
|
+
}): Promise<Blob>;
|
|
46
|
+
saveSnapshot(options: {
|
|
47
|
+
format: "download";
|
|
48
|
+
filename?: string;
|
|
49
|
+
mimeType?: string;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
loadSnapshotFromBytes(bytes: Uint8Array): Promise<SnapshotMeta>;
|
|
52
|
+
loadSnapshot(source: WasmSnapshotSource): Promise<SnapshotMeta>;
|
|
25
53
|
clear(): Promise<void>;
|
|
26
54
|
nodeCount(): Promise<number>;
|
|
27
55
|
relationshipCount(): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../ts/worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../ts/worker-client.ts"],"names":[],"mappings":"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"}
|
package/dist/worker-client.js
CHANGED
|
@@ -6,6 +6,64 @@
|
|
|
6
6
|
* so consumers can choose the execution model without rewriting their code.
|
|
7
7
|
*/
|
|
8
8
|
import { LoraError } from "./types.js";
|
|
9
|
+
import { downloadSnapshotBytes, resolveSnapshotSaveFormat, snapshotBytesToBase64, snapshotBytesToBlob, snapshotSourceToBytes, } from "./snapshot.js";
|
|
10
|
+
class WorkerRowStream {
|
|
11
|
+
#open;
|
|
12
|
+
#call;
|
|
13
|
+
#state = null;
|
|
14
|
+
#closed = false;
|
|
15
|
+
constructor(open, call) {
|
|
16
|
+
this.#open = open;
|
|
17
|
+
this.#call = call;
|
|
18
|
+
}
|
|
19
|
+
[Symbol.asyncIterator]() {
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
columns() {
|
|
23
|
+
return this.#ensureOpen().then((state) => state.columns);
|
|
24
|
+
}
|
|
25
|
+
async next() {
|
|
26
|
+
if (this.#closed) {
|
|
27
|
+
return { done: true, value: undefined };
|
|
28
|
+
}
|
|
29
|
+
const { streamId } = await this.#ensureOpen();
|
|
30
|
+
const row = await this.#call({ op: "streamNext", streamId });
|
|
31
|
+
if (row === null) {
|
|
32
|
+
this.#closed = true;
|
|
33
|
+
return { done: true, value: undefined };
|
|
34
|
+
}
|
|
35
|
+
return { done: false, value: row };
|
|
36
|
+
}
|
|
37
|
+
async return() {
|
|
38
|
+
this.close();
|
|
39
|
+
return { done: true, value: undefined };
|
|
40
|
+
}
|
|
41
|
+
async toArray() {
|
|
42
|
+
const rows = [];
|
|
43
|
+
for (;;) {
|
|
44
|
+
const next = await this.next();
|
|
45
|
+
if (next.done)
|
|
46
|
+
return rows;
|
|
47
|
+
rows.push(next.value);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
close() {
|
|
51
|
+
if (this.#closed)
|
|
52
|
+
return;
|
|
53
|
+
this.#closed = true;
|
|
54
|
+
if (this.#state) {
|
|
55
|
+
void this.#state.then(({ streamId }) => {
|
|
56
|
+
return this.#call({ op: "streamClose", streamId });
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
#ensureOpen() {
|
|
61
|
+
if (!this.#state) {
|
|
62
|
+
this.#state = this.#open();
|
|
63
|
+
}
|
|
64
|
+
return this.#state;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
9
67
|
/**
|
|
10
68
|
* Build a Database client that proxies to the supplied worker.
|
|
11
69
|
*
|
|
@@ -47,10 +105,52 @@ export function createWorkerDatabase(worker) {
|
|
|
47
105
|
worker.postMessage(msg);
|
|
48
106
|
});
|
|
49
107
|
}
|
|
108
|
+
async function saveSnapshot(target) {
|
|
109
|
+
const options = resolveSnapshotSaveFormat(target);
|
|
110
|
+
const bytes = await call({ op: "saveSnapshotToBytes" });
|
|
111
|
+
switch (options.format) {
|
|
112
|
+
case "binary":
|
|
113
|
+
return bytes;
|
|
114
|
+
case "base64":
|
|
115
|
+
return snapshotBytesToBase64(bytes);
|
|
116
|
+
case "blob":
|
|
117
|
+
return snapshotBytesToBlob(bytes, options.mimeType);
|
|
118
|
+
case "download":
|
|
119
|
+
return downloadSnapshotBytes(bytes, options.filename, options.mimeType);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
50
122
|
return {
|
|
51
123
|
execute(query, params) {
|
|
52
124
|
return call({ op: "execute", query, params: params ?? null });
|
|
53
125
|
},
|
|
126
|
+
stream(query, params) {
|
|
127
|
+
return new WorkerRowStream(() => {
|
|
128
|
+
return call({
|
|
129
|
+
op: "streamOpen",
|
|
130
|
+
query,
|
|
131
|
+
params: params ?? null,
|
|
132
|
+
});
|
|
133
|
+
}, call);
|
|
134
|
+
},
|
|
135
|
+
rows(query, params) {
|
|
136
|
+
return this.stream(query, params);
|
|
137
|
+
},
|
|
138
|
+
transaction(statements, mode = "read_write") {
|
|
139
|
+
return call({ op: "transaction", statements, mode });
|
|
140
|
+
},
|
|
141
|
+
saveSnapshotToBytes() {
|
|
142
|
+
return call({ op: "saveSnapshotToBytes" });
|
|
143
|
+
},
|
|
144
|
+
saveSnapshot: saveSnapshot,
|
|
145
|
+
loadSnapshotFromBytes(bytes) {
|
|
146
|
+
return call({ op: "loadSnapshotFromBytes", bytes });
|
|
147
|
+
},
|
|
148
|
+
async loadSnapshot(source) {
|
|
149
|
+
return call({
|
|
150
|
+
op: "loadSnapshotFromBytes",
|
|
151
|
+
bytes: await snapshotSourceToBytes(source),
|
|
152
|
+
});
|
|
153
|
+
},
|
|
54
154
|
async clear() {
|
|
55
155
|
await call({ op: "clear" });
|
|
56
156
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../ts/worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../ts/worker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,30 @@
|
|
|
6
6
|
* asynchronous responses.
|
|
7
7
|
*/
|
|
8
8
|
import type { LoraParams, QueryResult, LoraErrorCode } from "./types.js";
|
|
9
|
+
import type { TransactionMode, TransactionStatement } from "./index.js";
|
|
9
10
|
export type RequestBody = {
|
|
10
11
|
op: "execute";
|
|
11
12
|
query: string;
|
|
12
13
|
params?: LoraParams | null;
|
|
14
|
+
} | {
|
|
15
|
+
op: "streamOpen";
|
|
16
|
+
query: string;
|
|
17
|
+
params?: LoraParams | null;
|
|
18
|
+
} | {
|
|
19
|
+
op: "streamNext";
|
|
20
|
+
streamId: number;
|
|
21
|
+
} | {
|
|
22
|
+
op: "streamClose";
|
|
23
|
+
streamId: number;
|
|
24
|
+
} | {
|
|
25
|
+
op: "transaction";
|
|
26
|
+
statements: TransactionStatement[];
|
|
27
|
+
mode?: TransactionMode;
|
|
28
|
+
} | {
|
|
29
|
+
op: "saveSnapshotToBytes";
|
|
30
|
+
} | {
|
|
31
|
+
op: "loadSnapshotFromBytes";
|
|
32
|
+
bytes: Uint8Array;
|
|
13
33
|
} | {
|
|
14
34
|
op: "clear";
|
|
15
35
|
} | {
|
|
@@ -25,7 +45,10 @@ export interface Request {
|
|
|
25
45
|
}
|
|
26
46
|
export type ResponseBody = {
|
|
27
47
|
ok: true;
|
|
28
|
-
result: QueryResult | number | null
|
|
48
|
+
result: QueryResult | QueryResult[] | number | Uint8Array | null | {
|
|
49
|
+
streamId: number;
|
|
50
|
+
columns: string[];
|
|
51
|
+
} | Record<string, unknown>;
|
|
29
52
|
} | {
|
|
30
53
|
ok: false;
|
|
31
54
|
error: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../ts/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../ts/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,GACjF;IAAE,EAAE,EAAE,qBAAqB,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GACf;IAAE,EAAE,EAAE,WAAW,CAAA;CAAE,GACnB;IAAE,EAAE,EAAE,mBAAmB,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,CAAC;AAEtB,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EACF,WAAW,GACX,WAAW,EAAE,GACb,MAAM,GACN,UAAU,GACV,IAAI,GACJ;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;CACpB"}
|
package/dist/worker.js
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
import __wbg_init, { WasmDatabase, init as installPanicHook, } from "../pkg-web/lora_wasm.js";
|
|
13
13
|
let db = null;
|
|
14
14
|
let ready = null;
|
|
15
|
+
let nextStreamId = 1;
|
|
16
|
+
const streams = new Map();
|
|
15
17
|
function ensureReady() {
|
|
16
18
|
if (!ready) {
|
|
17
19
|
ready = (async () => {
|
|
@@ -43,6 +45,53 @@ self.onmessage = async (event) => {
|
|
|
43
45
|
respond({ ok: true, result: result });
|
|
44
46
|
break;
|
|
45
47
|
}
|
|
48
|
+
case "streamOpen": {
|
|
49
|
+
const native = db;
|
|
50
|
+
const stream = native.openStream(body.query, body.params ?? null);
|
|
51
|
+
const streamId = nextStreamId++;
|
|
52
|
+
streams.set(streamId, stream);
|
|
53
|
+
respond({
|
|
54
|
+
ok: true,
|
|
55
|
+
result: { streamId, columns: stream.columns() },
|
|
56
|
+
});
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "streamNext": {
|
|
60
|
+
const stream = streams.get(body.streamId);
|
|
61
|
+
if (!stream)
|
|
62
|
+
throw new Error("LORA_ERROR: query stream is closed");
|
|
63
|
+
const row = stream.next();
|
|
64
|
+
if (row === null) {
|
|
65
|
+
streams.delete(body.streamId);
|
|
66
|
+
}
|
|
67
|
+
respond({ ok: true, result: row });
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case "streamClose": {
|
|
71
|
+
const stream = streams.get(body.streamId);
|
|
72
|
+
if (stream) {
|
|
73
|
+
stream.close();
|
|
74
|
+
streams.delete(body.streamId);
|
|
75
|
+
}
|
|
76
|
+
respond({ ok: true, result: null });
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case "transaction": {
|
|
80
|
+
const native = db;
|
|
81
|
+
const result = native.transaction(body.statements, body.mode ?? "read_write");
|
|
82
|
+
respond({ ok: true, result: result });
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "saveSnapshotToBytes": {
|
|
86
|
+
const native = db;
|
|
87
|
+
respond({ ok: true, result: native.saveSnapshotToBytes() });
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case "loadSnapshotFromBytes": {
|
|
91
|
+
const native = db;
|
|
92
|
+
respond({ ok: true, result: native.loadSnapshotFromBytes(body.bytes) });
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
46
95
|
case "clear": {
|
|
47
96
|
db.clear();
|
|
48
97
|
respond({ ok: true, result: null });
|
|
@@ -57,6 +106,9 @@ self.onmessage = async (event) => {
|
|
|
57
106
|
break;
|
|
58
107
|
}
|
|
59
108
|
case "dispose": {
|
|
109
|
+
for (const stream of streams.values())
|
|
110
|
+
stream.close();
|
|
111
|
+
streams.clear();
|
|
60
112
|
db.free();
|
|
61
113
|
db = null;
|
|
62
114
|
respond({ ok: true, result: null });
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../ts/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iCAAiC;AAEjC,OAAO,UAAU,EAAE,EACjB,YAAY,EACZ,IAAI,IAAI,gBAAgB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,IAAI,EAAE,GAAwB,IAAI,CAAC;AACnC,IAAI,KAAK,GAAyB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../ts/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/pkg-bundler/README.md
CHANGED
|
@@ -37,19 +37,24 @@ npm run test:browser
|
|
|
37
37
|
npm run pack:dry
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
##
|
|
40
|
+
## Execution modes
|
|
41
41
|
|
|
42
|
-
### 1.
|
|
42
|
+
### 1. Default: Worker first, main-thread fallback
|
|
43
43
|
|
|
44
44
|
`lora-wasm` is **async-only** — the sole initialization pattern is
|
|
45
45
|
`createDatabase()`, which bootstraps the WASM module on first call.
|
|
46
46
|
There is no synchronous constructor and no `Database.create()`
|
|
47
47
|
static; `Database` is a type-only export.
|
|
48
48
|
|
|
49
|
+
In browser-like hosts, `createDatabase()` tries to spawn the packaged module
|
|
50
|
+
Worker first and pings it before returning. If the Worker cannot be created or
|
|
51
|
+
fails during startup, the package emits one `console.warn` and falls back to
|
|
52
|
+
the in-process WASM engine so the app can still run.
|
|
53
|
+
|
|
49
54
|
```ts
|
|
50
55
|
import { createDatabase, isNode } from "lora-wasm";
|
|
51
56
|
|
|
52
|
-
const db = await createDatabase();
|
|
57
|
+
const db = await createDatabase(); // Worker-backed in browsers when possible
|
|
53
58
|
await db.execute("CREATE (:Person {name: $n})", { n: "Alice" });
|
|
54
59
|
|
|
55
60
|
const r = await db.execute("MATCH (n:Person) RETURN n");
|
|
@@ -58,7 +63,36 @@ for (const row of r.rows) {
|
|
|
58
63
|
}
|
|
59
64
|
```
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
To force the in-process engine:
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const db = await createDatabase({ runtime: "main-thread" });
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
To require Worker startup instead of falling back:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
const db = await createDatabase({ runtime: "worker" });
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
To disable the fallback warning:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
const db = await createDatabase({ warnOnFallback: false });
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 2. Explicit main-thread WASM
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
import { createMainThreadDatabase } from "lora-wasm";
|
|
88
|
+
|
|
89
|
+
const db = await createMainThreadDatabase();
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3. Custom Web Worker
|
|
93
|
+
|
|
94
|
+
Use this when you need to control the Worker URL, lifecycle, bundler entry, or
|
|
95
|
+
pooling strategy.
|
|
62
96
|
|
|
63
97
|
```ts
|
|
64
98
|
import { createWorkerDatabase } from "lora-wasm/worker-client";
|
|
@@ -75,11 +109,42 @@ const { rows } = await db.execute("MATCH (n) RETURN n.n AS n");
|
|
|
75
109
|
The worker entry (`ts/worker.ts`) hosts the WASM module. The main thread only
|
|
76
110
|
posts messages, so long-running queries never block the event loop / UI.
|
|
77
111
|
|
|
78
|
-
###
|
|
112
|
+
### 4. In-process but typed like the worker (advanced)
|
|
79
113
|
|
|
80
114
|
The same `createWorkerDatabase` signature accepts any `WorkerLike` object —
|
|
81
115
|
useful for tests and for swapping execution backends behind the same API.
|
|
82
116
|
|
|
117
|
+
## Snapshots
|
|
118
|
+
|
|
119
|
+
WASM has no filesystem access, so `saveSnapshot()` defaults to a `Uint8Array`.
|
|
120
|
+
It also accepts typed formats: `"base64"` returns base64 text, `"blob"` returns
|
|
121
|
+
a `Blob`, and `"download"` triggers a browser download from the main thread.
|
|
122
|
+
|
|
123
|
+
`loadSnapshot` accepts a `WasmSnapshotSource`: `Uint8Array`, `ArrayBuffer`,
|
|
124
|
+
`Blob`/`File`, `Response`, web `ReadableStream`, string URL, or `URL`. It does
|
|
125
|
+
not include Node `Buffer`; use `Uint8Array` bytes when running the WASM package
|
|
126
|
+
from Node.
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import { createDatabase } from "lora-wasm";
|
|
130
|
+
|
|
131
|
+
const db = await createDatabase();
|
|
132
|
+
await db.execute("CREATE (:Person {name: 'Alice'})");
|
|
133
|
+
|
|
134
|
+
const bytes = await db.saveSnapshotToBytes();
|
|
135
|
+
const sameBytes = await db.saveSnapshot("binary");
|
|
136
|
+
const blob = await db.saveSnapshot({ format: "blob" });
|
|
137
|
+
await db.saveSnapshot({ format: "download", filename: "graph.lorasnap" });
|
|
138
|
+
|
|
139
|
+
await db.loadSnapshot(bytes);
|
|
140
|
+
await db.loadSnapshot(blob);
|
|
141
|
+
await db.loadSnapshot(new Response(bytes).body!);
|
|
142
|
+
await db.loadSnapshot(new URL("/graph.lorasnap", location.href));
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`loadSnapshotFromBytes(bytes)` remains available for the narrow
|
|
146
|
+
`Uint8Array`-only path.
|
|
147
|
+
|
|
83
148
|
## Typed value model
|
|
84
149
|
|
|
85
150
|
| TS type | Runtime shape |
|
|
@@ -140,8 +205,7 @@ public surface — consumers can swap backends without rewriting types.
|
|
|
140
205
|
millisecond-granular, so the nanosecond field on returned values is
|
|
141
206
|
zero below the millisecond boundary.
|
|
142
207
|
- Engine errors cross the worker boundary as `LoraError` with a
|
|
143
|
-
narrowed `code`; the engine does not currently
|
|
144
|
-
or offer cancellation.
|
|
208
|
+
narrowed `code`; the engine does not currently offer query cancellation.
|
|
145
209
|
|
|
146
210
|
## Feasibility assessment
|
|
147
211
|
|
|
@@ -11,6 +11,16 @@ export function init(): void;
|
|
|
11
11
|
export class WasmDatabase {
|
|
12
12
|
free(): void;
|
|
13
13
|
nodeCount(): number;
|
|
14
|
+
/**
|
|
15
|
+
* Open a true native row stream. Rows are pulled from the Rust executor
|
|
16
|
+
* one `next()` call at a time.
|
|
17
|
+
*/
|
|
18
|
+
openStream(query: string, params: any): WasmQueryStream;
|
|
19
|
+
/**
|
|
20
|
+
* Execute an array of `{ query, params? }` statements inside one native
|
|
21
|
+
* transaction. Returns an array of query results in statement order.
|
|
22
|
+
*/
|
|
23
|
+
transaction(statements: any, mode?: string | null): any;
|
|
14
24
|
relationshipCount(): number;
|
|
15
25
|
/**
|
|
16
26
|
* Serialize the graph into a byte buffer. The caller is responsible for
|
|
@@ -39,3 +49,10 @@ export class WasmDatabase {
|
|
|
39
49
|
*/
|
|
40
50
|
execute(query: string, params: any): any;
|
|
41
51
|
}
|
|
52
|
+
export class WasmQueryStream {
|
|
53
|
+
private constructor();
|
|
54
|
+
free(): void;
|
|
55
|
+
next(): any;
|
|
56
|
+
close(): void;
|
|
57
|
+
columns(): any;
|
|
58
|
+
}
|
|
@@ -226,6 +226,38 @@ export class WasmDatabase {
|
|
|
226
226
|
const ret = wasm.wasmdatabase_nodeCount(this.__wbg_ptr);
|
|
227
227
|
return ret >>> 0;
|
|
228
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Open a true native row stream. Rows are pulled from the Rust executor
|
|
231
|
+
* one `next()` call at a time.
|
|
232
|
+
* @param {string} query
|
|
233
|
+
* @param {any} params
|
|
234
|
+
* @returns {WasmQueryStream}
|
|
235
|
+
*/
|
|
236
|
+
openStream(query, params) {
|
|
237
|
+
const ptr0 = passStringToWasm0(query, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
238
|
+
const len0 = WASM_VECTOR_LEN;
|
|
239
|
+
const ret = wasm.wasmdatabase_openStream(this.__wbg_ptr, ptr0, len0, params);
|
|
240
|
+
if (ret[2]) {
|
|
241
|
+
throw takeFromExternrefTable0(ret[1]);
|
|
242
|
+
}
|
|
243
|
+
return WasmQueryStream.__wrap(ret[0]);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Execute an array of `{ query, params? }` statements inside one native
|
|
247
|
+
* transaction. Returns an array of query results in statement order.
|
|
248
|
+
* @param {any} statements
|
|
249
|
+
* @param {string | null} [mode]
|
|
250
|
+
* @returns {any}
|
|
251
|
+
*/
|
|
252
|
+
transaction(statements, mode) {
|
|
253
|
+
var ptr0 = isLikeNone(mode) ? 0 : passStringToWasm0(mode, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
254
|
+
var len0 = WASM_VECTOR_LEN;
|
|
255
|
+
const ret = wasm.wasmdatabase_transaction(this.__wbg_ptr, statements, ptr0, len0);
|
|
256
|
+
if (ret[2]) {
|
|
257
|
+
throw takeFromExternrefTable0(ret[1]);
|
|
258
|
+
}
|
|
259
|
+
return takeFromExternrefTable0(ret[0]);
|
|
260
|
+
}
|
|
229
261
|
/**
|
|
230
262
|
* @returns {number}
|
|
231
263
|
*/
|
|
@@ -298,6 +330,56 @@ export class WasmDatabase {
|
|
|
298
330
|
}
|
|
299
331
|
}
|
|
300
332
|
|
|
333
|
+
const WasmQueryStreamFinalization = (typeof FinalizationRegistry === 'undefined')
|
|
334
|
+
? { register: () => {}, unregister: () => {} }
|
|
335
|
+
: new FinalizationRegistry(ptr => wasm.__wbg_wasmquerystream_free(ptr >>> 0, 1));
|
|
336
|
+
|
|
337
|
+
export class WasmQueryStream {
|
|
338
|
+
|
|
339
|
+
static __wrap(ptr) {
|
|
340
|
+
ptr = ptr >>> 0;
|
|
341
|
+
const obj = Object.create(WasmQueryStream.prototype);
|
|
342
|
+
obj.__wbg_ptr = ptr;
|
|
343
|
+
WasmQueryStreamFinalization.register(obj, obj.__wbg_ptr, obj);
|
|
344
|
+
return obj;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
__destroy_into_raw() {
|
|
348
|
+
const ptr = this.__wbg_ptr;
|
|
349
|
+
this.__wbg_ptr = 0;
|
|
350
|
+
WasmQueryStreamFinalization.unregister(this);
|
|
351
|
+
return ptr;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
free() {
|
|
355
|
+
const ptr = this.__destroy_into_raw();
|
|
356
|
+
wasm.__wbg_wasmquerystream_free(ptr, 0);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* @returns {any}
|
|
360
|
+
*/
|
|
361
|
+
next() {
|
|
362
|
+
const ret = wasm.wasmquerystream_next(this.__wbg_ptr);
|
|
363
|
+
if (ret[2]) {
|
|
364
|
+
throw takeFromExternrefTable0(ret[1]);
|
|
365
|
+
}
|
|
366
|
+
return takeFromExternrefTable0(ret[0]);
|
|
367
|
+
}
|
|
368
|
+
close() {
|
|
369
|
+
wasm.wasmquerystream_close(this.__wbg_ptr);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* @returns {any}
|
|
373
|
+
*/
|
|
374
|
+
columns() {
|
|
375
|
+
const ret = wasm.wasmquerystream_columns(this.__wbg_ptr);
|
|
376
|
+
if (ret[2]) {
|
|
377
|
+
throw takeFromExternrefTable0(ret[1]);
|
|
378
|
+
}
|
|
379
|
+
return takeFromExternrefTable0(ret[0]);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
301
383
|
export function __wbg_String_8f0eb39a4a4c2f66(arg0, arg1) {
|
|
302
384
|
const ret = String(arg1);
|
|
303
385
|
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
Binary file
|
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
/* eslint-disable */
|
|
3
3
|
export const memory: WebAssembly.Memory;
|
|
4
4
|
export const __wbg_wasmdatabase_free: (a: number, b: number) => void;
|
|
5
|
+
export const __wbg_wasmquerystream_free: (a: number, b: number) => void;
|
|
5
6
|
export const wasmdatabase_clear: (a: number) => void;
|
|
6
7
|
export const wasmdatabase_execute: (a: number, b: number, c: number, d: any) => [number, number, number];
|
|
7
8
|
export const wasmdatabase_loadSnapshotFromBytes: (a: number, b: number, c: number) => [number, number, number];
|
|
8
9
|
export const wasmdatabase_new: () => number;
|
|
9
10
|
export const wasmdatabase_nodeCount: (a: number) => number;
|
|
11
|
+
export const wasmdatabase_openStream: (a: number, b: number, c: number, d: any) => [number, number, number];
|
|
10
12
|
export const wasmdatabase_relationshipCount: (a: number) => number;
|
|
11
13
|
export const wasmdatabase_saveSnapshotToBytes: (a: number) => [number, number, number, number];
|
|
14
|
+
export const wasmdatabase_transaction: (a: number, b: any, c: number, d: number) => [number, number, number];
|
|
15
|
+
export const wasmquerystream_close: (a: number) => void;
|
|
16
|
+
export const wasmquerystream_columns: (a: number) => [number, number, number];
|
|
17
|
+
export const wasmquerystream_next: (a: number) => [number, number, number];
|
|
12
18
|
export const init: () => void;
|
|
13
19
|
export const __wbindgen_malloc: (a: number, b: number) => number;
|
|
14
20
|
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|