@elaraai/e3-cloud-files 1.0.94 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -28
- package/dist/src/authoring.d.ts +90 -22
- package/dist/src/authoring.d.ts.map +1 -1
- package/dist/src/authoring.js +122 -46
- package/dist/src/authoring.js.map +1 -1
- package/dist/src/check/index.d.ts +3 -4
- package/dist/src/check/index.d.ts.map +1 -1
- package/dist/src/check/index.js +3 -4
- package/dist/src/check/index.js.map +1 -1
- package/dist/src/check.d.ts +44 -9
- package/dist/src/check.d.ts.map +1 -1
- package/dist/src/check.js +130 -53
- package/dist/src/check.js.map +1 -1
- package/dist/src/compat.d.ts +384 -0
- package/dist/src/compat.d.ts.map +1 -0
- package/dist/src/compat.js +258 -0
- package/dist/src/compat.js.map +1 -0
- package/dist/src/index.d.ts +14 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +14 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/s3/index.d.ts.map +1 -1
- package/dist/src/s3/index.js +34 -12
- package/dist/src/s3/index.js.map +1 -1
- package/dist/src/storage/index.d.ts +84 -3
- package/dist/src/storage/index.d.ts.map +1 -1
- package/dist/src/storage/index.js +387 -13
- package/dist/src/storage/index.js.map +1 -1
- package/dist/src/sync/engine.d.ts +288 -49
- package/dist/src/sync/engine.d.ts.map +1 -1
- package/dist/src/sync/engine.js +605 -110
- package/dist/src/sync/engine.js.map +1 -1
- package/dist/src/sync/index.d.ts +3 -2
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +3 -2
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/memory.d.ts +67 -12
- package/dist/src/sync/memory.d.ts.map +1 -1
- package/dist/src/sync/memory.js +248 -18
- package/dist/src/sync/memory.js.map +1 -1
- package/dist/src/sync/push.d.ts +56 -0
- package/dist/src/sync/push.d.ts.map +1 -0
- package/dist/src/sync/push.js +205 -0
- package/dist/src/sync/push.js.map +1 -0
- package/dist/test/decode.examples.d.ts +9 -4
- package/dist/test/decode.examples.d.ts.map +1 -1
- package/dist/test/decode.examples.js +15 -3
- package/dist/test/decode.examples.js.map +1 -1
- package/dist/test/typed.examples.d.ts +142 -0
- package/dist/test/typed.examples.d.ts.map +1 -0
- package/dist/test/typed.examples.js +125 -0
- package/dist/test/typed.examples.js.map +1 -0
- package/package.json +10 -6
|
@@ -4,30 +4,61 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* `@elaraai/e3-cloud-files/storage`: the sync's writer over an e3 store, the
|
|
7
|
-
* one a local repository and
|
|
7
|
+
* one a local repository writes through, and the base of a deployed
|
|
8
|
+
* workspace's.
|
|
8
9
|
*
|
|
9
|
-
* A `file`, `latest` or `listing` input is written as any input
|
|
10
|
-
* (`workspaceSetDataset`). A `folder` is updated a piece at a time: e3
|
|
11
|
-
* a collection as pieces, each holding the entries between two keys,
|
|
12
|
-
* the pieces holding a changed or removed file are read and cut
|
|
13
|
-
* every other piece is carried over as it is stored
|
|
14
|
-
* read. However large the folder, a sync holds
|
|
15
|
-
* files it read. The new folder is then set as
|
|
16
|
-
* for a value the store holds
|
|
17
|
-
* holds the dataset's write lock
|
|
10
|
+
* A `file`, `latest` or `listing` input with no type is written as any input
|
|
11
|
+
* is (`workspaceSetDataset`). A `folder` is updated a piece at a time: e3
|
|
12
|
+
* stores a collection as pieces, each holding the entries between two keys,
|
|
13
|
+
* so only the pieces holding a changed or removed file are read and cut
|
|
14
|
+
* again, and every other piece is carried over as it is stored
|
|
15
|
+
* (`storeCollection`), never read. However large the folder, a sync holds
|
|
16
|
+
* the pieces it changes and the files it read. The new folder is then set as
|
|
17
|
+
* the input's value by e3's door for a value the store holds
|
|
18
|
+
* (`datasetSetStored`), which checks its type, holds the dataset's write lock
|
|
19
|
+
* and versions it as any input write.
|
|
20
|
+
*
|
|
21
|
+
* A typed file is taken in through e3's door for a file (`datasetAdoptFile`):
|
|
22
|
+
* its bytes are streamed to a file of the repository's own scratch, hashed as
|
|
23
|
+
* they go, and the door takes the file in as the value it holds, a collection
|
|
24
|
+
* by intake units on the runner given, remembered by the bytes' hash so the
|
|
25
|
+
* same bytes taken again cost their hash and nothing else. (A local
|
|
26
|
+
* repository may use its disk; the platform's writer stages in its bucket
|
|
27
|
+
* instead, and never on a disk.) A fed mutation runs through e3's own
|
|
28
|
+
* `recordMutate`, the file's hash its idempotency key, so a file applied
|
|
29
|
+
* once is never applied twice.
|
|
30
|
+
*
|
|
31
|
+
* {@link cloudWriter} is the platform's: the same, but a typed file staged
|
|
32
|
+
* in the object store through {@link FilesStaging} (never a disk) and taken
|
|
33
|
+
* in through e3's door for a delivery the store holds, resumable across the
|
|
34
|
+
* platform's rounds.
|
|
18
35
|
*
|
|
19
36
|
* Needs `@elaraai/e3-core`, which a solution's own code never imports: the
|
|
20
37
|
* CLI and the platform do.
|
|
21
38
|
*
|
|
22
39
|
* @packageDocumentation
|
|
23
40
|
*/
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
41
|
+
import { createHash } from 'node:crypto';
|
|
42
|
+
import { createWriteStream } from 'node:fs';
|
|
43
|
+
import { mkdir, rm } from 'node:fs/promises';
|
|
44
|
+
import { tmpdir } from 'node:os';
|
|
45
|
+
import { join } from 'node:path';
|
|
46
|
+
import { Readable } from 'node:stream';
|
|
47
|
+
import { pipeline } from 'node:stream/promises';
|
|
48
|
+
import { StringType, compareFor, decodeBeast2For, encodeBeast2For, none, some, variant } from '@elaraai/east';
|
|
49
|
+
import { DatasetSegments, DatasetTypeMismatchError, DeliveryRefusedError, ObjectNotFoundError, datasetAdoptFile, datasetAdoptObject, datasetSetStored, deliveryAdoptStored, objectAdoptFile, recordHistory, recordMutate, recordSystemCommit, resolveRecord, storeCollection, withRunningWork, workspaceGetDatasetHash, workspaceSetDataset, } from '@elaraai/e3-core';
|
|
26
50
|
import { FilesFileType, FilesFolderType, FilesListingType } from '@elaraai/e3-cloud-types';
|
|
51
|
+
import { FilesUnreadableError, } from '../sync/engine.js';
|
|
27
52
|
/** An input's path: `.inputs.<input>`. */
|
|
28
53
|
function inputPath(input) {
|
|
29
54
|
return [variant('field', 'inputs'), variant('field', input)];
|
|
30
55
|
}
|
|
56
|
+
/** A record's path: `.records.<record>`. */
|
|
57
|
+
function recordPath(record) {
|
|
58
|
+
return [variant('field', 'records'), variant('field', record)];
|
|
59
|
+
}
|
|
60
|
+
/** The most commits a seed walks back for a record's last seed. */
|
|
61
|
+
const SEED_WALK_LIMIT = 100;
|
|
31
62
|
const compareKeys = compareFor(StringType);
|
|
32
63
|
const decodeFolder = decodeBeast2For(FilesFolderType);
|
|
33
64
|
/** Entries in a Dict's order. */
|
|
@@ -73,15 +104,136 @@ async function folderSources(storage, repo, hash, changes) {
|
|
|
73
104
|
sources.push({ stored: pieces.hash, from: next, to: pieces.counts.length });
|
|
74
105
|
return sources;
|
|
75
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* A refusal e3's door answered, as the sync reports it; null for an error the
|
|
109
|
+
* door did not refuse.
|
|
110
|
+
*
|
|
111
|
+
* @param err - What the door threw
|
|
112
|
+
* @param type - The mapping's type
|
|
113
|
+
* @returns The refusal, or null
|
|
114
|
+
*/
|
|
115
|
+
export function doorRefusal(err) {
|
|
116
|
+
if (err instanceof DatasetTypeMismatchError)
|
|
117
|
+
return variant('type_mismatch', { expected: err.mismatch.declared, actual: err.mismatch.given });
|
|
118
|
+
if (err instanceof DeliveryRefusedError) {
|
|
119
|
+
// east's intake: "segment N of the delivery, at offset X, holds B bytes, more than the M a segment is read in — write it again …"
|
|
120
|
+
const segment = /holds ([0-9]+) bytes, more than the ([0-9]+) a segment/i.exec(err.refusal);
|
|
121
|
+
if (segment !== null)
|
|
122
|
+
return variant('segment_too_large', { bytes: BigInt(Number(segment[1])), limit: BigInt(Number(segment[2])) });
|
|
123
|
+
return variant('other', `the runner refused it: ${err.refusal}`);
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const encodeArg = encodeBeast2For(StringType);
|
|
128
|
+
/**
|
|
129
|
+
* What a failed mutation said, from the runner's stderr: its last lines that
|
|
130
|
+
* are no stack frame (a runtime error prints its message, then where it was
|
|
131
|
+
* raised), at most three, as one line. What a refusal of a feed or a seed
|
|
132
|
+
* carries (`mutation {outcome: 'failed', message}`).
|
|
133
|
+
*
|
|
134
|
+
* @param stderr - The runner's stderr
|
|
135
|
+
* @returns The words
|
|
136
|
+
*/
|
|
137
|
+
export function failureWords(stderr) {
|
|
138
|
+
return stderr.trim().split('\n').filter((line) => !/^\s*at\s/.test(line)).slice(-3).join(' ');
|
|
139
|
+
}
|
|
140
|
+
/** The name a seed's commit takes: a record's first state, or its state again. */
|
|
141
|
+
function seedName(genesis) {
|
|
142
|
+
return genesis ? '$init' : '$seed';
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Commits a stored value as a record's state: its first (`$init`, as a
|
|
146
|
+
* deploy's mint writes the ref) or its state again (`$seed`, over its head,
|
|
147
|
+
* the reserved slots carried), the file's key, ETag and SHA-256 its
|
|
148
|
+
* arguments. The caller holds the repository's running work across the
|
|
149
|
+
* intake that stored the value and this commit, which names it.
|
|
150
|
+
*
|
|
151
|
+
* @returns What the seed did
|
|
152
|
+
*/
|
|
153
|
+
async function seedCommit(storage, runner, repo, ws, record, file, stored, sha256, actor, seed) {
|
|
154
|
+
const resolved = await resolveRecord(storage, repo, ws, record);
|
|
155
|
+
if (!resolved)
|
|
156
|
+
return { status: 'refused', reason: variant('other', `record ${record} is not declared by the package the workspace runs`) };
|
|
157
|
+
const outcome = await recordSystemCommit(storage, runner, repo, ws, record, {
|
|
158
|
+
name: seedName(seed.genesis),
|
|
159
|
+
target: { state: stored.hash, applied: resolved.migrations.map((step) => step.name) },
|
|
160
|
+
actor,
|
|
161
|
+
args: [encodeArg(file.key), encodeArg(file.etag), encodeArg(sha256)],
|
|
162
|
+
...(seed.signal !== undefined && { signal: seed.signal }),
|
|
163
|
+
});
|
|
164
|
+
switch (outcome.kind) {
|
|
165
|
+
case 'committed':
|
|
166
|
+
return { status: 'committed', commit: outcome.commitHash, rows: stored.rows === null ? null : BigInt(stored.rows), sha256 };
|
|
167
|
+
case 'invalid':
|
|
168
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'invalid', message: outcome.message }) };
|
|
169
|
+
case 'conflict':
|
|
170
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'conflict', message: outcome.detail ?? `the record was busy (${outcome.attempts} attempts): tried again by the next sync` }) };
|
|
171
|
+
case 'failed':
|
|
172
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'failed', message: failureWords(outcome.stderr) }) };
|
|
173
|
+
case 'timed_out':
|
|
174
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'timed_out', message: `after ${outcome.ms} ms` }) };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Takes a delivery in and seeds the record from it, under one hold of the
|
|
179
|
+
* repository's running work, so no sweep takes what the intake stored
|
|
180
|
+
* before the commit names it: a refusal of the delivery (its type, a
|
|
181
|
+
* segment past the limit, a runner's) is the seed's, and an intake the
|
|
182
|
+
* round's deadline stops yields, the pieces it finished remembered by the
|
|
183
|
+
* store for the next sync.
|
|
184
|
+
*/
|
|
185
|
+
async function seedThrough(storage, repo, take, commit, signal) {
|
|
186
|
+
return withRunningWork(storage, repo, async () => {
|
|
187
|
+
let stored;
|
|
188
|
+
try {
|
|
189
|
+
stored = await take();
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (signal?.aborted === true)
|
|
193
|
+
return { status: 'yielded' };
|
|
194
|
+
const reason = doorRefusal(err);
|
|
195
|
+
if (reason !== null)
|
|
196
|
+
return { status: 'refused', reason };
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
199
|
+
return commit(stored);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Streams a file's bytes to a scratch file, hashing them as they go.
|
|
204
|
+
*
|
|
205
|
+
* @returns The scratch file's path and the bytes' SHA-256
|
|
206
|
+
*/
|
|
207
|
+
async function spool(source, file, dir, signal) {
|
|
208
|
+
await mkdir(dir, { recursive: true });
|
|
209
|
+
const path = join(dir, `files-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.beast2`);
|
|
210
|
+
const hash = createHash('sha256');
|
|
211
|
+
const stream = Readable.from(await source.open(file));
|
|
212
|
+
const hashing = async function* (chunks) {
|
|
213
|
+
for await (const chunk of chunks) {
|
|
214
|
+
hash.update(chunk);
|
|
215
|
+
yield chunk;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
try {
|
|
219
|
+
await pipeline(stream, hashing, createWriteStream(path), signal === undefined ? {} : { signal });
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
await rm(path, { force: true });
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
return { path, sha256: hash.digest('hex') };
|
|
226
|
+
}
|
|
76
227
|
/**
|
|
77
228
|
* The sync's writer over an e3 store, for one workspace.
|
|
78
229
|
*
|
|
79
230
|
* @param storage - The store: a local repository's (`LocalStorage`) or the platform's
|
|
80
231
|
* @param repo - The repository: a local repository's path, or the platform's repository name
|
|
81
232
|
* @param ws - The workspace
|
|
233
|
+
* @param options - The runner, the scratch directory and the actor
|
|
82
234
|
* @returns The writer
|
|
83
235
|
*/
|
|
84
|
-
export function storageWriter(storage, repo, ws) {
|
|
236
|
+
export function storageWriter(storage, repo, ws, options = {}) {
|
|
85
237
|
const current = async (input) => (await workspaceGetDatasetHash(storage, repo, ws, inputPath(input))).hash;
|
|
86
238
|
const written = async (input) => {
|
|
87
239
|
const hash = await current(input);
|
|
@@ -89,6 +241,7 @@ export function storageWriter(storage, repo, ws) {
|
|
|
89
241
|
throw new Error(`input ${input} is unassigned after it was written`);
|
|
90
242
|
return hash;
|
|
91
243
|
};
|
|
244
|
+
const scratch = options.scratchDir ?? tmpdir();
|
|
92
245
|
return {
|
|
93
246
|
current,
|
|
94
247
|
async setFile(input, bytes) {
|
|
@@ -108,6 +261,227 @@ export function storageWriter(storage, repo, ws) {
|
|
|
108
261
|
// sets it as the input's value, checked and versioned, reading nothing
|
|
109
262
|
return (await datasetSetStored(storage, repo, ws, inputPath(input), stored)).hash;
|
|
110
263
|
},
|
|
264
|
+
async takeTyped(input, file, type, source, intake) {
|
|
265
|
+
let spooled;
|
|
266
|
+
try {
|
|
267
|
+
spooled = await spool(source, file, scratch, intake.signal);
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
if (err instanceof FilesUnreadableError)
|
|
271
|
+
return { status: 'refused', reason: variant('unreadable', err.reason) };
|
|
272
|
+
throw err;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const adopted = await datasetAdoptFile(storage, repo, ws, inputPath(input), spooled.path, {
|
|
276
|
+
expectHash: spooled.sha256,
|
|
277
|
+
...(options.runner !== undefined && { runner: options.runner }),
|
|
278
|
+
...(intake.signal !== undefined && { signal: intake.signal }),
|
|
279
|
+
});
|
|
280
|
+
return {
|
|
281
|
+
status: 'taken',
|
|
282
|
+
hash: adopted.hash,
|
|
283
|
+
sha256: spooled.sha256,
|
|
284
|
+
taken: { key: file.key, type, rows: adopted.rows === null ? none : some(BigInt(adopted.rows)), how: variant(adopted.segments === null ? 'carried' : 'split', null) },
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
const reason = doorRefusal(err);
|
|
289
|
+
if (reason !== null)
|
|
290
|
+
return { status: 'refused', reason };
|
|
291
|
+
throw err;
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
await rm(spooled.path, { force: true });
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
async seed(record, file, type, source, seed) {
|
|
298
|
+
if (options.runner === undefined)
|
|
299
|
+
throw new Error('a seeded record needs a runner');
|
|
300
|
+
let spooled;
|
|
301
|
+
try {
|
|
302
|
+
spooled = await spool(source, file, scratch, seed.signal);
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
if (err instanceof FilesUnreadableError)
|
|
306
|
+
return { status: 'refused', reason: variant('unreadable', err.reason) };
|
|
307
|
+
throw err;
|
|
308
|
+
}
|
|
309
|
+
const runner = options.runner;
|
|
310
|
+
try {
|
|
311
|
+
// The file placed in the store as the object its bytes name and taken in (a collection by intake units on the
|
|
312
|
+
// runner), then read as a stored value of the record's type, as the cloud reads a staged one: the memo answers
|
|
313
|
+
return await seedThrough(storage, repo, async () => {
|
|
314
|
+
await objectAdoptFile(storage, repo, spooled.path, { expectHash: spooled.sha256, runner, ...(seed.signal !== undefined && { signal: seed.signal }) });
|
|
315
|
+
const adopted = await deliveryAdoptStored(storage, repo, ws, { address: `.records.${record}`, type }, spooled.sha256, {
|
|
316
|
+
runner,
|
|
317
|
+
...(seed.signal !== undefined && { signal: seed.signal }),
|
|
318
|
+
});
|
|
319
|
+
return { hash: adopted.hash, rows: adopted.rows };
|
|
320
|
+
}, (stored) => seedCommit(storage, runner, repo, ws, record, file, stored, spooled.sha256, options.actor ?? 'files', seed), seed.signal);
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
await rm(spooled.path, { force: true });
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
async recordState(record) {
|
|
327
|
+
const { hash } = await workspaceGetDatasetHash(storage, repo, ws, recordPath(record));
|
|
328
|
+
if (hash === null)
|
|
329
|
+
return { pending: true };
|
|
330
|
+
// The head, and the commits since the last seed, walked back a bounded way
|
|
331
|
+
const history = await recordHistory(storage, repo, ws, record, { limit: SEED_WALK_LIMIT });
|
|
332
|
+
const head = history[0];
|
|
333
|
+
if (head === undefined)
|
|
334
|
+
return { pending: true };
|
|
335
|
+
const seed = history.findIndex((entry) => entry.commit.mutation === '$init' || entry.commit.mutation === '$seed');
|
|
336
|
+
return { pending: false, head: head.hash, sinceSeed: seed < 0 ? null : seed };
|
|
337
|
+
},
|
|
338
|
+
async feed(record, mutation, file, type, source, feed) {
|
|
339
|
+
if (options.runner === undefined)
|
|
340
|
+
throw new Error('a fed mutation needs a runner');
|
|
341
|
+
// A record with no state yet: nothing is read for it
|
|
342
|
+
const { hash } = await workspaceGetDatasetHash(storage, repo, ws, recordPath(record));
|
|
343
|
+
if (hash === null)
|
|
344
|
+
return { status: 'waiting', reason: 'the record has no state yet' };
|
|
345
|
+
let bytes;
|
|
346
|
+
try {
|
|
347
|
+
const chunks = [];
|
|
348
|
+
for await (const chunk of await source.open(file))
|
|
349
|
+
chunks.push(chunk);
|
|
350
|
+
bytes = Buffer.concat(chunks);
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
if (err instanceof FilesUnreadableError)
|
|
354
|
+
return { status: 'refused', reason: variant('unreadable', err.reason), sha256: '' };
|
|
355
|
+
throw err;
|
|
356
|
+
}
|
|
357
|
+
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
358
|
+
// Bytes applied before, under any name, are applied no more
|
|
359
|
+
if (feed.applied?.has(sha256) === true)
|
|
360
|
+
return { status: 'applied', sha256 };
|
|
361
|
+
const outcome = await recordMutate(storage, options.runner, repo, ws, record, mutation, [bytes], {
|
|
362
|
+
actor: options.actor ?? 'files',
|
|
363
|
+
idempotencyKey: sha256,
|
|
364
|
+
...(options.feedBudgetMs !== undefined && { budgetMs: options.feedBudgetMs }),
|
|
365
|
+
...(feed.signal !== undefined && { signal: feed.signal }),
|
|
366
|
+
});
|
|
367
|
+
void type;
|
|
368
|
+
switch (outcome.kind) {
|
|
369
|
+
case 'committed':
|
|
370
|
+
return { status: 'committed', commit: outcome.commitHash, sha256 };
|
|
371
|
+
case 'conflict':
|
|
372
|
+
// The record was busy: the next sync tries the file again
|
|
373
|
+
return { status: 'waiting', reason: `the record was busy (${outcome.detail ?? `the write lost the race ${outcome.attempts} times`}): tried again by the next sync` };
|
|
374
|
+
case 'invalid':
|
|
375
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'invalid', message: outcome.message }), sha256 };
|
|
376
|
+
case 'failed':
|
|
377
|
+
// Cut short by the round's end: not the file's fault
|
|
378
|
+
if (feed.signal?.aborted === true)
|
|
379
|
+
return { status: 'waiting', reason: 'the round ended before the mutation finished: tried again by the next sync' };
|
|
380
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'failed', message: failureWords(outcome.stderr) }), sha256 };
|
|
381
|
+
case 'timed_out':
|
|
382
|
+
return { status: 'refused', reason: variant('mutation', { outcome: 'timed_out', message: `after ${outcome.ms} ms` }), sha256 };
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* The sync's writer for a deployed workspace: the store's writer, with a
|
|
389
|
+
* typed file taken in through the platform's staging and e3's door for a
|
|
390
|
+
* delivery the store holds (`datasetAdoptObject`), so no byte of it passes
|
|
391
|
+
* through a disk (D7), and an intake the round's deadline stops resumes in
|
|
392
|
+
* the next round with the pieces it finished remembered; a record seeded
|
|
393
|
+
* from a staged file the same way (`deliveryAdoptStored`, then the
|
|
394
|
+
* record's `$init` or `$seed` commit).
|
|
395
|
+
*
|
|
396
|
+
* @param storage - The platform's storage
|
|
397
|
+
* @param repo - The repository, as the storage names it
|
|
398
|
+
* @param ws - The workspace
|
|
399
|
+
* @param options - The runner, the staging, the actor
|
|
400
|
+
* @returns The writer
|
|
401
|
+
*/
|
|
402
|
+
export function cloudWriter(storage, repo, ws, options) {
|
|
403
|
+
const base = storageWriter(storage, repo, ws, { runner: options.runner, ...(options.actor !== undefined && { actor: options.actor }), ...(options.feedBudgetMs !== undefined && { feedBudgetMs: options.feedBudgetMs }) });
|
|
404
|
+
return {
|
|
405
|
+
...base,
|
|
406
|
+
async takeTyped(input, file, type, source, intake) {
|
|
407
|
+
// The engine resumes only the intake of this same file, by its key and ETag
|
|
408
|
+
const progress = (sha256, staging) => ({ key: file.key, etag: file.etag, sha256, staging });
|
|
409
|
+
let sha256 = intake.resume?.sha256 ?? null;
|
|
410
|
+
const stage = async (resume) => {
|
|
411
|
+
let staged;
|
|
412
|
+
try {
|
|
413
|
+
staged = await options.staging.stage(repo, (start) => source.open(file, { start }), file.size, {
|
|
414
|
+
...(intake.signal !== undefined && { signal: intake.signal }),
|
|
415
|
+
...(resume !== null && { resume }),
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
if (err instanceof FilesUnreadableError)
|
|
420
|
+
return { status: 'refused', reason: variant('unreadable', err.reason) };
|
|
421
|
+
throw err;
|
|
422
|
+
}
|
|
423
|
+
if ('aborted' in staged)
|
|
424
|
+
return { status: 'yielded', taking: staged.progress === null ? null : progress(null, staged.progress) };
|
|
425
|
+
return staged.sha256;
|
|
426
|
+
};
|
|
427
|
+
if (sha256 === null) {
|
|
428
|
+
const staged = await stage(intake.resume?.staging ?? null);
|
|
429
|
+
if (typeof staged !== 'string')
|
|
430
|
+
return staged;
|
|
431
|
+
sha256 = staged;
|
|
432
|
+
}
|
|
433
|
+
for (;;) {
|
|
434
|
+
try {
|
|
435
|
+
const adopted = await datasetAdoptObject(storage, repo, ws, inputPath(input), sha256, options.runner, intake.signal === undefined ? {} : { signal: intake.signal });
|
|
436
|
+
return {
|
|
437
|
+
status: 'taken',
|
|
438
|
+
hash: adopted.hash,
|
|
439
|
+
sha256,
|
|
440
|
+
taken: { key: file.key, type, rows: adopted.rows === null ? none : some(BigInt(adopted.rows)), how: variant(adopted.segments === null ? 'carried' : 'split', null) },
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
catch (err) {
|
|
444
|
+
// Stopped at the round's deadline, the pieces it finished remembered: the next round resumes it
|
|
445
|
+
if (intake.signal?.aborted === true)
|
|
446
|
+
return { status: 'yielded', taking: progress(sha256, null) };
|
|
447
|
+
// The delivery a resumed intake names is gone (collected since): staged again
|
|
448
|
+
if (err instanceof ObjectNotFoundError && intake.resume !== undefined) {
|
|
449
|
+
const staged = await stage(null);
|
|
450
|
+
if (typeof staged !== 'string')
|
|
451
|
+
return staged;
|
|
452
|
+
sha256 = staged;
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
const reason = doorRefusal(err);
|
|
456
|
+
if (reason !== null)
|
|
457
|
+
return { status: 'refused', reason };
|
|
458
|
+
throw err;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
async seed(record, file, type, source, seed) {
|
|
463
|
+
let staged;
|
|
464
|
+
try {
|
|
465
|
+
staged = await options.staging.stage(repo, (start) => source.open(file, { start }), file.size, seed.signal === undefined ? {} : { signal: seed.signal });
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
if (err instanceof FilesUnreadableError)
|
|
469
|
+
return { status: 'refused', reason: variant('unreadable', err.reason) };
|
|
470
|
+
throw err;
|
|
471
|
+
}
|
|
472
|
+
// A stage the deadline stops is not kept for a seed: the next sync stages the file again
|
|
473
|
+
if ('aborted' in staged)
|
|
474
|
+
return { status: 'yielded' };
|
|
475
|
+
const { sha256 } = staged;
|
|
476
|
+
// The staged object taken in as a stored value of the record's type (the memo, intake units for a collection), then committed
|
|
477
|
+
return seedThrough(storage, repo, async () => {
|
|
478
|
+
const adopted = await deliveryAdoptStored(storage, repo, ws, { address: `.records.${record}`, type }, sha256, {
|
|
479
|
+
runner: options.runner,
|
|
480
|
+
...(seed.signal !== undefined && { signal: seed.signal }),
|
|
481
|
+
});
|
|
482
|
+
return { hash: adopted.hash, rows: adopted.rows };
|
|
483
|
+
}, (stored) => seedCommit(storage, options.runner, repo, ws, record, file, stored, sha256, options.actor ?? 'files', seed), seed.signal);
|
|
484
|
+
},
|
|
111
485
|
};
|
|
112
486
|
}
|
|
113
487
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"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"}
|