@korajs/store 1.0.0-beta.5 → 1.0.0-beta.6

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.
Files changed (50) hide show
  1. package/dist/adapters/better-sqlite3.d.cts +1 -1
  2. package/dist/adapters/better-sqlite3.d.ts +1 -1
  3. package/dist/adapters/indexeddb.cjs +309 -128
  4. package/dist/adapters/indexeddb.cjs.map +1 -1
  5. package/dist/adapters/indexeddb.d.cts +4 -2
  6. package/dist/adapters/indexeddb.d.ts +4 -2
  7. package/dist/adapters/indexeddb.js +7 -2
  8. package/dist/adapters/indexeddb.js.map +1 -1
  9. package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -1
  10. package/dist/adapters/sqlite-wasm-worker.js +250 -3
  11. package/dist/adapters/sqlite-wasm-worker.js.map +1 -1
  12. package/dist/adapters/sqlite-wasm.cjs +304 -128
  13. package/dist/adapters/sqlite-wasm.cjs.map +1 -1
  14. package/dist/adapters/sqlite-wasm.d.cts +18 -7
  15. package/dist/adapters/sqlite-wasm.d.ts +18 -7
  16. package/dist/adapters/sqlite-wasm.js +2 -2
  17. package/dist/{chunk-Q57CHIIN.js → chunk-FKW56RVZ.js} +306 -129
  18. package/dist/chunk-FKW56RVZ.js.map +1 -0
  19. package/dist/{chunk-COJSQBXW.js → chunk-VDBJQ75K.js} +1 -1
  20. package/dist/chunk-VDBJQ75K.js.map +1 -0
  21. package/dist/{chunk-RL43UYQZ.js → chunk-YT7MRFCP.js} +5 -5
  22. package/dist/index.cjs +16 -0
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +12 -4
  25. package/dist/index.d.ts +12 -4
  26. package/dist/index.js +34 -18
  27. package/dist/index.js.map +1 -1
  28. package/dist/internal.d.cts +3 -3
  29. package/dist/internal.d.ts +3 -3
  30. package/dist/internal.js +2 -2
  31. package/dist/{sqlite-wasm-channel-NGSBJR44.js → sqlite-wasm-channel-GGHA2BXU.js} +2 -2
  32. package/dist/{sqlite-wasm-channel-Bx57s8Cq.d.cts → sqlite-wasm-channel-L6o3bWQK.d.cts} +2 -2
  33. package/dist/{sqlite-wasm-channel-Bx57s8Cq.d.ts → sqlite-wasm-channel-L6o3bWQK.d.ts} +2 -2
  34. package/dist/{types-C1kigrWz.d.ts → types-BOO9EPt1.d.ts} +1 -1
  35. package/dist/{types-D1MzKVmk.d.ts → types-BslDOTk0.d.cts} +16 -1
  36. package/dist/{types-D1MzKVmk.d.cts → types-BslDOTk0.d.ts} +16 -1
  37. package/dist/{types-DAo9oduO.d.cts → types-C_GDavG-.d.cts} +1 -1
  38. package/package.json +1 -11
  39. package/dist/adapters/sqlite-wasm-shared-host.cjs +0 -345
  40. package/dist/adapters/sqlite-wasm-shared-host.cjs.map +0 -1
  41. package/dist/adapters/sqlite-wasm-shared-host.d.cts +0 -82
  42. package/dist/adapters/sqlite-wasm-shared-host.d.ts +0 -82
  43. package/dist/adapters/sqlite-wasm-shared-host.js +0 -61
  44. package/dist/adapters/sqlite-wasm-shared-host.js.map +0 -1
  45. package/dist/chunk-3Y2IERBF.js +0 -255
  46. package/dist/chunk-3Y2IERBF.js.map +0 -1
  47. package/dist/chunk-COJSQBXW.js.map +0 -1
  48. package/dist/chunk-Q57CHIIN.js.map +0 -1
  49. /package/dist/{chunk-RL43UYQZ.js.map → chunk-YT7MRFCP.js.map} +0 -0
  50. /package/dist/{sqlite-wasm-channel-NGSBJR44.js.map → sqlite-wasm-channel-GGHA2BXU.js.map} +0 -0
