@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.
- package/README.md +142 -0
- package/dist/assets/browser-worker-DBt51gsS.js +4 -0
- package/dist/assets/browser-worker-DBt51gsS.js.map +1 -0
- package/dist/assets/shared-worker-NdniRuEL.js +2 -0
- package/dist/assets/shared-worker-NdniRuEL.js.map +1 -0
- package/dist/chunks/{indexing-BzmFhWXs.js → indexing-CKtbpaZn.js} +93 -12
- package/dist/chunks/indexing-CKtbpaZn.js.map +1 -0
- package/dist/compression.d.ts +16 -2
- package/dist/compression.d.ts.map +1 -1
- package/dist/engine/README.md +30 -3
- package/dist/engine/moyodb_engine.d.ts +34 -10
- package/dist/engine/moyodb_engine.js +238 -51
- package/dist/engine/moyodb_engine_bg.wasm +0 -0
- package/dist/engine/moyodb_engine_bg.wasm.d.ts +17 -10
- package/dist/engine/package.json +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/moyodb-sdk.js +1122 -883
- package/dist/moyodb-sdk.js.map +1 -1
- package/dist/node-engine.js +703 -78
- package/dist/node-engine.js.map +1 -1
- package/dist/node-storage.d.mts +4 -0
- package/dist/node-storage.mjs +38 -3
- package/dist/node-worker-client.d.ts +1 -0
- package/dist/node-worker-client.d.ts.map +1 -1
- package/dist/node-worker.mjs +2 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +280 -37
- package/dist/node.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/shared-worker-client.d.ts +4 -0
- package/dist/shared-worker-client.d.ts.map +1 -1
- package/dist/shared-worker.d.ts.map +1 -1
- package/dist/snappy.d.ts +3 -0
- package/dist/snappy.d.ts.map +1 -0
- package/dist/sql-parser.d.ts.map +1 -1
- package/dist/types.d.ts +33 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/worker-api.d.ts +17 -1
- package/dist/worker-api.d.ts.map +1 -1
- package/dist/worker-client.d.ts +7 -2
- package/dist/worker-client.d.ts.map +1 -1
- package/dist/worker-protocol.d.ts +11 -1
- package/dist/worker-protocol.d.ts.map +1 -1
- package/dist/worker-server.d.ts.map +1 -1
- package/dist/worker.d.ts +31 -2
- package/dist/worker.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/assets/browser-worker-DP6Mjz7c.js +0 -4
- package/dist/assets/browser-worker-DP6Mjz7c.js.map +0 -1
- package/dist/assets/shared-worker-DKzhauVf.js +0 -2
- package/dist/assets/shared-worker-DKzhauVf.js.map +0 -1
- package/dist/chunks/indexing-BzmFhWXs.js.map +0 -1
- package/dist/engine/snippets/moyodb-engine-cff0a0e2441a7a8f/js/opfs_shim.js +0 -513
- /package/dist/engine/snippets/{moyodb-engine-8ebe6af0cc2e81b7 → moyodb-engine-54a406e33b0fb849}/js/opfs_shim.js +0 -0
package/dist/node-storage.d.mts
CHANGED
|
@@ -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;
|
package/dist/node-storage.mjs
CHANGED
|
@@ -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
|
|
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 });
|
|
@@ -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;
|
|
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"}
|
package/dist/node-worker.mjs
CHANGED
|
@@ -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();
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"
|
|
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"}
|