@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.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/binding.gyp +9 -0
  4. package/dist/errors.d.ts +43 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +69 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/files.d.ts +19 -0
  9. package/dist/files.d.ts.map +1 -0
  10. package/dist/files.js +113 -0
  11. package/dist/files.js.map +1 -0
  12. package/dist/index.d.ts +14 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +11 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/internal/fault-injection.d.ts +13 -0
  17. package/dist/internal/fault-injection.d.ts.map +1 -0
  18. package/dist/internal/fault-injection.js +68 -0
  19. package/dist/internal/fault-injection.js.map +1 -0
  20. package/dist/internal/filesystem.d.ts +25 -0
  21. package/dist/internal/filesystem.d.ts.map +1 -0
  22. package/dist/internal/filesystem.js +199 -0
  23. package/dist/internal/filesystem.js.map +1 -0
  24. package/dist/internal/model.d.ts +43 -0
  25. package/dist/internal/model.d.ts.map +1 -0
  26. package/dist/internal/model.js +49 -0
  27. package/dist/internal/model.js.map +1 -0
  28. package/dist/internal/native-publication.d.ts +9 -0
  29. package/dist/internal/native-publication.d.ts.map +1 -0
  30. package/dist/internal/native-publication.js +65 -0
  31. package/dist/internal/native-publication.js.map +1 -0
  32. package/dist/internal/publication.d.ts +10 -0
  33. package/dist/internal/publication.d.ts.map +1 -0
  34. package/dist/internal/publication.js +223 -0
  35. package/dist/internal/publication.js.map +1 -0
  36. package/dist/lease.d.ts +24 -0
  37. package/dist/lease.d.ts.map +1 -0
  38. package/dist/lease.js +932 -0
  39. package/dist/lease.js.map +1 -0
  40. package/dist/limits.d.ts +15 -0
  41. package/dist/limits.d.ts.map +1 -0
  42. package/dist/limits.js +14 -0
  43. package/dist/limits.js.map +1 -0
  44. package/dist/paths.d.ts +15 -0
  45. package/dist/paths.d.ts.map +1 -0
  46. package/dist/paths.js +58 -0
  47. package/dist/paths.js.map +1 -0
  48. package/dist/revision.d.ts +4 -0
  49. package/dist/revision.d.ts.map +1 -0
  50. package/dist/revision.js +8 -0
  51. package/dist/revision.js.map +1 -0
  52. package/dist/sqlite/adapter.d.ts +48 -0
  53. package/dist/sqlite/adapter.d.ts.map +1 -0
  54. package/dist/sqlite/adapter.js +183 -0
  55. package/dist/sqlite/adapter.js.map +1 -0
  56. package/dist/sqlite/bun.d.ts +2 -0
  57. package/dist/sqlite/bun.d.ts.map +1 -0
  58. package/dist/sqlite/bun.js +7 -0
  59. package/dist/sqlite/bun.js.map +1 -0
  60. package/dist/sqlite/cache-publication.d.ts +6 -0
  61. package/dist/sqlite/cache-publication.d.ts.map +1 -0
  62. package/dist/sqlite/cache-publication.js +191 -0
  63. package/dist/sqlite/cache-publication.js.map +1 -0
  64. package/dist/sqlite/cache.d.ts +26 -0
  65. package/dist/sqlite/cache.d.ts.map +1 -0
  66. package/dist/sqlite/cache.js +527 -0
  67. package/dist/sqlite/cache.js.map +1 -0
  68. package/dist/sqlite/node.d.ts +2 -0
  69. package/dist/sqlite/node.d.ts.map +1 -0
  70. package/dist/sqlite/node.js +6 -0
  71. package/dist/sqlite/node.js.map +1 -0
  72. package/dist/sqlite/runtime.d.ts +4 -0
  73. package/dist/sqlite/runtime.d.ts.map +1 -0
  74. package/dist/sqlite/runtime.js +34 -0
  75. package/dist/sqlite/runtime.js.map +1 -0
  76. package/dist/testing.d.ts +2 -0
  77. package/dist/testing.d.ts.map +1 -0
  78. package/dist/testing.js +2 -0
  79. package/dist/testing.js.map +1 -0
  80. package/dist/transaction/apply.d.ts +8 -0
  81. package/dist/transaction/apply.d.ts.map +1 -0
  82. package/dist/transaction/apply.js +273 -0
  83. package/dist/transaction/apply.js.map +1 -0
  84. package/dist/transaction/journal.d.ts +17 -0
  85. package/dist/transaction/journal.d.ts.map +1 -0
  86. package/dist/transaction/journal.js +207 -0
  87. package/dist/transaction/journal.js.map +1 -0
  88. package/dist/transaction/recovery.d.ts +6 -0
  89. package/dist/transaction/recovery.d.ts.map +1 -0
  90. package/dist/transaction/recovery.js +138 -0
  91. package/dist/transaction/recovery.js.map +1 -0
  92. package/dist/transaction/types.d.ts +45 -0
  93. package/dist/transaction/types.d.ts.map +1 -0
  94. package/dist/transaction/types.js +2 -0
  95. package/dist/transaction/types.js.map +1 -0
  96. package/native/rename_noreplace.cc +145 -0
  97. package/package.json +71 -0
  98. package/scripts/install-native.mjs +10 -0
