@neottia/repository-store 0.2.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/LICENSE +21 -0
- package/README.md +76 -0
- package/binding.gyp +9 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +19 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +113 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/fault-injection.d.ts +13 -0
- package/dist/internal/fault-injection.d.ts.map +1 -0
- package/dist/internal/fault-injection.js +68 -0
- package/dist/internal/fault-injection.js.map +1 -0
- package/dist/internal/filesystem.d.ts +25 -0
- package/dist/internal/filesystem.d.ts.map +1 -0
- package/dist/internal/filesystem.js +199 -0
- package/dist/internal/filesystem.js.map +1 -0
- package/dist/internal/model.d.ts +43 -0
- package/dist/internal/model.d.ts.map +1 -0
- package/dist/internal/model.js +49 -0
- package/dist/internal/model.js.map +1 -0
- package/dist/internal/native-publication.d.ts +9 -0
- package/dist/internal/native-publication.d.ts.map +1 -0
- package/dist/internal/native-publication.js +65 -0
- package/dist/internal/native-publication.js.map +1 -0
- package/dist/internal/publication.d.ts +10 -0
- package/dist/internal/publication.d.ts.map +1 -0
- package/dist/internal/publication.js +223 -0
- package/dist/internal/publication.js.map +1 -0
- package/dist/lease.d.ts +24 -0
- package/dist/lease.d.ts.map +1 -0
- package/dist/lease.js +932 -0
- package/dist/lease.js.map +1 -0
- package/dist/limits.d.ts +15 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +14 -0
- package/dist/limits.js.map +1 -0
- package/dist/paths.d.ts +15 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +58 -0
- package/dist/paths.js.map +1 -0
- package/dist/revision.d.ts +4 -0
- package/dist/revision.d.ts.map +1 -0
- package/dist/revision.js +8 -0
- package/dist/revision.js.map +1 -0
- package/dist/sqlite/adapter.d.ts +48 -0
- package/dist/sqlite/adapter.d.ts.map +1 -0
- package/dist/sqlite/adapter.js +183 -0
- package/dist/sqlite/adapter.js.map +1 -0
- package/dist/sqlite/bun.d.ts +2 -0
- package/dist/sqlite/bun.d.ts.map +1 -0
- package/dist/sqlite/bun.js +7 -0
- package/dist/sqlite/bun.js.map +1 -0
- package/dist/sqlite/cache-publication.d.ts +6 -0
- package/dist/sqlite/cache-publication.d.ts.map +1 -0
- package/dist/sqlite/cache-publication.js +191 -0
- package/dist/sqlite/cache-publication.js.map +1 -0
- package/dist/sqlite/cache.d.ts +26 -0
- package/dist/sqlite/cache.d.ts.map +1 -0
- package/dist/sqlite/cache.js +527 -0
- package/dist/sqlite/cache.js.map +1 -0
- package/dist/sqlite/node.d.ts +2 -0
- package/dist/sqlite/node.d.ts.map +1 -0
- package/dist/sqlite/node.js +6 -0
- package/dist/sqlite/node.js.map +1 -0
- package/dist/sqlite/runtime.d.ts +4 -0
- package/dist/sqlite/runtime.d.ts.map +1 -0
- package/dist/sqlite/runtime.js +34 -0
- package/dist/sqlite/runtime.js.map +1 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/dist/transaction/apply.d.ts +8 -0
- package/dist/transaction/apply.d.ts.map +1 -0
- package/dist/transaction/apply.js +273 -0
- package/dist/transaction/apply.js.map +1 -0
- package/dist/transaction/journal.d.ts +17 -0
- package/dist/transaction/journal.d.ts.map +1 -0
- package/dist/transaction/journal.js +207 -0
- package/dist/transaction/journal.js.map +1 -0
- package/dist/transaction/recovery.d.ts +6 -0
- package/dist/transaction/recovery.d.ts.map +1 -0
- package/dist/transaction/recovery.js +138 -0
- package/dist/transaction/recovery.js.map +1 -0
- package/dist/transaction/types.d.ts +45 -0
- package/dist/transaction/types.d.ts.map +1 -0
- package/dist/transaction/types.js +2 -0
- package/dist/transaction/types.js.map +1 -0
- package/native/rename_noreplace.cc +145 -0
- package/package.json +71 -0
- package/scripts/install-native.mjs +10 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { lstatSync } from 'node:fs';
|
|
3
|
+
import { basename, dirname, join } from 'node:path';
|
|
4
|
+
import { CacheSyncError, PathSafetyError, RepositoryStoreError, ResourceLimitError } from '../errors.js';
|
|
5
|
+
import { computeByteRevision } from '../revision.js';
|
|
6
|
+
import { selectSqliteAdapter } from './runtime.js';
|
|
7
|
+
import { assertSafeRegular, captureDirectories, hasCode, readRegularFile, revalidateDirectories, sameIdentity, syncDirectory, syncRegularFile, } from '../internal/filesystem.js';
|
|
8
|
+
import { managedPathBelongsToRoot, requirePathState, requireRootState, } from '../internal/model.js';
|
|
9
|
+
import { publishExactRegularFile } from '../internal/publication.js';
|
|
10
|
+
import { assertLiveLease, checkControl, trackLeaseOperation } from '../lease.js';
|
|
11
|
+
import { publishCacheDatabase, recoverCachePublications } from './cache-publication.js';
|
|
12
|
+
export async function openDisposableSqliteCache(root, lease, specification, options = {}) {
|
|
13
|
+
assertLiveLease(root, lease);
|
|
14
|
+
checkControl(options);
|
|
15
|
+
assertCachePath(root, specification.path);
|
|
16
|
+
const rootState = requireRootState(root);
|
|
17
|
+
recoverCachePublications(root, lease, options);
|
|
18
|
+
const path = requirePathState(specification.path).absolutePath;
|
|
19
|
+
if (!artifactExists(path))
|
|
20
|
+
return { state: 'rebuild-required', reason: 'missing' };
|
|
21
|
+
const beforeOpen = captureCacheState(path);
|
|
22
|
+
assertCacheSize(beforeOpen, rootState.limits.maxTemporaryBytes);
|
|
23
|
+
const adapter = await selectSqliteAdapter();
|
|
24
|
+
let database;
|
|
25
|
+
let closeSnapshot = beforeOpen;
|
|
26
|
+
try {
|
|
27
|
+
database = await adapter.open(path, {
|
|
28
|
+
readOnly: false,
|
|
29
|
+
busyTimeoutMs: 5_000,
|
|
30
|
+
limits: connectionLimits(root),
|
|
31
|
+
});
|
|
32
|
+
revalidateCacheState(path, closeSnapshot);
|
|
33
|
+
checkControl(options);
|
|
34
|
+
closeSnapshot = captureCacheState(path);
|
|
35
|
+
assertCacheSize(closeSnapshot, rootState.limits.maxTemporaryBytes);
|
|
36
|
+
const verificationDatabase = bindConnectionToCandidate(database, path, rootState.limits.maxTemporaryBytes, () => closeSnapshot, (snapshot) => {
|
|
37
|
+
closeSnapshot = snapshot;
|
|
38
|
+
});
|
|
39
|
+
const reason = await verifyDatabase(root, verificationDatabase, specification, {
|
|
40
|
+
beforeHealthCheck() {
|
|
41
|
+
closeSnapshot = refreshBoundedCacheState(path, closeSnapshot, rootState.limits.maxTemporaryBytes);
|
|
42
|
+
},
|
|
43
|
+
afterHealthCheck() {
|
|
44
|
+
closeSnapshot = refreshBoundedCacheState(path, closeSnapshot, rootState.limits.maxTemporaryBytes);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
revalidateCacheState(path, closeSnapshot);
|
|
48
|
+
assertCacheSize(closeSnapshot, rootState.limits.maxTemporaryBytes);
|
|
49
|
+
checkControl(options);
|
|
50
|
+
if (reason !== undefined) {
|
|
51
|
+
const closeError = await closeDatabaseIfSafe(database, path, closeSnapshot);
|
|
52
|
+
database = undefined;
|
|
53
|
+
if (closeError !== undefined)
|
|
54
|
+
throw closeError;
|
|
55
|
+
return { state: 'rebuild-required', reason };
|
|
56
|
+
}
|
|
57
|
+
const connection = bindConnectionToLease(root, lease, path, database);
|
|
58
|
+
return { state: 'ready', database: connection, close: () => connection.close() };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const closeError = database === undefined ? undefined : await closeDatabaseIfSafe(database, path, closeSnapshot);
|
|
62
|
+
if (closeError instanceof RepositoryStoreError)
|
|
63
|
+
throw closeError;
|
|
64
|
+
if (error instanceof CacheSyncError && error.code === 'CACHE_BUSY')
|
|
65
|
+
throw error;
|
|
66
|
+
if (error instanceof RepositoryStoreError && !(error instanceof CacheSyncError))
|
|
67
|
+
throw error;
|
|
68
|
+
assertSafeArtifacts(path);
|
|
69
|
+
return { state: 'rebuild-required', reason: 'corrupt' };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function rebuildDisposableSqliteCache(root, lease, specification, options = {}) {
|
|
73
|
+
assertLiveLease(root, lease);
|
|
74
|
+
checkControl(options);
|
|
75
|
+
assertCachePath(root, specification.path);
|
|
76
|
+
const rootState = requireRootState(root);
|
|
77
|
+
recoverCachePublications(root, lease, options);
|
|
78
|
+
const path = requirePathState(specification.path).absolutePath;
|
|
79
|
+
const parent = dirname(path);
|
|
80
|
+
const candidate = join(parent, `.${basename(path)}.${randomUUID()}.candidate`);
|
|
81
|
+
assertArtifactsAbsent(candidate);
|
|
82
|
+
let schemaBytes = 0;
|
|
83
|
+
for (const sql of specification.schemaSql) {
|
|
84
|
+
const bytes = Buffer.byteLength(sql, 'utf8');
|
|
85
|
+
if (bytes > rootState.limits.maxSqlBytes)
|
|
86
|
+
throw new ResourceLimitError('Cache schema statement exceeds maxSqlBytes.');
|
|
87
|
+
schemaBytes += bytes;
|
|
88
|
+
if (schemaBytes > rootState.limits.maxSqlBytes)
|
|
89
|
+
throw new ResourceLimitError('Aggregate cache schema exceeds maxSqlBytes.');
|
|
90
|
+
}
|
|
91
|
+
const activeSnapshot = captureCacheState(path);
|
|
92
|
+
const adapter = await selectSqliteAdapter();
|
|
93
|
+
let database;
|
|
94
|
+
let candidateSnapshot;
|
|
95
|
+
try {
|
|
96
|
+
database = await adapter.open(candidate, {
|
|
97
|
+
readOnly: false,
|
|
98
|
+
busyTimeoutMs: 5_000,
|
|
99
|
+
limits: connectionLimits(root),
|
|
100
|
+
});
|
|
101
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
102
|
+
assertCacheSize(candidateSnapshot, rootState.limits.maxTemporaryBytes);
|
|
103
|
+
database = bindConnectionToCandidate(database, candidate, rootState.limits.maxTemporaryBytes, () => candidateSnapshot, (snapshot) => {
|
|
104
|
+
candidateSnapshot = snapshot;
|
|
105
|
+
});
|
|
106
|
+
checkControl(options);
|
|
107
|
+
await database.exec('PRAGMA journal_mode=WAL;');
|
|
108
|
+
await database.exec(`PRAGMA application_id=${integer(specification.applicationId, 'applicationId')};`);
|
|
109
|
+
await database.exec(`PRAGMA user_version=${integer(specification.schemaVersion, 'schemaVersion')};`);
|
|
110
|
+
await database.exec('CREATE TABLE neottia_repository_cache_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);');
|
|
111
|
+
for (const sql of specification.schemaSql)
|
|
112
|
+
await database.exec(sql);
|
|
113
|
+
await database.exec('BEGIN IMMEDIATE;');
|
|
114
|
+
try {
|
|
115
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
116
|
+
await specification.populate(database);
|
|
117
|
+
revalidateCacheState(candidate, candidateSnapshot);
|
|
118
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
119
|
+
assertCacheSize(candidateSnapshot, rootState.limits.maxTemporaryBytes);
|
|
120
|
+
checkControl(options);
|
|
121
|
+
const metadata = await database.prepare('INSERT INTO neottia_repository_cache_meta (key, value) VALUES (?, ?)');
|
|
122
|
+
await metadata.run(['canonical_digest', specification.canonicalDigest]);
|
|
123
|
+
await metadata.run(['rebuilt_at', new Date().toISOString()]);
|
|
124
|
+
checkControl(options);
|
|
125
|
+
await database.exec('COMMIT;');
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (candidateSnapshot !== undefined)
|
|
129
|
+
revalidateCacheState(candidate, candidateSnapshot);
|
|
130
|
+
try {
|
|
131
|
+
await database.exec('ROLLBACK;');
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
checkControl(options);
|
|
138
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
139
|
+
const reason = await verifyDatabase(root, database, specification, {
|
|
140
|
+
beforeHealthCheck() {
|
|
141
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
142
|
+
},
|
|
143
|
+
afterHealthCheck() {
|
|
144
|
+
revalidateCacheState(candidate, candidateSnapshot);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
revalidateCacheState(candidate, candidateSnapshot);
|
|
148
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
149
|
+
assertCacheSize(candidateSnapshot, rootState.limits.maxTemporaryBytes);
|
|
150
|
+
checkControl(options);
|
|
151
|
+
if (reason !== undefined)
|
|
152
|
+
throw new CacheSyncError(`Rebuilt cache failed verification: ${reason}.`);
|
|
153
|
+
await database.exec('PRAGMA wal_checkpoint(TRUNCATE);');
|
|
154
|
+
revalidateCacheState(candidate, candidateSnapshot);
|
|
155
|
+
checkControl(options);
|
|
156
|
+
const closeError = await closeDatabaseIfSafe(database, candidate, candidateSnapshot);
|
|
157
|
+
database = undefined;
|
|
158
|
+
if (closeError !== undefined)
|
|
159
|
+
throw closeError;
|
|
160
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
161
|
+
candidateSnapshot = removeExactSidecars(candidate, candidateSnapshot);
|
|
162
|
+
assertCacheSize(candidateSnapshot, rootState.limits.maxTemporaryBytes);
|
|
163
|
+
syncRegularFile(candidate);
|
|
164
|
+
const candidateBytes = readRegularFile(candidate, rootState.limits.maxTemporaryBytes);
|
|
165
|
+
checkControl(options);
|
|
166
|
+
let activationSnapshot = activeSnapshot;
|
|
167
|
+
revalidateExactCacheState(path, activationSnapshot);
|
|
168
|
+
activationSnapshot = removeExactSidecars(path, activationSnapshot);
|
|
169
|
+
revalidateExactCacheState(path, activationSnapshot);
|
|
170
|
+
const active = activationSnapshot.artifacts.get('');
|
|
171
|
+
publishCacheDatabase(root, lease, specification.path, candidateBytes, active === undefined
|
|
172
|
+
? undefined
|
|
173
|
+
: {
|
|
174
|
+
identity: active,
|
|
175
|
+
revision: computeByteRevision(readRegularFile(path, rootState.limits.maxTemporaryBytes)),
|
|
176
|
+
maxBytes: rootState.limits.maxTemporaryBytes,
|
|
177
|
+
}, options);
|
|
178
|
+
removeExactArtifacts(candidate, candidateSnapshot);
|
|
179
|
+
candidateSnapshot = undefined;
|
|
180
|
+
revalidateDirectories(activationSnapshot.parents);
|
|
181
|
+
syncDirectory(parent);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
let cleanupSafetyError;
|
|
185
|
+
if (database !== undefined && candidateSnapshot !== undefined) {
|
|
186
|
+
cleanupSafetyError = await closeDatabaseIfSafe(database, candidate, candidateSnapshot);
|
|
187
|
+
if (cleanupSafetyError === undefined) {
|
|
188
|
+
database = undefined;
|
|
189
|
+
candidateSnapshot = captureCacheState(candidate);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (database === undefined && candidateSnapshot !== undefined) {
|
|
193
|
+
try {
|
|
194
|
+
removeExactArtifacts(candidate, candidateSnapshot);
|
|
195
|
+
}
|
|
196
|
+
catch (cleanupError) {
|
|
197
|
+
cleanupSafetyError ??= cleanupError;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (cleanupSafetyError instanceof RepositoryStoreError)
|
|
201
|
+
throw cleanupSafetyError;
|
|
202
|
+
if (error instanceof RepositoryStoreError)
|
|
203
|
+
throw error;
|
|
204
|
+
throw new CacheSyncError('Disposable cache rebuild failed; canonical files remain committed.', 'CACHE_SYNC_FAILED', {
|
|
205
|
+
cause: error,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const opened = await openDisposableSqliteCache(root, lease, specification, options);
|
|
209
|
+
if (opened.state !== 'ready')
|
|
210
|
+
throw new CacheSyncError(`Activated cache failed verification: ${opened.reason}.`);
|
|
211
|
+
return opened;
|
|
212
|
+
}
|
|
213
|
+
export async function removeDisposableSqliteCache(root, lease, path, options = {}) {
|
|
214
|
+
assertLiveLease(root, lease);
|
|
215
|
+
checkControl(options);
|
|
216
|
+
assertCachePath(root, path);
|
|
217
|
+
recoverCachePublications(root, lease, options);
|
|
218
|
+
const absolute = requirePathState(path).absolutePath;
|
|
219
|
+
const snapshot = captureCacheState(absolute);
|
|
220
|
+
if (snapshot.artifacts.size === 0)
|
|
221
|
+
return;
|
|
222
|
+
checkControl(options);
|
|
223
|
+
removeExactArtifacts(absolute, snapshot);
|
|
224
|
+
syncDirectory(dirname(absolute));
|
|
225
|
+
}
|
|
226
|
+
function wrapGuardedStatement(statement, guarded) {
|
|
227
|
+
return {
|
|
228
|
+
run: (parameters) => guarded(() => statement.run(parameters)),
|
|
229
|
+
get: (parameters) => guarded(() => statement.get(parameters)),
|
|
230
|
+
all: (parameters, bounds) => guarded(() => statement.all(parameters, bounds)),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function bindConnectionToCandidate(database, path, maxBytes, snapshot, updateSnapshot) {
|
|
234
|
+
const guarded = async (operation) => {
|
|
235
|
+
const before = refreshBoundedCacheState(path, snapshot(), maxBytes);
|
|
236
|
+
updateSnapshot(before);
|
|
237
|
+
try {
|
|
238
|
+
return await operation();
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
const current = captureContinuousCacheState(path, before);
|
|
242
|
+
updateSnapshot(current);
|
|
243
|
+
assertCacheSize(current, maxBytes);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
return {
|
|
247
|
+
exec: (sql) => guarded(() => database.exec(sql)),
|
|
248
|
+
prepare: (sql) => guarded(async () => wrapGuardedStatement(await database.prepare(sql), guarded)),
|
|
249
|
+
async close() {
|
|
250
|
+
const before = captureContinuousCacheState(path, snapshot());
|
|
251
|
+
updateSnapshot(before);
|
|
252
|
+
await database.close();
|
|
253
|
+
updateSnapshot(captureContinuousCacheState(path, before));
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function bindConnectionToLease(root, lease, path, database) {
|
|
258
|
+
let openedState = captureCacheState(path);
|
|
259
|
+
const maxBytes = requireRootState(root).limits.maxTemporaryBytes;
|
|
260
|
+
const guarded = async (operation) => {
|
|
261
|
+
const pending = (async () => {
|
|
262
|
+
const before = refreshBoundedCacheState(path, openedState, maxBytes);
|
|
263
|
+
openedState = before;
|
|
264
|
+
assertLiveLease(root, lease);
|
|
265
|
+
try {
|
|
266
|
+
return await operation();
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
const current = captureContinuousCacheState(path, before);
|
|
270
|
+
openedState = current;
|
|
271
|
+
assertCacheSize(current, maxBytes);
|
|
272
|
+
}
|
|
273
|
+
})();
|
|
274
|
+
return trackLeaseOperation(lease, pending);
|
|
275
|
+
};
|
|
276
|
+
let closed = false;
|
|
277
|
+
return {
|
|
278
|
+
exec: (sql) => guarded(() => database.exec(sql)),
|
|
279
|
+
prepare: (sql) => guarded(async () => wrapGuardedStatement(await database.prepare(sql), guarded)),
|
|
280
|
+
async close() {
|
|
281
|
+
if (closed)
|
|
282
|
+
return;
|
|
283
|
+
closed = true;
|
|
284
|
+
revalidateCacheState(path, openedState);
|
|
285
|
+
await database.close();
|
|
286
|
+
revalidateCacheState(path, openedState);
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function captureCacheState(path) {
|
|
291
|
+
const parents = captureDirectories(dirname(path));
|
|
292
|
+
assertSafeArtifacts(path);
|
|
293
|
+
const artifacts = new Map();
|
|
294
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
295
|
+
const artifact = `${path}${suffix}`;
|
|
296
|
+
try {
|
|
297
|
+
artifacts.set(suffix, lstatSync(artifact));
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
if (!hasCode(error, 'ENOENT'))
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
revalidateDirectories(parents);
|
|
305
|
+
return { parents, artifacts };
|
|
306
|
+
}
|
|
307
|
+
function captureContinuousCacheState(path, expected) {
|
|
308
|
+
revalidateCacheState(path, expected);
|
|
309
|
+
const current = captureCacheState(path);
|
|
310
|
+
revalidateCacheState(path, expected);
|
|
311
|
+
return current;
|
|
312
|
+
}
|
|
313
|
+
function refreshBoundedCacheState(path, expected, maxBytes) {
|
|
314
|
+
const current = captureContinuousCacheState(path, expected);
|
|
315
|
+
assertCacheSize(current, maxBytes);
|
|
316
|
+
return current;
|
|
317
|
+
}
|
|
318
|
+
function revalidateCacheState(path, snapshot) {
|
|
319
|
+
revalidateDirectories(snapshot.parents);
|
|
320
|
+
for (const [suffix, previous] of snapshot.artifacts) {
|
|
321
|
+
const artifact = `${path}${suffix}`;
|
|
322
|
+
let current;
|
|
323
|
+
try {
|
|
324
|
+
current = lstatSync(artifact);
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (suffix !== '' && hasCode(error, 'ENOENT'))
|
|
328
|
+
continue;
|
|
329
|
+
throw new PathSafetyError(`Cache artifact changed during access: ${artifact}`, 'IDENTITY_CHANGED');
|
|
330
|
+
}
|
|
331
|
+
assertSafeRegular(current, artifact);
|
|
332
|
+
if (!sameIdentity(previous, current))
|
|
333
|
+
throw new PathSafetyError(`Cache artifact changed during access: ${artifact}`, 'IDENTITY_CHANGED');
|
|
334
|
+
}
|
|
335
|
+
assertSafeArtifacts(path);
|
|
336
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
337
|
+
if (snapshot.artifacts.has(suffix))
|
|
338
|
+
continue;
|
|
339
|
+
const artifact = `${path}${suffix}`;
|
|
340
|
+
try {
|
|
341
|
+
snapshot.artifacts.set(suffix, lstatSync(artifact));
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
if (!hasCode(error, 'ENOENT'))
|
|
345
|
+
throw error;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
revalidateDirectories(snapshot.parents);
|
|
349
|
+
}
|
|
350
|
+
function revalidateExactCacheState(path, snapshot) {
|
|
351
|
+
revalidateDirectories(snapshot.parents);
|
|
352
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
353
|
+
const previous = snapshot.artifacts.get(suffix);
|
|
354
|
+
try {
|
|
355
|
+
const current = lstatSync(`${path}${suffix}`);
|
|
356
|
+
if (previous === undefined)
|
|
357
|
+
throw new PathSafetyError(`Cache artifact appeared during access: ${path}${suffix}`);
|
|
358
|
+
assertSafeRegular(current, `${path}${suffix}`);
|
|
359
|
+
if (!sameIdentity(previous, current))
|
|
360
|
+
throw new PathSafetyError(`Cache artifact changed during access: ${path}${suffix}`, 'IDENTITY_CHANGED');
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
if (previous === undefined && hasCode(error, 'ENOENT'))
|
|
364
|
+
continue;
|
|
365
|
+
if (error instanceof RepositoryStoreError)
|
|
366
|
+
throw error;
|
|
367
|
+
throw new PathSafetyError(`Cache artifact changed during access: ${path}${suffix}`, 'IDENTITY_CHANGED');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
revalidateDirectories(snapshot.parents);
|
|
371
|
+
}
|
|
372
|
+
async function closeDatabaseIfSafe(database, path, snapshot) {
|
|
373
|
+
try {
|
|
374
|
+
revalidateCacheState(path, snapshot);
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
return error;
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
await database.close();
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
return error;
|
|
384
|
+
}
|
|
385
|
+
try {
|
|
386
|
+
revalidateCacheState(path, snapshot);
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
return error;
|
|
390
|
+
}
|
|
391
|
+
return undefined;
|
|
392
|
+
}
|
|
393
|
+
function removeExactSidecars(path, snapshot) {
|
|
394
|
+
revalidateExactCacheState(path, snapshot);
|
|
395
|
+
const remaining = new Map(snapshot.artifacts);
|
|
396
|
+
for (const suffix of ['-wal', '-shm']) {
|
|
397
|
+
const previous = remaining.get(suffix);
|
|
398
|
+
if (previous === undefined)
|
|
399
|
+
continue;
|
|
400
|
+
const artifact = `${path}${suffix}`;
|
|
401
|
+
const current = lstatSync(artifact);
|
|
402
|
+
assertSafeRegular(current, artifact);
|
|
403
|
+
if (!sameIdentity(previous, current))
|
|
404
|
+
throw new PathSafetyError(`Cache artifact changed during removal: ${artifact}`, 'IDENTITY_CHANGED');
|
|
405
|
+
const bytes = readRegularFile(artifact, requireArtifactBound(previous));
|
|
406
|
+
publishExactRegularFile(artifact, null, { identity: previous, revision: computeByteRevision(bytes), maxBytes: requireArtifactBound(previous) }, randomUUID());
|
|
407
|
+
remaining.delete(suffix);
|
|
408
|
+
}
|
|
409
|
+
const next = { parents: snapshot.parents, artifacts: remaining };
|
|
410
|
+
revalidateExactCacheState(path, next);
|
|
411
|
+
return next;
|
|
412
|
+
}
|
|
413
|
+
function removeExactArtifacts(path, snapshot) {
|
|
414
|
+
let remaining = removeExactSidecars(path, snapshot);
|
|
415
|
+
const database = remaining.artifacts.get('');
|
|
416
|
+
if (database !== undefined) {
|
|
417
|
+
const current = lstatSync(path);
|
|
418
|
+
assertSafeRegular(current, path);
|
|
419
|
+
if (!sameIdentity(database, current))
|
|
420
|
+
throw new PathSafetyError(`Cache candidate changed during cleanup: ${path}`, 'IDENTITY_CHANGED');
|
|
421
|
+
const bytes = readRegularFile(path, requireArtifactBound(database));
|
|
422
|
+
publishExactRegularFile(path, null, { identity: database, revision: computeByteRevision(bytes), maxBytes: requireArtifactBound(database) }, randomUUID());
|
|
423
|
+
remaining = { parents: remaining.parents, artifacts: new Map() };
|
|
424
|
+
}
|
|
425
|
+
revalidateExactCacheState(path, remaining);
|
|
426
|
+
}
|
|
427
|
+
async function verifyDatabase(root, database, specification, healthGuard) {
|
|
428
|
+
const bounds = {
|
|
429
|
+
maxRows: requireRootState(root).limits.maxQueryRows,
|
|
430
|
+
maxBytes: requireRootState(root).limits.maxQueryResultBytes,
|
|
431
|
+
};
|
|
432
|
+
const application = await (await database.prepare('PRAGMA application_id')).get();
|
|
433
|
+
if (application?.application_id !== specification.applicationId)
|
|
434
|
+
return 'wrong-application';
|
|
435
|
+
const schema = await (await database.prepare('PRAGMA user_version')).get();
|
|
436
|
+
if (schema?.user_version !== specification.schemaVersion)
|
|
437
|
+
return 'wrong-schema';
|
|
438
|
+
const integrity = await (await database.prepare('PRAGMA integrity_check')).all(undefined, bounds);
|
|
439
|
+
if (integrity.length !== 1 || integrity[0]?.integrity_check !== 'ok')
|
|
440
|
+
return 'failed-integrity';
|
|
441
|
+
let digest;
|
|
442
|
+
try {
|
|
443
|
+
digest = await (await database.prepare("SELECT value FROM neottia_repository_cache_meta WHERE key='canonical_digest'")).get();
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return 'contradictory';
|
|
447
|
+
}
|
|
448
|
+
if (digest?.value !== specification.canonicalDigest)
|
|
449
|
+
return 'stale-digest';
|
|
450
|
+
healthGuard?.beforeHealthCheck();
|
|
451
|
+
let healthError;
|
|
452
|
+
try {
|
|
453
|
+
await specification.healthCheck(database);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
healthError = error;
|
|
457
|
+
}
|
|
458
|
+
healthGuard?.afterHealthCheck();
|
|
459
|
+
if (healthError instanceof RepositoryStoreError &&
|
|
460
|
+
(healthError.code === 'ABORTED' || healthError.code === 'DEADLINE_EXCEEDED'))
|
|
461
|
+
throw healthError;
|
|
462
|
+
if (healthError !== undefined)
|
|
463
|
+
return 'contradictory';
|
|
464
|
+
return undefined;
|
|
465
|
+
}
|
|
466
|
+
function assertCachePath(root, path) {
|
|
467
|
+
if (!managedPathBelongsToRoot(root, path))
|
|
468
|
+
throw new PathSafetyError('Cache path belongs to a different managed root.');
|
|
469
|
+
if (path.relativePath.split('/').length === 0)
|
|
470
|
+
throw new PathSafetyError('Cache path must name a file.');
|
|
471
|
+
}
|
|
472
|
+
function assertSafeArtifacts(path) {
|
|
473
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
474
|
+
const artifact = `${path}${suffix}`;
|
|
475
|
+
try {
|
|
476
|
+
assertSafeRegular(lstatSync(artifact), artifact);
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
if (!hasCode(error, 'ENOENT'))
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function assertArtifactsAbsent(path) {
|
|
485
|
+
for (const suffix of ['', '-wal', '-shm'])
|
|
486
|
+
if (artifactExists(`${path}${suffix}`))
|
|
487
|
+
throw new PathSafetyError(`Cache candidate already exists: ${path}${suffix}`);
|
|
488
|
+
}
|
|
489
|
+
function artifactExists(path) {
|
|
490
|
+
try {
|
|
491
|
+
lstatSync(path);
|
|
492
|
+
return true;
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
if (hasCode(error, 'ENOENT'))
|
|
496
|
+
return false;
|
|
497
|
+
throw error;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function connectionLimits(root) {
|
|
501
|
+
const limits = requireRootState(root).limits;
|
|
502
|
+
return {
|
|
503
|
+
maxSqlBytes: limits.maxSqlBytes,
|
|
504
|
+
maxStatementParameterBytes: limits.maxStatementParameterBytes,
|
|
505
|
+
maxQueryRows: limits.maxQueryRows,
|
|
506
|
+
maxQueryResultBytes: limits.maxQueryResultBytes,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
function assertCacheSize(snapshot, maxBytes) {
|
|
510
|
+
let total = 0;
|
|
511
|
+
for (const stat of snapshot.artifacts.values()) {
|
|
512
|
+
total += stat.size;
|
|
513
|
+
if (!Number.isSafeInteger(total) || total > maxBytes)
|
|
514
|
+
throw new ResourceLimitError('Disposable cache candidate exceeds maxTemporaryBytes.');
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
function requireArtifactBound(stat) {
|
|
518
|
+
if (!Number.isSafeInteger(stat.size) || stat.size < 0)
|
|
519
|
+
throw new PathSafetyError('Cache artifact has an invalid size.', 'IDENTITY_CHANGED');
|
|
520
|
+
return stat.size;
|
|
521
|
+
}
|
|
522
|
+
function integer(value, name) {
|
|
523
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
524
|
+
throw new CacheSyncError(`${name} must be a nonnegative integer.`);
|
|
525
|
+
return value;
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sqlite/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sqlite/node.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,sCAG5B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createSqliteAdapter } from './adapter.js';
|
|
2
|
+
export const nodeSqliteAdapter = createSqliteAdapter('node', async (path, readOnly) => {
|
|
3
|
+
const sqlite = await import('node:sqlite');
|
|
4
|
+
return new sqlite.DatabaseSync(path, { readOnly });
|
|
5
|
+
});
|
|
6
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/sqlite/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,cAAc,CAAC;AAGxE,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IACpF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3C,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAA8B,CAAC;AAClF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/sqlite/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAEjF;AAGD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAelE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { UnsupportedRuntimeError } from '../errors.js';
|
|
2
|
+
let testAdapter;
|
|
3
|
+
export function setSqliteAdapterForTests(adapter) {
|
|
4
|
+
testAdapter = adapter;
|
|
5
|
+
}
|
|
6
|
+
export async function selectSqliteAdapter() {
|
|
7
|
+
if (testAdapter !== undefined)
|
|
8
|
+
return testAdapter;
|
|
9
|
+
if (typeof Bun !== 'undefined') {
|
|
10
|
+
if (!atLeast(Bun.version, [1, 3, 13]))
|
|
11
|
+
throw new UnsupportedRuntimeError(`bun:sqlite requires Bun >=1.3.13; current version is ${Bun.version}.`);
|
|
12
|
+
return (await import('./bun.js')).bunSqliteAdapter;
|
|
13
|
+
}
|
|
14
|
+
if (typeof process !== 'undefined' && process.versions?.node !== undefined) {
|
|
15
|
+
if (!supportedNode(process.versions.node))
|
|
16
|
+
throw new UnsupportedRuntimeError(`node:sqlite requires Node >=22.16.0; current version is ${process.versions.node}.`);
|
|
17
|
+
return (await import('./node.js')).nodeSqliteAdapter;
|
|
18
|
+
}
|
|
19
|
+
throw new UnsupportedRuntimeError('SQLite cache requires Node >=22.16.0 or Bun >=1.3.13.');
|
|
20
|
+
}
|
|
21
|
+
function supportedNode(version) {
|
|
22
|
+
return atLeast(version, [22, 16, 0]);
|
|
23
|
+
}
|
|
24
|
+
function atLeast(version, minimum) {
|
|
25
|
+
const parts = version.split('.').map(Number);
|
|
26
|
+
for (let index = 0; index < minimum.length; index += 1) {
|
|
27
|
+
const actual = parts[index] ?? 0;
|
|
28
|
+
const required = minimum[index] ?? 0;
|
|
29
|
+
if (actual !== required)
|
|
30
|
+
return actual > required;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/sqlite/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAGvD,IAAI,WAAsC,CAAC;AAG3C,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,IAAI,uBAAuB,CAAC,wDAAwD,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5G,OAAO,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3E,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvC,MAAM,IAAI,uBAAuB,CAC/B,2DAA2D,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CACpF,CAAC;QACJ,OAAO,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACvD,CAAC;IACD,MAAM,IAAI,uBAAuB,CAAC,uDAAuD,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,OAA0C;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,GAAG,QAAQ,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { FILESYSTEM_FAULT_EVENTS, LEASE_FAULT_EVENTS, TRANSACTION_FAULT_EVENTS, setFilesystemFaultInjectorForTests, setLeaseFaultInjectorForTests, setTransactionFaultInjectorForTests, type FilesystemFaultEvent, type LeaseFaultEvent, type TransactionFaultEvent, } from './internal/fault-injection.js';
|
|
2
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kCAAkC,EAClC,6BAA6B,EAC7B,mCAAmC,EACnC,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,+BAA+B,CAAC"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,kCAAkC,EAClC,6BAA6B,EAC7B,mCAAmC,GAIpC,MAAM,+BAA+B,CAAC"}
|