@@ -75,4 +75,4 @@ var WebWorkerBridge = class {
75
75
  export {
76
76
  WebWorkerBridge
77
77
  };
78
- //# sourceMappingURL=chunk-COJSQBXW.js.map
78
+ //# sourceMappingURL=chunk-VDBJQ75K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/sqlite-wasm-channel.ts"],"sourcesContent":["/// <reference lib=\"dom\" />\nimport { WorkerTimeoutError } from '../errors'\n\n// === Message Protocol ===\n\n/**\n * Request message sent from the main thread to the SQLite WASM worker.\n * Each request carries a unique `id` for response correlation.\n */\nexport type WorkerRequest =\n\t| { id: number; type: 'open'; ddlStatements: string[]; dbName?: string }\n\t| { id: number; type: 'close' }\n\t| { id: number; type: 'execute'; sql: string; params?: unknown[] }\n\t| { id: number; type: 'query'; sql: string; params?: unknown[] }\n\t| { id: number; type: 'begin' }\n\t| { id: number; type: 'commit' }\n\t| { id: number; type: 'rollback' }\n\t| { id: number; type: 'migrate'; from: number; to: number; statements: string[] }\n\t| { id: number; type: 'export' }\n\t| { id: number; type: 'import'; data: Uint8Array }\n\n/**\n * Response message sent from the worker back to the main thread.\n * Matches the request `id` for correlation.\n */\nexport type WorkerResponse =\n\t| { id: number; type: 'success'; data?: unknown }\n\t| { id: number; type: 'error'; message: string; code: string; context?: Record<string, unknown> }\n\n// === WorkerBridge Interface ===\n\n/**\n * Abstraction over the communication channel with the SQLite WASM worker.\n * In browsers, this is backed by a real Web Worker via MessagePort.\n * In Node.js tests, this is backed by better-sqlite3 via MockWorkerBridge.\n */\nexport interface WorkerBridge {\n\t/** Send a request to the worker and wait for a response. */\n\tsend(request: WorkerRequest, clientId?: string): Promise<WorkerResponse>\n\n\t/** Terminate the worker. Safe to call multiple times. */\n\tterminate(): void\n}\n\n// === Mutex ===\n\n// The Mutex now lives in its own module so non-browser adapters (better-sqlite3)\n// can serialize transactions without importing browser-worker code.\nexport { Mutex } from './mutex'\n\n// === WebWorkerBridge ===\n\n/**\n * WorkerBridge implementation for browser environments.\n * Communicates with an actual Web Worker running SQLite WASM.\n */\nexport class WebWorkerBridge implements WorkerBridge {\n\tprivate worker: Worker\n\tprivate pending = new Map<\n\t\tnumber,\n\t\t{ resolve: (r: WorkerResponse) => void; reject: (e: Error) => void }\n\t>()\n\tprivate nextId = 1\n\tprivate terminated = false\n\tprivate timeoutMs: number\n\n\t/**\n\t * @param workerUrl - URL to the sqlite-wasm-worker script\n\t * @param timeoutMs - Timeout for worker responses in milliseconds (default: 30000)\n\t */\n\tconstructor(workerUrl: string | URL, timeoutMs = 30000) {\n\t\tthis.timeoutMs = timeoutMs\n\t\tthis.worker = new Worker(workerUrl, { type: 'module' })\n\t\tthis.worker.onmessage = (event: MessageEvent<WorkerResponse>) => {\n\t\t\tconst response = event.data\n\t\t\tconst entry = this.pending.get(response.id)\n\t\t\tif (entry) {\n\t\t\t\tthis.pending.delete(response.id)\n\t\t\t\tentry.resolve(response)\n\t\t\t}\n\t\t}\n\t\tthis.worker.onerror = (event) => {\n\t\t\t// Reject all pending requests on worker error\n\t\t\tconst error = new Error(`Worker error: ${event.message}`)\n\t\t\tfor (const [id, entry] of this.pending) {\n\t\t\t\tthis.pending.delete(id)\n\t\t\t\tentry.reject(error)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync send(request: WorkerRequest): Promise<WorkerResponse> {\n\t\tif (this.terminated) {\n\t\t\treturn {\n\t\t\t\tid: request.id,\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: 'Worker has been terminated',\n\t\t\t\tcode: 'WORKER_TERMINATED',\n\t\t\t}\n\t\t}\n\n\t\tconst id = this.nextId++\n\t\tconst req = { ...request, id }\n\n\t\treturn new Promise<WorkerResponse>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id)\n\t\t\t\treject(new WorkerTimeoutError(req.type, this.timeoutMs))\n\t\t\t}, this.timeoutMs)\n\n\t\t\tthis.pending.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timer)\n\t\t\t\t\tresolve(response)\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timer)\n\t\t\t\t\treject(error)\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tthis.worker.postMessage(req)\n\t\t})\n\t}\n\n\tterminate(): void {\n\t\tif (this.terminated) return\n\t\tthis.terminated = true\n\t\tthis.worker.terminate()\n\t\t// Reject any pending requests\n\t\tfor (const [id, entry] of this.pending) {\n\t\t\tthis.pending.delete(id)\n\t\t\tentry.reject(new Error('Worker terminated'))\n\t\t}\n\t}\n}\n"],"mappings":";;;;;AAwDO,IAAM,kBAAN,MAA8C;AAAA,EAC5C;AAAA,EACA,UAAU,oBAAI,IAGpB;AAAA,EACM,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,WAAyB,YAAY,KAAO;AACvD,SAAK,YAAY;AACjB,SAAK,SAAS,IAAI,OAAO,WAAW,EAAE,MAAM,SAAS,CAAC;AACtD,SAAK,OAAO,YAAY,CAAC,UAAwC;AAChE,YAAM,WAAW,MAAM;AACvB,YAAM,QAAQ,KAAK,QAAQ,IAAI,SAAS,EAAE;AAC1C,UAAI,OAAO;AACV,aAAK,QAAQ,OAAO,SAAS,EAAE;AAC/B,cAAM,QAAQ,QAAQ;AAAA,MACvB;AAAA,IACD;AACA,SAAK,OAAO,UAAU,CAAC,UAAU;AAEhC,YAAM,QAAQ,IAAI,MAAM,iBAAiB,MAAM,OAAO,EAAE;AACxD,iBAAW,CAAC,IAAI,KAAK,KAAK,KAAK,SAAS;AACvC,aAAK,QAAQ,OAAO,EAAE;AACtB,cAAM,OAAO,KAAK;AAAA,MACnB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,KAAK,SAAiD;AAC3D,QAAI,KAAK,YAAY;AACpB,aAAO;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACP;AAAA,IACD;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,MAAM,EAAE,GAAG,SAAS,GAAG;AAE7B,WAAO,IAAI,QAAwB,CAAC,SAAS,WAAW;AACvD,YAAM,QAAQ,WAAW,MAAM;AAC9B,aAAK,QAAQ,OAAO,EAAE;AACtB,eAAO,IAAI,mBAAmB,IAAI,MAAM,KAAK,SAAS,CAAC;AAAA,MACxD,GAAG,KAAK,SAAS;AAEjB,WAAK,QAAQ,IAAI,IAAI;AAAA,QACpB,SAAS,CAAC,aAAa;AACtB,uBAAa,KAAK;AAClB,kBAAQ,QAAQ;AAAA,QACjB;AAAA,QACA,QAAQ,CAAC,UAAU;AAClB,uBAAa,KAAK;AAClB,iBAAO,KAAK;AAAA,QACb;AAAA,MACD,CAAC;AAED,WAAK,OAAO,YAAY,GAAG;AAAA,IAC5B,CAAC;AAAA,EACF;AAAA,EAEA,YAAkB;AACjB,QAAI,KAAK,WAAY;AACrB,SAAK,aAAa;AAClB,SAAK,OAAO,UAAU;AAEtB,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,SAAS;AACvC,WAAK,QAAQ,OAAO,EAAE;AACtB,YAAM,OAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,IAC5C;AAAA,EACD;AACD;","names":[]}
@@ -1,13 +1,13 @@
1
+ import {
2
+ QueryError,
3
+ RecordNotFoundError
4
+ } from "./chunk-TUR7RGEP.js";
1
5
  import {
2
6
  deserializeRecord,
3
7
  encodeRichtextFieldsForOpData,
4
8
  serializeOperation,
5
9
  serializeRecord
6
10
  } from "./chunk-GSJ7EEUC.js";
7
- import {
8
- QueryError,
9
- RecordNotFoundError
10
- } from "./chunk-TUR7RGEP.js";
11
11
 
12
12
  // src/lww/row-version.ts
13
13
  import { HybridLogicalClock } from "@korajs/core";
@@ -684,4 +684,4 @@ export {
684
684
  validateUpdateStateMachine,
685
685
  executeUpdate
686
686
  };
687
- //# sourceMappingURL=chunk-RL43UYQZ.js.map
687
+ //# sourceMappingURL=chunk-YT7MRFCP.js.map
package/dist/index.cjs CHANGED
@@ -4291,6 +4291,22 @@ var Store = class {
4291
4291
  col.setMutationHandler(handler);
4292
4292
  }
4293
4293
  }
4294
+ /**
4295
+ * Notify this store that another same-origin runtime committed an operation to
4296
+ * the shared local database. The operation has already been persisted and
4297
+ * materialized by the database owner; this method only advances in-memory causal
4298
+ * watermarks and invalidates local reactive queries so already-open tabs stay
4299
+ * live without reapplying or rewriting the operation.
4300
+ */
4301
+ notifyExternalOperation(operation) {
4302
+ this.ensureOpen();
4303
+ const definition = this.schema.collections[operation.collection];
4304
+ if (!definition) {
4305
+ return;
4306
+ }
4307
+ this.recordOperationSequence(operation);
4308
+ this.subscriptionManager.notify(operation.collection, operation);
4309
+ }
4294
4310
  /**
4295
4311
  * Build mutation context for a collection (used by ApplyPipeline side effects).
4296
4312
  */