@cavelang/store 0.35.0 → 0.36.1
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 +884 -15
- package/dist/src/backup.d.ts.map +1 -1
- package/dist/src/backup.js +143 -70
- package/dist/src/backup.js.map +1 -1
- package/dist/src/capture-claim.d.ts +4 -0
- package/dist/src/capture-claim.d.ts.map +1 -0
- package/dist/src/capture-claim.js +26 -0
- package/dist/src/capture-claim.js.map +1 -0
- package/dist/src/descriptor.d.ts +3 -0
- package/dist/src/descriptor.d.ts.map +1 -0
- package/dist/src/descriptor.js +21 -0
- package/dist/src/descriptor.js.map +1 -0
- package/dist/src/error-message.d.ts +3 -0
- package/dist/src/error-message.d.ts.map +1 -0
- package/dist/src/error-message.js +10 -0
- package/dist/src/error-message.js.map +1 -0
- package/dist/src/locate.d.ts.map +1 -1
- package/dist/src/locate.js +33 -13
- package/dist/src/locate.js.map +1 -1
- package/dist/src/node-adapter.d.ts.map +1 -1
- package/dist/src/node-adapter.js +29 -1
- package/dist/src/node-adapter.js.map +1 -1
- package/dist/src/provenance.d.ts +4 -0
- package/dist/src/provenance.d.ts.map +1 -1
- package/dist/src/provenance.js +36 -1
- package/dist/src/provenance.js.map +1 -1
- package/dist/src/query-sql.d.ts.map +1 -1
- package/dist/src/query-sql.js +4 -2
- package/dist/src/query-sql.js.map +1 -1
- package/dist/src/read-snapshot.d.ts +4 -0
- package/dist/src/read-snapshot.d.ts.map +1 -0
- package/dist/src/read-snapshot.js +22 -0
- package/dist/src/read-snapshot.js.map +1 -0
- package/dist/src/record.d.ts.map +1 -1
- package/dist/src/record.js +102 -25
- package/dist/src/record.js.map +1 -1
- package/dist/src/resolve.d.ts.map +1 -1
- package/dist/src/resolve.js +42 -18
- package/dist/src/resolve.js.map +1 -1
- package/dist/src/row.d.ts.map +1 -1
- package/dist/src/row.js +45 -17
- package/dist/src/row.js.map +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/runtime.js +8 -4
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/schema.d.ts +1 -2
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +116 -15
- package/dist/src/schema.js.map +1 -1
- package/dist/src/store.d.ts +17 -5
- package/dist/src/store.d.ts.map +1 -1
- package/dist/src/store.js +451 -104
- package/dist/src/store.js.map +1 -1
- package/package.json +4 -4
- package/src/backup.ts +141 -65
- package/src/capture-claim.ts +30 -0
- package/src/descriptor.ts +19 -0
- package/src/error-message.ts +8 -0
- package/src/locate.ts +31 -12
- package/src/node-adapter.ts +28 -1
- package/src/provenance.ts +33 -1
- package/src/query-sql.ts +4 -2
- package/src/read-snapshot.ts +21 -0
- package/src/record.ts +102 -26
- package/src/resolve.ts +43 -20
- package/src/row.ts +29 -2
- package/src/runtime.ts +8 -4
- package/src/schema.ts +117 -18
- package/src/store.ts +452 -125
package/dist/src/backup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/backup.ts"],"names":[],"mappings":"AAAA,sEAAsE;
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/backup.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAUtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIvC,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAiID,uEAAuE;AACvE,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,iBAAiB,MAAM,KAAG,QAmDpE,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,aAAa,MAAM,EAAE,UAAS,YAAiB,KAAG,QA4BtF,CAAA;AAED,2FAA2F;AAC3F,eAAO,MAAM,aAAa,GACxB,cAAc,MAAM,EACpB,aAAa,MAAM,EACnB,UAAS,YAAY,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,KACvD,QA0BF,CAAA"}
|
package/dist/src/backup.js
CHANGED
|
@@ -1,86 +1,151 @@
|
|
|
1
1
|
/** Exact SQLite snapshot backup, verification, and atomic restore. */
|
|
2
2
|
import { createHash, randomBytes } from 'node:crypto';
|
|
3
|
-
import {
|
|
3
|
+
import { copyFileSync, existsSync, fsyncSync, linkSync, openSync, readSync, realpathSync, renameSync, rmSync, statSync } from 'node:fs';
|
|
4
4
|
import { basename, dirname, resolve } from 'node:path';
|
|
5
|
+
import { withDescriptor } from "./descriptor.js";
|
|
6
|
+
import { errorMessage } from "./error-message.js";
|
|
5
7
|
import { nodeSqliteAdapter } from "./node-adapter.js";
|
|
6
8
|
import * as Schema from "./schema.js";
|
|
7
9
|
const temporaryPath = (destination) => {
|
|
8
10
|
const target = resolve(destination);
|
|
9
11
|
return resolve(dirname(target), `.${basename(target)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
|
|
10
12
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
class PublishedSnapshotError extends Error {
|
|
14
|
+
}
|
|
15
|
+
/** Retain the operation failure and identify a temporary file whose removal failed. */
|
|
16
|
+
const failWithTemporaryCleanup = (temporary, operation, error) => {
|
|
15
17
|
try {
|
|
16
|
-
|
|
17
|
-
const size = readSync(fd, buffer, 0, buffer.length, null);
|
|
18
|
-
if (size === 0)
|
|
19
|
-
break;
|
|
20
|
-
hash.update(buffer.subarray(0, size));
|
|
21
|
-
}
|
|
18
|
+
rmSync(temporary, { force: true });
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
catch (cleanupError) {
|
|
21
|
+
throw new AggregateError([error, cleanupError], `CAVE ${operation} failed: ${errorMessage(error)}; temporary cleanup also failed: ${temporary}: ${errorMessage(cleanupError)}`, { cause: error });
|
|
25
22
|
}
|
|
26
|
-
|
|
23
|
+
throw error;
|
|
27
24
|
};
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// must still reopen and validate the complete database before publish.
|
|
38
|
-
if (process.platform !== 'win32' ||
|
|
39
|
-
!(error instanceof Error) || !('code' in error) || error.code !== 'EPERM')
|
|
40
|
-
throw error;
|
|
41
|
-
}
|
|
25
|
+
const withFile = (path, operation, body) => withDescriptor(openSync(path, 'r'), `snapshot ${operation}`, body);
|
|
26
|
+
const hashFile = (path) => withFile(path, 'hash', fd => {
|
|
27
|
+
const hash = createHash('sha256');
|
|
28
|
+
const buffer = Buffer.allocUnsafe(1024 * 1024);
|
|
29
|
+
for (;;) {
|
|
30
|
+
const size = readSync(fd, buffer, 0, buffer.length, null);
|
|
31
|
+
if (size === 0)
|
|
32
|
+
break;
|
|
33
|
+
hash.update(buffer.subarray(0, size));
|
|
42
34
|
}
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
return hash.digest('hex');
|
|
36
|
+
});
|
|
37
|
+
const syncFile = (path) => withFile(path, 'sync', fd => {
|
|
38
|
+
try {
|
|
39
|
+
fsyncSync(fd);
|
|
45
40
|
}
|
|
46
|
-
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Windows can reject a redundant fsync while SQLite's completed
|
|
43
|
+
// VACUUM statement still owns the snapshot handle. Verification below
|
|
44
|
+
// must still reopen and validate the complete database before publish.
|
|
45
|
+
if (process.platform !== 'win32' ||
|
|
46
|
+
!(error instanceof Error) || !('code' in error) || error.code !== 'EPERM')
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const errorCode = (error) => error instanceof Error && 'code' in error ? error.code : undefined;
|
|
47
51
|
const syncDirectory = (path) => {
|
|
48
52
|
let fd;
|
|
49
53
|
try {
|
|
50
54
|
fd = openSync(dirname(resolve(path)), 'r');
|
|
51
|
-
fsyncSync(fd);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// Some platforms do not permit opening/fsyncing a directory. The fully
|
|
55
|
-
// written database itself is still synced before publication.
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Windows may reject opening a directory through the ordinary file API.
|
|
58
|
+
const code = errorCode(error);
|
|
59
|
+
if (process.platform === 'win32' && (code === 'EPERM' || code === 'EACCES' || code === 'EISDIR'))
|
|
60
|
+
return;
|
|
61
|
+
throw error;
|
|
60
62
|
}
|
|
63
|
+
withDescriptor(fd, 'snapshot directory sync', descriptor => {
|
|
64
|
+
try {
|
|
65
|
+
fsyncSync(descriptor);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const code = errorCode(error);
|
|
69
|
+
// Unsupported directory synchronization is a portability limitation;
|
|
70
|
+
// I/O, space, interruption, and unexpected errors must remain visible.
|
|
71
|
+
if (code === 'EINVAL' || code === 'ENOTSUP' || code === 'ENOSYS' ||
|
|
72
|
+
(process.platform === 'win32' && code === 'EPERM') ||
|
|
73
|
+
(process.platform === 'aix' && code === 'EBADF'))
|
|
74
|
+
return;
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
61
78
|
};
|
|
62
|
-
const publish = (temporary, destination, force) => {
|
|
79
|
+
const publish = (temporary, destination, force, operation) => {
|
|
63
80
|
const target = resolve(destination);
|
|
81
|
+
requireStoppedDestination(target, operation);
|
|
64
82
|
if (force) {
|
|
65
83
|
renameSync(temporary, target);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// A hard link publishes the fully written inode atomically and fails if a
|
|
87
|
+
// racing process created the destination after the initial existence check.
|
|
88
|
+
linkSync(temporary, target);
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
if (!force)
|
|
92
|
+
rmSync(temporary);
|
|
66
93
|
syncDirectory(target);
|
|
67
|
-
return;
|
|
68
94
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new PublishedSnapshotError(`CAVE ${operation}: snapshot published to ${target}, but post-publication cleanup or directory sync failed: ${errorMessage(error)}`, { cause: error });
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const canonicalPath = (path) => {
|
|
100
|
+
const absolute = resolve(path);
|
|
101
|
+
if (existsSync(absolute))
|
|
102
|
+
return realpathSync(absolute);
|
|
103
|
+
const parent = dirname(absolute);
|
|
104
|
+
return existsSync(parent) ? resolve(realpathSync(parent), basename(absolute)) : absolute;
|
|
105
|
+
};
|
|
106
|
+
const samePath = (left, right) => {
|
|
107
|
+
if (existsSync(left) && existsSync(right)) {
|
|
108
|
+
const a = statSync(left);
|
|
109
|
+
const b = statSync(right);
|
|
110
|
+
if (a.dev === b.dev && a.ino === b.ino)
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
return canonicalPath(left) === canonicalPath(right);
|
|
114
|
+
};
|
|
115
|
+
const sourceFile = (source, target) => [source, canonicalPath(source)].some(base => ['', '-wal', '-shm', '-journal'].some(suffix => samePath(`${base}${suffix}`, target)));
|
|
116
|
+
const requireStoppedDestination = (target, operation) => {
|
|
117
|
+
for (const base of new Set([target, canonicalPath(target)])) {
|
|
118
|
+
for (const suffix of ['-wal', '-shm', '-journal']) {
|
|
119
|
+
if (existsSync(`${base}${suffix}`)) {
|
|
120
|
+
throw new Error(`CAVE ${operation}: refusing while ${base}${suffix} exists; stop all users and remove stale sidecars`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const expectedDigest = (value) => {
|
|
126
|
+
if (value === undefined)
|
|
127
|
+
return undefined;
|
|
128
|
+
if (typeof value !== 'string' || value.length !== 64 || !/^[0-9a-f]{64}$/i.test(value)) {
|
|
129
|
+
throw new TypeError('CAVE backup: expected SHA-256 must be 64 hexadecimal characters');
|
|
130
|
+
}
|
|
131
|
+
return value.toLowerCase();
|
|
74
132
|
};
|
|
75
|
-
const samePath = (left, right) => existsSync(left) && existsSync(right) ?
|
|
76
|
-
realpathSync(left) === realpathSync(right) :
|
|
77
|
-
resolve(left) === resolve(right);
|
|
78
133
|
/** Validate a standalone snapshot without migrating or mutating it. */
|
|
79
134
|
export const verifyBackup = (path, expectedSha256) => {
|
|
135
|
+
const expected = expectedDigest(expectedSha256);
|
|
80
136
|
const target = resolve(path);
|
|
81
137
|
if (!existsSync(target)) {
|
|
82
138
|
throw new Error(`CAVE backup: ${target}: no such file`);
|
|
83
139
|
}
|
|
140
|
+
// Metadata and the checksum must describe the same standalone file. Opening
|
|
141
|
+
// a live WAL database would read committed rows absent from the hashed bytes.
|
|
142
|
+
for (const base of new Set([target, canonicalPath(target)])) {
|
|
143
|
+
for (const suffix of ['-wal', '-shm', '-journal']) {
|
|
144
|
+
if (existsSync(`${base}${suffix}`)) {
|
|
145
|
+
throw new Error(`CAVE backup: ${base}${suffix} exists; verification requires a standalone snapshot, create one with backup()`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
84
149
|
const db = nodeSqliteAdapter.open(target, { readOnly: true });
|
|
85
150
|
let schemaVersion = 0;
|
|
86
151
|
let rows = 0;
|
|
@@ -95,37 +160,46 @@ export const verifyBackup = (path, expectedSha256) => {
|
|
|
95
160
|
throw new Error(`foreign_key_check failed for ${foreignKeys.length} row(s)`);
|
|
96
161
|
}
|
|
97
162
|
schemaVersion = db.prepare('PRAGMA user_version').get().user_version;
|
|
98
|
-
if (schemaVersion
|
|
99
|
-
throw new Error(`schema version ${schemaVersion} is not
|
|
163
|
+
if (schemaVersion < 1 || schemaVersion > Schema.currentVersion) {
|
|
164
|
+
throw new Error(`schema version ${schemaVersion} is not a supported exact-backup format (1..${Schema.currentVersion})`);
|
|
100
165
|
}
|
|
101
166
|
Schema.validate(db, schemaVersion);
|
|
102
167
|
const summary = db.prepare('SELECT COUNT(*) AS rows, MAX(tx) AS max_tx FROM cave_claim').get();
|
|
103
168
|
rows = summary.rows;
|
|
104
169
|
maxTx = summary.max_tx;
|
|
105
170
|
}
|
|
106
|
-
|
|
107
|
-
|
|
171
|
+
catch (error) {
|
|
172
|
+
try {
|
|
173
|
+
db.close();
|
|
174
|
+
}
|
|
175
|
+
catch (closeError) {
|
|
176
|
+
throw new AggregateError([error, closeError], `CAVE backup verification failed: ${errorMessage(error)}; database close also failed: ${errorMessage(closeError)}`, { cause: error });
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
108
179
|
}
|
|
180
|
+
db.close();
|
|
109
181
|
const sha256 = hashFile(target);
|
|
110
|
-
if (
|
|
111
|
-
throw new Error(`CAVE backup: SHA-256 mismatch: expected ${
|
|
182
|
+
if (expected !== undefined && sha256 !== expected) {
|
|
183
|
+
throw new Error(`CAVE backup: SHA-256 mismatch: expected ${expected}, got ${sha256}`);
|
|
112
184
|
}
|
|
113
185
|
return { path: target, bytes: statSync(target).size, sha256, schemaVersion, rows, maxTx };
|
|
114
186
|
};
|
|
115
187
|
/** Create and atomically publish a verified, point-in-time SQLite snapshot. */
|
|
116
188
|
export const backup = (store, destination, options = {}) => {
|
|
189
|
+
const force = options.force === true;
|
|
117
190
|
const target = resolve(destination);
|
|
118
191
|
const capability = store.adapter.capabilities.backup;
|
|
119
192
|
if (capability === undefined) {
|
|
120
193
|
throw new Error(`CAVE backup: SQLite adapter ${JSON.stringify(store.adapter.name)} does not support exact snapshots`);
|
|
121
194
|
}
|
|
122
195
|
const source = capability.location(store.db);
|
|
123
|
-
if (source !== null &&
|
|
196
|
+
if (source !== null && sourceFile(source, target)) {
|
|
124
197
|
throw new Error('CAVE backup: destination is the source database');
|
|
125
198
|
}
|
|
126
|
-
if (existsSync(target) &&
|
|
199
|
+
if (existsSync(target) && !force) {
|
|
127
200
|
throw new Error(`CAVE backup: ${target} already exists; pass force to replace it`);
|
|
128
201
|
}
|
|
202
|
+
requireStoppedDestination(target, 'backup');
|
|
129
203
|
if (capability.inTransaction(store.db)) {
|
|
130
204
|
throw new Error('CAVE backup: cannot snapshot inside an open transaction');
|
|
131
205
|
}
|
|
@@ -134,41 +208,40 @@ export const backup = (store, destination, options = {}) => {
|
|
|
134
208
|
capability.write(store.db, temporary);
|
|
135
209
|
syncFile(temporary);
|
|
136
210
|
const checked = verifyBackup(temporary);
|
|
137
|
-
publish(temporary, target,
|
|
211
|
+
publish(temporary, target, force, 'backup');
|
|
138
212
|
return { ...checked, path: target };
|
|
139
213
|
}
|
|
140
214
|
catch (error) {
|
|
141
|
-
|
|
142
|
-
throw error;
|
|
215
|
+
return failWithTemporaryCleanup(temporary, 'backup', error);
|
|
143
216
|
}
|
|
144
217
|
};
|
|
145
218
|
/** Verify a snapshot, then atomically restore its exact bytes to a stopped destination. */
|
|
146
219
|
export const restoreBackup = (snapshotPath, destination, options = {}) => {
|
|
220
|
+
const force = options.force === true;
|
|
221
|
+
const expectedSha256 = expectedDigest(options.expectedSha256);
|
|
147
222
|
const source = resolve(snapshotPath);
|
|
148
223
|
const target = resolve(destination);
|
|
149
224
|
if (samePath(source, target)) {
|
|
150
225
|
throw new Error('CAVE restore: snapshot and destination are the same file');
|
|
151
226
|
}
|
|
152
|
-
if (
|
|
153
|
-
throw new Error(
|
|
227
|
+
if (sourceFile(source, target)) {
|
|
228
|
+
throw new Error('CAVE restore: destination is a sidecar of the source snapshot');
|
|
154
229
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
throw new Error(`CAVE restore: refusing while ${target}${suffix} exists; stop all users and remove stale sidecars`);
|
|
158
|
-
}
|
|
230
|
+
if (existsSync(target) && !force) {
|
|
231
|
+
throw new Error(`CAVE restore: ${target} already exists; pass force to replace it`);
|
|
159
232
|
}
|
|
160
|
-
|
|
233
|
+
requireStoppedDestination(target, 'restore');
|
|
234
|
+
const checked = verifyBackup(source, expectedSha256);
|
|
161
235
|
const temporary = temporaryPath(target);
|
|
162
236
|
try {
|
|
163
237
|
copyFileSync(source, temporary);
|
|
164
238
|
syncFile(temporary);
|
|
165
239
|
const copied = verifyBackup(temporary, checked.sha256);
|
|
166
|
-
publish(temporary, target,
|
|
240
|
+
publish(temporary, target, force, 'restore');
|
|
167
241
|
return { ...copied, path: target };
|
|
168
242
|
}
|
|
169
243
|
catch (error) {
|
|
170
|
-
|
|
171
|
-
throw error;
|
|
244
|
+
return failWithTemporaryCleanup(temporary, 'restore', error);
|
|
172
245
|
}
|
|
173
246
|
};
|
|
174
247
|
//# sourceMappingURL=backup.js.map
|
package/dist/src/backup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/backup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-claim.d.ts","sourceRoot":"","sources":["../../src/capture-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,gBAAgB,CAAA;AAelD,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,KAAK,CAAC,CAanD,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const term = ({ kind, text }) => ({ kind, text });
|
|
2
|
+
const value = ({ raw, kind, approx, num, unit, from, to }) => ({ raw, kind, approx, num, unit, from, to });
|
|
3
|
+
const payload = (input) => {
|
|
4
|
+
switch (input.kind) {
|
|
5
|
+
case 'none': return { kind: 'none' };
|
|
6
|
+
case 'relation': return { kind: 'relation', object: term(input.object) };
|
|
7
|
+
case 'attribute': return { kind: 'attribute', attribute: input.attribute, value: value(input.value) };
|
|
8
|
+
case 'metric': return { kind: 'metric', value: value(input.value) };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
/** Own declared fields before columns, emitted text and identity are derived. */
|
|
12
|
+
export const captureClaim = (input) => {
|
|
13
|
+
const { subject, verb, negated, payload: body, contexts, tags, conf, importance, delta, sigmaLevel, comment, raw } = input;
|
|
14
|
+
for (const [name, collection] of [['contexts', contexts], ['tags', tags]]) {
|
|
15
|
+
if (!Array.isArray(collection))
|
|
16
|
+
throw new TypeError(`claim ${name} must be an array`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
subject: term(subject), verb, negated, payload: payload(body),
|
|
20
|
+
contexts: Array.from(contexts),
|
|
21
|
+
tags: Array.from(tags, ({ key, value }) => ({ key, value })),
|
|
22
|
+
conf, importance, delta: delta === undefined ? undefined : value(delta),
|
|
23
|
+
sigmaLevel, comment, raw,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=capture-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-claim.js","sourceRoot":"","sources":["../../src/capture-claim.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAc,EAAc,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACzE,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAW,EAAW,EAAE,CAC7E,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;AAE9C,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAiB,EAAE;IACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QACpC,KAAK,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxE,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;QACrG,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;IACrE,CAAC;AACH,CAAC,CAAA;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE;IACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAC7E,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAU,EAAE,CAAC;QACnF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAA;IACvF,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;QAC7D,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QACvE,UAAU,EAAE,OAAO,EAAE,GAAG;KACzB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../src/descriptor.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,IAAI,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,KAAG,CAc1F,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { closeSync } from 'node:fs';
|
|
2
|
+
import { errorMessage } from "./error-message.js";
|
|
3
|
+
/** Close once without allowing cleanup to replace the operation's error. */
|
|
4
|
+
export const withDescriptor = (fd, operation, body) => {
|
|
5
|
+
let result;
|
|
6
|
+
try {
|
|
7
|
+
result = body(fd);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
try {
|
|
11
|
+
closeSync(fd);
|
|
12
|
+
}
|
|
13
|
+
catch (closeError) {
|
|
14
|
+
throw new AggregateError([error, closeError], `CAVE ${operation} failed: ${errorMessage(error)}; descriptor close also failed: ${errorMessage(closeError)}`, { cause: error });
|
|
15
|
+
}
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
closeSync(fd);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAI,EAAU,EAAE,SAAiB,EAAE,IAAuB,EAAK,EAAE;IAC7F,IAAI,MAAS,CAAA;IACb,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAAC,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,QAAQ,SAAS,YAAY,YAAY,CAAC,KAAK,CAAC,mCAAmC,YAAY,CAAC,UAAU,CAAC,EAAE,EAC7G,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACrB,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IACD,SAAS,CAAC,EAAE,CAAC,CAAA;IACb,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-message.d.ts","sourceRoot":"","sources":["../../src/error-message.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAM7C,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Preserve useful diagnostics when combining operation and cleanup failures. */
|
|
2
|
+
export const errorMessage = (value) => {
|
|
3
|
+
try {
|
|
4
|
+
return value instanceof Error ? String(value.message) : String(value);
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return '[unprintable thrown value]';
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=error-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-message.js","sourceRoot":"","sources":["../../src/error-message.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,4BAA4B,CAAA;IACrC,CAAC;AACH,CAAC,CAAA"}
|
package/dist/src/locate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../src/locate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../src/locate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAGtD,gCAAgC;AAChC,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAK3D,6GAA6G;AAC7G,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAUvC,CAAA;AAEJ,kDAAkD;AAClD,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,KAAG,IAQrC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAEjD;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAE3D,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAC7B,CAAA;AAiBD;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAgB;CACvC;AAED,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,MAC0C,CAAA;AAE7F,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,MAEO,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,UAAS,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,KAAG,KA2BrH,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,UAAS,aAAkB,KAAG,KAuBlE,CAAA"}
|
package/dist/src/locate.js
CHANGED
|
@@ -8,23 +8,26 @@
|
|
|
8
8
|
* in-memory store first. Detection is by content, never by extension — a
|
|
9
9
|
* store named `k.cave` and a text file named `notes.txt` both work.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { existsSync, openSync, readFileSync, readSync } from 'node:fs';
|
|
12
12
|
import { resolve } from 'node:path';
|
|
13
|
+
import { withDescriptor } from "./descriptor.js";
|
|
14
|
+
import { errorMessage } from "./error-message.js";
|
|
13
15
|
import { nodeSqliteAdapter } from "./node-adapter.js";
|
|
14
16
|
import { openWith } from "./runtime.js";
|
|
15
17
|
/** SQLite database files begin with this NUL-terminated 16-byte header. */
|
|
16
18
|
const sqliteHeader = 'SQLite format 3\u0000';
|
|
17
19
|
/** @returns `true` when the file starts with the SQLite header — a store file rather than canonical text. */
|
|
18
|
-
export const isStoreFile = (path) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
export const isStoreFile = (path) => withDescriptor(openSync(path, 'r'), 'store-file detection', fd => {
|
|
21
|
+
const head = Buffer.alloc(16);
|
|
22
|
+
let offset = 0;
|
|
23
|
+
while (offset < head.length) {
|
|
24
|
+
const bytes = readSync(fd, head, offset, head.length - offset, offset);
|
|
25
|
+
if (bytes === 0)
|
|
26
|
+
return false;
|
|
27
|
+
offset += bytes;
|
|
26
28
|
}
|
|
27
|
-
|
|
29
|
+
return head.toString('latin1') === sqliteHeader;
|
|
30
|
+
});
|
|
28
31
|
/** Classifies a store path by what is on disk. */
|
|
29
32
|
export const kindOf = (path) => {
|
|
30
33
|
if (path === ':memory:') {
|
|
@@ -69,7 +72,14 @@ export const textStoreReadOnlyMessage = (path) => `${path} is CAVE text, not a d
|
|
|
69
72
|
* and a store silently missing rows is worse than an error.
|
|
70
73
|
*/
|
|
71
74
|
export const openText = (path, options = {}) => {
|
|
72
|
-
const
|
|
75
|
+
const bytes = readFileSync(path);
|
|
76
|
+
let text;
|
|
77
|
+
try {
|
|
78
|
+
text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
79
|
+
}
|
|
80
|
+
catch (cause) {
|
|
81
|
+
throw new LocateError(`${path}: invalid UTF-8 text store`, { cause });
|
|
82
|
+
}
|
|
73
83
|
// A fresh in-memory store is always created and initialized: an `access`
|
|
74
84
|
// mode is meaningless here and must not reach the open.
|
|
75
85
|
const store = openWith(nodeSqliteAdapter, ':memory:', { registry: options.registry });
|
|
@@ -82,7 +92,12 @@ export const openText = (path, options = {}) => {
|
|
|
82
92
|
options.assemble?.(store, resolve(path));
|
|
83
93
|
}
|
|
84
94
|
catch (error) {
|
|
85
|
-
|
|
95
|
+
try {
|
|
96
|
+
store.close();
|
|
97
|
+
}
|
|
98
|
+
catch (closeError) {
|
|
99
|
+
throw new AggregateError([error, closeError], `CAVE text-store load failed: ${errorMessage(error)}; store cleanup also failed: ${errorMessage(closeError)}`, { cause: error });
|
|
100
|
+
}
|
|
86
101
|
throw error;
|
|
87
102
|
}
|
|
88
103
|
return store;
|
|
@@ -101,7 +116,12 @@ export const openText = (path, options = {}) => {
|
|
|
101
116
|
* never leaves an empty database behind.
|
|
102
117
|
*/
|
|
103
118
|
export const openAt = (path, options = {}) => {
|
|
104
|
-
const { intent = 'write'
|
|
119
|
+
const { intent = 'write' } = options;
|
|
120
|
+
if (intent !== 'read' && intent !== 'scratch' && intent !== 'write') {
|
|
121
|
+
throw new TypeError('store intent must be read, scratch or write');
|
|
122
|
+
}
|
|
123
|
+
const { registry, assemble } = options;
|
|
124
|
+
const openOptions = { registry, assemble };
|
|
105
125
|
switch (kindOf(path)) {
|
|
106
126
|
case 'memory':
|
|
107
127
|
return openWith(nodeSqliteAdapter, path, openOptions);
|
package/dist/src/locate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/locate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/locate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAOvC,2EAA2E;AAC3E,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAE5C,6GAA6G;AAC7G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CACnD,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC7B,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAA;QACtE,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QAC7B,MAAM,IAAI,KAAK,CAAA;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAA;AACjD,CAAC,CAAC,CAAA;AAEJ,kDAAkD;AAClD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC3C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;AAC9C,CAAC,CAAA;AA8BD,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAU,EAAE,CAC1C,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;AAEnF,sGAAsG;AACtG,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,OAAoB,EAAS,EAAE;IAC/E,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,KAAK,OAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,WAAW,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAClB,IAAI,GAAG,aAAa,CAAA;CACvC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE,CAC1D,eAAe,IAAI,sCAAsC,IAAI,8BAA8B,CAAA;AAE7F,oDAAoD;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAU,EAAE,CAC/D,GAAG,IAAI,6DAA6D;IACpE,qDAAqD,IAAI,IAAI,CAAA;AAE/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,UAA0E,EAAE,EAAS,EAAE;IAC5H,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC,GAAG,IAAI,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACvE,CAAC;IACD,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,iBAAiB,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,SAAS,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;YACnG,MAAM,IAAI,WAAW,CAAC,eAAe,IAAI,6CAA6C,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvH,CAAC;QACD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,EAC1C,gCAAgC,YAAY,CAAC,KAAK,CAAC,gCAAgC,YAAY,CAAC,UAAU,CAAC,EAAE,EAC7G,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACrB,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,UAAyB,EAAE,EAAS,EAAE;IACzE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,OAAO,CAAA;IACpC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACpE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IACtC,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IAC1C,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;QACvD,KAAK,QAAQ;YACX,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;QAC9C,KAAK,MAAM;YACT,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACpC,KAAK,SAAS;YACZ,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;YAClD,CAAC;YACD,OAAO,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;IACzD,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-adapter.d.ts","sourceRoot":"","sources":["../../src/node-adapter.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"node-adapter.d.ts","sourceRoot":"","sources":["../../src/node-adapter.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,cAAc,CAAA;AA4BrD,eAAO,MAAM,iBAAiB,EAAE,OAkB/B,CAAA"}
|
package/dist/src/node-adapter.js
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
/** Node.js builtin SQLite implementation of the CAVE adapter contract. */
|
|
2
2
|
import { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
import { errorMessage } from "./error-message.js";
|
|
3
4
|
const asNodeDatabase = (db) => db;
|
|
5
|
+
let verifiedText = false;
|
|
6
|
+
/** Refuse lossy native text decoding before opening or creating caller data. */
|
|
7
|
+
const verifyText = () => {
|
|
8
|
+
if (verifiedText)
|
|
9
|
+
return;
|
|
10
|
+
const probe = new DatabaseSync(':memory:');
|
|
11
|
+
try {
|
|
12
|
+
const expected = 'before\0after';
|
|
13
|
+
if (probe.prepare('SELECT ? AS value').get(expected)?.value !== expected) {
|
|
14
|
+
throw new Error('CAVE: node:sqlite truncates embedded NUL text on this runtime; use Node 24.16.0+ (24.x) or 26.1.0+ (26.x)');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
try {
|
|
19
|
+
probe.close();
|
|
20
|
+
}
|
|
21
|
+
catch (closeError) {
|
|
22
|
+
throw new AggregateError([error, closeError], `CAVE native text probe failed: ${errorMessage(error)}; database close also failed: ${errorMessage(closeError)}`, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
probe.close();
|
|
27
|
+
verifiedText = true;
|
|
28
|
+
};
|
|
4
29
|
export const nodeSqliteAdapter = {
|
|
5
30
|
name: 'node:sqlite',
|
|
6
31
|
capabilities: {
|
|
@@ -15,6 +40,9 @@ export const nodeSqliteAdapter = {
|
|
|
15
40
|
},
|
|
16
41
|
},
|
|
17
42
|
},
|
|
18
|
-
open: (path, options = {}) =>
|
|
43
|
+
open: (path, options = {}) => {
|
|
44
|
+
verifyText();
|
|
45
|
+
return new DatabaseSync(path, options);
|
|
46
|
+
},
|
|
19
47
|
};
|
|
20
48
|
//# sourceMappingURL=node-adapter.js.map
|