@rindle/wasm 0.4.2 → 0.4.4
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 +14 -38
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/pkg/rindle_bg.wasm +0 -0
- package/src/index.ts +15 -6
package/README.md
CHANGED
|
@@ -4,43 +4,32 @@ The WASM backend for [`@rindle/client`](../client): the Rust IVM engine (a port
|
|
|
4
4
|
dataflow engine) compiled to WebAssembly, running queries **in-process**. It re-exports
|
|
5
5
|
`@rindle/client`, so a local app can import everything from here.
|
|
6
6
|
|
|
7
|
-
## Quick start
|
|
8
|
-
|
|
9
7
|
```ts
|
|
10
8
|
import { table, string, number, boolean, createSchema, createWasmStore } from "@rindle/wasm";
|
|
11
9
|
|
|
12
10
|
const issue = table("issue")
|
|
13
11
|
.columns({ id: number(), title: string(), closed: boolean() })
|
|
14
12
|
.primaryKey("id");
|
|
15
|
-
const
|
|
16
|
-
.columns({ id: number(), issueID: number(), body: string() })
|
|
17
|
-
.primaryKey("id");
|
|
18
|
-
const schema = createSchema({ tables: [issue, comment] });
|
|
13
|
+
const schema = createSchema({ tables: [issue] });
|
|
19
14
|
|
|
20
15
|
const store = await createWasmStore(schema); // inits the wasm + wires the local backend
|
|
21
16
|
|
|
22
|
-
const view = store.query.issue
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
.materialize();
|
|
26
|
-
|
|
27
|
-
view.subscribe((data) => render(data)); // typed, nested, reference-stable tree
|
|
28
|
-
await store.write((tx) => tx.add("comment", { id: 1, issueID: 1, body: "hi" }));
|
|
29
|
-
|
|
30
|
-
// `.one()` materializes a single row (`data` is the row or `null`, not an array):
|
|
31
|
-
const top = store.query.issue.orderBy("priority", "desc").one().materialize();
|
|
32
|
-
top.subscribe((row) => render(row)); // row: Issue | null
|
|
33
|
-
|
|
34
|
-
// `.start(cursor, { exclusive })` pages from a cursor over the sort columns:
|
|
35
|
-
const page2 = store.query.issue.orderBy("id", "asc").start({ id: lastId }, { exclusive: true }).limit(20).materialize();
|
|
17
|
+
const view = store.query.issue.where.closed(false).materialize();
|
|
18
|
+
view.subscribe((data) => render(data)); // typed, reference-stable, always == a fresh query
|
|
19
|
+
await store.write((tx) => tx.add("issue", { id: 1, title: "hi", closed: false }));
|
|
36
20
|
```
|
|
37
21
|
|
|
38
|
-
|
|
22
|
+
`createWasmStore(schema)` calls `initWasm()` for you. If you build a `WasmBackend` directly,
|
|
23
|
+
`await initWasm()` first — and pass `initWasm(moduleOrPath)` to supply the wasm yourself (a
|
|
24
|
+
`WebAssembly.Module`, URL, or bytes).
|
|
25
|
+
|
|
26
|
+
## Docs
|
|
39
27
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
28
|
+
Full docs — the standalone browser engine, query surface, and the change model:
|
|
29
|
+
**[rindle.sh/docs/wasm-client](https://rindle.sh/docs/wasm-client)** · markdown mirror:
|
|
30
|
+
[`wasm-client.md`](https://rindle.sh/docs/wasm-client.md) · query shapes:
|
|
31
|
+
[supported-queries-ts](https://rindle.sh/docs/supported-queries-ts) · for agents:
|
|
32
|
+
[llms.txt](https://rindle.sh/llms.txt)
|
|
44
33
|
|
|
45
34
|
## Building & publishing
|
|
46
35
|
|
|
@@ -67,16 +56,3 @@ the TS source directly (via the `@rindle/source` export condition), so `pnpm tes
|
|
|
67
56
|
`pnpm test:browser` builds `dist/`, then loads the package in **headless Chrome** (taking the real
|
|
68
57
|
browser `fetch` + `WebAssembly.instantiateStreaming` init path) and runs a query. Needs system
|
|
69
58
|
Chrome/Chromium (`CHROME_BIN` to override); skipped with a message when none is installed.
|
|
70
|
-
|
|
71
|
-
## Initialization
|
|
72
|
-
|
|
73
|
-
`createWasmStore(schema)` calls `initWasm()` for you. If you build a `WasmBackend` directly,
|
|
74
|
-
`await initWasm()` first:
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
import { initWasm, WasmBackend, Store } from "@rindle/wasm";
|
|
78
|
-
await initWasm(); // browser: fetches the wasm; Node: reads it
|
|
79
|
-
const store = new Store(schema, new WasmBackend(schema));
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Pass `initWasm(moduleOrPath)` to supply the wasm yourself (a `WebAssembly.Module`, URL, or bytes).
|
package/dist/index.d.ts
CHANGED
|
@@ -61,8 +61,10 @@ export declare class WasmBackend<S extends ColsMap> implements Backend {
|
|
|
61
61
|
}): void;
|
|
62
62
|
/** Direct-commit a batch of LOCAL-only writes (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6): push them
|
|
63
63
|
* straight through the engine on the ordinary delivery path, OUTSIDE any optimistic cycle (a
|
|
64
|
-
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
65
|
-
|
|
64
|
+
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
65
|
+
* `onCommitted` fires between the engine commit and subscriber delivery ({@link writeWith}) —
|
|
66
|
+
* the post-commit anchor the persistence tap needs (207 §5.1). */
|
|
67
|
+
writeLocal(mutations: Mutation[], onCommitted?: () => void): void;
|
|
66
68
|
/** Remove a synthetic aggregate table registered by {@link registerTable}, once the last
|
|
67
69
|
* query reading it has been unregistered (`AGGREGATE-SYNC-DESIGN.md` §4): frees the engine
|
|
68
70
|
* source + its optimistic baseline so aggregate state is reclaimed, not permanent. Throws
|
|
@@ -91,8 +93,13 @@ export declare class WasmBackend<S extends ColsMap> implements Backend {
|
|
|
91
93
|
/** Run `f` against a raw staged write txn (with the §4.1 `get` read path), commit, and
|
|
92
94
|
* dispatch the resulting batches on the ordinary event stream. Inside an open server
|
|
93
95
|
* batch the engine buffers the events into the cycle instead (commit returns `[]`),
|
|
94
|
-
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
95
|
-
|
|
96
|
+
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
97
|
+
*
|
|
98
|
+
* `onCommitted` runs after `tx.commit()` returns but before `dispatch` delivers to
|
|
99
|
+
* subscribers: a throw from `f` (pre-commit — engine untouched) skips it; a subscriber
|
|
100
|
+
* throw re-raised by `dispatch` happens after it. It is the only point where "the commit
|
|
101
|
+
* is applied" is knowable to a caller that must not confuse the two failure modes. */
|
|
102
|
+
writeWith(f: (tx: WasmWriteTxn) => void, onCommitted?: () => void): void;
|
|
96
103
|
/** Open a §1.3 reconcile cycle against the coherent server delta: the engine rewinds
|
|
97
104
|
* (optimistic layer un-applied, delta folded in, `sync` re-forked) and starts
|
|
98
105
|
* buffering. Re-invoke the still-pending mutators via {@link writeWith}, then call
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,EAAa,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EACV,GAAG,EACH,OAAO,EACP,WAAW,EACX,OAAO,EACP,QAAQ,EACR,OAAO,EACP,MAAM,EACP,MAAM,gBAAgB,CAAC;AAExB,cAAc,gBAAgB,CAAC;AAa/B;;qFAEqF;AACrF,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;IACzD;;;;6DAIyD;IACzD,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,EAAE,CAAC;IAC3B,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,mFAAmF;AACnF,MAAM,MAAM,aAAa,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE,GAC9C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE,GACjD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAIpE;;sGAEsG;AACtG,wBAAgB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9D;AAMD,qBAAa,WAAW,CAAC,CAAC,SAAS,OAAO,CAAE,YAAW,OAAO;IAC5D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAqD;IAKpE,OAAO,CAAC,eAAe,CAA8C;IACrE;gGAC4F;IAC5F,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAM1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAChD,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAU7B;;;;qGAIiG;IACjG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAIpF
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -66,8 +66,10 @@ export class WasmBackend {
|
|
|
66
66
|
}
|
|
67
67
|
/** Direct-commit a batch of LOCAL-only writes (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6): push them
|
|
68
68
|
* straight through the engine on the ordinary delivery path, OUTSIDE any optimistic cycle (a
|
|
69
|
-
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
70
|
-
|
|
69
|
+
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
70
|
+
* `onCommitted` fires between the engine commit and subscriber delivery ({@link writeWith}) —
|
|
71
|
+
* the post-commit anchor the persistence tap needs (207 §5.1). */
|
|
72
|
+
writeLocal(mutations, onCommitted) {
|
|
71
73
|
for (const m of mutations) {
|
|
72
74
|
if (!this.localTables.has(m.table)) {
|
|
73
75
|
throw new Error(`writeLocal: table "${m.table}" is not local-only — a direct commit to a synced table is reverted on the next rewind (M2).`);
|
|
@@ -82,7 +84,7 @@ export class WasmBackend {
|
|
|
82
84
|
else
|
|
83
85
|
tx.edit(m.table, m.old, m.new);
|
|
84
86
|
}
|
|
85
|
-
});
|
|
87
|
+
}, onCommitted);
|
|
86
88
|
}
|
|
87
89
|
/** Remove a synthetic aggregate table registered by {@link registerTable}, once the last
|
|
88
90
|
* query reading it has been unregistered (`AGGREGATE-SYNC-DESIGN.md` §4): frees the engine
|
|
@@ -184,11 +186,18 @@ export class WasmBackend {
|
|
|
184
186
|
/** Run `f` against a raw staged write txn (with the §4.1 `get` read path), commit, and
|
|
185
187
|
* dispatch the resulting batches on the ordinary event stream. Inside an open server
|
|
186
188
|
* batch the engine buffers the events into the cycle instead (commit returns `[]`),
|
|
187
|
-
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
188
|
-
|
|
189
|
+
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
190
|
+
*
|
|
191
|
+
* `onCommitted` runs after `tx.commit()` returns but before `dispatch` delivers to
|
|
192
|
+
* subscribers: a throw from `f` (pre-commit — engine untouched) skips it; a subscriber
|
|
193
|
+
* throw re-raised by `dispatch` happens after it. It is the only point where "the commit
|
|
194
|
+
* is applied" is knowable to a caller that must not confuse the two failure modes. */
|
|
195
|
+
writeWith(f, onCommitted) {
|
|
189
196
|
const tx = this.db.write();
|
|
190
197
|
f(tx);
|
|
191
|
-
|
|
198
|
+
const batches = tx.commit();
|
|
199
|
+
onCommitted?.();
|
|
200
|
+
this.dispatch(batches);
|
|
192
201
|
}
|
|
193
202
|
/** Open a §1.3 reconcile cycle against the coherent server delta: the engine rewinds
|
|
194
203
|
* (optimistic layer un-applied, delta folded in, `sync` re-forked) and starts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,kGAAkG;AAClG,6CAA6C;AAC7C,EAAE;AACF,yFAAyF;AACzF,yFAAyF;AACzF,yFAAyF;AAEzF,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAWnE,cAAc,gBAAgB,CAAC;AAqC/B,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;sGAEsG;AACtG,MAAM,UAAU,QAAQ,CAAC,YAAsB;IAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;YACxB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAK,UAA6D,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAClG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChF,MAAM,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAMD,MAAM,OAAO,WAAW;IACL,EAAE,CAAS;IACpB,OAAO,GAA4C,GAAG,EAAE,GAAE,CAAC,CAAC;IACpE,8FAA8F;IAC9F,8FAA8F;IAC9F,gGAAgG;IAChG,qFAAqF;IAC7E,eAAe,GAAqC,GAAG,EAAE,GAAE,CAAC,CAAC;IACrE;gGAC4F;IAC3E,WAAW,CAAc;IAE1C,yFAAyF;IACzF,6FAA6F;IAC7F,8FAA8F;IAC9F,kBAAkB;IACD,aAAa,GAAe,EAAE,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,MAAiB;QAC3B,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,EAAuB,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,2FAA2F;YAC3F,8BAA8B;YAC9B,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;;;qGAIiG;IACjG,aAAa,CAAC,IAAY,EAAE,IAAiD;QAC3E,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rindle/wasm",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"README.md"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@rindle/client": "0.4.
|
|
32
|
+
"@rindle/client": "0.4.4"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^22.10.0",
|
package/pkg/rindle_bg.wasm
CHANGED
|
Binary file
|
package/src/index.ts
CHANGED
|
@@ -121,8 +121,10 @@ export class WasmBackend<S extends ColsMap> implements Backend {
|
|
|
121
121
|
|
|
122
122
|
/** Direct-commit a batch of LOCAL-only writes (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6): push them
|
|
123
123
|
* straight through the engine on the ordinary delivery path, OUTSIDE any optimistic cycle (a
|
|
124
|
-
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
125
|
-
|
|
124
|
+
* local table is untracked, so it never rebases). Rejects a synced/tracked table (M2).
|
|
125
|
+
* `onCommitted` fires between the engine commit and subscriber delivery ({@link writeWith}) —
|
|
126
|
+
* the post-commit anchor the persistence tap needs (207 §5.1). */
|
|
127
|
+
writeLocal(mutations: Mutation[], onCommitted?: () => void): void {
|
|
126
128
|
for (const m of mutations) {
|
|
127
129
|
if (!this.localTables.has(m.table)) {
|
|
128
130
|
throw new Error(`writeLocal: table "${m.table}" is not local-only — a direct commit to a synced table is reverted on the next rewind (M2).`);
|
|
@@ -134,7 +136,7 @@ export class WasmBackend<S extends ColsMap> implements Backend {
|
|
|
134
136
|
else if (m.op === "remove") tx.remove(m.table, m.row);
|
|
135
137
|
else tx.edit(m.table, m.old, m.new);
|
|
136
138
|
}
|
|
137
|
-
});
|
|
139
|
+
}, onCommitted);
|
|
138
140
|
}
|
|
139
141
|
|
|
140
142
|
/** Remove a synthetic aggregate table registered by {@link registerTable}, once the last
|
|
@@ -235,11 +237,18 @@ export class WasmBackend<S extends ColsMap> implements Backend {
|
|
|
235
237
|
/** Run `f` against a raw staged write txn (with the §4.1 `get` read path), commit, and
|
|
236
238
|
* dispatch the resulting batches on the ordinary event stream. Inside an open server
|
|
237
239
|
* batch the engine buffers the events into the cycle instead (commit returns `[]`),
|
|
238
|
-
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
239
|
-
|
|
240
|
+
* so re-invocations dispatch nothing here — delivery is `serverBatchEnd`'s.
|
|
241
|
+
*
|
|
242
|
+
* `onCommitted` runs after `tx.commit()` returns but before `dispatch` delivers to
|
|
243
|
+
* subscribers: a throw from `f` (pre-commit — engine untouched) skips it; a subscriber
|
|
244
|
+
* throw re-raised by `dispatch` happens after it. It is the only point where "the commit
|
|
245
|
+
* is applied" is knowable to a caller that must not confuse the two failure modes. */
|
|
246
|
+
writeWith(f: (tx: WasmWriteTxn) => void, onCommitted?: () => void): void {
|
|
240
247
|
const tx = this.db.write();
|
|
241
248
|
f(tx);
|
|
242
|
-
|
|
249
|
+
const batches = tx.commit() as BatchSet;
|
|
250
|
+
onCommitted?.();
|
|
251
|
+
this.dispatch(batches);
|
|
243
252
|
}
|
|
244
253
|
|
|
245
254
|
/** Open a §1.3 reconcile cycle against the coherent server delta: the engine rewinds
|