@apexops/kernel 0.10.0-next.5 → 0.11.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/directory-lock.d.ts +118 -0
- package/dist/directory-lock.d.ts.map +1 -0
- package/dist/directory-lock.js +587 -0
- package/dist/directory-lock.js.map +1 -0
- package/dist/files.d.ts +63 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +158 -2
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/object-store.js +2 -2
- package/dist/object-store.js.map +1 -1
- package/dist/project-store.d.ts +2 -1
- package/dist/project-store.d.ts.map +1 -1
- package/dist/project-store.js +1 -0
- package/dist/project-store.js.map +1 -1
- package/dist/repeat-files.d.ts +66 -0
- package/dist/repeat-files.d.ts.map +1 -0
- package/dist/repeat-files.js +214 -0
- package/dist/repeat-files.js.map +1 -0
- package/dist/repeat-guard.d.ts +197 -0
- package/dist/repeat-guard.d.ts.map +1 -0
- package/dist/repeat-guard.js +462 -0
- package/dist/repeat-guard.js.map +1 -0
- package/dist/review-capture.d.ts +170 -0
- package/dist/review-capture.d.ts.map +1 -0
- package/dist/review-capture.js +570 -0
- package/dist/review-capture.js.map +1 -0
- package/dist/run-repository.d.ts +52 -2
- package/dist/run-repository.d.ts.map +1 -1
- package/dist/run-repository.js +198 -52
- package/dist/run-repository.js.map +1 -1
- package/dist/tasks.d.ts.map +1 -1
- package/dist/tasks.js +16 -2
- package/dist/tasks.js.map +1 -1
- package/dist/test/files.test.d.ts +2 -0
- package/dist/test/files.test.d.ts.map +1 -0
- package/dist/test/files.test.js +140 -0
- package/dist/test/files.test.js.map +1 -0
- package/dist/test/policies.test.js +1 -1
- package/dist/test/policies.test.js.map +1 -1
- package/dist/test/repeat-guard.test.d.ts +2 -0
- package/dist/test/repeat-guard.test.d.ts.map +1 -0
- package/dist/test/repeat-guard.test.js +1106 -0
- package/dist/test/repeat-guard.test.js.map +1 -0
- package/dist/test/review-capture.test.d.ts +2 -0
- package/dist/test/review-capture.test.d.ts.map +1 -0
- package/dist/test/review-capture.test.js +291 -0
- package/dist/test/review-capture.test.js.map +1 -0
- package/dist/test/run-repository.test.js +451 -7
- package/dist/test/run-repository.test.js.map +1 -1
- package/dist/test/workflow.test.js +30 -1
- package/dist/test/workflow.test.js.map +1 -1
- package/dist/test/writer-transfer.test.js +6 -1
- package/dist/test/writer-transfer.test.js.map +1 -1
- package/dist/validator-registry.d.ts.map +1 -1
- package/dist/validator-registry.js +10 -1
- package/dist/validator-registry.js.map +1 -1
- package/dist/workflow-validator-ownership.d.ts.map +1 -1
- package/dist/workflow-validator-ownership.js +2 -1
- package/dist/workflow-validator-ownership.js.map +1 -1
- package/package.json +3 -3
package/dist/files.d.ts
CHANGED
|
@@ -1,6 +1,69 @@
|
|
|
1
|
+
import { type Stats } from "node:fs";
|
|
2
|
+
export interface RenameRetryOptions {
|
|
3
|
+
readonly platform?: NodeJS.Platform;
|
|
4
|
+
readonly attempts?: number;
|
|
5
|
+
readonly rename?: (from: string, to: string) => Promise<void>;
|
|
6
|
+
readonly sleep?: (milliseconds: number) => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Rename with bounded retries on Windows, where antivirus, indexers and editor watchers briefly hold files open and
|
|
10
|
+
* make an atomic replace fail with EPERM, EACCES or EBUSY. Other platforms and other errors fail on the first attempt.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renameWithRetry(from: string, to: string, options?: RenameRetryOptions): Promise<void>;
|
|
13
|
+
export interface SharingRetryOptions {
|
|
14
|
+
readonly platform?: NodeJS.Platform;
|
|
15
|
+
readonly attempts?: number;
|
|
16
|
+
readonly sleep?: (milliseconds: number) => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Runs a file operation with the bounded backoff of `renameWithRetry`, retrying the Windows sharing violations (EPERM,
|
|
20
|
+
* EACCES, EBUSY) that a concurrent writer, antivirus or indexer causes. Other platforms and other errors fail on the
|
|
21
|
+
* first attempt.
|
|
22
|
+
*/
|
|
23
|
+
export declare function retrySharingViolations<T>(operation: () => Promise<T>, options?: SharingRetryOptions): Promise<T>;
|
|
24
|
+
export interface PublishedFileReadOptions {
|
|
25
|
+
readonly maxBytes: number;
|
|
26
|
+
/** Prefix of the error thrown when the path is not a regular file within `maxBytes`. */
|
|
27
|
+
readonly label: string;
|
|
28
|
+
readonly platform?: NodeJS.Platform;
|
|
29
|
+
readonly attempts?: number;
|
|
30
|
+
readonly lstat?: (path: string) => Promise<Pick<Stats, "isFile" | "isSymbolicLink" | "size">>;
|
|
31
|
+
readonly readFile?: (path: string) => Promise<Buffer>;
|
|
32
|
+
readonly sleep?: (milliseconds: number) => Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Read a small regular file that writers publish with an atomic replace (see `atomicWriteBytes`). Returns undefined
|
|
36
|
+
* only when lstat reports the path as absent. A file that vanishes between lstat and read was replaced or removed
|
|
37
|
+
* mid-read and is re-examined; on Windows, sharing violations (EPERM, EACCES, EBUSY) raised while a writer replaces
|
|
38
|
+
* the file are retried with the same bounded backoff as `renameWithRetry`. Exhausted retries rethrow, so a transient
|
|
39
|
+
* failure is never reported as an absent file.
|
|
40
|
+
*/
|
|
41
|
+
export declare function readPublishedFile(path: string, options: PublishedFileReadOptions): Promise<Buffer | undefined>;
|
|
1
42
|
export interface AtomicWriteOptions {
|
|
2
43
|
refuseOverwrite?: boolean;
|
|
3
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Coordinates the atomic writes of one operation, such as a workspace lock holder, with its quiet sections, during
|
|
47
|
+
* which another process may read the state those writes change. A write in the fenced async context waits while a
|
|
48
|
+
* quiet section runs, and a quiet section starts only once no such write is in flight, so readers inside a quiet
|
|
49
|
+
* section never see the operation's writes land. Writes made inside a quiet section itself are not held back: the
|
|
50
|
+
* section's own work, such as an external provider's private records, is outside the state readers depend on. Once
|
|
51
|
+
* `error` is set, every later fenced write throws it instead of writing.
|
|
52
|
+
*/
|
|
53
|
+
export declare class WriteFence {
|
|
54
|
+
error?: Error;
|
|
55
|
+
private writes;
|
|
56
|
+
private quiets;
|
|
57
|
+
private pendingQuiets;
|
|
58
|
+
private waiters;
|
|
59
|
+
/** Runs `operation` as a quiet section; a section started inside another one of this fence joins it. */
|
|
60
|
+
quiet<T>(operation: () => Promise<T>): Promise<T>;
|
|
61
|
+
write<T>(operation: () => Promise<T>): Promise<T>;
|
|
62
|
+
private changed;
|
|
63
|
+
private notify;
|
|
64
|
+
}
|
|
65
|
+
/** Runs `operation` with its atomic writes, and those of everything it starts, subject to `fence`. */
|
|
66
|
+
export declare function withWriteFence<T>(fence: WriteFence, operation: () => Promise<T>): Promise<T>;
|
|
4
67
|
export declare function atomicWriteBytes(path: string, bytes: Uint8Array, options?: AtomicWriteOptions): Promise<void>;
|
|
5
68
|
export declare function atomicWriteJson(path: string, value: unknown, options?: AtomicWriteOptions): Promise<void>;
|
|
6
69
|
//# sourceMappingURL=files.d.ts.map
|
package/dist/files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/files.js
CHANGED
|
@@ -1,8 +1,164 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { constants } from "node:fs";
|
|
2
|
-
import { link, mkdir, open, rename, rm } from "node:fs/promises";
|
|
3
|
+
import { link, lstat, mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
3
4
|
import { basename, dirname, join } from "node:path";
|
|
4
5
|
import { canonicalJsonBytes } from "./canonical.js";
|
|
6
|
+
const TRANSIENT_RENAME_CODES = new Set(["EPERM", "EACCES", "EBUSY"]);
|
|
7
|
+
/**
|
|
8
|
+
* Rename with bounded retries on Windows, where antivirus, indexers and editor watchers briefly hold files open and
|
|
9
|
+
* make an atomic replace fail with EPERM, EACCES or EBUSY. Other platforms and other errors fail on the first attempt.
|
|
10
|
+
*/
|
|
11
|
+
export async function renameWithRetry(from, to, options = {}) {
|
|
12
|
+
if (options.attempts !== undefined &&
|
|
13
|
+
(!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
|
|
14
|
+
throw new RangeError("Rename attempts must be an integer from 1 to 10");
|
|
15
|
+
const move = options.rename ?? rename;
|
|
16
|
+
await retrySharingViolations(() => move(from, to), options);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Runs a file operation with the bounded backoff of `renameWithRetry`, retrying the Windows sharing violations (EPERM,
|
|
20
|
+
* EACCES, EBUSY) that a concurrent writer, antivirus or indexer causes. Other platforms and other errors fail on the
|
|
21
|
+
* first attempt.
|
|
22
|
+
*/
|
|
23
|
+
export async function retrySharingViolations(operation, options = {}) {
|
|
24
|
+
if (options.attempts !== undefined &&
|
|
25
|
+
(!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
|
|
26
|
+
throw new RangeError("Retry attempts must be an integer from 1 to 10");
|
|
27
|
+
const attempts = (options.platform ?? process.platform) === "win32" ? (options.attempts ?? 10) : 1;
|
|
28
|
+
const sleep = options.sleep ?? (async (milliseconds) => await new Promise((done) => setTimeout(done, milliseconds)));
|
|
29
|
+
for (let attempt = 1;; attempt += 1) {
|
|
30
|
+
try {
|
|
31
|
+
return await operation();
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (attempt >= attempts || !TRANSIENT_RENAME_CODES.has(error.code ?? ""))
|
|
35
|
+
throw error;
|
|
36
|
+
await sleep(Math.min(10 * 2 ** (attempt - 1), 500));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read a small regular file that writers publish with an atomic replace (see `atomicWriteBytes`). Returns undefined
|
|
42
|
+
* only when lstat reports the path as absent. A file that vanishes between lstat and read was replaced or removed
|
|
43
|
+
* mid-read and is re-examined; on Windows, sharing violations (EPERM, EACCES, EBUSY) raised while a writer replaces
|
|
44
|
+
* the file are retried with the same bounded backoff as `renameWithRetry`. Exhausted retries rethrow, so a transient
|
|
45
|
+
* failure is never reported as an absent file.
|
|
46
|
+
*/
|
|
47
|
+
export async function readPublishedFile(path, options) {
|
|
48
|
+
if (options.attempts !== undefined &&
|
|
49
|
+
(!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
|
|
50
|
+
throw new RangeError("Read attempts must be an integer from 1 to 10");
|
|
51
|
+
const windows = (options.platform ?? process.platform) === "win32";
|
|
52
|
+
const attempts = options.attempts ?? 10;
|
|
53
|
+
const inspect = options.lstat ?? lstat;
|
|
54
|
+
const read = options.readFile ?? readFile;
|
|
55
|
+
const sleep = options.sleep ?? (async (milliseconds) => await new Promise((done) => setTimeout(done, milliseconds)));
|
|
56
|
+
for (let attempt = 1;; attempt += 1) {
|
|
57
|
+
try {
|
|
58
|
+
let stat;
|
|
59
|
+
try {
|
|
60
|
+
stat = await inspect(path);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error.code === "ENOENT")
|
|
64
|
+
return undefined;
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > options.maxBytes) {
|
|
68
|
+
throw new Error(`${options.label} is unsafe`);
|
|
69
|
+
}
|
|
70
|
+
const bytes = await read(path);
|
|
71
|
+
if (bytes.byteLength > options.maxBytes)
|
|
72
|
+
throw new Error(`${options.label} is unsafe`);
|
|
73
|
+
return bytes;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const code = error.code ?? "";
|
|
77
|
+
const transient = code === "ENOENT" || (windows && TRANSIENT_RENAME_CODES.has(code));
|
|
78
|
+
if (attempt >= attempts || !transient)
|
|
79
|
+
throw error;
|
|
80
|
+
await sleep(Math.min(10 * 2 ** (attempt - 1), 500));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Coordinates the atomic writes of one operation, such as a workspace lock holder, with its quiet sections, during
|
|
86
|
+
* which another process may read the state those writes change. A write in the fenced async context waits while a
|
|
87
|
+
* quiet section runs, and a quiet section starts only once no such write is in flight, so readers inside a quiet
|
|
88
|
+
* section never see the operation's writes land. Writes made inside a quiet section itself are not held back: the
|
|
89
|
+
* section's own work, such as an external provider's private records, is outside the state readers depend on. Once
|
|
90
|
+
* `error` is set, every later fenced write throws it instead of writing.
|
|
91
|
+
*/
|
|
92
|
+
export class WriteFence {
|
|
93
|
+
error;
|
|
94
|
+
writes = 0;
|
|
95
|
+
quiets = 0;
|
|
96
|
+
pendingQuiets = 0;
|
|
97
|
+
waiters = [];
|
|
98
|
+
/** Runs `operation` as a quiet section; a section started inside another one of this fence joins it. */
|
|
99
|
+
async quiet(operation) {
|
|
100
|
+
if (quietSections.getStore()?.has(this) === true)
|
|
101
|
+
return operation();
|
|
102
|
+
this.pendingQuiets += 1;
|
|
103
|
+
try {
|
|
104
|
+
while (this.writes > 0)
|
|
105
|
+
await this.changed();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.pendingQuiets -= 1;
|
|
109
|
+
}
|
|
110
|
+
this.quiets += 1;
|
|
111
|
+
try {
|
|
112
|
+
return await quietSections.run(new Set(quietSections.getStore() ?? []).add(this), operation);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.quiets -= 1;
|
|
116
|
+
this.notify();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async write(operation) {
|
|
120
|
+
if (this.error !== undefined)
|
|
121
|
+
throw this.error;
|
|
122
|
+
if (quietSections.getStore()?.has(this) === true)
|
|
123
|
+
return operation();
|
|
124
|
+
// Waiting quiet sections go first, so a stream of writes cannot hold a reader window off indefinitely.
|
|
125
|
+
while (this.quiets > 0 || this.pendingQuiets > 0) {
|
|
126
|
+
await this.changed();
|
|
127
|
+
if (this.error !== undefined)
|
|
128
|
+
throw this.error;
|
|
129
|
+
}
|
|
130
|
+
this.writes += 1;
|
|
131
|
+
try {
|
|
132
|
+
return await operation();
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
this.writes -= 1;
|
|
136
|
+
this.notify();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
changed() {
|
|
140
|
+
return new Promise((resolve) => this.waiters.push(resolve));
|
|
141
|
+
}
|
|
142
|
+
notify() {
|
|
143
|
+
const waiters = this.waiters;
|
|
144
|
+
this.waiters = [];
|
|
145
|
+
for (const resolve of waiters)
|
|
146
|
+
resolve();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const writeFences = new AsyncLocalStorage();
|
|
150
|
+
const quietSections = new AsyncLocalStorage();
|
|
151
|
+
/** Runs `operation` with its atomic writes, and those of everything it starts, subject to `fence`. */
|
|
152
|
+
export function withWriteFence(fence, operation) {
|
|
153
|
+
return writeFences.run(fence, operation);
|
|
154
|
+
}
|
|
5
155
|
export async function atomicWriteBytes(path, bytes, options = {}) {
|
|
156
|
+
const fence = writeFences.getStore();
|
|
157
|
+
if (fence !== undefined)
|
|
158
|
+
return fence.write(() => writeBytes(path, bytes, options));
|
|
159
|
+
return writeBytes(path, bytes, options);
|
|
160
|
+
}
|
|
161
|
+
async function writeBytes(path, bytes, options) {
|
|
6
162
|
const directory = dirname(path);
|
|
7
163
|
await mkdir(directory, { recursive: true });
|
|
8
164
|
const temporary = join(directory, `.${basename(path)}.${process.pid}.${crypto.randomUUID()}.tmp`);
|
|
@@ -20,7 +176,7 @@ export async function atomicWriteBytes(path, bytes, options = {}) {
|
|
|
20
176
|
await rm(temporary);
|
|
21
177
|
return;
|
|
22
178
|
}
|
|
23
|
-
await
|
|
179
|
+
await renameWithRetry(temporary, path);
|
|
24
180
|
}
|
|
25
181
|
catch (error) {
|
|
26
182
|
await rm(temporary, { force: true });
|
package/dist/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,9 @@ export * from "./improvement-store.js";
|
|
|
9
9
|
export * from "./lease-store.js";
|
|
10
10
|
export * from "./object-store.js";
|
|
11
11
|
export * from "./project-store.js";
|
|
12
|
+
export * from "./repeat-files.js";
|
|
13
|
+
export * from "./repeat-guard.js";
|
|
14
|
+
export * from "./review-capture.js";
|
|
12
15
|
export * from "./run-repository.js";
|
|
13
16
|
export * from "./tasks.js";
|
|
14
17
|
export * from "./validator-registry.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,9 @@ export * from "./improvement-store.js";
|
|
|
9
9
|
export * from "./lease-store.js";
|
|
10
10
|
export * from "./object-store.js";
|
|
11
11
|
export * from "./project-store.js";
|
|
12
|
+
export * from "./repeat-files.js";
|
|
13
|
+
export * from "./repeat-guard.js";
|
|
14
|
+
export * from "./review-capture.js";
|
|
12
15
|
export * from "./run-repository.js";
|
|
13
16
|
export * from "./tasks.js";
|
|
14
17
|
export * from "./validator-registry.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
|
package/dist/object-store.js
CHANGED
|
@@ -54,10 +54,10 @@ export class ObjectStore {
|
|
|
54
54
|
if (create) {
|
|
55
55
|
await mkdir(this.root, { recursive: true });
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
if (root !== this.root) {
|
|
57
|
+
if ((await lstat(this.root)).isSymbolicLink()) {
|
|
59
58
|
throw new Error("Object store root must not be a symlink");
|
|
60
59
|
}
|
|
60
|
+
const root = await realpath(this.root);
|
|
61
61
|
const path = join(root, hash.slice(0, 2), hash.slice(2));
|
|
62
62
|
if (create) {
|
|
63
63
|
await mkdir(dirname(path), { recursive: true });
|
package/dist/object-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-store.js","sourceRoot":"","sources":["../src/object-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"object-store.js","sourceRoot":"","sources":["../src/object-store.ts"],"names":[],"mappings":"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"}
|
package/dist/project-store.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { IacTool, ProjectConfigV1, ProjectId, RunConfigV1, RunId } from "@apexops/contracts";
|
|
1
|
+
import type { IacTool, ProjectConfigV1, ProjectId, RiskOwner, RunConfigV1, RunId } from "@apexops/contracts";
|
|
2
2
|
import type { Clock } from "./lease-store.js";
|
|
3
3
|
export type IdSource = () => string;
|
|
4
4
|
export interface InitializeProjectInput {
|
|
5
5
|
projectId: ProjectId;
|
|
6
6
|
displayName: string;
|
|
7
7
|
defaultIacTool: IacTool;
|
|
8
|
+
riskOwner: RiskOwner;
|
|
8
9
|
}
|
|
9
10
|
export interface CreateRunInput {
|
|
10
11
|
environment: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK7G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YACE,aAAa,EAAE,MAAM,EACJ,KAAK,GAAE,KAAwB,EAC/B,QAAQ,GAAE,QAAoC,EAGhE;IAEK,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAa/E;IAEK,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBjF;IAEK,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/D;IAEK,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAErE;IAED,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAG7C;IAED,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAGvD;IAED,OAAO,CAAC,gBAAgB;YAMV,QAAQ;CAGvB"}
|
package/dist/project-store.js
CHANGED
|
@@ -18,6 +18,7 @@ export class ProjectStore {
|
|
|
18
18
|
displayName: input.displayName,
|
|
19
19
|
createdAt: this.clock().toISOString(),
|
|
20
20
|
defaultIacTool: input.defaultIacTool,
|
|
21
|
+
riskOwner: input.riskOwner,
|
|
21
22
|
};
|
|
22
23
|
const directory = this.projectDirectory(input.projectId);
|
|
23
24
|
await mkdir(join(directory, "runs"), { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type SharingRetryOptions } from "./files.js";
|
|
2
|
+
/** Most entries a repeat file snapshot covers; a larger tree fails the snapshot, which disables replay and storage. */
|
|
3
|
+
export declare const MAX_REPEAT_FILE_ENTRIES = 20000;
|
|
4
|
+
/** Most file bytes a repeat file snapshot hashes; a larger tree fails the snapshot, which disables replay and storage. */
|
|
5
|
+
export declare const MAX_REPEAT_FILE_BYTES: number;
|
|
6
|
+
/**
|
|
7
|
+
* One bound path. A regular file is bound by the SHA-256 of its content and by its stat identity (device, inode, mode,
|
|
8
|
+
* size, modification and change times); a directory by its existence; anything else, such as a symbolic link, by its
|
|
9
|
+
* stat identity without being followed.
|
|
10
|
+
*/
|
|
11
|
+
export type RepeatFileEntry = {
|
|
12
|
+
type: "directory";
|
|
13
|
+
} | {
|
|
14
|
+
type: "file";
|
|
15
|
+
sha256: string;
|
|
16
|
+
stat: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "other";
|
|
19
|
+
stat: string;
|
|
20
|
+
};
|
|
21
|
+
/** Content of the mutable trees a repeat-guarded call binds, as read at one point in time. */
|
|
22
|
+
export interface RepeatFileSnapshot {
|
|
23
|
+
/** Absolute, sorted, unique roots. A missing root binds its absence. */
|
|
24
|
+
roots: string[];
|
|
25
|
+
/** Every path under the roots, roots included, keyed by absolute path. */
|
|
26
|
+
entries: Record<string, RepeatFileEntry>;
|
|
27
|
+
}
|
|
28
|
+
export interface RepeatFileSnapshotOptions extends SharingRetryOptions {
|
|
29
|
+
maxEntries?: number;
|
|
30
|
+
maxBytes?: number;
|
|
31
|
+
}
|
|
32
|
+
/** A bound tree is too large or kept changing while it was read, so it cannot be bound by content. */
|
|
33
|
+
export declare class RepeatFileSnapshotError extends Error {
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reads the trees under `roots` and hashes every regular file with streaming SHA-256. Roots nested in another root are
|
|
38
|
+
* read once. Symbolic links below a root are bound by their own stat and never followed; a root that is a symbolic
|
|
39
|
+
* link fails the snapshot. A file that keeps changing while it is hashed, or a tree over the entry or byte budget,
|
|
40
|
+
* fails the snapshot with {@link RepeatFileSnapshotError}. Windows sharing violations are retried.
|
|
41
|
+
*/
|
|
42
|
+
export declare function snapshotRepeatFiles(roots: readonly string[], options?: RepeatFileSnapshotOptions): Promise<RepeatFileSnapshot>;
|
|
43
|
+
/** Digest of a snapshot for the repeat state token; equal only for equal roots, paths, contents and stat identities. */
|
|
44
|
+
export declare function repeatFilesDigest(snapshot: RepeatFileSnapshot): string;
|
|
45
|
+
/**
|
|
46
|
+
* Writes a repeat-guarded operation made itself to bound files, in order. The guard compares the bound trees after the
|
|
47
|
+
* operation with their content at its start changed only by these writes.
|
|
48
|
+
*/
|
|
49
|
+
export declare class RepeatFileWrites {
|
|
50
|
+
#private;
|
|
51
|
+
/** The operation wrote `path` with content of SHA-256 `sha256`, creating missing parent directories. */
|
|
52
|
+
file(path: string, sha256: string): void;
|
|
53
|
+
/** The operation removed `path` and everything below it. */
|
|
54
|
+
removed(path: string): void;
|
|
55
|
+
get writes(): ReadonlyArray<{
|
|
56
|
+
readonly path: string;
|
|
57
|
+
readonly sha256: string | null;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* True when every tree bound at `start` holds, in `end`, exactly its start content changed only by the operation's own
|
|
62
|
+
* `writes`: a file the operation wrote holds what it wrote, and every other path is unchanged in content and stat
|
|
63
|
+
* identity. A bound root missing from `end` fails the check, so `end` must be read over at least the start roots.
|
|
64
|
+
*/
|
|
65
|
+
export declare function repeatFilesHeld(start: RepeatFileSnapshot, end: RepeatFileSnapshot, writes?: RepeatFileWrites): boolean;
|
|
66
|
+
//# sourceMappingURL=repeat-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeat-files.d.ts","sourceRoot":"","sources":["../src/repeat-files.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE9E,uHAAuH;AACvH,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,0HAA0H;AAC1H,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAItD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACzB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3G,8FAA8F;AAC9F,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sGAAsG;AACtG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAgBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAmG7B;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,qBAAa,gBAAgB;;IAG3B,wGAAwG;IACxG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvC;IAED,4DAA4D;IAC5D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,MAAM,IAAI,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAErF;CACF;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,kBAAkB,EACvB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CA4BT"}
|