@@ -0,0 +1,8 @@
1
+ import type { ApplyCanonicalBatchOptions, CanonicalOperation } from './types.js';
2
+ import { type ManagedRoot, type RepositoryLease } from '../internal/model.js';
3
+ import { type ExpectedRegularFile } from '../internal/publication.js';
4
+ export declare function applyCanonicalBatch(root: ManagedRoot, lease: RepositoryLease, operations: readonly CanonicalOperation[], options?: ApplyCanonicalBatchOptions): Promise<{
5
+ transactionId: string;
6
+ }>;
7
+ export declare function publishTransition(path: string, bytes: Uint8Array | null, token: string, expected?: ExpectedRegularFile): void;
8
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/transaction/apply.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,0BAA0B,EAAE,kBAAkB,EAAiC,MAAM,YAAY,CAAC;AAGhH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAY/F,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,SAAS,kBAAkB,EAAE,EACzC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA+HpC;AAyJD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,mBAAmB,GAC7B,IAAI,CAEN"}
@@ -0,0 +1,273 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { lstatSync, readdirSync, renameSync, rmSync, rmdirSync } from 'node:fs';
3
+ import { join, relative } from 'node:path';
4
+ import { PathSafetyError, RecoveryError, ResourceLimitError, StaleRevisionError } from '../errors.js';
5
+ import { assertPathAuthority, readManagedFileIfExists } from '../files.js';
6
+ import { cleanupJournal, createTransactionDirectory, manifestDigest, transactionRoot, writeDurableFile, } from './journal.js';
7
+ import { recoverActiveDirectory } from './recovery.js';
8
+ import { emitTransactionFault } from '../internal/fault-injection.js';
9
+ import { assertSafeRegular, hasCode, syncDirectory } from '../internal/filesystem.js';
10
+ import { requirePathState, requireRootState, } from '../internal/model.js';
11
+ import { publishExactRegularFile } from '../internal/publication.js';
12
+ import { assertLiveLease, checkControl } from '../lease.js';
13
+ import { compareCanonicalPaths, portablePathKey } from '../paths.js';
14
+ import { computeByteRevision } from '../revision.js';
15
+ export async function applyCanonicalBatch(root, lease, operations, options = {}) {
16
+ assertLiveLease(root, lease);
17
+ checkControl(options);
18
+ const ownedOperations = snapshotOperations(operations);
19
+ const state = requireRootState(root);
20
+ if (ownedOperations.length === 0)
21
+ return { transactionId: randomBytes(32).toString('hex') };
22
+ if (ownedOperations.length > state.limits.maxBatchPaths)
23
+ throw new ResourceLimitError('Canonical batch exceeds maxBatchPaths.');
24
+ const transitions = await normalizeOperations(root, lease, ownedOperations, options);
25
+ if (transitions.length > state.limits.maxBatchPaths)
26
+ throw new ResourceLimitError('Canonical batch exceeds maxBatchPaths after move normalization.');
27
+ await validateProposedInventory(root, transitions, options.inventory);
28
+ const transactionId = randomBytes(32).toString('hex');
29
+ const transactions = transactionRoot(state.authorityRoot, state.managedRootId);
30
+ const prepare = join(transactions, `${transactionId}.prepare`);
31
+ const active = join(transactions, `${transactionId}.active`);
32
+ const committed = join(transactions, `${transactionId}.committed`);
33
+ createTransactionDirectory(prepare);
34
+ syncDirectory(transactions);
35
+ emitTransactionFault('prepare-directory-created');
36
+ let stateDirectory = prepare;
37
+ try {
38
+ const entries = [];
39
+ let beforeBytes = 0;
40
+ let temporaryBytes = 0;
41
+ for (const [index, transition] of transitions.entries()) {
42
+ checkControl(options);
43
+ const beforeArtifact = transition.original === null ? null : `${index}-${transactionId}.before`;
44
+ const stagedArtifact = transition.intended === null ? null : `${index}-${transactionId}.stage`;
45
+ if (transition.original !== null) {
46
+ beforeBytes += transition.original.byteLength;
47
+ if (beforeBytes > state.limits.maxBeforeImageBytes)
48
+ throw new ResourceLimitError('Canonical batch exceeds maxBeforeImageBytes.');
49
+ writeDurableFile(join(prepare, beforeArtifact), transition.original);
50
+ emitTransactionFault('before-image-written');
51
+ }
52
+ if (transition.intended !== null) {
53
+ temporaryBytes += transition.intended.byteLength;
54
+ if (temporaryBytes > state.limits.maxTemporaryBytes)
55
+ throw new ResourceLimitError('Canonical batch exceeds maxTemporaryBytes.');
56
+ writeDurableFile(join(prepare, stagedArtifact), transition.intended);
57
+ emitTransactionFault('staged-artifact-written');
58
+ }
59
+ entries.push({
60
+ path: transition.path.relativePath,
61
+ originalRevision: transition.original === null ? null : computeByteRevision(transition.original),
62
+ intendedRevision: transition.intended === null ? null : computeByteRevision(transition.intended),
63
+ beforeArtifact,
64
+ stagedArtifact,
65
+ bytes: transition.intended?.byteLength ?? 0,
66
+ });
67
+ }
68
+ const unsigned = {
69
+ version: 1,
70
+ transactionId,
71
+ authorityId: state.authorityId,
72
+ managedRootId: state.managedRootId,
73
+ entries,
74
+ createdAt: new Date().toISOString(),
75
+ };
76
+ const manifest = { ...unsigned, digest: manifestDigest(unsigned) };
77
+ const manifestBytes = Buffer.from(`${JSON.stringify(manifest)}\n`);
78
+ if (manifestBytes.byteLength > state.limits.maxJournalBytes)
79
+ throw new ResourceLimitError('Canonical transaction manifest exceeds maxJournalBytes.');
80
+ writeDurableFile(join(prepare, 'manifest.json'), manifestBytes);
81
+ emitTransactionFault('manifest-written');
82
+ syncDirectory(prepare);
83
+ emitTransactionFault('prepare-directory-synced');
84
+ renameSync(prepare, active);
85
+ stateDirectory = active;
86
+ emitTransactionFault('active-state-renamed');
87
+ syncDirectory(transactions);
88
+ emitTransactionFault('active-state-synced');
89
+ for (const transition of transitions) {
90
+ checkControl(options);
91
+ const expected = await verifyCurrent(root, lease, transition.path, transition.original, options);
92
+ publishTransition(requirePathState(transition.path).absolutePath, transition.intended, transactionId, expected);
93
+ emitTransactionFault('canonical-path-published');
94
+ }
95
+ for (const transition of transitions)
96
+ await verifyCurrent(root, lease, transition.path, transition.intended, options, true);
97
+ renameSync(active, committed);
98
+ stateDirectory = committed;
99
+ emitTransactionFault('committed-state-renamed');
100
+ syncDirectory(transactions);
101
+ emitTransactionFault('committed-state-synced');
102
+ try {
103
+ const cleanup = join(transactions, `${transactionId}.cleanup`);
104
+ renameSync(committed, cleanup);
105
+ emitTransactionFault('cleanup-state-renamed');
106
+ syncDirectory(transactions);
107
+ emitTransactionFault('cleanup-state-synced');
108
+ cleanupJournal(cleanup, manifest);
109
+ }
110
+ catch {
111
+ }
112
+ return { transactionId };
113
+ }
114
+ catch (error) {
115
+ if (stateDirectory === active) {
116
+ try {
117
+ await recoverActiveDirectory(root, lease, active, {});
118
+ }
119
+ catch (rollbackError) {
120
+ throw new RecoveryError('Canonical publication failed and durable rollback could not complete.', 'RECOVERY_AMBIGUOUS', { transactionId }, { cause: rollbackError });
121
+ }
122
+ }
123
+ else if (stateDirectory === prepare) {
124
+ try {
125
+ removePreparationArtifacts(prepare, transactionId);
126
+ }
127
+ catch {
128
+ }
129
+ }
130
+ throw error;
131
+ }
132
+ }
133
+ function snapshotOperations(operations) {
134
+ return operations.map((operation) => operation.kind === 'write' ? { ...operation, bytes: Uint8Array.from(operation.bytes) } : operation);
135
+ }
136
+ async function normalizeOperations(root, lease, operations, options) {
137
+ const transitions = new Map();
138
+ const add = (transition) => {
139
+ assertPathAuthority(root, transition.path);
140
+ const key = portablePathKey(transition.path.relativePath);
141
+ if (transitions.has(key))
142
+ throw new PathSafetyError('Canonical batch contains duplicate/colliding paths.', 'PATH_COLLISION');
143
+ transitions.set(key, transition);
144
+ };
145
+ for (const operation of operations) {
146
+ checkControl(options);
147
+ if (operation.kind === 'write') {
148
+ const current = await readManagedFileIfExists(root, lease, operation.path, options);
149
+ assertExpected(operation.path, current?.revision, operation.expected);
150
+ if (operation.bytes.byteLength > requireRootState(root).limits.maxFileBytes)
151
+ throw new ResourceLimitError(`Canonical file exceeds maxFileBytes: ${operation.path.relativePath}`);
152
+ add({ path: operation.path, original: current?.bytes ?? null, intended: operation.bytes });
153
+ }
154
+ else if (operation.kind === 'remove') {
155
+ const current = await readManagedFileIfExists(root, lease, operation.path, options);
156
+ assertExpected(operation.path, current?.revision, operation.expected);
157
+ add({ path: operation.path, original: current?.bytes ?? null, intended: null });
158
+ }
159
+ else {
160
+ if (operation.from.relativePath === operation.to.relativePath)
161
+ throw new PathSafetyError('Canonical move source and destination must differ.');
162
+ const source = await readManagedFileIfExists(root, lease, operation.from, options);
163
+ const destination = await readManagedFileIfExists(root, lease, operation.to, options);
164
+ assertExpected(operation.from, source?.revision, operation.expectedSource);
165
+ assertExpected(operation.to, destination?.revision, operation.expectedDestination);
166
+ add({ path: operation.from, original: source?.bytes ?? null, intended: null });
167
+ add({ path: operation.to, original: destination?.bytes ?? null, intended: source?.bytes ?? null });
168
+ }
169
+ }
170
+ return [...transitions.values()].sort((left, right) => compareCanonicalPaths(left.path.relativePath, right.path.relativePath));
171
+ }
172
+ function assertExpected(path, actual, expected) {
173
+ if ((expected === 'absent' && actual === undefined) || expected === actual)
174
+ return;
175
+ throw new StaleRevisionError(`Canonical revision mismatch: ${path.relativePath}`, { expected, actual });
176
+ }
177
+ async function validateProposedInventory(root, transitions, inventoryRoots) {
178
+ const state = requireRootState(root);
179
+ const inventory = new Map();
180
+ if (inventoryRoots === undefined) {
181
+ inventoryWalk(state.managedRoot, state.managedRoot, inventory, state.authorityRoot === state.managedRoot);
182
+ }
183
+ else {
184
+ for (const inventoryRoot of inventoryRoots) {
185
+ assertPathAuthority(root, inventoryRoot);
186
+ inventoryWalk(requirePathState(inventoryRoot).absolutePath, state.managedRoot, inventory, false);
187
+ }
188
+ }
189
+ for (const transition of transitions) {
190
+ const key = portablePathKey(transition.path.relativePath);
191
+ const existing = inventory.get(key);
192
+ if (existing !== undefined && existing.path !== transition.path.relativePath)
193
+ throw new PathSafetyError(`Portable catalog collision: ${existing.path} and ${transition.path.relativePath}`, 'PATH_COLLISION');
194
+ inventory.delete(key);
195
+ if (transition.intended !== null)
196
+ inventory.set(key, { path: transition.path.relativePath, bytes: transition.intended.byteLength });
197
+ }
198
+ const values = [...inventory.values()];
199
+ const paths = new Set();
200
+ for (const item of values) {
201
+ const key = portablePathKey(item.path);
202
+ if (paths.has(key))
203
+ throw new PathSafetyError(`Portable catalog collision: ${item.path}`, 'PATH_COLLISION');
204
+ paths.add(key);
205
+ }
206
+ if (values.length > state.limits.maxFiles)
207
+ throw new ResourceLimitError('Resulting canonical file count exceeds limit.');
208
+ if (values.reduce((sum, item) => sum + item.bytes, 0) > state.limits.maxTotalBytes)
209
+ throw new ResourceLimitError('Resulting canonical byte count exceeds limit.');
210
+ }
211
+ function inventoryWalk(absolute, root, output, skipControl) {
212
+ let entries;
213
+ try {
214
+ entries = readdirSync(absolute, { withFileTypes: true });
215
+ }
216
+ catch (error) {
217
+ if (hasCode(error, 'ENOENT'))
218
+ return;
219
+ throw error;
220
+ }
221
+ for (const entry of entries) {
222
+ const path = join(absolute, entry.name);
223
+ const relativePath = relative(root, path).split('\\').join('/');
224
+ if (skipControl && relativePath === '.neottia/repository-store')
225
+ continue;
226
+ const stat = lstatSync(path);
227
+ if (stat.isSymbolicLink())
228
+ throw new PathSafetyError(`Symbolic link in managed catalog: ${path}`, 'UNSAFE_LINK');
229
+ if (stat.isDirectory()) {
230
+ inventoryWalk(path, root, output, skipControl);
231
+ continue;
232
+ }
233
+ assertSafeRegular(stat, path);
234
+ const key = portablePathKey(relativePath);
235
+ const previous = output.get(key);
236
+ if (previous !== undefined && previous.path !== relativePath)
237
+ throw new PathSafetyError(`Portable catalog collision: ${previous.path} and ${relativePath}`, 'PATH_COLLISION');
238
+ output.set(key, { path: relativePath, bytes: stat.size });
239
+ }
240
+ }
241
+ async function verifyCurrent(root, lease, path, expected, options, recoveryVerification = false) {
242
+ const current = await readManagedFileIfExists(root, lease, path, options);
243
+ const actualRevision = current?.revision;
244
+ const expectedRevision = expected === null ? undefined : computeByteRevision(expected);
245
+ if (actualRevision !== expectedRevision) {
246
+ if (recoveryVerification)
247
+ throw new RecoveryError('Published canonical revision does not match intended bytes.', 'RECOVERY_AMBIGUOUS', {
248
+ path: path.relativePath,
249
+ });
250
+ throw new StaleRevisionError(`Canonical path changed during publication: ${path.relativePath}`);
251
+ }
252
+ if (current === undefined)
253
+ return undefined;
254
+ const absolute = requirePathState(path).absolutePath;
255
+ const identity = lstatSync(absolute);
256
+ assertSafeRegular(identity, absolute);
257
+ return { identity, revision: current.revision, maxBytes: requireRootState(root).limits.maxFileBytes };
258
+ }
259
+ export function publishTransition(path, bytes, token, expected) {
260
+ publishExactRegularFile(path, bytes, expected, token);
261
+ }
262
+ function removePreparationArtifacts(directory, token) {
263
+ const entries = readdirSync(directory);
264
+ for (const entry of entries) {
265
+ if (entry !== 'manifest.json' && !new RegExp(`^[0-9]+-${token}\\.(?:before|stage)$`, 'u').test(entry))
266
+ return;
267
+ assertSafeRegular(lstatSync(join(directory, entry)), join(directory, entry));
268
+ }
269
+ for (const entry of entries)
270
+ rmSync(join(directory, entry));
271
+ rmdirSync(directory);
272
+ }
273
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/transaction/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { JournalManifest } from './types.js';
2
+ export declare function transactionRoot(authorityRoot: string, managedRootId: string): string;
3
+ export declare function writeDurableFile(path: string, bytes: Uint8Array): void;
4
+ export declare function manifestDigest(manifest: Omit<JournalManifest, 'digest'>): string;
5
+ export declare function readManifest(directory: string, maxJournalBytes: number): JournalManifest;
6
+ export declare function cleanupJournal(directory: string, manifest: JournalManifest): void;
7
+ export declare function cleanupIncompleteJournal(directory: string, transactionId: string, limits: {
8
+ readonly maxJournalBytes: number;
9
+ readonly maxArtifactBytes: number;
10
+ }): void;
11
+ export declare function validateArtifacts(directory: string, manifest: JournalManifest, limits: {
12
+ readonly maxBeforeImageBytes: number;
13
+ readonly maxTemporaryBytes: number;
14
+ }): void;
15
+ export declare function readArtifact(directory: string, name: string, maxBytes: number): Uint8Array;
16
+ export declare function createTransactionDirectory(path: string): void;
17
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/transaction/journal.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,YAAY,CAAC;AAGhE,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAKpF;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAStE;AAGD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,MAAM,CAEhF;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,eAAe,CAkBxF;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CA2BjF;AAGD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;IAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,GAC9E,IAAI,CAuBN;AAGD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE;IAAE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GACnF,IAAI,CAqBN;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAI1F;AAGD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,207 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { closeSync, constants as fsConstants, lstatSync, mkdirSync, openSync, readdirSync, rmSync, rmdirSync, writeFileSync, } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { RecoveryError, ResourceLimitError } from '../errors.js';
5
+ import { emitTransactionFault } from '../internal/fault-injection.js';
6
+ import { assertSafeRegular, ensurePrivateDirectory, readRegularFile, syncDirectory, syncFileDescriptor, } from '../internal/filesystem.js';
7
+ import { compareCanonicalPaths } from '../paths.js';
8
+ import { isByteRevision } from '../revision.js';
9
+ export function transactionRoot(authorityRoot, managedRootId) {
10
+ if (!/^[0-9a-f]{64}$/u.test(managedRootId))
11
+ throw malformed('Managed-root transaction identity is invalid.');
12
+ const path = join(authorityRoot, '.neottia', 'repository-store', 'transactions', managedRootId);
13
+ ensurePrivateDirectory(path);
14
+ return path;
15
+ }
16
+ export function writeDurableFile(path, bytes) {
17
+ let descriptor;
18
+ try {
19
+ descriptor = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL, 0o600);
20
+ writeFileSync(descriptor, bytes);
21
+ syncFileDescriptor(descriptor, path);
22
+ }
23
+ finally {
24
+ if (descriptor !== undefined)
25
+ closeSync(descriptor);
26
+ }
27
+ }
28
+ export function manifestDigest(manifest) {
29
+ return createHash('sha256').update(JSON.stringify(manifest)).digest('hex');
30
+ }
31
+ export function readManifest(directory, maxJournalBytes) {
32
+ const path = join(directory, 'manifest.json');
33
+ const stat = lstatSync(path);
34
+ assertSafeRegular(stat, path);
35
+ if (stat.size > maxJournalBytes)
36
+ throw malformed('Transaction manifest exceeds maxJournalBytes.');
37
+ let value;
38
+ try {
39
+ value = JSON.parse(new TextDecoder().decode(readRegularFile(path, maxJournalBytes)));
40
+ }
41
+ catch (error) {
42
+ throw malformed('Transaction manifest is not valid JSON.', error);
43
+ }
44
+ if (!isManifest(value))
45
+ throw malformed('Transaction manifest has an invalid schema.');
46
+ const { digest, ...unsigned } = value;
47
+ if (manifestDigest(unsigned) !== digest)
48
+ throw malformed('Transaction manifest digest does not match.');
49
+ const sorted = [...value.entries].sort((left, right) => compareCanonicalPaths(left.path, right.path));
50
+ if (sorted.some((entry, index) => entry.path !== value.entries[index]?.path))
51
+ throw malformed('Transaction manifest entries are not canonically sorted.');
52
+ return value;
53
+ }
54
+ export function cleanupJournal(directory, manifest) {
55
+ const expected = new Set(['manifest.json']);
56
+ for (const entry of manifest.entries)
57
+ for (const artifact of [entry.beforeArtifact, entry.stagedArtifact])
58
+ if (artifact !== null)
59
+ expected.add(artifact);
60
+ const actual = readdirSync(directory);
61
+ if (actual.some((name) => !expected.has(name)))
62
+ throw malformed('Transaction directory contains unowned artifacts.');
63
+ for (const entry of manifest.entries) {
64
+ for (const artifact of [entry.beforeArtifact, entry.stagedArtifact]) {
65
+ if (artifact === null)
66
+ continue;
67
+ assertArtifactName(artifact, manifest.transactionId);
68
+ const path = join(directory, artifact);
69
+ try {
70
+ const stat = lstatSync(path);
71
+ assertSafeRegular(stat, path);
72
+ rmSync(path);
73
+ emitTransactionFault('cleanup-artifact-removed');
74
+ }
75
+ catch (error) {
76
+ if (!isMissing(error))
77
+ throw error;
78
+ }
79
+ }
80
+ }
81
+ removeRegularIfPresent(join(directory, 'manifest.json'));
82
+ emitTransactionFault('cleanup-manifest-removed');
83
+ rmdirSync(directory);
84
+ emitTransactionFault('cleanup-directory-removed');
85
+ syncDirectory(join(directory, '..'));
86
+ emitTransactionFault('cleanup-root-synced');
87
+ }
88
+ export function cleanupIncompleteJournal(directory, transactionId, limits) {
89
+ const entries = readdirSync(directory);
90
+ for (const entry of entries) {
91
+ const path = join(directory, entry);
92
+ const stat = lstatSync(path);
93
+ assertSafeRegular(stat, path);
94
+ if (entry === 'manifest.json') {
95
+ if (stat.size > limits.maxJournalBytes)
96
+ throw malformed('Incomplete transaction manifest exceeds its bound.');
97
+ }
98
+ else {
99
+ assertArtifactName(entry, transactionId);
100
+ if (stat.size > limits.maxArtifactBytes)
101
+ throw malformed('Incomplete transaction artifact exceeds its bound.');
102
+ }
103
+ }
104
+ for (const entry of entries.filter((name) => name !== 'manifest.json')) {
105
+ rmSync(join(directory, entry));
106
+ emitTransactionFault('cleanup-artifact-removed');
107
+ }
108
+ removeRegularIfPresent(join(directory, 'manifest.json'));
109
+ emitTransactionFault('cleanup-manifest-removed');
110
+ rmdirSync(directory);
111
+ emitTransactionFault('cleanup-directory-removed');
112
+ syncDirectory(join(directory, '..'));
113
+ emitTransactionFault('cleanup-root-synced');
114
+ }
115
+ export function validateArtifacts(directory, manifest, limits) {
116
+ let beforeBytes = 0;
117
+ let stagedBytes = 0;
118
+ for (const entry of manifest.entries) {
119
+ if (entry.beforeArtifact !== null) {
120
+ assertArtifactName(entry.beforeArtifact, manifest.transactionId);
121
+ const bytes = readArtifact(directory, entry.beforeArtifact, limits.maxBeforeImageBytes);
122
+ beforeBytes += bytes.byteLength;
123
+ if (revision(bytes) !== entry.originalRevision)
124
+ throw malformed('Before-image revision does not match manifest.');
125
+ }
126
+ if (entry.stagedArtifact !== null) {
127
+ assertArtifactName(entry.stagedArtifact, manifest.transactionId);
128
+ const bytes = readArtifact(directory, entry.stagedArtifact, limits.maxTemporaryBytes);
129
+ stagedBytes += bytes.byteLength;
130
+ if (revision(bytes) !== entry.intendedRevision)
131
+ throw malformed('Staged revision does not match manifest.');
132
+ }
133
+ }
134
+ if (beforeBytes > limits.maxBeforeImageBytes)
135
+ throw new ResourceLimitError('Transaction before-images exceed configured bound.');
136
+ if (stagedBytes > limits.maxTemporaryBytes)
137
+ throw new ResourceLimitError('Transaction staged artifacts exceed configured bound.');
138
+ }
139
+ export function readArtifact(directory, name, maxBytes) {
140
+ assertArtifactName(name, directory.split(/[\\/]/u).at(-1)?.split('.')[0] ?? '');
141
+ const path = join(directory, name);
142
+ return readRegularFile(path, maxBytes);
143
+ }
144
+ export function createTransactionDirectory(path) {
145
+ mkdirSync(path, { mode: 0o700 });
146
+ }
147
+ function isManifest(value) {
148
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
149
+ return false;
150
+ const candidate = value;
151
+ if (candidate.version !== 1 ||
152
+ typeof candidate.transactionId !== 'string' ||
153
+ !/^[0-9a-f]{64}$/u.test(candidate.transactionId) ||
154
+ typeof candidate.authorityId !== 'string' ||
155
+ !/^[0-9a-f]{64}$/u.test(candidate.authorityId) ||
156
+ typeof candidate.managedRootId !== 'string' ||
157
+ !/^[0-9a-f]{64}$/u.test(candidate.managedRootId) ||
158
+ typeof candidate.createdAt !== 'string' ||
159
+ typeof candidate.digest !== 'string' ||
160
+ !/^[0-9a-f]{64}$/u.test(candidate.digest) ||
161
+ !Array.isArray(candidate.entries))
162
+ return false;
163
+ const paths = new Set();
164
+ for (const entry of candidate.entries) {
165
+ if (!isEntry(entry) || paths.has(entry.path))
166
+ return false;
167
+ paths.add(entry.path);
168
+ }
169
+ return true;
170
+ }
171
+ function isEntry(value) {
172
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
173
+ return false;
174
+ const entry = value;
175
+ return (typeof entry.path === 'string' &&
176
+ (entry.originalRevision === null || isByteRevision(entry.originalRevision)) &&
177
+ (entry.intendedRevision === null || isByteRevision(entry.intendedRevision)) &&
178
+ (entry.beforeArtifact === null || typeof entry.beforeArtifact === 'string') &&
179
+ (entry.stagedArtifact === null || typeof entry.stagedArtifact === 'string') &&
180
+ Number.isSafeInteger(entry.bytes) &&
181
+ (entry.bytes ?? -1) >= 0);
182
+ }
183
+ function assertArtifactName(name, token) {
184
+ if (!new RegExp(`^[0-9]+-${token}\\.(?:before|stage)$`, 'u').test(name))
185
+ throw malformed(`Unowned transaction artifact name: ${name}`);
186
+ }
187
+ function revision(bytes) {
188
+ return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
189
+ }
190
+ function malformed(message, cause) {
191
+ return new RecoveryError(message, 'RECOVERY_MALFORMED', undefined, cause === undefined ? undefined : { cause });
192
+ }
193
+ function removeRegularIfPresent(path) {
194
+ try {
195
+ const stat = lstatSync(path);
196
+ assertSafeRegular(stat, path);
197
+ rmSync(path);
198
+ }
199
+ catch (error) {
200
+ if (!isMissing(error))
201
+ throw error;
202
+ }
203
+ }
204
+ function isMissing(error) {
205
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
206
+ }
207
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/transaction/journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RecoveryReport } from './types.js';
2
+ import { type ManagedRoot, type RepositoryLease } from '../internal/model.js';
3
+ import { type OperationControl } from '../lease.js';
4
+ export declare function recoverCanonicalTransactions(root: ManagedRoot, lease: RepositoryLease, options?: OperationControl): Promise<RecoveryReport>;
5
+ export declare function recoverActiveDirectory(root: ManagedRoot, lease: RepositoryLease, directory: string, options: OperationControl): Promise<void>;
6
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/transaction/recovery.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlE,OAAO,EAA8B,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE1G,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMnF,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAqCzB;AAGD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAyDf"}