@arden-hq/revisions 0.0.0-stage → 0.1.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 +202 -0
- package/README.md +84 -2
- package/dist/domain/change-set.d.ts +34 -0
- package/dist/domain/change-set.d.ts.map +1 -0
- package/dist/domain/change-set.js +206 -0
- package/dist/domain/change-set.js.map +1 -0
- package/dist/domain/codec.d.ts +17 -0
- package/dist/domain/codec.d.ts.map +1 -0
- package/dist/domain/codec.js +188 -0
- package/dist/domain/codec.js.map +1 -0
- package/dist/domain/errors.d.ts +61 -0
- package/dist/domain/errors.d.ts.map +1 -0
- package/dist/domain/errors.js +44 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/format.d.ts +72 -0
- package/dist/domain/format.d.ts.map +1 -0
- package/dist/domain/format.js +93 -0
- package/dist/domain/format.js.map +1 -0
- package/dist/domain/integrity.d.ts +7 -0
- package/dist/domain/integrity.d.ts.map +1 -0
- package/dist/domain/integrity.js +100 -0
- package/dist/domain/integrity.js.map +1 -0
- package/dist/domain/model.d.ts +114 -0
- package/dist/domain/model.d.ts.map +1 -0
- package/dist/domain/model.js +145 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/query.d.ts +31 -0
- package/dist/domain/query.d.ts.map +1 -0
- package/dist/domain/query.js +168 -0
- package/dist/domain/query.js.map +1 -0
- package/dist/domain/transaction.d.ts +26 -0
- package/dist/domain/transaction.d.ts.map +1 -0
- package/dist/domain/transaction.js +93 -0
- package/dist/domain/transaction.js.map +1 -0
- package/dist/domain/tree.d.ts +6 -0
- package/dist/domain/tree.d.ts.map +1 -0
- package/dist/domain/tree.js +59 -0
- package/dist/domain/tree.js.map +1 -0
- package/dist/effect/index.d.ts +10 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +4 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/repository/commit.d.ts +12 -0
- package/dist/repository/commit.d.ts.map +1 -0
- package/dist/repository/commit.js +164 -0
- package/dist/repository/commit.js.map +1 -0
- package/dist/repository/history.d.ts +21 -0
- package/dist/repository/history.d.ts.map +1 -0
- package/dist/repository/history.js +152 -0
- package/dist/repository/history.js.map +1 -0
- package/dist/repository/service.d.ts +114 -0
- package/dist/repository/service.d.ts.map +1 -0
- package/dist/repository/service.js +374 -0
- package/dist/repository/service.js.map +1 -0
- package/dist/repository/state.d.ts +27 -0
- package/dist/repository/state.d.ts.map +1 -0
- package/dist/repository/state.js +72 -0
- package/dist/repository/state.js.map +1 -0
- package/dist/repository/transaction.d.ts +27 -0
- package/dist/repository/transaction.d.ts.map +1 -0
- package/dist/repository/transaction.js +372 -0
- package/dist/repository/transaction.js.map +1 -0
- package/dist/storage/files.d.ts +17 -0
- package/dist/storage/files.d.ts.map +1 -0
- package/dist/storage/files.js +179 -0
- package/dist/storage/files.js.map +1 -0
- package/dist/storage/maintenance-adapter.d.ts +5 -0
- package/dist/storage/maintenance-adapter.d.ts.map +1 -0
- package/dist/storage/maintenance-adapter.js +177 -0
- package/dist/storage/maintenance-adapter.js.map +1 -0
- package/dist/storage/maintenance-reader.d.ts +17 -0
- package/dist/storage/maintenance-reader.d.ts.map +1 -0
- package/dist/storage/maintenance-reader.js +82 -0
- package/dist/storage/maintenance-reader.js.map +1 -0
- package/dist/storage/maintenance.d.ts +113 -0
- package/dist/storage/maintenance.d.ts.map +1 -0
- package/dist/storage/maintenance.js +445 -0
- package/dist/storage/maintenance.js.map +1 -0
- package/dist/storage/node.d.ts +7 -0
- package/dist/storage/node.d.ts.map +1 -0
- package/dist/storage/node.js +53 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/storage/service.d.ts +88 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +506 -0
- package/dist/storage/service.js.map +1 -0
- package/package.json +63 -4
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { parseIdempotencyRecord, parseTransaction } from "../domain/transaction.js";
|
|
3
|
+
import { validateSnapshotTransition } from "../domain/integrity.js";
|
|
4
|
+
import { materializationRows } from "../domain/change-set.js";
|
|
5
|
+
import { parseCommitObject } from "../domain/codec.js";
|
|
6
|
+
import { normalizeRelativePath } from "../domain/model.js";
|
|
7
|
+
import { CorruptRepositoryError, IdempotencyConflictError, RevisionConflictError } from "../domain/errors.js";
|
|
8
|
+
import { canonicalJsonl } from "../domain/format.js";
|
|
9
|
+
import { currentMap, materializeTree, validHash } from "./state.js";
|
|
10
|
+
import { compareCodePoints } from "@arden-hq/std/json";
|
|
11
|
+
import { sha256Hex } from "@arden-hq/std/hash";
|
|
12
|
+
const readTransaction = Effect.fn("RevisionTransaction.readTransaction")(function* (storage, id) {
|
|
13
|
+
for (const directory of ["publish", "backups", "displaced", "rejected", "markers"]) {
|
|
14
|
+
yield* storage.listMetadata(`transactions/${id}/${directory}`);
|
|
15
|
+
}
|
|
16
|
+
const content = yield* storage.readMetadata(`transactions/${id}/manifest.jsonl`);
|
|
17
|
+
if (content === null)
|
|
18
|
+
return yield* new CorruptRepositoryError({ message: `transaction manifest is missing: ${id}` });
|
|
19
|
+
return yield* parseTransaction(id, content);
|
|
20
|
+
});
|
|
21
|
+
const hasMarker = (storage, id, marker) => storage
|
|
22
|
+
.readMetadata(`transactions/${id}/${marker === "PREPARED" ? marker : `markers/${marker}`}`, true)
|
|
23
|
+
.pipe(Effect.flatMap((content) => {
|
|
24
|
+
if (content === null)
|
|
25
|
+
return Effect.succeed(false);
|
|
26
|
+
return content.length === 0
|
|
27
|
+
? Effect.succeed(true)
|
|
28
|
+
: Effect.fail(new CorruptRepositoryError({
|
|
29
|
+
message: `transaction marker is not an empty file: ${id}/${marker}`
|
|
30
|
+
}));
|
|
31
|
+
}));
|
|
32
|
+
export const writeIdempotencyRecord = (storage, keyHash, requestHash, commitId) => {
|
|
33
|
+
const content = canonicalJsonl({
|
|
34
|
+
version: 2,
|
|
35
|
+
key_hash: keyHash,
|
|
36
|
+
request_hash: requestHash,
|
|
37
|
+
commit_id: commitId
|
|
38
|
+
});
|
|
39
|
+
return storage.writeIdempotency(keyHash, content).pipe(Effect.catchTag("RevisionConflictError", Effect.fn("RevisionTransaction.writeIdempotencyRecord.conflict")(function* () {
|
|
40
|
+
const existing = yield* storage.readIdempotency(keyHash);
|
|
41
|
+
if (existing === null)
|
|
42
|
+
return yield* new CorruptRepositoryError({
|
|
43
|
+
message: `idempotency record disappeared: ${keyHash}`
|
|
44
|
+
});
|
|
45
|
+
const record = yield* parseIdempotencyRecord(existing, keyHash);
|
|
46
|
+
if (record.requestHash !== requestHash || record.commitId !== commitId)
|
|
47
|
+
return yield* new IdempotencyConflictError({
|
|
48
|
+
message: `idempotency record conflicts: ${keyHash}`
|
|
49
|
+
});
|
|
50
|
+
})));
|
|
51
|
+
};
|
|
52
|
+
export const artifact = (id, kind, index) => `transactions/${id}/${kind}/${index.toString().padStart(4, "0")}`;
|
|
53
|
+
const contentHash = (content) => content === null ? null : sha256Hex(content);
|
|
54
|
+
export const workingHash = (storage, path) => storage.readWorking(path, true, true).pipe(Effect.map(contentHash));
|
|
55
|
+
export const assertWorking = Effect.fn("RevisionTransaction.assertWorking")(function* (storage, path, expected) {
|
|
56
|
+
const actual = yield* workingHash(storage, path);
|
|
57
|
+
if (actual !== expected)
|
|
58
|
+
return yield* new RevisionConflictError({ message: `working file changed: ${path}` });
|
|
59
|
+
});
|
|
60
|
+
export const installRows = Effect.fn("RevisionTransaction.installRows")(function* (storage, transaction, expectPreinstalled = false) {
|
|
61
|
+
for (const [index, row] of transaction.rows.entries()) {
|
|
62
|
+
const expected = row.newBlob;
|
|
63
|
+
const current = yield* workingHash(storage, row.path);
|
|
64
|
+
if (expectPreinstalled) {
|
|
65
|
+
if (expected === null || current !== expected) {
|
|
66
|
+
return yield* new RevisionConflictError({
|
|
67
|
+
message: `adopted working file changed during transaction: ${row.path}`
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const baseline = row.oldBlob;
|
|
73
|
+
const displacement = artifact(transaction.transactionId, "displaced", index);
|
|
74
|
+
const displaced = (yield* storage.readMetadata(displacement, true)) !== null;
|
|
75
|
+
if (current === expected)
|
|
76
|
+
continue;
|
|
77
|
+
if (current !== baseline && !(current === null && displaced)) {
|
|
78
|
+
return yield* new RevisionConflictError({
|
|
79
|
+
message: `working file changed during transaction: ${row.path}`
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (current === baseline && baseline !== null) {
|
|
83
|
+
if (displaced)
|
|
84
|
+
return yield* new RevisionConflictError({
|
|
85
|
+
message: `working file changed during transaction: ${row.path}`
|
|
86
|
+
});
|
|
87
|
+
yield* storage.moveWorkingToMetadata(row.path, displacement);
|
|
88
|
+
const moved = yield* storage.readMetadata(displacement);
|
|
89
|
+
if (moved === null || sha256Hex(moved) !== baseline) {
|
|
90
|
+
if (moved !== null && (yield* workingHash(storage, row.path)) === null) {
|
|
91
|
+
yield* storage.writeWorking(row.path, moved, true).pipe(Effect.catchTags({
|
|
92
|
+
RevisionConflictError: () => Effect.void,
|
|
93
|
+
UnsafePathError: () => Effect.void
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
return yield* new RevisionConflictError({
|
|
97
|
+
message: `working file changed during displacement: ${row.path}`
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (displaced) {
|
|
102
|
+
if (baseline === null)
|
|
103
|
+
return yield* new CorruptRepositoryError({
|
|
104
|
+
message: `transaction has an unexpected displacement: ${row.path}`
|
|
105
|
+
});
|
|
106
|
+
const moved = yield* storage.readMetadata(displacement);
|
|
107
|
+
if (moved === null || sha256Hex(moved) !== baseline) {
|
|
108
|
+
return yield* new CorruptRepositoryError({
|
|
109
|
+
message: `transaction displacement is invalid: ${row.path}`
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (expected === null)
|
|
114
|
+
continue;
|
|
115
|
+
const source = artifact(transaction.transactionId, "publish", index);
|
|
116
|
+
const content = yield* storage.readMetadata(source);
|
|
117
|
+
if (content === null || sha256Hex(content) !== expected)
|
|
118
|
+
return yield* new CorruptRepositoryError({
|
|
119
|
+
message: `transaction artifact is invalid: ${row.path}`
|
|
120
|
+
});
|
|
121
|
+
if ((yield* workingHash(storage, row.path)) !== expected) {
|
|
122
|
+
yield* storage.writeWorking(row.path, content, true);
|
|
123
|
+
if ((yield* workingHash(storage, row.path)) !== expected) {
|
|
124
|
+
return yield* new RevisionConflictError({
|
|
125
|
+
message: `working file changed during install: ${row.path}`
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
const observeWorking = (storage, path) => storage.readWorking(path, true, false).pipe(Effect.map((content) => ({
|
|
132
|
+
hash: contentHash(content),
|
|
133
|
+
conflicted: false
|
|
134
|
+
})), Effect.catchTags({
|
|
135
|
+
RevisionConflictError: () => Effect.succeed({ hash: null, conflicted: true }),
|
|
136
|
+
UnsafePathError: () => Effect.succeed({ hash: null, conflicted: true })
|
|
137
|
+
}));
|
|
138
|
+
const tryWriteWorking = (storage, path, content) => storage.writeWorking(path, content, true).pipe(Effect.as(true), Effect.catchTags({
|
|
139
|
+
RevisionConflictError: () => Effect.succeed(false),
|
|
140
|
+
UnsafePathError: () => Effect.succeed(false)
|
|
141
|
+
}));
|
|
142
|
+
const moveTransactionToConflicts = Effect.fn("RevisionTransaction.moveTransactionToConflicts")(function* (storage, transactionId) {
|
|
143
|
+
if (!(yield* hasMarker(storage, transactionId, "CONFLICT"))) {
|
|
144
|
+
yield* storage.writeMetadata(`transactions/${transactionId}/markers/CONFLICT`, new Uint8Array(), true);
|
|
145
|
+
}
|
|
146
|
+
if (yield* storage.metadataExists(`conflicts/${transactionId}`)) {
|
|
147
|
+
return yield* new CorruptRepositoryError({
|
|
148
|
+
message: `conflict transaction already exists: ${transactionId}`
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
yield* storage.renameMetadataDirectory(`transactions/${transactionId}`, `conflicts/${transactionId}`);
|
|
152
|
+
});
|
|
153
|
+
const rollbackTransaction = Effect.fn("RevisionTransaction.rollbackTransaction")(function* (storage, transaction) {
|
|
154
|
+
let conflicted = false;
|
|
155
|
+
for (const [index, row] of [...transaction.rows.entries()].reverse()) {
|
|
156
|
+
let observed = yield* observeWorking(storage, row.path);
|
|
157
|
+
conflicted ||= observed.conflicted;
|
|
158
|
+
if (row.newBlob !== null && !observed.conflicted && observed.hash === row.newBlob) {
|
|
159
|
+
const rejected = artifact(transaction.transactionId, "rejected", index);
|
|
160
|
+
if (yield* storage.metadataExists(rejected)) {
|
|
161
|
+
conflicted = true;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const moved = yield* storage.moveWorkingToMetadata(row.path, rejected).pipe(Effect.as(true), Effect.catchTags({
|
|
165
|
+
RevisionConflictError: () => Effect.succeed(false),
|
|
166
|
+
UnsafePathError: () => Effect.succeed(false)
|
|
167
|
+
}));
|
|
168
|
+
if (!moved) {
|
|
169
|
+
conflicted = true;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const rejectedContent = yield* storage.readMetadata(rejected);
|
|
173
|
+
if (rejectedContent === null || sha256Hex(rejectedContent) !== row.newBlob) {
|
|
174
|
+
conflicted = true;
|
|
175
|
+
if ((yield* observeWorking(storage, row.path)).hash === null &&
|
|
176
|
+
rejectedContent !== null) {
|
|
177
|
+
yield* tryWriteWorking(storage, row.path, rejectedContent);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
observed = yield* observeWorking(storage, row.path);
|
|
183
|
+
conflicted ||= observed.conflicted;
|
|
184
|
+
}
|
|
185
|
+
if (row.oldBlob === null) {
|
|
186
|
+
if (observed.hash !== null || observed.conflicted)
|
|
187
|
+
conflicted = true;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (observed.hash === row.oldBlob && !observed.conflicted)
|
|
191
|
+
continue;
|
|
192
|
+
if (observed.hash !== null || observed.conflicted) {
|
|
193
|
+
conflicted = true;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const displaced = artifact(transaction.transactionId, "displaced", index);
|
|
197
|
+
const source = (yield* storage.metadataExists(displaced))
|
|
198
|
+
? displaced
|
|
199
|
+
: artifact(transaction.transactionId, "backups", index);
|
|
200
|
+
const content = yield* storage.readMetadata(source);
|
|
201
|
+
if (content === null || sha256Hex(content) !== row.oldBlob) {
|
|
202
|
+
return yield* new CorruptRepositoryError({
|
|
203
|
+
message: `transaction restore artifact is invalid: ${row.path}`
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
if (!(yield* tryWriteWorking(storage, row.path, content)))
|
|
207
|
+
conflicted = true;
|
|
208
|
+
}
|
|
209
|
+
const previous = yield* currentMap(storage, transaction.oldHead);
|
|
210
|
+
for (const version of previous.values()) {
|
|
211
|
+
if (version.state !== "active")
|
|
212
|
+
continue;
|
|
213
|
+
const observed = yield* observeWorking(storage, version.path);
|
|
214
|
+
if (observed.conflicted || observed.hash !== version.blobId)
|
|
215
|
+
conflicted = true;
|
|
216
|
+
}
|
|
217
|
+
if (conflicted) {
|
|
218
|
+
yield* moveTransactionToConflicts(storage, transaction.transactionId);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (!(yield* hasMarker(storage, transaction.transactionId, "ROLLED_BACK"))) {
|
|
222
|
+
yield* storage.writeMetadata(`transactions/${transaction.transactionId}/markers/ROLLED_BACK`, new Uint8Array(), true);
|
|
223
|
+
}
|
|
224
|
+
yield* storage.removeMetadataTree(`transactions/${transaction.transactionId}`);
|
|
225
|
+
});
|
|
226
|
+
/** Validate every active path in a resulting tree before publishing or deleting recovery metadata. */
|
|
227
|
+
export const validateWorkingTree = Effect.fn("RevisionTransaction.validateWorkingTree")(function* (storage, head) {
|
|
228
|
+
const snapshot = yield* currentMap(storage, head);
|
|
229
|
+
for (const version of snapshot.values()) {
|
|
230
|
+
if (version.state !== "active")
|
|
231
|
+
continue;
|
|
232
|
+
const observed = yield* observeWorking(storage, version.path);
|
|
233
|
+
if (observed.conflicted || observed.hash !== version.blobId) {
|
|
234
|
+
return yield* new RevisionConflictError({
|
|
235
|
+
message: `working tree does not match resulting tree: ${version.path}`
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
/**
|
|
241
|
+
* Settle interrupted transactions. Only the transactions directory is swept
|
|
242
|
+
* for crash-orphaned temporaries here, because recovery lists it and nothing
|
|
243
|
+
* else: this runs before every commit, and sweeping the whole history
|
|
244
|
+
* (thousands of objects) each time cost seconds per boot. The rest of the
|
|
245
|
+
* history is swept once per open, and before maintenance lists objects.
|
|
246
|
+
*/
|
|
247
|
+
export const recoverTransactions = Effect.fn("recoverRevisionTransactions")(function* (storage) {
|
|
248
|
+
yield* storage.cleanupMetadataTemps("transactions");
|
|
249
|
+
const names = yield* storage.listMetadata("transactions");
|
|
250
|
+
for (const id of [...names].sort(compareCodePoints)) {
|
|
251
|
+
if (!validHash(id))
|
|
252
|
+
return yield* new CorruptRepositoryError({ message: `invalid transaction directory: ${id}` });
|
|
253
|
+
const prepared = yield* hasMarker(storage, id, "PREPARED");
|
|
254
|
+
if (!prepared) {
|
|
255
|
+
yield* storage.removeMetadataTree(`transactions/${id}`);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const transaction = yield* readTransaction(storage, id);
|
|
259
|
+
const decided = yield* hasMarker(storage, id, "DECIDED");
|
|
260
|
+
const committed = yield* hasMarker(storage, id, "COMMITTED");
|
|
261
|
+
const adopting = yield* hasMarker(storage, id, "ADOPTING");
|
|
262
|
+
const semanticsOk = yield* validateTransactionSemantics(storage, transaction).pipe(Effect.as(true), Effect.catch((error) => quarantineUndecidedPrepare(storage, transaction, { decided, committed }, error)));
|
|
263
|
+
if (!semanticsOk)
|
|
264
|
+
continue;
|
|
265
|
+
const current = yield* storage.readRef;
|
|
266
|
+
if (decided || committed || adopting || current === transaction.newHead) {
|
|
267
|
+
if (current !== transaction.oldHead && current !== transaction.newHead) {
|
|
268
|
+
return yield* new CorruptRepositoryError({
|
|
269
|
+
message: `decided transaction ${id} found unexpected current ref`
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const materialize = Effect.gen(function* () {
|
|
273
|
+
yield* installRows(storage, transaction, adopting);
|
|
274
|
+
yield* validateWorkingTree(storage, transaction.newHead);
|
|
275
|
+
});
|
|
276
|
+
const ready = yield* materialize.pipe(Effect.as(true), Effect.catch(Effect.fn("RevisionTransaction.materializeFailed")(function* (error) {
|
|
277
|
+
if (adopting &&
|
|
278
|
+
!decided &&
|
|
279
|
+
!committed &&
|
|
280
|
+
(error._tag === "RevisionConflictError" || error._tag === "UnsafePathError") &&
|
|
281
|
+
(current === transaction.oldHead || current === transaction.newHead)) {
|
|
282
|
+
if (current === transaction.newHead) {
|
|
283
|
+
yield* storage.compensateRef(transaction.newHead, transaction.oldHead);
|
|
284
|
+
}
|
|
285
|
+
yield* moveTransactionToConflicts(storage, transaction.transactionId);
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
if (!decided &&
|
|
289
|
+
current === transaction.newHead &&
|
|
290
|
+
(error._tag === "RevisionConflictError" || error._tag === "UnsafePathError")) {
|
|
291
|
+
yield* storage.compensateRef(transaction.newHead, transaction.oldHead);
|
|
292
|
+
}
|
|
293
|
+
return yield* Effect.fail(error);
|
|
294
|
+
})));
|
|
295
|
+
if (!ready)
|
|
296
|
+
continue;
|
|
297
|
+
if (current === transaction.oldHead)
|
|
298
|
+
yield* storage.compareAndSwapRef(transaction.oldHead, transaction.newHead);
|
|
299
|
+
yield* storage.publish(transaction.newHead).pipe(Effect.catchTag("RevisionConflictError", () => storage.isPublished(transaction.newHead).pipe(Effect.flatMap((published) => published
|
|
300
|
+
? Effect.succeed(undefined)
|
|
301
|
+
: Effect.fail(new CorruptRepositoryError({
|
|
302
|
+
message: `publication marker is invalid: ${transaction.newHead}`
|
|
303
|
+
}))))));
|
|
304
|
+
yield* writeIdempotencyRecord(storage, transaction.keyHash, transaction.requestHash, transaction.newHead);
|
|
305
|
+
yield* storage.removeMetadataTree(`transactions/${id}`);
|
|
306
|
+
}
|
|
307
|
+
else if (current === transaction.oldHead) {
|
|
308
|
+
yield* rollbackTransaction(storage, transaction);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
return yield* new CorruptRepositoryError({
|
|
312
|
+
message: `transaction ${id} found unexpected current ref`
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
const quarantineUndecidedPrepare = Effect.fn("RevisionTransaction.quarantineUndecidedPrepare")(function* (storage, transaction, markers, error) {
|
|
318
|
+
const ref = yield* storage.readRef;
|
|
319
|
+
if (!markers.decided && !markers.committed && ref === transaction.oldHead) {
|
|
320
|
+
yield* moveTransactionToConflicts(storage, transaction.transactionId);
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
return yield* Effect.fail(error);
|
|
324
|
+
});
|
|
325
|
+
export const validateBeforePrepare = (storage, transaction) => Effect.as(validateTransactionSemantics(storage, transaction), transaction);
|
|
326
|
+
export const writePreparedMarker = (storage, transaction) => storage.writeMetadata(`transactions/${transaction.transactionId}/PREPARED`, new Uint8Array(), true);
|
|
327
|
+
const validateTransactionSemantics = Effect.fn("RevisionTransaction.validateTransactionSemantics")(function* (storage, transaction) {
|
|
328
|
+
const commitBytes = yield* storage.readCommit(transaction.newHead);
|
|
329
|
+
const commit = yield* parseCommitObject(transaction.newHead, commitBytes);
|
|
330
|
+
if (commit.parentId !== transaction.oldHead || commit.treeId !== transaction.treeId) {
|
|
331
|
+
return yield* new CorruptRepositoryError({
|
|
332
|
+
message: `transaction ${transaction.transactionId} does not match its commit`
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
const before = yield* currentMap(storage, transaction.oldHead);
|
|
336
|
+
const after = yield* materializeTree(storage, transaction.treeId);
|
|
337
|
+
yield* validateSnapshotTransition(commit, before, after);
|
|
338
|
+
const expected = yield* materializationRows(before, after);
|
|
339
|
+
if (expected.length !== transaction.rows.length ||
|
|
340
|
+
expected.some((row, index) => {
|
|
341
|
+
const actual = transaction.rows[index];
|
|
342
|
+
return (actual === undefined ||
|
|
343
|
+
row.path !== actual.path ||
|
|
344
|
+
row.oldBlob !== actual.oldBlob ||
|
|
345
|
+
row.newBlob !== actual.newBlob);
|
|
346
|
+
}))
|
|
347
|
+
return yield* new CorruptRepositoryError({
|
|
348
|
+
message: `transaction ${transaction.transactionId} rows do not match its tree delta`
|
|
349
|
+
});
|
|
350
|
+
for (const [index, row] of transaction.rows.entries()) {
|
|
351
|
+
yield* normalizeRelativePath(row.path).pipe(Effect.mapError(() => new CorruptRepositoryError({
|
|
352
|
+
message: `transaction ${transaction.transactionId} has an unsafe path`
|
|
353
|
+
})));
|
|
354
|
+
if (row.oldBlob !== null) {
|
|
355
|
+
const backup = yield* storage.readMetadata(artifact(transaction.transactionId, "backups", index));
|
|
356
|
+
if (backup === null || sha256Hex(backup) !== row.oldBlob) {
|
|
357
|
+
return yield* new CorruptRepositoryError({
|
|
358
|
+
message: `transaction backup is invalid: ${row.path}`
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (row.newBlob !== null) {
|
|
363
|
+
const publish = yield* storage.readMetadata(artifact(transaction.transactionId, "publish", index));
|
|
364
|
+
if (publish === null || sha256Hex(publish) !== row.newBlob) {
|
|
365
|
+
return yield* new CorruptRepositoryError({
|
|
366
|
+
message: `transaction publish artifact is invalid: ${row.path}`
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/repository/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
2
|
+
import * as PlatformError from "effect/PlatformError";
|
|
3
|
+
import { RevisionStorageError, UnsafePathError } from "../domain/errors.js";
|
|
4
|
+
import type { StorageError } from "./service.js";
|
|
5
|
+
export declare const storageFailure: (operation: string, cause: unknown) => RevisionStorageError;
|
|
6
|
+
export declare const isAlreadyExists: (cause: unknown) => boolean;
|
|
7
|
+
/** Internal repository paths are canonical POSIX-relative values. */
|
|
8
|
+
export declare const relativeParts: (value: string, allowRoot?: any) => Effect.Effect<readonly string[], UnsafePathError, never>;
|
|
9
|
+
export declare const entryIsSymlink: (fs: FileSystem.FileSystem, file: string) => Effect.Effect<boolean, PlatformError.PlatformError>;
|
|
10
|
+
export declare const ensureDirectory: (fs: FileSystem.FileSystem, path: Path.Path, root: string, parts: readonly string[]) => Effect.Effect<void, StorageError, never>;
|
|
11
|
+
/** Only a caller that allows a missing file gets `null` back. */
|
|
12
|
+
export declare function inspectRegular(fs: FileSystem.FileSystem, file: string, allowMissing: false, requireStandalone: boolean): Effect.Effect<FileSystem.File.Info, StorageError>;
|
|
13
|
+
export declare function inspectRegular(fs: FileSystem.FileSystem, file: string, allowMissing: boolean, requireStandalone: boolean): Effect.Effect<FileSystem.File.Info | null, StorageError>;
|
|
14
|
+
export declare const syncDirectory: (fs: FileSystem.FileSystem, directory: string) => Effect.Effect<void, RevisionStorageError>;
|
|
15
|
+
export declare const removeTree: (fs: FileSystem.FileSystem, path: Path.Path, directory: string) => Effect.Effect<void, StorageError, never>;
|
|
16
|
+
export declare const atomicWrite: (fs: FileSystem.FileSystem, path: Path.Path, target: string, content: Uint8Array<ArrayBufferLike>, noReplace: boolean, mode?: any) => Effect.Effect<void, StorageError, never>;
|
|
17
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/storage/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAyB,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD,eAAO,MAAM,cAAc,cAAe,MAAM,SAAS,OAAO,KAAG,oBAI/D,CAAA;AASJ,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,OAAmD,CAAA;AAapG,qEAAqE;AACrE,eAAO,MAAM,aAAa,8FAOxB,CAAA;AAEF,eAAO,MAAM,cAAc,OACrB,UAAU,CAAC,UAAU,QACnB,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAMlD,CAAA;AAEH,eAAO,MAAM,eAAe,kIA4C1B,CAAA;AAEF,iEAAiE;AACjE,wBAAgB,cAAc,CAC5B,EAAE,EAAE,UAAU,CAAC,UAAU,EACzB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,KAAK,EACnB,iBAAiB,EAAE,OAAO,GACzB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;AACpD,wBAAgB,cAAc,CAC5B,EAAE,EAAE,UAAU,CAAC,UAAU,EACzB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,EACrB,iBAAiB,EAAE,OAAO,GACzB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,YAAY,CAAC,CAAA;AAsC3D,eAAO,MAAM,aAAa,OACpB,UAAU,CAAC,UAAU,aACd,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAQxC,CAAA;AAEH,eAAO,MAAM,UAAU,6GA4CrB,CAAA;AAEF,eAAO,MAAM,WAAW,gLAyDtB,CAAA"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Effect, FileSystem, Option, Path } from "effect";
|
|
2
|
+
import * as PlatformError from "effect/PlatformError";
|
|
3
|
+
import { normalizeRelativePath } from "../domain/model.js";
|
|
4
|
+
import { RevisionConflictError, RevisionStorageError, UnsafePathError } from "../domain/errors.js";
|
|
5
|
+
import { errorMessage } from "@arden-hq/std/errors";
|
|
6
|
+
export const storageFailure = (operation, cause) => new RevisionStorageError({
|
|
7
|
+
message: `${operation}: ${errorMessage(cause)}`,
|
|
8
|
+
cause
|
|
9
|
+
});
|
|
10
|
+
const isPlatform = (cause) => cause instanceof PlatformError.PlatformError;
|
|
11
|
+
const isPlatformReason = (cause, reason) => isPlatform(cause) && cause.reason._tag === reason;
|
|
12
|
+
const isMissing = (cause) => isPlatformReason(cause, "NotFound");
|
|
13
|
+
export const isAlreadyExists = (cause) => isPlatformReason(cause, "AlreadyExists");
|
|
14
|
+
const isNotSymlink = (cause) => {
|
|
15
|
+
if (isMissing(cause))
|
|
16
|
+
return true;
|
|
17
|
+
if (!isPlatform(cause) ||
|
|
18
|
+
cause.reason._tag !== "Unknown" ||
|
|
19
|
+
typeof cause.reason.cause !== "object" ||
|
|
20
|
+
cause.reason.cause === null)
|
|
21
|
+
return false;
|
|
22
|
+
return "code" in cause.reason.cause && cause.reason.cause.code === "EINVAL";
|
|
23
|
+
};
|
|
24
|
+
/** Internal repository paths are canonical POSIX-relative values. */
|
|
25
|
+
export const relativeParts = Effect.fn("RevisionStorage.relativeParts")(function* (value, allowRoot = false) {
|
|
26
|
+
if (allowRoot && value === ".")
|
|
27
|
+
return [];
|
|
28
|
+
const normalized = yield* normalizeRelativePath(value);
|
|
29
|
+
return normalized.split("/");
|
|
30
|
+
});
|
|
31
|
+
export const entryIsSymlink = (fs, file) => fs.readLink(file).pipe(Effect.as(true), Effect.catchTag("PlatformError", (error) => isNotSymlink(error) ? Effect.succeed(false) : Effect.fail(error)));
|
|
32
|
+
export const ensureDirectory = Effect.fn("RevisionStorage.ensureDirectory")(function* (fs, path, root, parts) {
|
|
33
|
+
const rootInfo = yield* fs
|
|
34
|
+
.stat(root)
|
|
35
|
+
.pipe(Effect.mapError((cause) => storageFailure("stat repository root", cause)));
|
|
36
|
+
const rootLink = yield* entryIsSymlink(fs, root).pipe(Effect.mapError((cause) => storageFailure("inspect repository root", cause)));
|
|
37
|
+
if (rootInfo.type !== "Directory" || rootLink) {
|
|
38
|
+
return yield* new UnsafePathError({ message: `repository root is not a directory: ${root}` });
|
|
39
|
+
}
|
|
40
|
+
let current = root;
|
|
41
|
+
for (const part of parts) {
|
|
42
|
+
current = path.join(current, part);
|
|
43
|
+
const exists = yield* fs
|
|
44
|
+
.exists(current)
|
|
45
|
+
.pipe(Effect.mapError((cause) => storageFailure("check repository directory", cause)));
|
|
46
|
+
if (!exists) {
|
|
47
|
+
yield* fs
|
|
48
|
+
.makeDirectory(current, { mode: 0o700 })
|
|
49
|
+
.pipe(Effect.catchTag("PlatformError", (cause) => isAlreadyExists(cause)
|
|
50
|
+
? Effect.succeed(undefined)
|
|
51
|
+
: Effect.fail(storageFailure("create repository directory", cause))));
|
|
52
|
+
}
|
|
53
|
+
const info = yield* fs
|
|
54
|
+
.stat(current)
|
|
55
|
+
.pipe(Effect.mapError((cause) => storageFailure("stat repository directory", cause)));
|
|
56
|
+
const linked = yield* entryIsSymlink(fs, current).pipe(Effect.mapError((cause) => storageFailure("inspect repository directory", cause)));
|
|
57
|
+
if (info.type !== "Directory" || linked) {
|
|
58
|
+
return yield* new UnsafePathError({
|
|
59
|
+
message: `repository path is not a directory: ${current}`
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
export function inspectRegular(fs, file, allowMissing, requireStandalone) {
|
|
65
|
+
return inspectRegularEntry(fs, file, allowMissing, requireStandalone);
|
|
66
|
+
}
|
|
67
|
+
const inspectRegularEntry = Effect.fn("RevisionStorage.inspectRegular")(function* (fs, file, allowMissing, requireStandalone) {
|
|
68
|
+
const linked = yield* entryIsSymlink(fs, file).pipe(Effect.mapError((cause) => storageFailure("inspect file", cause)));
|
|
69
|
+
if (linked)
|
|
70
|
+
return yield* new UnsafePathError({ message: `file is a symlink: ${file}` });
|
|
71
|
+
const info = yield* fs.stat(file).pipe(Effect.catchTag("PlatformError", (cause) => {
|
|
72
|
+
if (isMissing(cause))
|
|
73
|
+
return allowMissing
|
|
74
|
+
? Effect.succeed(null)
|
|
75
|
+
: Effect.fail(new RevisionStorageError({ message: `file is missing: ${file}` }));
|
|
76
|
+
return Effect.fail(storageFailure("stat file", cause));
|
|
77
|
+
}));
|
|
78
|
+
if (info === null)
|
|
79
|
+
return null;
|
|
80
|
+
if (info.type !== "File")
|
|
81
|
+
return yield* new UnsafePathError({ message: `path is not a regular file: ${file}` });
|
|
82
|
+
if (requireStandalone && Option.getOrElse(info.nlink, () => 1) !== 1) {
|
|
83
|
+
return yield* new UnsafePathError({ message: `file has unsupported hard links: ${file}` });
|
|
84
|
+
}
|
|
85
|
+
return info;
|
|
86
|
+
});
|
|
87
|
+
export const syncDirectory = (fs, directory) => Effect.scoped(Effect.gen(function* () {
|
|
88
|
+
const handle = yield* fs
|
|
89
|
+
.open(directory, { flag: "r" })
|
|
90
|
+
.pipe(Effect.mapError((cause) => storageFailure("open directory for sync", cause)));
|
|
91
|
+
yield* handle.sync.pipe(Effect.mapError((cause) => storageFailure("sync directory", cause)));
|
|
92
|
+
}));
|
|
93
|
+
export const removeTree = Effect.fn("RevisionStorage.removeTree")(function* (fs, path, directory) {
|
|
94
|
+
const exists = yield* fs
|
|
95
|
+
.exists(directory)
|
|
96
|
+
.pipe(Effect.mapError((cause) => storageFailure("check directory", cause)));
|
|
97
|
+
if (!exists)
|
|
98
|
+
return;
|
|
99
|
+
const linked = yield* entryIsSymlink(fs, directory).pipe(Effect.mapError((cause) => storageFailure("inspect directory", cause)));
|
|
100
|
+
if (linked)
|
|
101
|
+
return yield* new UnsafePathError({ message: `directory is a symlink: ${directory}` });
|
|
102
|
+
const info = yield* fs
|
|
103
|
+
.stat(directory)
|
|
104
|
+
.pipe(Effect.mapError((cause) => storageFailure("stat directory", cause)));
|
|
105
|
+
if (info.type !== "Directory")
|
|
106
|
+
return yield* new UnsafePathError({ message: `path is not a directory: ${directory}` });
|
|
107
|
+
const children = yield* fs
|
|
108
|
+
.readDirectory(directory)
|
|
109
|
+
.pipe(Effect.mapError((cause) => storageFailure("list directory", cause)));
|
|
110
|
+
for (const child of children) {
|
|
111
|
+
const childPath = path.join(directory, child);
|
|
112
|
+
const childLink = yield* entryIsSymlink(fs, childPath).pipe(Effect.mapError((cause) => storageFailure("inspect directory entry", cause)));
|
|
113
|
+
if (childLink)
|
|
114
|
+
return yield* new UnsafePathError({ message: `directory contains a symlink: ${childPath}` });
|
|
115
|
+
const childInfo = yield* fs
|
|
116
|
+
.stat(childPath)
|
|
117
|
+
.pipe(Effect.mapError((cause) => storageFailure("stat directory entry", cause)));
|
|
118
|
+
if (childInfo.type === "Directory")
|
|
119
|
+
yield* removeTree(fs, path, childPath);
|
|
120
|
+
else if (childInfo.type === "File")
|
|
121
|
+
yield* fs
|
|
122
|
+
.remove(childPath)
|
|
123
|
+
.pipe(Effect.mapError((cause) => storageFailure("remove file", cause)));
|
|
124
|
+
else
|
|
125
|
+
return yield* new UnsafePathError({
|
|
126
|
+
message: `directory contains unsupported entry: ${childPath}`
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
yield* fs
|
|
130
|
+
.remove(directory, { recursive: true })
|
|
131
|
+
.pipe(Effect.mapError((cause) => storageFailure("remove directory", cause)));
|
|
132
|
+
});
|
|
133
|
+
export const atomicWrite = Effect.fn("RevisionStorage.atomicWrite")(function* (fs, path, target, content, noReplace, mode = 0o600) {
|
|
134
|
+
const parent = path.dirname(target);
|
|
135
|
+
const existing = yield* inspectRegular(fs, target, true, true);
|
|
136
|
+
if (existing !== null && noReplace)
|
|
137
|
+
return yield* new RevisionConflictError({ message: `target already exists: ${target}` });
|
|
138
|
+
const temporary = yield* fs
|
|
139
|
+
.makeTempFile({ directory: parent, prefix: ".arden-", suffix: ".tmp" })
|
|
140
|
+
.pipe(Effect.mapError((cause) => storageFailure("create atomic temporary file", cause)));
|
|
141
|
+
const temporaryDirectory = path.dirname(temporary);
|
|
142
|
+
let installed = false;
|
|
143
|
+
try {
|
|
144
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
145
|
+
const handle = yield* fs
|
|
146
|
+
.open(temporary, { flag: "w", mode })
|
|
147
|
+
.pipe(Effect.mapError((cause) => storageFailure("open atomic temporary file", cause)));
|
|
148
|
+
if (content.length > 0) {
|
|
149
|
+
yield* handle
|
|
150
|
+
.writeAll(content)
|
|
151
|
+
.pipe(Effect.mapError((cause) => storageFailure("write atomic temporary file", cause)));
|
|
152
|
+
}
|
|
153
|
+
yield* handle.sync.pipe(Effect.mapError((cause) => storageFailure("sync atomic temporary file", cause)));
|
|
154
|
+
}));
|
|
155
|
+
if (noReplace) {
|
|
156
|
+
yield* fs
|
|
157
|
+
.link(temporary, target)
|
|
158
|
+
.pipe(Effect.mapError((cause) => isAlreadyExists(cause)
|
|
159
|
+
? new RevisionConflictError({ message: `target already exists: ${target}` })
|
|
160
|
+
: storageFailure("install immutable file", cause)));
|
|
161
|
+
yield* fs
|
|
162
|
+
.remove(temporary)
|
|
163
|
+
.pipe(Effect.mapError((cause) => storageFailure("remove atomic temporary file", cause)));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
yield* fs
|
|
167
|
+
.rename(temporary, target)
|
|
168
|
+
.pipe(Effect.mapError((cause) => storageFailure("replace file", cause)));
|
|
169
|
+
}
|
|
170
|
+
installed = true;
|
|
171
|
+
yield* syncDirectory(fs, parent);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
if (!installed)
|
|
175
|
+
yield* fs.remove(temporary, { force: true }).pipe(Effect.ignore);
|
|
176
|
+
yield* fs.remove(temporaryDirectory, { recursive: true, force: true }).pipe(Effect.ignore);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/storage/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MaintenanceStorage } from "./maintenance.js";
|
|
2
|
+
import type { RevisionStorageShape } from "./service.js";
|
|
3
|
+
/** Adapt the repository's low-level storage contract to maintenance operations. */
|
|
4
|
+
export declare const maintenanceStorageFromRevisionStorage: (storage: RevisionStorageShape) => MaintenanceStorage;
|
|
5
|
+
//# sourceMappingURL=maintenance-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/maintenance-adapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAMV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,cAAc,CAAA;AA0HtE,mFAAmF;AACnF,eAAO,MAAM,qCAAqC,YACvC,oBAAoB,KAC5B,kBAkGF,CAAA"}
|