@moyodb/sdk 1.1.0 → 1.3.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.
Files changed (56) hide show
  1. package/README.md +142 -0
  2. package/dist/assets/browser-worker-DBt51gsS.js +4 -0
  3. package/dist/assets/browser-worker-DBt51gsS.js.map +1 -0
  4. package/dist/assets/shared-worker-NdniRuEL.js +2 -0
  5. package/dist/assets/shared-worker-NdniRuEL.js.map +1 -0
  6. package/dist/chunks/{indexing-BzmFhWXs.js → indexing-CKtbpaZn.js} +93 -12
  7. package/dist/chunks/indexing-CKtbpaZn.js.map +1 -0
  8. package/dist/compression.d.ts +16 -2
  9. package/dist/compression.d.ts.map +1 -1
  10. package/dist/engine/README.md +30 -3
  11. package/dist/engine/moyodb_engine.d.ts +34 -10
  12. package/dist/engine/moyodb_engine.js +238 -51
  13. package/dist/engine/moyodb_engine_bg.wasm +0 -0
  14. package/dist/engine/moyodb_engine_bg.wasm.d.ts +17 -10
  15. package/dist/engine/package.json +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/internal.d.ts +6 -0
  18. package/dist/internal.d.ts.map +1 -1
  19. package/dist/moyodb-sdk.js +1122 -883
  20. package/dist/moyodb-sdk.js.map +1 -1
  21. package/dist/node-engine.js +703 -78
  22. package/dist/node-engine.js.map +1 -1
  23. package/dist/node-storage.d.mts +4 -0
  24. package/dist/node-storage.mjs +38 -3
  25. package/dist/node-worker-client.d.ts +1 -0
  26. package/dist/node-worker-client.d.ts.map +1 -1
  27. package/dist/node-worker.mjs +2 -1
  28. package/dist/node.d.ts.map +1 -1
  29. package/dist/node.js +280 -37
  30. package/dist/node.js.map +1 -1
  31. package/dist/registry.d.ts.map +1 -1
  32. package/dist/shared-worker-client.d.ts +4 -0
  33. package/dist/shared-worker-client.d.ts.map +1 -1
  34. package/dist/shared-worker.d.ts.map +1 -1
  35. package/dist/snappy.d.ts +3 -0
  36. package/dist/snappy.d.ts.map +1 -0
  37. package/dist/sql-parser.d.ts.map +1 -1
  38. package/dist/types.d.ts +33 -3
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/worker-api.d.ts +17 -1
  41. package/dist/worker-api.d.ts.map +1 -1
  42. package/dist/worker-client.d.ts +7 -2
  43. package/dist/worker-client.d.ts.map +1 -1
  44. package/dist/worker-protocol.d.ts +11 -1
  45. package/dist/worker-protocol.d.ts.map +1 -1
  46. package/dist/worker-server.d.ts.map +1 -1
  47. package/dist/worker.d.ts +31 -2
  48. package/dist/worker.d.ts.map +1 -1
  49. package/package.json +4 -4
  50. package/dist/assets/browser-worker-DP6Mjz7c.js +0 -4
  51. package/dist/assets/browser-worker-DP6Mjz7c.js.map +0 -1
  52. package/dist/assets/shared-worker-DKzhauVf.js +0 -2
  53. package/dist/assets/shared-worker-DKzhauVf.js.map +0 -1
  54. package/dist/chunks/indexing-BzmFhWXs.js.map +0 -1
  55. package/dist/engine/snippets/moyodb-engine-cff0a0e2441a7a8f/js/opfs_shim.js +0 -513
  56. /package/dist/engine/snippets/{moyodb-engine-8ebe6af0cc2e81b7 → moyodb-engine-54a406e33b0fb849}/js/opfs_shim.js +0 -0
@@ -1,6 +1,9 @@
1
+ export const MISSING_DATABASE_MESSAGE: string;
2
+
1
3
  export interface NodeStorageOptions {
2
4
  lockToken?: string;
3
5
  encodedDbName?: string;
6
+ createIfMissing?: boolean;
4
7
  }
5
8
 
