@gonvex/local-runtime 0.5.2-staging.13 → 0.5.2-staging.15

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.
@@ -0,0 +1,21 @@
1
+ import type { DataRead, DataPredicate, JsonObject } from "@gonvex/module-sdk";
2
+ import type { LocalPatch } from "./index.js";
3
+ import { type ReducerReadView } from "./portable.js";
4
+ export type ReadCoverage = Readonly<Record<string, {
5
+ key: string;
6
+ complete: boolean;
7
+ completeWhere?: readonly DataPredicate[];
8
+ columns?: readonly string[];
9
+ }>>;
10
+ /** Conservative implication: one complete slice must cover the whole read. */
11
+ export declare function predicateImplies(read: DataPredicate | undefined, covered: DataPredicate): boolean;
12
+ export declare function readIsCovered(known: ReadCoverage[string] | undefined, read: DataRead): boolean;
13
+ /** A primary-key list bounds the result even when the surrounding collection is partial. */
14
+ export declare function primaryReadKeys(read: DataRead, key: string): string[] | undefined;
15
+ /** Preserve keys and predicates for overlays without fetching unrelated fields. */
16
+ export declare function executionReadColumns(read: DataRead, key: string): string[] | undefined;
17
+ export declare function projectDataRows(rows: JsonObject[], read: DataRead): JsonObject[];
18
+ /** A captured immutable RAM view. Only matching rows are copied. */
19
+ export declare function memoryReadView(tables: ReadonlyMap<string, ReadonlyMap<string, JsonObject>>, coverage: ReadCoverage): ReducerReadView;
20
+ /** Predictions overlay the confirmed replica. No second entity cache is created. */
21
+ export declare function overlayReadView(base: ReducerReadView, coverage: ReadCoverage, patches: readonly LocalPatch[]): ReducerReadView;
@@ -0,0 +1,230 @@
1
+ import { matchesDataPredicate, orderedDataRead } from "@gonvex/module-sdk";
2
+ import { orderDataRows } from "./portable.js";
3
+ /** Index ID-list membership for this read only, without retaining row data. */
4
+ function readPredicate(predicate) {
5
+ if ('and' in predicate) {
6
+ const parts = predicate.and.map(readPredicate);
7
+ return row => parts.every(part => part(row));
8
+ }
9
+ if ('or' in predicate) {
10
+ const parts = predicate.or.map(readPredicate);
11
+ return row => parts.some(part => part(row));
12
+ }
13
+ if (predicate.op === 'in' && !predicate.transform) {
14
+ const values = new Set(predicate.values);
15
+ return row => {
16
+ const value = row[predicate.column];
17
+ return value != null && value === value && values.has(value);
18
+ };
19
+ }
20
+ return row => matchesDataPredicate(row, predicate);
21
+ }
22
+ /** Conservative implication: one complete slice must cover the whole read. */
23
+ export function predicateImplies(read, covered) {
24
+ if (!read)
25
+ return false;
26
+ if ('and' in covered)
27
+ return covered.and.every(term => predicateImplies(read, term));
28
+ if ('or' in read)
29
+ return read.or.every(term => predicateImplies(term, covered));
30
+ if ('or' in covered)
31
+ return covered.or.some(term => predicateImplies(read, term));
32
+ if ('and' in read)
33
+ return read.and.some(term => predicateImplies(term, covered));
34
+ return read.column === covered.column && read.op === covered.op
35
+ && read.transform === covered.transform
36
+ && JSON.stringify(read) === JSON.stringify(covered);
37
+ }
38
+ export function readIsCovered(known, read) {
39
+ return known?.complete === true || known?.completeWhere?.some(where => predicateImplies(read.where, where)) === true;
40
+ }
41
+ /** A primary-key list bounds the result even when the surrounding collection is partial. */
42
+ export function primaryReadKeys(read, key) {
43
+ const where = read.where;
44
+ if (where && 'and' in where) {
45
+ for (const term of where.and) {
46
+ const keys = primaryReadKeys({ ...read, where: term }, key);
47
+ if (keys !== undefined)
48
+ return keys;
49
+ }
50
+ return undefined;
51
+ }
52
+ if (!where || !('column' in where) || where.column !== key || where.transform)
53
+ return undefined;
54
+ if (where.op === 'eq' && typeof where.value === 'string')
55
+ return [where.value];
56
+ if (where.op === 'in' && where.values.every(value => typeof value === 'string'))
57
+ return [...new Set(where.values)];
58
+ return undefined;
59
+ }
60
+ /** Preserve keys and predicates for overlays without fetching unrelated fields. */
61
+ export function executionReadColumns(read, key) {
62
+ if (!read.columns)
63
+ return undefined;
64
+ const columns = new Set([...read.columns, key]);
65
+ const collect = (where) => {
66
+ if ('and' in where)
67
+ where.and.forEach(collect);
68
+ else if ('or' in where)
69
+ where.or.forEach(collect);
70
+ else
71
+ columns.add(where.column);
72
+ };
73
+ if (read.where)
74
+ collect(read.where);
75
+ for (const order of read.orderBy ?? [])
76
+ columns.add(order.column);
77
+ return [...columns];
78
+ }
79
+ export function projectDataRows(rows, read) {
80
+ orderDataRows(rows, read);
81
+ const window = read.limit === undefined ? rows : rows.slice(0, read.limit);
82
+ return window.map((row) => structuredClone(read.columns
83
+ ? Object.fromEntries(read.columns.map((column) => [column, row[column] ?? null]))
84
+ : row));
85
+ }
86
+ /** A captured immutable RAM view. Only matching rows are copied. */
87
+ export function memoryReadView(tables, coverage) {
88
+ return {
89
+ async select(read, excludedRowIds = []) {
90
+ read = orderedDataRead({
91
+ ...read,
92
+ key: read.key ?? coverage[read.table]?.key,
93
+ });
94
+ const known = coverage[read.table];
95
+ const matches = read.where ? readPredicate(read.where) : undefined;
96
+ const excluded = new Set(excludedRowIds);
97
+ const table = tables.get(read.table);
98
+ const keys = primaryReadKeys(read, known?.key ?? '_id');
99
+ const candidates = keys === undefined ? (table?.values() ?? [])
100
+ : keys.flatMap(id => table?.has(id) ? [table.get(id)] : []);
101
+ const rows = [];
102
+ const required = new Set(read.columns ?? known?.columns ?? []);
103
+ const collect = (predicate) => {
104
+ if ("and" in predicate)
105
+ predicate.and.forEach(collect);
106
+ else if ("or" in predicate)
107
+ predicate.or.forEach(collect);
108
+ else
109
+ required.add(predicate.column);
110
+ };
111
+ if (read.where)
112
+ collect(read.where);
113
+ for (const order of read.orderBy ?? [])
114
+ required.add(order.column);
115
+ const requiredColumns = [...required];
116
+ let completeFields = true;
117
+ for (const row of candidates) {
118
+ if (excluded.has(String(row[known?.key ?? '_id'])))
119
+ continue;
120
+ if (requiredColumns.some((column) => !Object.hasOwn(row, column)))
121
+ completeFields = false;
122
+ if (!matches || matches(row)) {
123
+ rows.push(row);
124
+ if (!read.orderBy?.length &&
125
+ read.limit !== undefined &&
126
+ rows.length >= read.limit)
127
+ break;
128
+ }
129
+ }
130
+ return {
131
+ rows: projectDataRows(rows, read),
132
+ complete: read.limit === 0 ||
133
+ (completeFields &&
134
+ (readIsCovered(known, read) ||
135
+ (keys !== undefined && keys.every(id => excluded.has(id) || table?.has(id) === true)))),
136
+ };
137
+ },
138
+ };
139
+ }
140
+ /** Predictions overlay the confirmed replica. No second entity cache is created. */
141
+ export function overlayReadView(base, coverage, patches) {
142
+ const byTable = new Map();
143
+ for (const patch of patches) {
144
+ let table = byTable.get(patch.entity);
145
+ if (!table) {
146
+ table = new Map();
147
+ byTable.set(patch.entity, table);
148
+ }
149
+ const chain = table.get(patch.rowId);
150
+ if (chain)
151
+ chain.push(patch);
152
+ else
153
+ table.set(patch.rowId, [patch]);
154
+ }
155
+ return {
156
+ keepAliveFor: base.keepAliveFor,
157
+ async select(read, excludedRowIds = []) {
158
+ read = orderedDataRead({
159
+ ...read,
160
+ key: read.key ?? coverage[read.table]?.key,
161
+ });
162
+ const changes = byTable.get(read.table);
163
+ if (!changes?.size)
164
+ return base.select(read, excludedRowIds);
165
+ const key = coverage[read.table]?.key ?? "_id";
166
+ const keys = primaryReadKeys(read, key);
167
+ const exact = read.where && 'column' in read.where && read.where.column === key
168
+ && !read.where.transform && read.where.op === 'eq' && typeof read.where.value === 'string'
169
+ ? read.where.value : undefined;
170
+ const excluded = new Set(excludedRowIds);
171
+ const relevant = new Map();
172
+ // A primary-key predicate bounds the candidates even within an AND.
173
+ // Do not fetch or apply unrelated pending rows for a small bulk read.
174
+ for (const id of keys ?? changes.keys()) {
175
+ const chain = changes.get(id);
176
+ if (chain && !excluded.has(id))
177
+ relevant.set(id, chain);
178
+ }
179
+ if (!relevant.size)
180
+ return base.select(read, excludedRowIds);
181
+ // A full replacement or deletion makes the old row irrelevant, including
182
+ // fields absent from a narrow server projection. Exclude it before base
183
+ // coverage checks; missing fields on every other row remain an error.
184
+ const superseded = [...relevant].filter(([, chain]) => chain.some(patch => patch.op !== 'patch')).map(([id]) => id);
185
+ const result = await base.select({
186
+ ...read,
187
+ columns: executionReadColumns(read, key),
188
+ limit: read.limit === undefined ? undefined : read.limit + relevant.size,
189
+ }, [...excludedRowIds, ...superseded]);
190
+ const rows = new Map(result.rows.map((row) => [String(row[key]), row]));
191
+ const missing = [...relevant].filter(([id, chain]) => !rows.has(id) && chain[0]?.op === 'patch').map(([id]) => id);
192
+ const originals = new Map();
193
+ if (missing.length) {
194
+ const fetched = await base.select({ table: read.table, key, where: { column: key, op: 'in', values: missing } });
195
+ for (const row of fetched.rows)
196
+ originals.set(String(row[key]), row);
197
+ }
198
+ const resolved = new Set();
199
+ for (const [id, chain] of relevant) {
200
+ let row = rows.get(id);
201
+ if (!row && chain[0]?.op === "patch")
202
+ row = originals.get(id);
203
+ for (const patch of chain) {
204
+ if (patch.op === "delete") {
205
+ row = undefined;
206
+ resolved.add(id);
207
+ }
208
+ else if (patch.op === "patch") {
209
+ if (row) {
210
+ row = { ...row, ...patch.fields };
211
+ resolved.add(id);
212
+ }
213
+ }
214
+ else {
215
+ row = patch.fields;
216
+ resolved.add(id);
217
+ }
218
+ }
219
+ rows.delete(id);
220
+ if (row && (!read.where || matchesDataPredicate(row, read.where)))
221
+ rows.set(id, row);
222
+ }
223
+ return {
224
+ rows: projectDataRows([...rows.values()], read),
225
+ complete: result.complete || (exact !== undefined && resolved.has(exact)),
226
+ };
227
+ },
228
+ };
229
+ }
230
+ //# sourceMappingURL=read-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-view.js","sourceRoot":"","sources":["../src/read-view.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -8,8 +8,3 @@ export type LocalTableSchema = {
8
8
  columns: Record<string, LocalColumn>;
