@volter/browser-runtime 0.1.83 → 0.1.85
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/browser-image-layers.d.ts +11 -2
- package/dist/browser-image-layers.d.ts.map +1 -1
- package/dist/browser-image-layers.js +11 -3
- package/dist/browser-image-layers.js.map +1 -1
- package/dist/browser-image-range-worker.js +441 -69
- package/dist/browser-image-range-worker.js.map +1 -1
- package/dist/browser-image-ranges.d.ts +58 -2
- package/dist/browser-image-ranges.d.ts.map +1 -1
- package/dist/browser-image-ranges.js +271 -13
- package/dist/browser-image-ranges.js.map +1 -1
- package/dist/browser-pack-store.d.ts +32 -6
- package/dist/browser-pack-store.d.ts.map +1 -1
- package/dist/browser-pack-store.js +74 -22
- package/dist/browser-pack-store.js.map +1 -1
- package/dist/browser-store-layout.d.ts +13 -0
- package/dist/browser-store-layout.d.ts.map +1 -0
- package/dist/browser-store-layout.js +20 -0
- package/dist/browser-store-layout.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,86 +1,472 @@
|
|
|
1
1
|
import { validateImageRanges } from "./browser-image-ranges.js";
|
|
2
2
|
const scope = self;
|
|
3
|
+
/** When this script began to run, and when its reader's admission arrived: the boot trace splits a reader's wait. */
|
|
4
|
+
const loadedAt = Date.now();
|
|
5
|
+
let initAt = 0;
|
|
3
6
|
let ranges;
|
|
4
7
|
let directory;
|
|
5
8
|
let identity;
|
|
6
9
|
let state;
|
|
7
10
|
let completed;
|
|
11
|
+
let packAccess;
|
|
12
|
+
let receiptAccess;
|
|
13
|
+
let receiptLock;
|
|
14
|
+
let admitted = false;
|
|
15
|
+
let sharedCompletion = false;
|
|
16
|
+
let receiptKey;
|
|
17
|
+
/** Digest bytes, followed by exact safe-number offset and expanded length. */
|
|
18
|
+
const RECEIPT_BYTES = 48;
|
|
19
|
+
/** Prefetches in flight at once; a demanded read never waits for one of these slots. */
|
|
20
|
+
const PREFETCH_LANES = 2;
|
|
8
21
|
const loading = new Map();
|
|
22
|
+
/** Ranges written but not yet receipted: their receipts wait for the pack flush that covers them. */
|
|
23
|
+
let awaitingReceipt = [];
|
|
24
|
+
let durableSoon;
|
|
25
|
+
const RECEIPT_BATCH = 32;
|
|
26
|
+
const RECEIPT_DELAY_MS = 100;
|
|
27
|
+
/** Flushes the pack, then writes and flushes the receipts of exactly the ranges that flush covered. */
|
|
28
|
+
async function makeDurable() {
|
|
29
|
+
if (durableSoon) {
|
|
30
|
+
clearTimeout(durableSoon);
|
|
31
|
+
durableSoon = undefined;
|
|
32
|
+
}
|
|
33
|
+
if (awaitingReceipt.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
const covered = awaitingReceipt;
|
|
36
|
+
awaitingReceipt = [];
|
|
37
|
+
packAccess.flush();
|
|
38
|
+
await scope.navigator.locks.request(receiptLock, { mode: "shared" }, () => {
|
|
39
|
+
for (const index of covered)
|
|
40
|
+
writeCompletely(receiptAccess, receiptFor(index), index * RECEIPT_BYTES);
|
|
41
|
+
receiptAccess.flush();
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** A helper's share is done once its receipts are durable too: it is terminated after it says so. */
|
|
45
|
+
function reportPrefetched() {
|
|
46
|
+
void makeDurable().finally(() => scope.postMessage({ type: "prefetched", identity }));
|
|
47
|
+
}
|
|
48
|
+
/** Ranges a synchronous reader is waiting on. */
|
|
49
|
+
const demanded = new Set();
|
|
50
|
+
/** The readers waiting on each range: this worker's own and every line it serves (ADR-0080). */
|
|
51
|
+
const waiting = new Map();
|
|
52
|
+
/** The lines this worker serves, told when it ends. */
|
|
53
|
+
const lines = new Set();
|
|
54
|
+
/** Reads that arrived on a line before admission, served once admitted. */
|
|
55
|
+
let early = [];
|
|
56
|
+
let prefetchQueue = [];
|
|
57
|
+
let prefetching = 0;
|
|
9
58
|
scope.onmessage = (event) => {
|
|
10
59
|
const message = event.data;
|
|
11
60
|
if (message.type === "init") {
|
|
12
61
|
if (state)
|
|
13
62
|
throw new Error("An image reader can only be initialized once.");
|
|
63
|
+
initAt = Date.now();
|
|
14
64
|
ranges = validateImageRanges(message.ranges);
|
|
15
65
|
directory = message.directory;
|
|
16
66
|
identity = message.identity;
|
|
17
67
|
state = new Int32Array(message.state);
|
|
18
|
-
|
|
68
|
+
// The completion state leads the buffer; a read order may follow it (ADR-0078).
|
|
69
|
+
completed = message.completed.byteLength >= ranges.parts.length * Int32Array.BYTES_PER_ELEMENT ? new Int32Array(message.completed, 0, ranges.parts.length) : new Int32Array(new SharedArrayBuffer(0));
|
|
19
70
|
if (state.length !== ranges.parts.length || completed.length !== state.length || !/^[a-zA-Z0-9._-]+$/u.test(identity))
|
|
20
71
|
throw new Error("Invalid image reader admission.");
|
|
72
|
+
if (message.receiptKey !== undefined && !/^[a-f0-9]{64}$/u.test(message.receiptKey))
|
|
73
|
+
throw new Error("Invalid image receipt key.");
|
|
74
|
+
receiptKey = message.receiptKey;
|
|
75
|
+
sharedCompletion = message.sharedCompletion === true;
|
|
76
|
+
void admit().then(() => {
|
|
77
|
+
admitted = true;
|
|
78
|
+
for (const read of early.splice(0))
|
|
79
|
+
read();
|
|
80
|
+
scope.postMessage({ type: "ready", identity });
|
|
81
|
+
}, (cause) => {
|
|
82
|
+
for (const access of [packAccess, receiptAccess]) {
|
|
83
|
+
try {
|
|
84
|
+
access?.close();
|
|
85
|
+
}
|
|
86
|
+
catch { /* Preserve the admission error. */ }
|
|
87
|
+
}
|
|
88
|
+
scope.postMessage({ type: "init-error", identity, error: cause instanceof Error ? cause.message : String(cause) });
|
|
89
|
+
});
|
|
21
90
|
return;
|
|
22
91
|
}
|
|
23
|
-
if (message.type
|
|
92
|
+
if (message.type === "prefetch") {
|
|
93
|
+
const indices = event.data.indices;
|
|
94
|
+
if (!admitted || !Array.isArray(indices) || indices.length > ranges.parts.length
|
|
95
|
+
|| indices.some(index => !Number.isSafeInteger(index) || index < 0 || index >= ranges.parts.length))
|
|
96
|
+
return;
|
|
97
|
+
prefetchQueue = [...new Set(indices)];
|
|
98
|
+
pumpPrefetch();
|
|
99
|
+
// Demanded reads may already have verified the whole share: nothing started, so nothing will report done.
|
|
100
|
+
if (prefetching === 0 && prefetchQueue.length === 0)
|
|
101
|
+
reportPrefetched();
|
|
24
102
|
return;
|
|
25
|
-
|
|
26
|
-
if (
|
|
103
|
+
}
|
|
104
|
+
if (message.type === "client") {
|
|
105
|
+
serveLine(event.data);
|
|
27
106
|
return;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
107
|
+
}
|
|
108
|
+
if (message.type === "prefetch-stream") {
|
|
109
|
+
const url = event.data.url;
|
|
110
|
+
if (!admitted || typeof url !== "string")
|
|
111
|
+
return;
|
|
112
|
+
void readStartupStream(url).catch((cause) => console.warn("The image's startup stream could not be read; its ranges are fetched when first read.", cause))
|
|
113
|
+
.finally(reportPrefetched);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (message.type === "closing") {
|
|
117
|
+
// Every reader still waiting fails now, not after its 30 s bound; every
|
|
118
|
+
// line's reader starts a materializer of its own (ADR-0080).
|
|
119
|
+
for (const index of [...waiting.keys()])
|
|
120
|
+
settleWaiting(index, -1);
|
|
121
|
+
for (const port of lines) {
|
|
122
|
+
port.postMessage({ type: "closing" });
|
|
123
|
+
port.close();
|
|
124
|
+
}
|
|
125
|
+
lines.clear();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (message.type !== "read" || !admitted)
|
|
129
|
+
return;
|
|
130
|
+
read(message.index, state);
|
|
38
131
|
};
|
|
132
|
+
/**
|
|
133
|
+
* Another realm's reader of this generation reads through this worker: it
|
|
134
|
+
* sends its reads on the port and waits in its own state buffer. A line may
|
|
135
|
+
* hand on further lines, for the processes its realm starts.
|
|
136
|
+
*/
|
|
137
|
+
function serveLine(line) {
|
|
138
|
+
if (!(line.port instanceof MessagePort) || !(line.state instanceof SharedArrayBuffer))
|
|
139
|
+
return;
|
|
140
|
+
const lineState = new Int32Array(line.state);
|
|
141
|
+
if (!ranges || lineState.length !== ranges.parts.length) {
|
|
142
|
+
line.port.close();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
lines.add(line.port);
|
|
146
|
+
line.port.onmessage = (event) => {
|
|
147
|
+
const message = event.data;
|
|
148
|
+
if (message?.type === "client") {
|
|
149
|
+
serveLine(event.data);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (message?.type !== "read")
|
|
153
|
+
return;
|
|
154
|
+
if (admitted)
|
|
155
|
+
read(message.index, lineState);
|
|
156
|
+
else
|
|
157
|
+
early.push(() => read(message.index, lineState));
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function read(index, readerState) {
|
|
161
|
+
if (!Number.isSafeInteger(index) || index < 0 || index >= ranges.parts.length)
|
|
162
|
+
return;
|
|
163
|
+
const at = index;
|
|
164
|
+
if (Atomics.load(readerState, at) === 2)
|
|
165
|
+
return;
|
|
166
|
+
if (Atomics.load(completed, at) === 2) {
|
|
167
|
+
settle(readerState, at, 2);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
let readers = waiting.get(at);
|
|
171
|
+
if (!readers)
|
|
172
|
+
waiting.set(at, readers = new Set());
|
|
173
|
+
readers.add(readerState);
|
|
174
|
+
demanded.add(at);
|
|
175
|
+
// A prefetch already fetching this range settles the reader's wait.
|
|
176
|
+
if (loading.has(at))
|
|
177
|
+
return;
|
|
178
|
+
start(at, true);
|
|
179
|
+
}
|
|
180
|
+
function settle(readerState, index, value) {
|
|
181
|
+
Atomics.store(readerState, index, value);
|
|
182
|
+
Atomics.notify(readerState, index);
|
|
183
|
+
}
|
|
184
|
+
function settleWaiting(index, value) {
|
|
185
|
+
const readers = waiting.get(index);
|
|
186
|
+
waiting.delete(index);
|
|
187
|
+
for (const readerState of readers ?? [])
|
|
188
|
+
settle(readerState, index, value);
|
|
189
|
+
}
|
|
190
|
+
/** Placements a stream's reader keeps in flight: as many as a helper's prefetch lanes. */
|
|
191
|
+
const STREAM_LANES = 2;
|
|
192
|
+
/**
|
|
193
|
+
* One of the image's startup streams (ADR-0082): each entry a range's digest,
|
|
194
|
+
* its served length and its served bytes. Each range it holds is placed as a
|
|
195
|
+
* fetched one is (part lock, inflation, digest, extent write, receipt), and
|
|
196
|
+
* one already held, or already being placed, is passed over.
|
|
197
|
+
*/
|
|
198
|
+
async function readStartupStream(url) {
|
|
199
|
+
const target = new URL(url, scope.location.origin);
|
|
200
|
+
if (target.origin !== scope.location.origin || !/^\/substrate\/[A-Za-z0-9._-]+\.startup\/[0-9a-f]{64}\.bin$/u.test(target.pathname))
|
|
201
|
+
throw new Error("Not an image startup stream.");
|
|
202
|
+
const byDigest = new Map();
|
|
203
|
+
for (let index = 0; index < ranges.parts.length; index += 1) {
|
|
204
|
+
const part = ranges.parts[index];
|
|
205
|
+
if (part.raw === 0)
|
|
206
|
+
continue;
|
|
207
|
+
const held = byDigest.get(part.sha256);
|
|
208
|
+
if (held)
|
|
209
|
+
held.push(index);
|
|
210
|
+
else
|
|
211
|
+
byDigest.set(part.sha256, [index]);
|
|
212
|
+
}
|
|
213
|
+
const response = await fetch(target, { cache: "no-store", credentials: "omit", redirect: "error" });
|
|
214
|
+
if (!response.ok || !response.body)
|
|
215
|
+
throw new Error(`${target.pathname} answered ${response.status}.`);
|
|
216
|
+
const reader = response.body.getReader();
|
|
217
|
+
let buffer = new Uint8Array(0);
|
|
218
|
+
const placing = new Set();
|
|
219
|
+
const place = async (digest, served) => {
|
|
220
|
+
for (const index of byDigest.get(digest) ?? []) {
|
|
221
|
+
if (Atomics.load(completed, index) === 2 || loading.has(index))
|
|
222
|
+
continue;
|
|
223
|
+
const operation = materialize(index, served).then(() => {
|
|
224
|
+
Atomics.store(completed, index, 2);
|
|
225
|
+
Atomics.store(state, index, 2);
|
|
226
|
+
settleWaiting(index, 2);
|
|
227
|
+
}, (cause) => {
|
|
228
|
+
// A reader waiting on it fetches it itself.
|
|
229
|
+
console.warn(`Placing immutable image part ${ranges.parts[index].url} from its startup stream failed; its first read fetches it.`, cause);
|
|
230
|
+
if (waiting.has(index)) {
|
|
231
|
+
loading.delete(index);
|
|
232
|
+
start(index, true);
|
|
233
|
+
}
|
|
234
|
+
}).finally(() => { if (loading.get(index) === operation)
|
|
235
|
+
loading.delete(index); });
|
|
236
|
+
loading.set(index, operation);
|
|
237
|
+
await operation;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
for (;;) {
|
|
241
|
+
while (buffer.byteLength >= 36) {
|
|
242
|
+
const length = new DataView(buffer.buffer, buffer.byteOffset + 32, 4).getUint32(0, true);
|
|
243
|
+
if (buffer.byteLength < 36 + length)
|
|
244
|
+
break;
|
|
245
|
+
const digest = Array.from(buffer.subarray(0, 32), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
246
|
+
const served = buffer.slice(36, 36 + length);
|
|
247
|
+
buffer = buffer.subarray(36 + length);
|
|
248
|
+
const placed = place(digest, served);
|
|
249
|
+
placing.add(placed);
|
|
250
|
+
void placed.finally(() => placing.delete(placed));
|
|
251
|
+
if (placing.size >= STREAM_LANES)
|
|
252
|
+
await Promise.race(placing);
|
|
253
|
+
}
|
|
254
|
+
const { done, value } = await reader.read();
|
|
255
|
+
if (done)
|
|
256
|
+
break;
|
|
257
|
+
const joined = new Uint8Array(buffer.byteLength + value.byteLength);
|
|
258
|
+
joined.set(buffer, 0);
|
|
259
|
+
joined.set(value, buffer.byteLength);
|
|
260
|
+
buffer = joined;
|
|
261
|
+
}
|
|
262
|
+
if (buffer.byteLength !== 0)
|
|
263
|
+
throw new Error(`${target.pathname} ends inside an entry.`);
|
|
264
|
+
await Promise.all(placing);
|
|
265
|
+
}
|
|
266
|
+
function pumpPrefetch() {
|
|
267
|
+
while (prefetching < PREFETCH_LANES && prefetchQueue.length > 0) {
|
|
268
|
+
const index = prefetchQueue.shift();
|
|
269
|
+
if (Atomics.load(completed, index) === 2 || loading.has(index))
|
|
270
|
+
continue;
|
|
271
|
+
prefetching += 1;
|
|
272
|
+
start(index, false);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function start(index, demand) {
|
|
276
|
+
const operation = (async () => {
|
|
277
|
+
let retry = false;
|
|
278
|
+
try {
|
|
279
|
+
await materialize(index);
|
|
280
|
+
// Only successful verification and durable publication move shared state.
|
|
281
|
+
// A reader's failure/termination affects its own waiter, never its siblings.
|
|
282
|
+
Atomics.store(completed, index, 2);
|
|
283
|
+
Atomics.store(state, index, 2);
|
|
284
|
+
settleWaiting(index, 2);
|
|
285
|
+
}
|
|
286
|
+
catch (cause) {
|
|
287
|
+
// A failed prefetch fails no reader: one waiting on it gets its own acquisition.
|
|
288
|
+
if (!demand && demanded.has(index))
|
|
289
|
+
retry = true;
|
|
290
|
+
else if (demand) {
|
|
291
|
+
console.error(`Immutable image part ${ranges.parts[index].url} failed:`, cause);
|
|
292
|
+
Atomics.store(state, index, -1);
|
|
293
|
+
settleWaiting(index, -1);
|
|
294
|
+
}
|
|
295
|
+
else
|
|
296
|
+
console.warn(`Prefetching immutable image part ${ranges.parts[index].url} failed; its first read fetches it.`, cause);
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
loading.delete(index);
|
|
300
|
+
if (!retry) {
|
|
301
|
+
demanded.delete(index);
|
|
302
|
+
Atomics.notify(state, index);
|
|
303
|
+
}
|
|
304
|
+
if (!demand) {
|
|
305
|
+
prefetching -= 1;
|
|
306
|
+
pumpPrefetch();
|
|
307
|
+
if (prefetching === 0 && prefetchQueue.length === 0)
|
|
308
|
+
reportPrefetched();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (retry)
|
|
312
|
+
start(index, true);
|
|
313
|
+
})();
|
|
314
|
+
loading.set(index, operation);
|
|
315
|
+
}
|
|
39
316
|
async function digest(bytes) {
|
|
40
317
|
return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256", bytes)), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
41
318
|
}
|
|
42
|
-
|
|
319
|
+
function matchesReceipt(index, bytes, at = 0) {
|
|
320
|
+
if (at + RECEIPT_BYTES > bytes.byteLength)
|
|
321
|
+
return false;
|
|
43
322
|
const part = ranges.parts[index];
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
323
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset + at, RECEIPT_BYTES);
|
|
324
|
+
if (view.getFloat64(32, true) !== part.offset || view.getFloat64(40, true) !== part.raw)
|
|
325
|
+
return false;
|
|
326
|
+
for (let byte = 0; byte < 32; byte += 1) {
|
|
327
|
+
if (bytes[at + byte] !== Number.parseInt(part.sha256.slice(byte * 2, byte * 2 + 2), 16))
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
function receiptFor(index) {
|
|
333
|
+
const part = ranges.parts[index];
|
|
334
|
+
const bytes = new Uint8Array(RECEIPT_BYTES);
|
|
335
|
+
for (let byte = 0; byte < 32; byte += 1)
|
|
336
|
+
bytes[byte] = Number.parseInt(part.sha256.slice(byte * 2, byte * 2 + 2), 16);
|
|
337
|
+
const view = new DataView(bytes.buffer);
|
|
338
|
+
view.setFloat64(32, part.offset, true);
|
|
339
|
+
view.setFloat64(40, part.raw, true);
|
|
340
|
+
return bytes;
|
|
341
|
+
}
|
|
342
|
+
function writeCompletely(access, bytes, offset) {
|
|
343
|
+
let written = 0;
|
|
344
|
+
while (written < bytes.byteLength) {
|
|
345
|
+
const count = access.write(bytes.subarray(written), { at: offset + written });
|
|
346
|
+
if (count <= 0)
|
|
347
|
+
throw new Error("An immutable image extent could not be written completely.");
|
|
348
|
+
written += count;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async function admit() {
|
|
352
|
+
const began = Date.now();
|
|
353
|
+
packAccess = await (await directory.getFileHandle("pack.bin")).createSyncAccessHandle({ mode: "readwrite-unsafe" });
|
|
354
|
+
if (packAccess.getSize() < ranges.bytes)
|
|
355
|
+
throw new Error("The immutable image reservation is incomplete.");
|
|
356
|
+
// The generation owns the directory; the exact validated range table owns
|
|
357
|
+
// this additive cache name. No application or preparation key is involved.
|
|
358
|
+
const key = receiptKey ?? await digest(new TextEncoder().encode(JSON.stringify(ranges)));
|
|
359
|
+
const name = `image-receipts-v1-${key}.bin`;
|
|
360
|
+
receiptLock = `supercode-browser-image-receipts-${identity}-${key}`;
|
|
361
|
+
const packed = Date.now();
|
|
362
|
+
let lockedAt = 0;
|
|
363
|
+
receiptAccess = await scope.navigator.locks.request(receiptLock, async () => {
|
|
364
|
+
lockedAt = Date.now();
|
|
365
|
+
let file;
|
|
50
366
|
try {
|
|
51
|
-
|
|
52
|
-
const held = JSON.parse(await file.text());
|
|
53
|
-
if (held.sha256 === part.sha256 && held.offset === part.offset && held.raw === part.raw)
|
|
54
|
-
return;
|
|
367
|
+
file = await directory.getFileHandle(name);
|
|
55
368
|
}
|
|
56
369
|
catch (cause) {
|
|
57
|
-
if (cause.name !== "NotFoundError"
|
|
370
|
+
if (cause.name !== "NotFoundError")
|
|
58
371
|
throw cause;
|
|
59
372
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
373
|
+
if (file)
|
|
374
|
+
return file.createSyncAccessHandle({ mode: "readwrite-unsafe" });
|
|
375
|
+
// Import old verified receipts once. Keep them for old readers; a reader
|
|
376
|
+
// that cannot read this ledger may safely reverify and fetch the bytes.
|
|
377
|
+
const legacy = [];
|
|
378
|
+
for await (const [name, handle] of directory.entries()) {
|
|
379
|
+
const match = /^image-part-(\d+)\.json$/u.exec(name);
|
|
380
|
+
const index = match ? Number(match[1]) : -1;
|
|
381
|
+
if (handle.kind === "file" && Number.isSafeInteger(index) && index >= 0 && index < ranges.parts.length)
|
|
382
|
+
legacy.push({ index, file: handle });
|
|
383
|
+
}
|
|
384
|
+
const access = await (await directory.getFileHandle(name, { create: true })).createSyncAccessHandle({ mode: "readwrite-unsafe" });
|
|
68
385
|
try {
|
|
69
|
-
for (
|
|
70
|
-
|
|
71
|
-
|
|
386
|
+
for (const { index, file } of legacy) {
|
|
387
|
+
try {
|
|
388
|
+
const held = JSON.parse(await (await file.getFile()).text());
|
|
389
|
+
const part = ranges.parts[index];
|
|
390
|
+
if (held.sha256 === part.sha256 && held.offset === part.offset && held.raw === part.raw)
|
|
391
|
+
writeCompletely(access, receiptFor(index), index * RECEIPT_BYTES);
|
|
392
|
+
}
|
|
393
|
+
catch (cause) {
|
|
394
|
+
if (cause.name !== "NotFoundError" && !(cause instanceof SyntaxError))
|
|
395
|
+
throw cause;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
access.flush();
|
|
399
|
+
return access;
|
|
400
|
+
}
|
|
401
|
+
catch (cause) {
|
|
402
|
+
access.close();
|
|
403
|
+
throw cause;
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
console.log(`[boot-trace] ${JSON.stringify({ event: "materializer-admit", at: Date.now(), loaded: loadedAt, init: initAt, pack: packed - began, ledgerLock: lockedAt - packed, ledgerOpen: Date.now() - lockedAt })}`);
|
|
407
|
+
// Writers hold a shared ledger lock through write/flush. Exclusive scanning
|
|
408
|
+
// cannot promote a record whose publication has not durably completed.
|
|
409
|
+
// The owner scanned this same generation/table before exporting its
|
|
410
|
+
// completion buffer. Later verified writers update that shared buffer;
|
|
411
|
+
// this reader needs no second whole-ledger scan. Independent opens do.
|
|
412
|
+
if (!sharedCompletion)
|
|
413
|
+
await scope.navigator.locks.request(receiptLock, () => {
|
|
414
|
+
const bytes = new Uint8Array(Math.min(receiptAccess.getSize(), ranges.parts.length * RECEIPT_BYTES));
|
|
415
|
+
let read = 0;
|
|
416
|
+
while (read < bytes.byteLength) {
|
|
417
|
+
const count = receiptAccess.read(bytes.subarray(read), { at: read });
|
|
418
|
+
if (count <= 0)
|
|
72
419
|
break;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
420
|
+
read += count;
|
|
421
|
+
}
|
|
422
|
+
for (let index = 0; (index + 1) * RECEIPT_BYTES <= read; index += 1) {
|
|
423
|
+
if (matchesReceipt(index, bytes, index * RECEIPT_BYTES))
|
|
424
|
+
Atomics.store(completed, index, 2);
|
|
77
425
|
}
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
async function materialize(index, delivered) {
|
|
429
|
+
const part = ranges.parts[index];
|
|
430
|
+
await scope.navigator.locks.request(`supercode-browser-image-part-${identity}-${index}`, async () => {
|
|
431
|
+
if (Atomics.load(completed, index) === 2)
|
|
432
|
+
return;
|
|
433
|
+
// Different process readers may request the same part. Only the verified,
|
|
434
|
+
// flushed completion receipt permits them to skip its download/write.
|
|
435
|
+
const receipt = new Uint8Array(RECEIPT_BYTES);
|
|
436
|
+
if (receiptAccess.read(receipt, { at: index * RECEIPT_BYTES }) === RECEIPT_BYTES && matchesReceipt(index, receipt))
|
|
437
|
+
return;
|
|
438
|
+
let served;
|
|
439
|
+
if (delivered) {
|
|
440
|
+
if (delivered.byteLength !== part.bytes)
|
|
441
|
+
throw new Error(`${part.url} arrived in its startup stream with the wrong served size.`);
|
|
442
|
+
served = delivered;
|
|
78
443
|
}
|
|
79
|
-
|
|
80
|
-
await
|
|
444
|
+
else {
|
|
445
|
+
const response = await fetch(new URL(part.url, scope.location.origin), { cache: "force-cache", credentials: "omit", redirect: "error" });
|
|
446
|
+
if (!response.ok)
|
|
447
|
+
throw new Error(`${part.url} answered ${response.status}.`);
|
|
448
|
+
if (!response.body)
|
|
449
|
+
throw new Error(`${part.url} has no body.`);
|
|
450
|
+
served = new Uint8Array(part.bytes);
|
|
451
|
+
const download = response.body.getReader();
|
|
452
|
+
let received = 0;
|
|
453
|
+
try {
|
|
454
|
+
for (;;) {
|
|
455
|
+
const { done, value } = await download.read();
|
|
456
|
+
if (done)
|
|
457
|
+
break;
|
|
458
|
+
if (received + value.byteLength > served.byteLength)
|
|
459
|
+
throw new Error(`${part.url} exceeds its declared served size.`);
|
|
460
|
+
served.set(value, received);
|
|
461
|
+
received += value.byteLength;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
finally {
|
|
465
|
+
await download.cancel().catch(() => undefined);
|
|
466
|
+
}
|
|
467
|
+
if (received !== part.bytes)
|
|
468
|
+
throw new Error(`${part.url} has the wrong served size.`);
|
|
81
469
|
}
|
|
82
|
-
if (received !== part.bytes)
|
|
83
|
-
throw new Error(`${part.url} has the wrong served size.`);
|
|
84
470
|
const stream = new Blob([served]).stream().pipeThrough(new DecompressionStream("gzip"));
|
|
85
471
|
const reader = stream.getReader();
|
|
86
472
|
const raw = new Uint8Array(part.raw);
|
|
@@ -101,30 +487,16 @@ async function materialize(index) {
|
|
|
101
487
|
}
|
|
102
488
|
if (cursor !== raw.byteLength || await digest(raw) !== part.sha256)
|
|
103
489
|
throw new Error(`${part.url} does not match its immutable digest.`);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
access.close();
|
|
117
|
-
}
|
|
118
|
-
const marker = await directory.getFileHandle(receipt, { create: true });
|
|
119
|
-
const output = await marker.createWritable();
|
|
120
|
-
try {
|
|
121
|
-
await output.write(JSON.stringify({ sha256: part.sha256, offset: part.offset, raw: part.raw }));
|
|
122
|
-
await output.close();
|
|
123
|
-
}
|
|
124
|
-
catch (cause) {
|
|
125
|
-
await output.abort().catch(() => undefined);
|
|
126
|
-
throw cause;
|
|
127
|
-
}
|
|
490
|
+
writeCompletely(packAccess, raw, part.offset);
|
|
491
|
+
// The bytes are in the pack file now, where every reader of this boot
|
|
492
|
+
// reads them; its receipt follows once a flush has made them durable.
|
|
493
|
+
// One flush per batch, not two per range: each flush blocked this
|
|
494
|
+
// thread, and both of its lanes with it.
|
|
495
|
+
awaitingReceipt.push(index);
|
|
496
|
+
if (awaitingReceipt.length >= RECEIPT_BATCH)
|
|
497
|
+
await makeDurable();
|
|
498
|
+
else
|
|
499
|
+
durableSoon ??= setTimeout(() => { makeDurable().catch((cause) => console.warn("Immutable image receipts were not written; a later boot verifies those ranges again.", cause)); }, RECEIPT_DELAY_MS);
|
|
128
500
|
});
|
|
129
501
|
}
|
|
130
502
|
//# sourceMappingURL=browser-image-range-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-image-range-worker.js","sourceRoot":"","sources":["../src/browser-image-range-worker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-image-range-worker.js","sourceRoot":"","sources":["../src/browser-image-range-worker.ts"],"names":[],"mappings":"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"}
|