@amalgm/live 0.2.54 → 0.2.56
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/PURPOSE.md +6 -0
- package/dist/contracts/binding.d.ts +3 -2
- package/dist/contracts/binding.d.ts.map +1 -1
- package/dist/contracts/deployments.d.ts +39 -0
- package/dist/contracts/deployments.d.ts.map +1 -0
- package/dist/contracts/deployments.js +75 -0
- package/dist/contracts/deployments.js.map +1 -0
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/detection/adapter-contract.d.ts +0 -33
- package/dist/detection/adapter-contract.d.ts.map +1 -1
- package/dist/detection/adapter-contract.js +0 -32
- package/dist/detection/adapter-contract.js.map +1 -1
- package/dist/detection/diff.d.ts +5 -87
- package/dist/detection/diff.d.ts.map +1 -1
- package/dist/detection/diff.js +5 -111
- package/dist/detection/diff.js.map +1 -1
- package/dist/detection/enrollment.d.ts +8 -17
- package/dist/detection/enrollment.d.ts.map +1 -1
- package/dist/detection/enrollment.js +8 -73
- package/dist/detection/enrollment.js.map +1 -1
- package/dist/detection/index.d.ts +5 -8
- package/dist/detection/index.d.ts.map +1 -1
- package/dist/detection/index.js +5 -8
- package/dist/detection/index.js.map +1 -1
- package/dist/detection/territory.d.ts +1 -27
- package/dist/detection/territory.d.ts.map +1 -1
- package/dist/detection/territory.js +1 -77
- package/dist/detection/territory.js.map +1 -1
- package/dist/transfer/cargo.d.ts +46 -12
- package/dist/transfer/cargo.d.ts.map +1 -1
- package/dist/transfer/cargo.js +52 -18
- package/dist/transfer/cargo.js.map +1 -1
- package/dist/transfer/download.d.ts +8 -6
- package/dist/transfer/download.d.ts.map +1 -1
- package/dist/transfer/download.js +8 -6
- package/dist/transfer/download.js.map +1 -1
- package/dist/transfer/index.d.ts +2 -1
- package/dist/transfer/index.d.ts.map +1 -1
- package/dist/transfer/index.js +2 -1
- package/dist/transfer/index.js.map +1 -1
- package/dist/transfer/ranges.d.ts +43 -0
- package/dist/transfer/ranges.d.ts.map +1 -0
- package/dist/transfer/ranges.js +109 -0
- package/dist/transfer/ranges.js.map +1 -0
- package/dist/transfer/refs.d.ts +35 -0
- package/dist/transfer/refs.d.ts.map +1 -0
- package/dist/transfer/refs.js +45 -0
- package/dist/transfer/refs.js.map +1 -0
- package/dist-cjs/contracts/deployments.js +81 -0
- package/dist-cjs/contracts/deployments.js.map +1 -0
- package/dist-cjs/contracts/index.js +1 -0
- package/dist-cjs/contracts/index.js.map +1 -1
- package/dist-cjs/detection/adapter-contract.js +1 -34
- package/dist-cjs/detection/adapter-contract.js.map +1 -1
- package/dist-cjs/detection/diff.js +5 -113
- package/dist-cjs/detection/diff.js.map +1 -1
- package/dist-cjs/detection/enrollment.js +9 -75
- package/dist-cjs/detection/enrollment.js.map +1 -1
- package/dist-cjs/detection/index.js +5 -8
- package/dist-cjs/detection/index.js.map +1 -1
- package/dist-cjs/detection/territory.js +1 -79
- package/dist-cjs/detection/territory.js.map +1 -1
- package/dist-cjs/transfer/cargo.js +55 -20
- package/dist-cjs/transfer/cargo.js.map +1 -1
- package/dist-cjs/transfer/download.js +8 -6
- package/dist-cjs/transfer/download.js.map +1 -1
- package/dist-cjs/transfer/index.js +2 -1
- package/dist-cjs/transfer/index.js.map +1 -1
- package/dist-cjs/transfer/ranges.js +114 -0
- package/dist-cjs/transfer/ranges.js.map +1 -0
- package/dist-cjs/transfer/refs.js +49 -0
- package/dist-cjs/transfer/refs.js.map +1 -0
- package/package.json +2 -2
- package/dist/detection/continuity.d.ts +0 -54
- package/dist/detection/continuity.d.ts.map +0 -1
- package/dist/detection/continuity.js +0 -85
- package/dist/detection/continuity.js.map +0 -1
- package/dist/transfer/presign.d.ts +0 -26
- package/dist/transfer/presign.d.ts.map +0 -1
- package/dist/transfer/presign.js +0 -44
- package/dist/transfer/presign.js.map +0 -1
- package/dist-cjs/detection/continuity.js +0 -88
- package/dist-cjs/detection/continuity.js.map +0 -1
- package/dist-cjs/transfer/presign.js +0 -48
- package/dist-cjs/transfer/presign.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"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"}
|
package/dist/transfer/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
package/dist/transfer/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranged pack reading.
|
|
3
|
+
*
|
|
4
|
+
* Sealed envelopes of many small objects live inside one immutable pack.
|
|
5
|
+
* Requests for ranges of the same pack URL made in the same event-loop turn
|
|
6
|
+
* merge into minimal byte spans — one ranged GET per span — and every
|
|
7
|
+
* requester receives exactly its envelope slice. A small hole between wanted
|
|
8
|
+
* ranges is cheaper to read through than to split a request over, so spans
|
|
9
|
+
* merge across gaps up to RANGE_MERGE_GAP_BYTES. Wrong or shifted bytes can
|
|
10
|
+
* never leak: every dispensed slice is still an authenticated envelope the
|
|
11
|
+
* caller opens and hash-verifies.
|
|
12
|
+
*/
|
|
13
|
+
import type { ContentRef } from './refs.js';
|
|
14
|
+
/** Read through holes up to this size rather than splitting a range request. */
|
|
15
|
+
export declare const RANGE_MERGE_GAP_BYTES: number;
|
|
16
|
+
export interface ByteSpan {
|
|
17
|
+
readonly offset: number;
|
|
18
|
+
readonly length: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SpanPlan {
|
|
21
|
+
/** Minimal disjoint fetch spans, ascending by offset. */
|
|
22
|
+
readonly spans: ByteSpan[];
|
|
23
|
+
/** Aligned with the input: which span serves each request, and where the
|
|
24
|
+
* request's bytes start inside that span. */
|
|
25
|
+
readonly slices: Array<{
|
|
26
|
+
readonly span: number;
|
|
27
|
+
readonly start: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
/** Merge wanted ranges into minimal fetch spans. Pure planning — no IO. */
|
|
31
|
+
export declare function planSpans(requests: readonly ByteSpan[], mergeGap: number): SpanPlan;
|
|
32
|
+
export interface SpanFetcherPorts {
|
|
33
|
+
/** Return exactly the requested bytes: the whole object when span is null,
|
|
34
|
+
* otherwise precisely span.length bytes starting at span.offset. */
|
|
35
|
+
fetchSpan(url: string, span: ByteSpan | null): Promise<Uint8Array>;
|
|
36
|
+
}
|
|
37
|
+
export interface SpanFetcher {
|
|
38
|
+
/** The sealed envelope bytes a ref names — a whole standalone object, or
|
|
39
|
+
* one exact slice of a pack. */
|
|
40
|
+
fetch(ref: ContentRef): Promise<Uint8Array>;
|
|
41
|
+
}
|
|
42
|
+
export declare function createSpanFetcher(ports: SpanFetcherPorts): SpanFetcher;
|
|
43
|
+
//# sourceMappingURL=ranges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranges.d.ts","sourceRoot":"","sources":["../../src/transfer/ranges.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3B;iDAC6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAQD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAwBnF;AAED,MAAM,WAAW,gBAAgB;IAC/B;wEACoE;IACpE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,WAAW;IAC1B;oCACgC;IAChC,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7C;AAQD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAyDtE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranged pack reading.
|
|
3
|
+
*
|
|
4
|
+
* Sealed envelopes of many small objects live inside one immutable pack.
|
|
5
|
+
* Requests for ranges of the same pack URL made in the same event-loop turn
|
|
6
|
+
* merge into minimal byte spans — one ranged GET per span — and every
|
|
7
|
+
* requester receives exactly its envelope slice. A small hole between wanted
|
|
8
|
+
* ranges is cheaper to read through than to split a request over, so spans
|
|
9
|
+
* merge across gaps up to RANGE_MERGE_GAP_BYTES. Wrong or shifted bytes can
|
|
10
|
+
* never leak: every dispensed slice is still an authenticated envelope the
|
|
11
|
+
* caller opens and hash-verifies.
|
|
12
|
+
*/
|
|
13
|
+
/** Read through holes up to this size rather than splitting a range request. */
|
|
14
|
+
export const RANGE_MERGE_GAP_BYTES = 64 * 1024;
|
|
15
|
+
function invalidSpan(span) {
|
|
16
|
+
return !Number.isSafeInteger(span.offset) || span.offset < 0
|
|
17
|
+
|| !Number.isSafeInteger(span.length) || span.length < 1
|
|
18
|
+
|| !Number.isSafeInteger(span.offset + span.length);
|
|
19
|
+
}
|
|
20
|
+
/** Merge wanted ranges into minimal fetch spans. Pure planning — no IO. */
|
|
21
|
+
export function planSpans(requests, mergeGap) {
|
|
22
|
+
if (requests.length === 0)
|
|
23
|
+
return { spans: [], slices: [] };
|
|
24
|
+
if (!Number.isSafeInteger(mergeGap) || mergeGap < 0) {
|
|
25
|
+
throw new Error('range plan received an invalid merge gap');
|
|
26
|
+
}
|
|
27
|
+
if (requests.some(invalidSpan))
|
|
28
|
+
throw new Error('range plan received an invalid byte span');
|
|
29
|
+
const order = requests.map((request, index) => ({ request, index }))
|
|
30
|
+
.sort((a, b) => a.request.offset - b.request.offset || a.request.length - b.request.length);
|
|
31
|
+
const spans = [];
|
|
32
|
+
const slices = new Array(requests.length);
|
|
33
|
+
for (const { request, index } of order) {
|
|
34
|
+
const end = request.offset + request.length;
|
|
35
|
+
const current = spans[spans.length - 1];
|
|
36
|
+
if (current && request.offset <= current.end + mergeGap) {
|
|
37
|
+
current.end = Math.max(current.end, end);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
spans.push({ offset: request.offset, end });
|
|
41
|
+
}
|
|
42
|
+
slices[index] = { span: spans.length - 1, start: request.offset - spans[spans.length - 1].offset };
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
spans: spans.map((span) => ({ offset: span.offset, length: span.end - span.offset })),
|
|
46
|
+
slices,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function createSpanFetcher(ports) {
|
|
50
|
+
const pending = new Map();
|
|
51
|
+
let scheduled = false;
|
|
52
|
+
const flushUrl = async (url, waiters) => {
|
|
53
|
+
let plan;
|
|
54
|
+
try {
|
|
55
|
+
plan = planSpans(waiters.map((waiter) => waiter.range), RANGE_MERGE_GAP_BYTES);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
waiters.forEach((waiter) => waiter.reject(error));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await Promise.all(plan.spans.map(async (span, spanIndex) => {
|
|
62
|
+
const served = [];
|
|
63
|
+
plan.slices.forEach((slice, index) => {
|
|
64
|
+
if (slice.span === spanIndex)
|
|
65
|
+
served.push({ waiter: waiters[index], start: slice.start });
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
const bytes = await ports.fetchSpan(url, span);
|
|
69
|
+
if (bytes.length !== span.length) {
|
|
70
|
+
throw new Error(`pack range answered ${bytes.length} bytes where ${span.length} were requested`);
|
|
71
|
+
}
|
|
72
|
+
served.forEach(({ waiter, start }) => waiter.resolve(bytes.subarray(start, start + waiter.range.length)));
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
served.forEach(({ waiter }) => waiter.reject(error));
|
|
76
|
+
}
|
|
77
|
+
}));
|
|
78
|
+
};
|
|
79
|
+
const flush = () => {
|
|
80
|
+
scheduled = false;
|
|
81
|
+
const batches = [...pending.entries()];
|
|
82
|
+
pending.clear();
|
|
83
|
+
for (const [url, waiters] of batches)
|
|
84
|
+
void flushUrl(url, waiters);
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
fetch(ref) {
|
|
88
|
+
if (ref.offset == null && ref.length == null) {
|
|
89
|
+
return ports.fetchSpan(ref.url, null);
|
|
90
|
+
}
|
|
91
|
+
const range = { offset: ref.offset ?? -1, length: ref.length ?? -1 };
|
|
92
|
+
if (invalidSpan(range)) {
|
|
93
|
+
return Promise.reject(new Error('content ref carries an invalid pack range'));
|
|
94
|
+
}
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
const waiters = pending.get(ref.url);
|
|
97
|
+
if (waiters)
|
|
98
|
+
waiters.push({ range, resolve, reject });
|
|
99
|
+
else
|
|
100
|
+
pending.set(ref.url, [{ range, resolve, reject }]);
|
|
101
|
+
if (!scheduled) {
|
|
102
|
+
scheduled = true;
|
|
103
|
+
setTimeout(flush, 0);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ranges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ranges.js","sourceRoot":"","sources":["../../src/transfer/ranges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-ref brokering for direct content-storage fetches.
|
|
3
|
+
*
|
|
4
|
+
* Downloads fetch every storage object straight from content storage. Callers
|
|
5
|
+
* ask where one object lives at a time; the broker coalesces every request
|
|
6
|
+
* made in the same event-loop turn into one batched refs call. The authority
|
|
7
|
+
* answers each object with a short-lived URL and, when the object's sealed
|
|
8
|
+
* envelope rides inside an immutable pack, the exact byte range holding it.
|
|
9
|
+
* URLs are used immediately and never cached — their expiry is the gateway's
|
|
10
|
+
* revocation lever.
|
|
11
|
+
*/
|
|
12
|
+
/** One law shared with the gateway: the most objects one refs call may name. */
|
|
13
|
+
export declare const CONTENT_REFS_BATCH_OBJECTS = 2048;
|
|
14
|
+
export interface ContentObjectName {
|
|
15
|
+
/** 'manifest' names a whole artifact by content hash; 'block' one chunk by its sha256. */
|
|
16
|
+
readonly kind: 'manifest' | 'block';
|
|
17
|
+
readonly sha256: string;
|
|
18
|
+
}
|
|
19
|
+
/** Where one sealed envelope lives. A packed object carries the byte range of
|
|
20
|
+
* its envelope inside the pack the URL names; a standalone object carries the
|
|
21
|
+
* URL alone and is fetched whole. */
|
|
22
|
+
export interface ContentRef {
|
|
23
|
+
readonly url: string;
|
|
24
|
+
readonly offset?: number;
|
|
25
|
+
readonly length?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface RefsBrokerPorts {
|
|
28
|
+
/** Resolve every named object, returning refs aligned by index. */
|
|
29
|
+
requestRefs(objects: readonly ContentObjectName[]): Promise<readonly ContentRef[]>;
|
|
30
|
+
}
|
|
31
|
+
export interface RefsBroker {
|
|
32
|
+
ref(object: ContentObjectName): Promise<ContentRef>;
|
|
33
|
+
}
|
|
34
|
+
export declare function createRefsBroker(ports: RefsBrokerPorts): RefsBroker;
|
|
35
|
+
//# sourceMappingURL=refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/transfer/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;qCAEqC;AACrC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,WAAW,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrD;AAQD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CA+BnE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content-ref brokering for direct content-storage fetches.
|
|
3
|
+
*
|
|
4
|
+
* Downloads fetch every storage object straight from content storage. Callers
|
|
5
|
+
* ask where one object lives at a time; the broker coalesces every request
|
|
6
|
+
* made in the same event-loop turn into one batched refs call. The authority
|
|
7
|
+
* answers each object with a short-lived URL and, when the object's sealed
|
|
8
|
+
* envelope rides inside an immutable pack, the exact byte range holding it.
|
|
9
|
+
* URLs are used immediately and never cached — their expiry is the gateway's
|
|
10
|
+
* revocation lever.
|
|
11
|
+
*/
|
|
12
|
+
/** One law shared with the gateway: the most objects one refs call may name. */
|
|
13
|
+
export const CONTENT_REFS_BATCH_OBJECTS = 2048;
|
|
14
|
+
export function createRefsBroker(ports) {
|
|
15
|
+
let pending = [];
|
|
16
|
+
let scheduled = false;
|
|
17
|
+
const flush = async () => {
|
|
18
|
+
scheduled = false;
|
|
19
|
+
while (pending.length > 0) {
|
|
20
|
+
const batch = pending.splice(0, CONTENT_REFS_BATCH_OBJECTS);
|
|
21
|
+
try {
|
|
22
|
+
const refs = await ports.requestRefs(batch.map((waiter) => waiter.object));
|
|
23
|
+
if (refs.length !== batch.length) {
|
|
24
|
+
throw new Error('content refs answered the wrong number of objects');
|
|
25
|
+
}
|
|
26
|
+
batch.forEach((waiter, index) => waiter.resolve(refs[index]));
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
batch.forEach((waiter) => waiter.reject(error));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
ref(object) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
pending.push({ object, resolve, reject });
|
|
37
|
+
if (!scheduled) {
|
|
38
|
+
scheduled = true;
|
|
39
|
+
setTimeout(() => { void flush(); }, 0);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/transfer/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAgC/C,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,SAAS,GAAG,KAAK,CAAC;QAClB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,CAAC,MAAyB;YAC3B,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS,GAAG,IAAI,CAAC;oBACjB,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Immutable product deployments over one durable Live channel.
|
|
4
|
+
*
|
|
5
|
+
* Products own the definition carried by a deployment. Live owns the shared
|
|
6
|
+
* envelope law: one activation introduces immutable bytes and advances the
|
|
7
|
+
* subject's head atomically. The previous id records lineage; official
|
|
8
|
+
* channel order, not a client-side compare-and-swap, decides the current head.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.DEPLOYMENT_OPERATION = void 0;
|
|
12
|
+
exports.checkDeploymentActivation = checkDeploymentActivation;
|
|
13
|
+
exports.applyDeploymentActivation = applyDeploymentActivation;
|
|
14
|
+
exports.emptyDeploymentSnapshot = emptyDeploymentSnapshot;
|
|
15
|
+
const validate_js_1 = require("./validate.js");
|
|
16
|
+
exports.DEPLOYMENT_OPERATION = 'deployment.activate';
|
|
17
|
+
const EXAMPLE = '{ type: "deployment.activate", deployment: { id, subjectId, previousDeploymentId, definition, createdAt } }';
|
|
18
|
+
/** Validate the shared envelope. The owning product validates `definition`. */
|
|
19
|
+
function checkDeploymentActivation(input) {
|
|
20
|
+
if (!(0, validate_js_1.isRecord)(input) || input.type !== exports.DEPLOYMENT_OPERATION || !(0, validate_js_1.isRecord)(input.deployment)) {
|
|
21
|
+
return (0, validate_js_1.failShape)(EXAMPLE, 'the activation envelope was malformed');
|
|
22
|
+
}
|
|
23
|
+
const deployment = input.deployment;
|
|
24
|
+
if (!(0, validate_js_1.isNonEmptyString)(deployment.id) || !(0, validate_js_1.isNonEmptyString)(deployment.subjectId)) {
|
|
25
|
+
return (0, validate_js_1.failShape)(EXAMPLE, 'deployment id and subjectId must be non-empty strings');
|
|
26
|
+
}
|
|
27
|
+
if (deployment.previousDeploymentId !== null
|
|
28
|
+
&& !(0, validate_js_1.isNonEmptyString)(deployment.previousDeploymentId)) {
|
|
29
|
+
return (0, validate_js_1.failShape)(EXAMPLE, 'previousDeploymentId must be null or a non-empty string');
|
|
30
|
+
}
|
|
31
|
+
if (!(0, validate_js_1.isNonEmptyString)(deployment.createdAt)) {
|
|
32
|
+
return (0, validate_js_1.failShape)(EXAMPLE, 'createdAt must be a non-empty string');
|
|
33
|
+
}
|
|
34
|
+
return (0, validate_js_1.pass)(input);
|
|
35
|
+
}
|
|
36
|
+
function canonical(value) {
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
return value.map(canonical);
|
|
39
|
+
if (!(0, validate_js_1.isRecord)(value))
|
|
40
|
+
return value;
|
|
41
|
+
return Object.fromEntries(Object.entries(value)
|
|
42
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
43
|
+
.map(([key, item]) => [key, canonical(item)]));
|
|
44
|
+
}
|
|
45
|
+
function sameDeployment(left, right) {
|
|
46
|
+
return JSON.stringify(canonical(left)) === JSON.stringify(canonical(right));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Apply one officially ordered activation.
|
|
50
|
+
*
|
|
51
|
+
* A retry of an already-known deployment is a no-op even if newer operations
|
|
52
|
+
* have since advanced the head. Rollback therefore mints a new deployment;
|
|
53
|
+
* it never reactivates an old id. Reusing an id for different bytes is always
|
|
54
|
+
* corruption and is refused.
|
|
55
|
+
*/
|
|
56
|
+
function applyDeploymentActivation(snapshot, activation) {
|
|
57
|
+
const checked = checkDeploymentActivation(activation);
|
|
58
|
+
if (!checked.ok)
|
|
59
|
+
throw new Error(checked.error);
|
|
60
|
+
const deployment = activation.deployment;
|
|
61
|
+
const existing = snapshot.deployments[deployment.id];
|
|
62
|
+
if (existing) {
|
|
63
|
+
if (!sameDeployment(existing, deployment)) {
|
|
64
|
+
throw new Error(`Deployment id is immutable: ${deployment.id}`);
|
|
65
|
+
}
|
|
66
|
+
return snapshot;
|
|
67
|
+
}
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
version: 1,
|
|
70
|
+
deployments: Object.freeze({ ...snapshot.deployments, [deployment.id]: deployment }),
|
|
71
|
+
heads: Object.freeze({ ...snapshot.heads, [deployment.subjectId]: deployment.id }),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function emptyDeploymentSnapshot() {
|
|
75
|
+
return Object.freeze({
|
|
76
|
+
version: 1,
|
|
77
|
+
deployments: Object.freeze({}),
|
|
78
|
+
heads: Object.freeze({}),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=deployments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/contracts/deployments.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA4BH,8DAkBC;AAsBD,8DAmBC;AAED,0DAMC;AA7FD,+CAA0F;AAE7E,QAAA,oBAAoB,GAAG,qBAA8B,CAAC;AAqBnE,MAAM,OAAO,GAAG,6GAA6G,CAAC;AAE9H,+EAA+E;AAC/E,SAAgB,yBAAyB,CACvC,KAAc;IAEd,IAAI,CAAC,IAAA,sBAAQ,EAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,4BAAoB,IAAI,CAAC,IAAA,sBAAQ,EAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3F,OAAO,IAAA,uBAAS,EAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChF,OAAO,IAAA,uBAAS,EAAC,OAAO,EAAE,uDAAuD,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,UAAU,CAAC,oBAAoB,KAAK,IAAI;WACvC,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACxD,OAAO,IAAA,uBAAS,EAAC,OAAO,EAAE,yDAAyD,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAA,uBAAS,EAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAA,kBAAI,EAAC,KAAoD,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,IAAA,sBAAQ,EAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAC5C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,IAAa,EAAE,KAAc;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACvC,QAAwC,EACxC,UAA4C;IAE5C,MAAM,OAAO,GAAG,yBAAyB,CAAa,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAU;QACnB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;QACpF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;KACnF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAU;QACnB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -25,6 +25,7 @@ __exportStar(require("./resources.js"), exports);
|
|
|
25
25
|
__exportStar(require("./events.js"), exports);
|
|
26
26
|
__exportStar(require("./snapshot.js"), exports);
|
|
27
27
|
__exportStar(require("./binding.js"), exports);
|
|
28
|
+
__exportStar(require("./deployments.js"), exports);
|
|
28
29
|
__exportStar(require("./presence.js"), exports);
|
|
29
30
|
__exportStar(require("./docs.js"), exports);
|
|
30
31
|
__exportStar(require("./content.js"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,gDAA8B;AAC9B,iDAA+B;AAC/B,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B;AAC7B,gDAA8B;AAC9B,4CAA0B;AAC1B,+CAA6B;AAC7B,kDAAgC;AAChC,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;AAEH,gDAA8B;AAC9B,iDAA+B;AAC/B,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B;AAC7B,mDAAiC;AACjC,gDAA8B;AAC9B,4CAA0B;AAC1B,+CAA6B;AAC7B,kDAAgC;AAChC,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC"}
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* behavior differs by type — never for symmetry.
|
|
35
35
|
*/
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.
|
|
37
|
+
exports.SOCKETS = exports.RAILS = void 0;
|
|
38
38
|
exports.assertAdapter = assertAdapter;
|
|
39
39
|
exports.buildTypeMap = buildTypeMap;
|
|
40
40
|
/** The seven rails, declared once, frozen, in journey order. */
|
|
@@ -132,37 +132,4 @@ function buildTypeMap(adapters, alphabet) {
|
|
|
132
132
|
}
|
|
133
133
|
return byType;
|
|
134
134
|
}
|
|
135
|
-
/**
|
|
136
|
-
* The three-state vocabulary's one shared judgment: what a FAILED look
|
|
137
|
-
* at ground means. ENOENT and ENOTDIR are the filesystem itself saying
|
|
138
|
-
* "not there" — honest ABSENCE, a fact. Every other failure means the
|
|
139
|
-
* LOOK failed, not the ground — UNSETTLED: no conclusion, read again.
|
|
140
|
-
*
|
|
141
|
-
* Every truth reader classifies through this one function so no reader
|
|
142
|
-
* can invent its own idea of absence: mistaking "could not look" for
|
|
143
|
-
* "not there" is the exact lie axiom 4 forbids. Only present or absent
|
|
144
|
-
* may produce a conclusion.
|
|
145
|
-
*/
|
|
146
|
-
const lookFailed = (error) => error.code === 'ENOENT' || error.code === 'ENOTDIR'
|
|
147
|
-
? { truth: 'absent' }
|
|
148
|
-
: { truth: 'unsettled', reason: error.code };
|
|
149
|
-
exports.lookFailed = lookFailed;
|
|
150
|
-
/**
|
|
151
|
-
* The managed-reference adapter: Amalgm's OWN link kind, never
|
|
152
|
-
* conflated with a filesystem symlink. Its payload is the target
|
|
153
|
-
* entity's UUID — identity, not an address — and its local rendering as
|
|
154
|
-
* an ordinary symlink is DERIVED state (entity-model.md, symlink
|
|
155
|
-
* section). ASSIGNED, NOT YET OPERATIONAL — and that absence is the
|
|
156
|
-
* honest truth: no rail is bound because the projection lives inside
|
|
157
|
-
* the registration boundary today; its detect socket is ratified from
|
|
158
|
-
* that seam when the projection is extracted, never invented ahead of
|
|
159
|
-
* it.
|
|
160
|
-
*/
|
|
161
|
-
exports.referenceAdapter = Object.freeze({
|
|
162
|
-
name: 'reference',
|
|
163
|
-
types: Object.freeze({
|
|
164
|
-
reference: "its target entity's UUID — identity, not an address; the rendered symlink is derived state",
|
|
165
|
-
}),
|
|
166
|
-
rails: Object.freeze({}),
|
|
167
|
-
});
|
|
168
135
|
//# sourceMappingURL=adapter-contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,27 +6,19 @@
|
|
|
6
6
|
* verdicts live here. Ratified by entity-model.md ("Address and
|
|
7
7
|
* physical continuity are the two identity witnesses, never content").
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* absorb that churn.
|
|
14
|
-
* - Directories: physical continuity claims first; the address claims
|
|
15
|
-
* what no inode claims. Nothing replaces a directory's inode in
|
|
16
|
-
* place, so a known inode at a new address IS the directory, moved.
|
|
17
|
-
* - Links: the FILE rules, for the file reason — retarget is unlink +
|
|
18
|
-
* recreate, so the inode churns exactly like an atomic save.
|
|
9
|
+
* Directories order the two witnesses opposite to files: physical
|
|
10
|
+
* continuity claims first and the address claims what no inode claims,
|
|
11
|
+
* because nothing replaces a directory's inode in place. So a known inode
|
|
12
|
+
* at a new address IS the directory, moved.
|
|
19
13
|
*/
|
|
20
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
15
|
exports.matchByInode = matchByInode;
|
|
22
16
|
exports.diffDirState = diffDirState;
|
|
23
|
-
exports.diffLinkState = diffLinkState;
|
|
24
|
-
exports.diffRootState = diffRootState;
|
|
25
17
|
/**
|
|
26
18
|
* Physical continuity, shared by every compare function: a row and an
|
|
27
19
|
* entry sharing one device:inode, exactly one match on both sides → the
|
|
28
20
|
* same physical thing. Anything else is never guessed. For files this
|
|
29
|
-
* rescues path-orphans
|
|
21
|
+
* rescues path-orphans; for directories it is the first rule.
|
|
30
22
|
*/
|
|
31
23
|
function matchByInode(rows, entries) {
|
|
32
24
|
const one = (map, key, value) => map.set(key, map.has(key) ? 'many' : value);
|
|
@@ -90,104 +82,4 @@ function diffDirState(rows, entries) {
|
|
|
90
82
|
deletes: [...rowsByPath.values()],
|
|
91
83
|
};
|
|
92
84
|
}
|
|
93
|
-
/**
|
|
94
|
-
* The compare function for link channels — the FILE identity rules, for
|
|
95
|
-
* the file reason: a symlink cannot be retargeted in place (retarget is
|
|
96
|
-
* unlink + recreate, so the inode churns exactly like an atomic save),
|
|
97
|
-
* so the path absorbs that churn and claims first; the inode rescues
|
|
98
|
-
* path-orphans (`mv` preserves a symlink's inode). The payload is the
|
|
99
|
-
* target string, already read at walk time. A consequence worth naming:
|
|
100
|
-
* two links exchanging names read as two retargets (path-first),
|
|
101
|
-
* because a link's meaning IS its written address.
|
|
102
|
-
* 1. Path claims the channel: same target = continued (a new inode
|
|
103
|
-
* under an old name with an old target is silent recreation),
|
|
104
|
-
* different target = changed.
|
|
105
|
-
* 2. Inode rescues path-orphans: renames.
|
|
106
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
107
|
-
*/
|
|
108
|
-
function diffLinkState(rows, entries) {
|
|
109
|
-
const changes = [];
|
|
110
|
-
const retags = [];
|
|
111
|
-
const rowsByPath = new Map(rows.map((row) => [row.relPath, row]));
|
|
112
|
-
const claimedRowIds = new Set();
|
|
113
|
-
const orphanEntries = [];
|
|
114
|
-
for (const entry of entries) {
|
|
115
|
-
const row = rowsByPath.get(entry.relPath);
|
|
116
|
-
if (!row) {
|
|
117
|
-
orphanEntries.push(entry);
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
claimedRowIds.add(row.linkId);
|
|
121
|
-
if (row.target !== entry.target)
|
|
122
|
-
changes.push({ row, entry });
|
|
123
|
-
else if (row.device !== entry.device || row.inode !== entry.inode)
|
|
124
|
-
retags.push({ row, entry });
|
|
125
|
-
}
|
|
126
|
-
const orphanRows = rows.filter((row) => !claimedRowIds.has(row.linkId));
|
|
127
|
-
const renames = matchByInode(orphanRows, orphanEntries);
|
|
128
|
-
const renamedRowIds = new Set(renames.map((pair) => pair.row.linkId));
|
|
129
|
-
const renamedEntries = new Set(renames.map((pair) => pair.entry));
|
|
130
|
-
return {
|
|
131
|
-
changes,
|
|
132
|
-
retags,
|
|
133
|
-
renames,
|
|
134
|
-
creates: orphanEntries.filter((entry) => !renamedEntries.has(entry)),
|
|
135
|
-
deletes: orphanRows.filter((row) => !renamedRowIds.has(row.linkId)),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* The compare function for file channels — doorbells and rescans both
|
|
140
|
-
* end here. Hashing is deferred — `checks` name the files whose content
|
|
141
|
-
* must be read before an event may be claimed.
|
|
142
|
-
*
|
|
143
|
-
* Identity rules, in order:
|
|
144
|
-
* 1. Path claims the channel. Same rel_path = same file_id, even when
|
|
145
|
-
* the inode changed (atomic saves replace the inode on every
|
|
146
|
-
* write).
|
|
147
|
-
* 2. Inode rescues path-orphans (matchByInode above).
|
|
148
|
-
* 3. Leftover entries are creates; leftover rows are deletes.
|
|
149
|
-
*
|
|
150
|
-
* The single stat-shortcut this layer allows itself: a (size, mtime,
|
|
151
|
-
* inode) triple identical to the stored one is skipped as unchanged —
|
|
152
|
-
* but only when the mtime is strictly older than the moment we last
|
|
153
|
-
* read the bytes (git's "racily clean" rule), and only when nothing
|
|
154
|
-
* pointed at the file. A path named in `mustCheck` (the doorbell said
|
|
155
|
-
* so) is always hashed: timestamps can lie, a delivered watcher event
|
|
156
|
-
* cannot be un-delivered.
|
|
157
|
-
*/
|
|
158
|
-
function diffRootState(rows, entries, mustCheck = null) {
|
|
159
|
-
const checks = [];
|
|
160
|
-
let unchanged = 0;
|
|
161
|
-
const rowsByPath = new Map(rows.map((row) => [row.relPath, row]));
|
|
162
|
-
const claimedRowIds = new Set();
|
|
163
|
-
const orphanEntries = [];
|
|
164
|
-
for (const entry of entries) {
|
|
165
|
-
const row = rowsByPath.get(entry.relPath);
|
|
166
|
-
if (!row) {
|
|
167
|
-
orphanEntries.push(entry);
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
claimedRowIds.add(row.fileId);
|
|
171
|
-
const statsMatch = row.size === entry.size && row.mtimeMs === entry.mtimeMs && row.inode === entry.inode;
|
|
172
|
-
const provablyBeforeLastRead = typeof row.hashedAtMs === 'number' && entry.mtimeMs < row.hashedAtMs;
|
|
173
|
-
const named = mustCheck !== null && mustCheck.has(entry.relPath);
|
|
174
|
-
if (statsMatch && provablyBeforeLastRead && !named) {
|
|
175
|
-
unchanged += 1;
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
checks.push({ row, entry });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
const orphanRows = rows.filter((row) => !claimedRowIds.has(row.fileId));
|
|
182
|
-
const renames = matchByInode(orphanRows, orphanEntries);
|
|
183
|
-
const renamedRowIds = new Set(renames.map((pair) => pair.row.fileId));
|
|
184
|
-
const renamedEntries = new Set(renames.map((pair) => pair.entry));
|
|
185
|
-
return {
|
|
186
|
-
checks,
|
|
187
|
-
renames,
|
|
188
|
-
creates: orphanEntries.filter((entry) => !renamedEntries.has(entry)),
|
|
189
|
-
deletes: orphanRows.filter((row) => !renamedRowIds.has(row.fileId)),
|
|
190
|
-
unchanged,
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
85
|
//# sourceMappingURL=diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/detection/diff.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA6BH,oCAiBC;AA2BD,oCAwBC;AA1ED;;;;;GAKG;AACH,SAAgB,YAAY,CAC1B,IAAoB,EACpB,OAAyB;IAEzB,MAAM,GAAG,GAAG,CAAQ,GAAgC,EAAE,GAAW,EAAE,KAAY,EAAE,EAAE,CACjF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwB,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,GAAG,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1F,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS;QACzD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AASD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,YAAY,CAAC,IAAuB,EAAE,OAA4B;IAChF,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC3E,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,MAAM,GAAmC,EAAE,CAAC;IAClD,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACxC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,GAAG,EAAE,CAAC;YACR,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1E,MAAM;QACN,OAAO;QACP,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC"}
|