9
9
  };
10
10
  export type LocalSchema = Record<string, LocalTableSchema>;
11
- /** Compile schema using PostgreSQL itself, without connecting to a service. */
12
- export declare function compileLocalSchema(migrations: readonly {
13
- name: string;
14
- sql: string;
15
- }[]): Promise<LocalSchema>;
package/dist/schema.js CHANGED
@@ -1,55 +1,2 @@
1
- import { PGlite } from "@electric-sql/pglite";
2
- import { pg_trgm } from "@electric-sql/pglite/contrib/pg_trgm";
3
- // The framework's tenant identity table exists before application migrations.
4
- // Keep this in parity with TENANT_IDENTITY_SQL in postgres/src/provision.rs.
5
- const identitySchema = `CREATE TABLE members (
6
- id text PRIMARY KEY, account_id text NOT NULL UNIQUE, status text NOT NULL DEFAULT 'active',
7
- display_name text NOT NULL DEFAULT '', avatar_url text NOT NULL DEFAULT '',
8
- role text NOT NULL DEFAULT 'member', permissions jsonb NOT NULL DEFAULT '{}'::jsonb,
9
- membership_revision bigint NOT NULL DEFAULT 1,
10
- created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now()
11
- )`;
12
- /** Compile schema using PostgreSQL itself, without connecting to a service. */
13
- export async function compileLocalSchema(migrations) {
14
- const db = new PGlite({ extensions: { pg_trgm } });
15
- try {
16
- await db.exec(identitySchema);
17
- for (const migration of migrations) {
18
- // gen_random_uuid is built into modern PostgreSQL. PGlite does not ship
19
- // pgcrypto's OpenSSL extension; remaining references fail explicitly.
20
- const sql = migration.sql.replace(/CREATE\s+EXTENSION\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?pgcrypto["']?\s*;/gi, "");
21
- try {
22
- await db.exec(sql);
23
- }
24
- catch (error) {
25
- throw new Error(`Local schema compilation failed in ${migration.name}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
26
- }
27
- }
28
- const { rows } = await db.query(`SELECT c.relname AS table_name, a.attname AS column_name,
29
- format_type(a.atttypid, a.atttypmod) AS type, NOT a.attnotnull AS nullable,
30
- pg_get_expr(d.adbin, d.adrelid) AS column_default,
31
- EXISTS (SELECT 1 FROM pg_index i WHERE i.indrelid=c.oid AND i.indisprimary AND a.attnum=ANY(i.indkey)) AS primary_key
32
- FROM pg_class c JOIN pg_namespace n ON c.relnamespace=n.oid
33
- JOIN pg_attribute a ON a.attrelid=c.oid AND a.attnum>0 AND NOT a.attisdropped
34
- LEFT JOIN pg_attrdef d ON d.adrelid=c.oid AND d.adnum=a.attnum
35
- WHERE n.nspname='public' AND c.relkind='r'
36
- ORDER BY c.relname, a.attnum`);
37
- const schema = {};
38
- for (const row of rows) {
39
- if (row.table_name.startsWith("_gonvex"))
40
- continue;
41
- const table = schema[row.table_name] ??= { key: "_id", columns: {} };
42
- if (row.primary_key)
43
- table.key = row.column_name;
44
- table.columns[row.column_name] = {
45
- type: row.type, nullable: row.nullable,
46
- ...(row.column_default ? { default: row.column_default } : {}),
47
- };
48
- }
49
- return schema;
50
- }
51
- finally {
52
- await db.close();
53
- }
54
- }
1
+ export {};
55
2
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAM/D,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,cAAc,GAAG;;;;;;EAMrB,CAAC;AAEH,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAoD;IAC3F,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,wEAAwE;YACxE,sEAAsE;YACtE,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;YAChH,IAAI,CAAC;gBAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAC3B,OAAO,KAAK,EAAE,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,CAAC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,CAAC;QACzK,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,CAG5B;;;;;;;;mCAQ4B,CAAC,CAAC;QACjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAS;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACrE,IAAI,GAAG,CAAC,WAAW;gBAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC;YACjD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG;gBAC/B,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":""}
@@ -1,12 +1,16 @@
1
1
  import type { JsonValue } from "@gonvex/module-sdk";
2
2
  import type { LocalExecution, LocalIntent, LocalReplay, LocalSnapshot, LocalTransactionResult } from "./index.js";
3
+ import type { ReducerReadView } from './portable.js';
3
4
  export type LocalExecutor = {
4
5
  ready: Promise<void>;
6
+ prepare?(path: string): Promise<void>;
7
+ executeRead?(path: string, args: JsonValue, source: ReducerReadView, execution: LocalExecution): Promise<LocalTransactionResult>;
5
8
  execute(path: string, args: JsonValue, snapshot: LocalSnapshot, execution: LocalExecution): Promise<LocalTransactionResult>;
6
9
  replay(snapshot: LocalSnapshot, intents: readonly LocalIntent[]): Promise<LocalReplay>;
7
10
  close(): void;
8
11
  };
9
12
  export type LocalRuntimeBinding = {
13
+ mode?: 'portable';
10
14
  artifactHash: string;
11
15
  tables: readonly string[];
12
16
  create(): LocalExecutor;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../src/worker-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-client.js","sourceRoot":"","sources":["../src/worker-client.ts"],"names":[],"mappings":"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"}
package/dist/worker.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { LocalReducerRuntime } from "./index.js";
2
2
  /** Generated worker entrypoint calls this exactly once. */
3
3
  export function serveLocalReducerWorker(options) {
4
- const host = new LocalReducerRuntime(options);
4
+ const host = Promise.resolve(new LocalReducerRuntime(options));
5
5
  const endpoint = globalThis;
6
6
  const respond = async (id, run) => {
7
7
  try {
@@ -12,8 +12,8 @@ export function serveLocalReducerWorker(options) {
12
12
  }
13
13
  };
14
14
  void respond(0, async () => {
15
- await host.initializeReady();
16
- // WASM is loaded before closing ambient network access. Reducers enqueue
15
+ await (await host).initializeReady();
16
+ // Reducers enqueue
17
17
  // external work through ctx.actions; they cannot send it during prediction.
18
18
  const denied = () => { throw new Error("External I/O is unavailable in a local Reducer; enqueue an Action"); };
19
19
  Object.defineProperty(globalThis, "fetch", { value: denied, writable: false, configurable: false });
@@ -25,9 +25,9 @@ export function serveLocalReducerWorker(options) {
25
25
  return;
26
26
  void respond(data.id, async () => {
27
27
  if (data.method === "execute")
28
- return host.execute(data.args[0], data.args[1], data.args[2], data.args[3]);
28
+ return (await host).execute(data.args[0], data.args[1], data.args[2], data.args[3]);
29
29
  if (data.method === "replay")
30
- return host.replay(data.args[0], data.args[1]);
30
+ return (await host).replay(data.args[0], data.args[1]);
31
31
  throw new Error("Unknown local reducer operation");
32
32
  });
33
33
  });
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,YAAY,CAAC;AAE3E,2DAA2D;AAC3D,MAAM,UAAU,uBAAuB,CAAC,OAA4B;IAClE,MAAM,IAAI,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,UAGhB,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,EAAE,EAAU,EAAE,GAA2B,EAAE,EAAE;QAChE,IAAI,CAAC;YAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;QAC1D,OAAO,KAAK,EAAE,CAAC;YAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;IAClL,CAAC,CAAC;IACF,KAAK,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,yEAAyE;QACzE,4EAA4E;QAC5E,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACpG,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAChD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACjF,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3G,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,YAAY,CAAC;AAE3E,2DAA2D;AAC3D,MAAM,UAAU,uBAAuB,CAAC,OAA4B;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,UAGhB,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,EAAE,EAAU,EAAE,GAA2B,EAAE,EAAE;QAChE,IAAI,CAAC;YAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;QAC1D,OAAO,KAAK,EAAE,CAAC;YAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;IAClL,CAAC,CAAC;IACF,KAAK,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;QACrC,mBAAmB;QACnB,4EAA4E;QAC5E,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACpG,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QAChD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACjF,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnH,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@gonvex/local-runtime",
3
- "version": "0.5.2-staging.13",
3
+ "version": "0.5.2-staging.15",
4
4
  "type": "module",
5
5
  "exports": {
6
+ "./portable": {
7
+ "types": "./dist/portable.d.ts",
8
+ "default": "./dist/portable.js"
9
+ },
6
10
  ".": {
7
11
  "types": "./dist/index.d.ts",
8
12
  "default": "./dist/index.js"
@@ -22,6 +26,14 @@
22
26
  "./native-bridge": {
23
27
  "types": "./dist/native-bridge.d.ts",
24
28
  "default": "./dist/native-bridge.js"
29
+ },
30
+ "./read-view": {
31
+ "types": "./dist/read-view.d.ts",
32
+ "default": "./dist/read-view.js"
33
+ },
34
+ "./portable-client": {
35
+ "types": "./dist/portable-client.d.ts",
36
+ "default": "./dist/portable-client.js"
25
37
  }
26
38
  },
27
39
  "main": "./dist/index.js",
@@ -31,14 +43,14 @@
31
43
  "README.md"
32
44
  ],
33
45
  "dependencies": {
34
- "@electric-sql/pglite": "0.5.8",
35
46
  "@ungap/structured-clone": "1.4.0",
36
- "@gonvex/module-sdk": "0.5.2-staging.13"
47
+ "@gonvex/module-sdk": "0.5.2-staging.15"
37
48
  },
38
49
  "devDependencies": {
39
50
  "@types/ungap__structured-clone": "^1.2.0",
40
51
  "typescript": "^6.0.3",
41
- "vitest": "^4.1.6"
52
+ "vitest": "^4.1.6",
53
+ "@electric-sql/pglite": "0.5.8"
42
54
  },
43
55
  "publishConfig": {
44
56
  "access": "public"