6
9
  export interface NodeStorageHandle {
@@ -8,5 +11,6 @@ export interface NodeStorageHandle {
8
11
  close(): void;
9
12
  }
10
13
 
14
+ export function ensureStorageRoot(directory: string, createIfMissing?: boolean): string;
11
15
  export function installNodeStorage(directory: string, options?: NodeStorageOptions): Promise<NodeStorageHandle>;
12
16
  export function releaseNodeStorageLease(directory: string, lockToken: string): boolean;
@@ -6,6 +6,10 @@ import { isMainThread } from 'node:worker_threads';
6
6
  const LOCK_DIRECTORY = '.moyodb.lock';
7
7
  const PENDING_PREFIX = '.moyodb.pending-';
8
8
  const TOKEN_PATTERN = /^[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}$/i;
9
+ // NativeFileBackend rejects a larger record without deleting it.
10
+ const MAX_LEASE_RECORD_BYTES = 1024;
11
+ const MAX_LEASE_PID = 0xffffffff;
12
+ export const MISSING_DATABASE_MESSAGE = 'database missing and create_if_missing=false';
9
13
  let installedStorage = null;
10
14
 
11
15
  function namedError(name, message, cause) {
@@ -84,9 +88,12 @@ function readLease(directory, token) {
84
88
  const lockDirectory = join(directory, LOCK_DIRECTORY);
85
89
  entryStat(lockDirectory, 'directory');
86
90
  const recordPath = join(lockDirectory, `${validateToken(token)}.json`);
87
- entryStat(recordPath, 'file');
91
+ const stat = entryStat(recordPath, 'file');
92
+ if (stat.size > MAX_LEASE_RECORD_BYTES) {
93
+ throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');
94
+ }
88
95
  const owner = JSON.parse(fs.readFileSync(recordPath, 'utf8'));
89
- if (owner.token !== token || !Number.isSafeInteger(owner.pid) || owner.pid <= 0) {
96
+ if (owner.token !== token || !Number.isSafeInteger(owner.pid) || owner.pid <= 0 || owner.pid > MAX_LEASE_PID) {
90
97
  throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');
91
98
  }
92
99
  return { lockDirectory, recordPath, owner };
@@ -556,7 +563,26 @@ function mountedRoot(storage, encodedDbName) {
556
563
  return new MountedDirectoryHandle(storage, '', 'stackdb', () => stackdb);
557
564
  }
558
565
 
559
- export async function installNodeStorage(directory, { lockToken = randomUUID(), encodedDbName } = {}) {
566
+ export function ensureStorageRoot(directory, createIfMissing = true) {
567
+ const path = validateDirectory(directory);
568
+ if (!createIfMissing) {
569
+ try {
570
+ entryStat(path, 'directory');
571
+ } catch (error) {
572
+ if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);
573
+ if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;
574
+ throw storageError(error);
575
+ }
576
+ return path;
577
+ }
578
+ fs.mkdirSync(path, { recursive: true });
579
+ return path;
580
+ }
581
+
582
+ export async function installNodeStorage(
583
+ directory,
584
+ { lockToken = randomUUID(), encodedDbName, createIfMissing = true } = {}
585
+ ) {
560
586
  if (isMainThread) throw new Error('Node storage must be installed in a dedicated worker');
561
587
  if (installedStorage) throw new Error('Node storage is already installed in this worker');
562
588
  const path = validateDirectory(directory);
@@ -567,6 +593,15 @@ export async function installNodeStorage(directory, { lockToken = randomUUID(),
567
593
  ) {
568
594
  throw new TypeError('encodedDbName must be the lowercase hexadecimal UTF-8 database name');
569
595
  }
596
+ if (createIfMissing === false) {
597
+ try {
598
+ entryStat(path, 'directory');
599
+ } catch (error) {
600
+ if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);
601
+ if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;
602
+ throw storageError(error);
603
+ }
604
+ }
570
605
  let canonical;
571
606
  try {
572
607
  fs.mkdirSync(path, { recursive: true, mode: 0o700 });
@@ -6,6 +6,7 @@ export interface NodeWorkerData {
6
6
  lockToken: string;
7
7
  ownerWaitMs: number;
8
8
  encodedDbName: string;
9
+ createIfMissing: boolean;
9
10
  }
10
11
  export declare class NodeWorkerTransport {
11
12
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"node-worker-client.d.ts","sourceRoot":"","sources":["../src/node-worker-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,mBAAmB;;IAC5B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IASrC,YAAY,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,IAAI,EAgCzD;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,YAAY,EAAO,GAAG,IAAI,CAEjE;IAED,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,GAAG,IAAI,CAOjF;IAED,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,GAAG,IAAI,CAEpF;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAM3B;CAQJ"}
1
+ {"version":3,"file":"node-worker-client.d.ts","sourceRoot":"","sources":["../src/node-worker-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,mBAAmB;;IAC5B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IASrC,YAAY,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,IAAI,EAgCzD;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,YAAY,EAAO,GAAG,IAAI,CAEjE;IAED,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,GAAG,IAAI,CAOjF;IAED,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,GAAG,IAAI,CAEpF;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAM3B;CAQJ"}
@@ -54,7 +54,8 @@ async function acquireStorage() {
54
54
  try {
55
55
  return await installNodeStorage(workerData.directory, {
56
56
  lockToken: workerData.lockToken,
57
- encodedDbName: workerData.encodedDbName
57
+ encodedDbName: workerData.encodedDbName,
58
+ createIfMissing: workerData.createIfMissing !== false
58
59
  });
59
60
  } catch (error) {
60
61
  const remaining = deadline - performance.now();
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACtF,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;CACrB;AAmLD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,CAOpF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1F;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAY3G;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACtF,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;CACrB;AA2LD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC,CAOpF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1F;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAY3G;AAED,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,mBAAmB,aAAa,CAAC;AACjC,mBAAmB,SAAS,CAAC"}