@loradb/lora-wasm 0.4.0 → 0.5.1

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.
@@ -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;AAE9D,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,SAAS,IAAI,IAAI,CAAC;IAClB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3F;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACrE,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAOD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAsDvE"}
1
+ {"version":3,"file":"worker-client.d.ts","sourceRoot":"","sources":["../ts/worker-client.ts"],"names":[],"mappings":"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"}
@@ -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;AA2BvC;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE3C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;QAChC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACjC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,IAAI,CAAI,IAAqB;QACpC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAA+B,EAAE,MAAM,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAY,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,CACL,KAAa,EACb,MAAmB;YAEnB,OAAO,IAAI,CAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,SAAS;YACP,OAAO,IAAI,CAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,iBAAiB;YACf,OAAO,IAAI,CAAS,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,IAAI,CAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,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;AAEzE,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,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;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GACjD;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"}
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 });
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../ts/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../ts/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loradb/lora-wasm",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "WebAssembly bindings for the Lora in-memory graph database",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "LoraDB, Inc.",
@@ -37,19 +37,24 @@ npm run test:browser
37
37
  npm run pack:dry
38
38
  ```
39
39
 
40
- ## Two execution modes
40
+ ## Execution modes
41
41
 
42
- ### 1. In-process (Node / scripts)
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
- ### 2. Non-blocking Web Worker (browser)
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
- ### 3. In-process but typed like the worker (advanced)
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 stream query progress
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;
@@ -5,7 +5,7 @@
5
5
  "LoraDB, Inc."
6
6
  ],
7
7
  "description": "WebAssembly bindings for the Lora in-memory graph database",
8
- "version": "0.4.0",
8
+ "version": "0.5.1",
9
9
  "license": "BUSL-1.1",
10
10
  "files": [
11
11
  "lora_wasm_bg.wasm",