@elaraai/e3-cloud-cli 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -2
- package/dist/src/cli.js +22 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/files.d.ts +8 -1
- package/dist/src/commands/files.d.ts.map +1 -1
- package/dist/src/commands/files.js +44 -28
- package/dist/src/commands/files.js.map +1 -1
- package/dist/src/commands/records.d.ts +9 -0
- package/dist/src/commands/records.d.ts.map +1 -1
- package/dist/src/commands/records.js +7 -4
- package/dist/src/commands/records.js.map +1 -1
- package/dist/src/commands/whoami.d.ts +18 -0
- package/dist/src/commands/whoami.d.ts.map +1 -1
- package/dist/src/commands/whoami.js +29 -5
- package/dist/src/commands/whoami.js.map +1 -1
- package/dist/src/dataset-source.d.ts +102 -0
- package/dist/src/dataset-source.d.ts.map +1 -0
- package/dist/src/dataset-source.js +412 -0
- package/dist/src/dataset-source.js.map +1 -0
- package/dist/src/files-local.d.ts +12 -17
- package/dist/src/files-local.d.ts.map +1 -1
- package/dist/src/files-local.js +35 -11
- package/dist/src/files-local.js.map +1 -1
- package/dist/src/files-push.d.ts +129 -31
- package/dist/src/files-push.d.ts.map +1 -1
- package/dist/src/files-push.js +297 -139
- package/dist/src/files-push.js.map +1 -1
- package/dist/src/versions.d.ts +36 -0
- package/dist/src/versions.d.ts.map +1 -0
- package/dist/src/versions.js +83 -0
- package/dist/src/versions.js.map +1 -0
- package/package.json +9 -9
|
@@ -2,5 +2,23 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* whoami command - show current user identity and admin status, and which
|
|
7
|
+
* releases the deployment and this CLI run: the deployment's e3 cloud
|
|
8
|
+
* release and e3, each next e3 an app's bundle is staged for, and the e3
|
|
9
|
+
* cloud, east and e3 this CLI is built with. A package a newer e3 exported is
|
|
10
|
+
* refused by an older one, so a project can tell here whether it fits.
|
|
11
|
+
*/
|
|
12
|
+
import type { PlatformVersions } from '@elaraai/e3-cloud-types';
|
|
13
|
+
import { type CliVersions } from '../versions.js';
|
|
14
|
+
/**
|
|
15
|
+
* What the deployment runs and what this CLI is built with, as whoami prints
|
|
16
|
+
* them: a line each, and a note where their e3s differ.
|
|
17
|
+
*
|
|
18
|
+
* @param platform - The deployment's versions; null for a deployment that doesn't say them
|
|
19
|
+
* @param cli - This CLI's
|
|
20
|
+
* @returns The lines
|
|
21
|
+
*/
|
|
22
|
+
export declare function releasesText(platform: PlatformVersions | null, cli: CliVersions): string[];
|
|
5
23
|
export declare function whoamiCommand(server?: string): Promise<void>;
|
|
6
24
|
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7E;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAa1F;AAED,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlE"}
|
|
@@ -2,12 +2,34 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
* whoami command - show current user identity and admin status.
|
|
7
|
-
*/
|
|
8
|
-
import { whoami } from '@elaraai/e3-cloud-client';
|
|
5
|
+
import { platformVersions, whoami } from '@elaraai/e3-cloud-client';
|
|
9
6
|
import { getValidToken, listCredentials, normalizeServerUrl } from '../credentials.js';
|
|
10
7
|
import { formatError, exitError } from '../utils.js';
|
|
8
|
+
import { cliVersions, versionsText } from '../versions.js';
|
|
9
|
+
/**
|
|
10
|
+
* What the deployment runs and what this CLI is built with, as whoami prints
|
|
11
|
+
* them: a line each, and a note where their e3s differ.
|
|
12
|
+
*
|
|
13
|
+
* @param platform - The deployment's versions; null for a deployment that doesn't say them
|
|
14
|
+
* @param cli - This CLI's
|
|
15
|
+
* @returns The lines
|
|
16
|
+
*/
|
|
17
|
+
export function releasesText(platform, cli) {
|
|
18
|
+
const lines = [];
|
|
19
|
+
if (platform === null) {
|
|
20
|
+
lines.push('deployment: its releases not stated (it predates the platform\'s versions)');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
lines.push(platform.e3Cloud.type === 'some' ? `deployment: e3-cloud ${platform.e3Cloud.value}, e3 ${platform.e3}` : `deployment: e3 ${platform.e3} (its e3-cloud release not stated)`);
|
|
24
|
+
if (platform.staged.length > 0)
|
|
25
|
+
lines.push(`staged for: e3 ${platform.staged.join(', ')} (apps deployed with --for-platform)`);
|
|
26
|
+
}
|
|
27
|
+
lines.push(`cli: ${versionsText(cli)}`);
|
|
28
|
+
if (platform !== null && platform.e3 !== cli.e3) {
|
|
29
|
+
lines.push(`note: this CLI is built with e3 ${cli.e3} and the deployment runs e3 ${platform.e3}: a package exported with a newer e3 than the deployment's is refused`);
|
|
30
|
+
}
|
|
31
|
+
return lines;
|
|
32
|
+
}
|
|
11
33
|
export async function whoamiCommand(server) {
|
|
12
34
|
try {
|
|
13
35
|
// If no server specified, use first stored credential
|
|
@@ -21,7 +43,7 @@ export async function whoamiCommand(server) {
|
|
|
21
43
|
}
|
|
22
44
|
serverUrl = normalizeServerUrl(serverUrl);
|
|
23
45
|
const token = await getValidToken(serverUrl);
|
|
24
|
-
const me = await whoami(serverUrl, { token });
|
|
46
|
+
const [me, platform] = await Promise.all([whoami(serverUrl, { token }), platformVersions(serverUrl, { token })]);
|
|
25
47
|
console.log(`sub: ${me.sub}`);
|
|
26
48
|
if (me.email.value !== undefined) {
|
|
27
49
|
console.log(`email: ${me.email.value}`);
|
|
@@ -30,6 +52,8 @@ export async function whoamiCommand(server) {
|
|
|
30
52
|
console.log(`name: ${me.name.value}`);
|
|
31
53
|
}
|
|
32
54
|
console.log(`admin: ${me.isAdmin}`);
|
|
55
|
+
for (const line of releasesText(platform, cliVersions()))
|
|
56
|
+
console.log(line);
|
|
33
57
|
}
|
|
34
58
|
catch (err) {
|
|
35
59
|
exitError(formatError(err));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { type EastTypeValue } from '@elaraai/east';
|
|
6
|
+
import { type FilesDatasetOrigin } from '@elaraai/e3-cloud-types';
|
|
7
|
+
import type { FilesPushBytes } from '@elaraai/e3-cloud-client';
|
|
8
|
+
/** What names a dataset among a push's paths. */
|
|
9
|
+
export declare const DATASET_ARG_PREFIX = "dataset:";
|
|
10
|
+
/** A `dataset:<ws>.<name>` among a push's paths. */
|
|
11
|
+
export interface DatasetArg {
|
|
12
|
+
/** As it was given */
|
|
13
|
+
readonly arg: string;
|
|
14
|
+
readonly workspace: string;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The repository a push reads its datasets from: `--from`, else `$E3_REPO`,
|
|
19
|
+
* else the current directory, as e3's `[repo]` defaults.
|
|
20
|
+
*
|
|
21
|
+
* @param from - `--from`, as given
|
|
22
|
+
* @returns The repository
|
|
23
|
+
*/
|
|
24
|
+
export declare function datasetRepositoryArg(from: string | undefined): string;
|
|
25
|
+
/**
|
|
26
|
+
* The dataset a push's path names, or null for a path that names none.
|
|
27
|
+
*
|
|
28
|
+
* @param arg - The path, as given
|
|
29
|
+
* @returns The dataset, or null
|
|
30
|
+
* @throws {Error} For `dataset:` followed by anything but `<ws>.<name>`
|
|
31
|
+
*/
|
|
32
|
+
export declare function datasetArgOf(arg: string): DatasetArg | null;
|
|
33
|
+
/** What a dataset is in its workspace, as a row names it. */
|
|
34
|
+
export type DatasetKind = 'input' | 'task output' | 'record';
|
|
35
|
+
/** A dataset found: what it is, the value it holds, and that value's bytes. */
|
|
36
|
+
export interface FoundDataset {
|
|
37
|
+
readonly arg: DatasetArg;
|
|
38
|
+
readonly kind: DatasetKind;
|
|
39
|
+
/** The hash of the value read, as `e3 dataset status` names it */
|
|
40
|
+
readonly hash: string;
|
|
41
|
+
/**
|
|
42
|
+
* The value's bytes, in order.
|
|
43
|
+
*
|
|
44
|
+
* @throws {DatasetMovedError} When the dataset no longer holds the value
|
|
45
|
+
*/
|
|
46
|
+
readonly open: () => Promise<AsyncIterable<Uint8Array>>;
|
|
47
|
+
}
|
|
48
|
+
/** Why a dataset is not pushed: unassigned, not in the workspace, or a name two of its datasets have. */
|
|
49
|
+
export type DatasetRefusal = 'unassigned' | 'not_found' | 'ambiguous';
|
|
50
|
+
/** A dataset asked for: found, or refused with why. */
|
|
51
|
+
export type DatasetLookup = {
|
|
52
|
+
readonly found: FoundDataset;
|
|
53
|
+
} | {
|
|
54
|
+
readonly refused: DatasetRefusal;
|
|
55
|
+
readonly message: string;
|
|
56
|
+
};
|
|
57
|
+
/** A dataset that no longer holds the value a push read: a run wrote it again. */
|
|
58
|
+
export declare class DatasetMovedError extends Error {
|
|
59
|
+
constructor(arg: string);
|
|
60
|
+
}
|
|
61
|
+
/** Where a push reads datasets from: a local repository, or a deployed one. */
|
|
62
|
+
export interface DatasetRepository {
|
|
63
|
+
/**
|
|
64
|
+
* Each dataset asked for, found or refused, in order.
|
|
65
|
+
*
|
|
66
|
+
* @param args - The datasets
|
|
67
|
+
* @returns Each one's lookup
|
|
68
|
+
*/
|
|
69
|
+
find(args: readonly DatasetArg[]): Promise<DatasetLookup[]>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Where a push reads its datasets: a deployed repository given its URL, a
|
|
73
|
+
* local one given its path.
|
|
74
|
+
*
|
|
75
|
+
* @param from - The repository ({@link datasetRepositoryArg})
|
|
76
|
+
* @returns The repository
|
|
77
|
+
* @throws {Error} When a local path holds no repository this e3 can open, or a URL names none
|
|
78
|
+
*/
|
|
79
|
+
export declare function datasetRepository(from: string): Promise<DatasetRepository>;
|
|
80
|
+
/** A dataset's value measured: what the plan is told of it, and its bytes for the upload. */
|
|
81
|
+
export interface MeasuredDataset {
|
|
82
|
+
readonly size: number;
|
|
83
|
+
/** Its SHA-256, hex */
|
|
84
|
+
readonly sha256: string;
|
|
85
|
+
/** The root type its beast2 header declares */
|
|
86
|
+
readonly type: EastTypeValue;
|
|
87
|
+
/** Where it came from, which its put names */
|
|
88
|
+
readonly origin: FilesDatasetOrigin;
|
|
89
|
+
readonly bytes: FilesPushBytes;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* A dataset's value read once for its size, its SHA-256 and the type its
|
|
93
|
+
* header declares, the bytes kept when they are few; and its bytes for the
|
|
94
|
+
* upload, read again pinned to the same value and checked as they end.
|
|
95
|
+
*
|
|
96
|
+
* @param found - The dataset
|
|
97
|
+
* @returns The measures and the bytes
|
|
98
|
+
* @throws {DatasetMovedError} When it moves while it is read
|
|
99
|
+
* @throws {Error} When its bytes are no beast2, which a stored value always is
|
|
100
|
+
*/
|
|
101
|
+
export declare function measuredDataset(found: FoundDataset): Promise<MeasuredDataset>;
|
|
102
|
+
//# sourceMappingURL=dataset-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-source.d.ts","sourceRoot":"","sources":["../../src/dataset-source.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAO7F,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK/D,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAc7C,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAa3D;AAED,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE7D,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;CACzD;AAED,yGAAyG;AACzG,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAEtE,uDAAuD;AACvD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAIxB;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7D;AAgED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAEhF;AA6JD,6FAA6F;AAC7F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AAaD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CA+CnF"}
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* `dataset:<ws>.<name>`: a workspace's dataset offered to `e3-cloud files
|
|
7
|
+
* push` as the file of its value.
|
|
8
|
+
*
|
|
9
|
+
* The dataset is read from the repository `--from` names, a local
|
|
10
|
+
* repository's path or a repository's URL, defaulting as e3's `[repo]` does
|
|
11
|
+
* (`$E3_REPO`, then `.`). Its name resolves as e3's CLI resolves a flat path
|
|
12
|
+
* (e3-cli's `path-resolver`): the input, the task (its output) or the record
|
|
13
|
+
* of that name in the workspace. One that is unassigned (a task output not
|
|
14
|
+
* produced since its workspace's last deploy, an input never set, a record
|
|
15
|
+
* with no state yet), that the workspace does not hold, or that names two of
|
|
16
|
+
* them, is refused in its own row.
|
|
17
|
+
*
|
|
18
|
+
* Its bytes are its value as a deployed repository serves `e3 dataset get -f
|
|
19
|
+
* beast2`: a collection spliced from its stored segments a segment at a time
|
|
20
|
+
* (e3-core's `DatasetSegments.splice`, as the server splices them), any other
|
|
21
|
+
* value as it is stored, never held whole; so the same stored value gives the
|
|
22
|
+
* same bytes from a local repository and a deployed one, and a dataset pushed
|
|
23
|
+
* again unchanged is `unchanged`. They are read twice: once for their size,
|
|
24
|
+
* SHA-256 and header type, which the plan is given, then again as they are
|
|
25
|
+
* uploaded. Each read is pinned to the value first read (a local repository's
|
|
26
|
+
* by its hash, which names one value for ever; a deployed one's refused when
|
|
27
|
+
* the dataset names another) and its SHA-256 is checked as it ends, so a
|
|
28
|
+
* dataset a run writes again in between is refused ({@link DatasetMovedError}),
|
|
29
|
+
* never put as something else. A value of 8 MiB or less is kept from the first
|
|
30
|
+
* read and read once.
|
|
31
|
+
*/
|
|
32
|
+
import { createHash } from 'node:crypto';
|
|
33
|
+
import { encodeBeast2For, readBeast2Type, variant } from '@elaraai/east';
|
|
34
|
+
import { DatasetSegments, InvalidNameError, LocalStorage, WorkspaceNotDeployedError, WorkspaceNotFoundError, openDatasetObject, workspaceGetTree, } from '@elaraai/e3-core';
|
|
35
|
+
import { ApiError, DatasetHashMismatchError, datasetGetStatus, datasetGetStream, datasetListRecursive } from '@elaraai/e3-api-client';
|
|
36
|
+
import { parseDatasetPath } from '@elaraai/e3-types';
|
|
37
|
+
import { filesDatasetPathText } from '@elaraai/e3-cloud-types';
|
|
38
|
+
import { getValidToken } from './credentials.js';
|
|
39
|
+
import { openLocalRepository } from './files-local.js';
|
|
40
|
+
import { parseRepoUrl } from './utils.js';
|
|
41
|
+
/** What names a dataset among a push's paths. */
|
|
42
|
+
export const DATASET_ARG_PREFIX = 'dataset:';
|
|
43
|
+
/** A value this size or smaller is kept from its first read, and read once. */
|
|
44
|
+
const KEPT_BYTES = 8 * 1024 * 1024;
|
|
45
|
+
/** How much of a stored object one read takes, for a value that is no collection. */
|
|
46
|
+
const READ_BYTES = 8 * 1024 * 1024;
|
|
47
|
+
/** The segments a local read of a collection reads ahead of the upload. */
|
|
48
|
+
const READ_AHEAD = 2;
|
|
49
|
+
/** The most of a value's head read for its type: a type section wider is malformed, not large. */
|
|
50
|
+
const HEAD_TYPE_MAX_BYTES = 16 * 1024 * 1024;
|
|
51
|
+
/**
|
|
52
|
+
* The repository a push reads its datasets from: `--from`, else `$E3_REPO`,
|
|
53
|
+
* else the current directory, as e3's `[repo]` defaults.
|
|
54
|
+
*
|
|
55
|
+
* @param from - `--from`, as given
|
|
56
|
+
* @returns The repository
|
|
57
|
+
*/
|
|
58
|
+
export function datasetRepositoryArg(from) {
|
|
59
|
+
return from !== undefined && from.length > 0 ? from : (process.env.E3_REPO ?? '.');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The dataset a push's path names, or null for a path that names none.
|
|
63
|
+
*
|
|
64
|
+
* @param arg - The path, as given
|
|
65
|
+
* @returns The dataset, or null
|
|
66
|
+
* @throws {Error} For `dataset:` followed by anything but `<ws>.<name>`
|
|
67
|
+
*/
|
|
68
|
+
export function datasetArgOf(arg) {
|
|
69
|
+
if (!arg.startsWith(DATASET_ARG_PREFIX))
|
|
70
|
+
return null;
|
|
71
|
+
const spec = arg.slice(DATASET_ARG_PREFIX.length);
|
|
72
|
+
const shape = 'name a dataset as dataset:<workspace>.<name>, the name of its input, task or record (dataset:dev.customer_book)';
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = parseDatasetPath(spec);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
throw new Error(`${arg}: ${err instanceof Error ? err.message : String(err)}: ${shape}`);
|
|
79
|
+
}
|
|
80
|
+
const [name, ...rest] = parsed.path;
|
|
81
|
+
if (name === undefined || rest.length > 0)
|
|
82
|
+
throw new Error(`${arg}: ${shape}`);
|
|
83
|
+
return { arg, workspace: parsed.ws, name: name.value };
|
|
84
|
+
}
|
|
85
|
+
/** A dataset that no longer holds the value a push read: a run wrote it again. */
|
|
86
|
+
export class DatasetMovedError extends Error {
|
|
87
|
+
constructor(arg) {
|
|
88
|
+
super(`${arg} changed while it was pushed (a run wrote it again): push it again`);
|
|
89
|
+
this.name = 'DatasetMovedError';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** A tree path of fields. */
|
|
93
|
+
function fields(...names) {
|
|
94
|
+
return names.map((name) => variant('field', name));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A dataset's entry by where its workspace's tree holds it, as e3's CLI
|
|
98
|
+
* names it: `inputs/<name>`, `tasks/<name>` (its output: a tree names a task's
|
|
99
|
+
* output by the task, a listing that walks into the task by `output` under
|
|
100
|
+
* it) or `records/<name>`; null for anything else, which no flat name of an
|
|
101
|
+
* input, task or record reaches.
|
|
102
|
+
*/
|
|
103
|
+
function entryOf(prefix, name) {
|
|
104
|
+
if (prefix.length === 1 && prefix[0] === 'inputs')
|
|
105
|
+
return { name, kind: 'input', path: fields('inputs', name) };
|
|
106
|
+
if (prefix.length === 1 && prefix[0] === 'records')
|
|
107
|
+
return { name, kind: 'record', path: fields('records', name) };
|
|
108
|
+
if (prefix.length === 1 && prefix[0] === 'tasks')
|
|
109
|
+
return { name, kind: 'task output', path: fields('tasks', name, 'output') };
|
|
110
|
+
if (prefix.length === 2 && prefix[0] === 'tasks' && name === 'output') {
|
|
111
|
+
return { name: prefix[1], kind: 'task output', path: fields('tasks', prefix[1], 'output') };
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/** The one entry a name names, or why there is none. */
|
|
116
|
+
function entryNamed(index, arg) {
|
|
117
|
+
const matches = index.filter((entry) => entry.name === arg.name);
|
|
118
|
+
const path = filesDatasetPathText(arg.workspace, arg.name);
|
|
119
|
+
if (matches.length === 1)
|
|
120
|
+
return matches[0];
|
|
121
|
+
if (matches.length > 1) {
|
|
122
|
+
return { refused: 'ambiguous', message: `${path} is ambiguous: ${arg.workspace} has ${matches.map((m) => `a ${m.kind}`).join(' and ')} named ${arg.name}` };
|
|
123
|
+
}
|
|
124
|
+
return { refused: 'not_found', message: `${arg.workspace} has no input, task or record named ${arg.name}` };
|
|
125
|
+
}
|
|
126
|
+
/** Why an unassigned dataset holds nothing, as its row says. */
|
|
127
|
+
function unassignedWords(arg, kind) {
|
|
128
|
+
const path = filesDatasetPathText(arg.workspace, arg.name);
|
|
129
|
+
switch (kind) {
|
|
130
|
+
case 'task output': return `${path} is unassigned: its task has not produced it since ${arg.workspace}'s last deploy (run its dataflow)`;
|
|
131
|
+
case 'input': return `${path} is unassigned: no value has been set`;
|
|
132
|
+
case 'record': return `${path} is unassigned: the record has no state yet`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** A dataset that holds null, which e3 stores as no object: its type's encoding of null, and that encoding's hash. */
|
|
136
|
+
function nullValue(arg, kind, type) {
|
|
137
|
+
const bytes = encodeBeast2For(type)(null);
|
|
138
|
+
return { arg, kind, hash: createHash('sha256').update(bytes).digest('hex'), open: () => Promise.resolve(once(bytes)) };
|
|
139
|
+
}
|
|
140
|
+
/** Bytes as one chunk. */
|
|
141
|
+
// eslint-disable-next-line @typescript-eslint/require-await -- bytes in memory, as the async iterable a dataset's bytes are
|
|
142
|
+
async function* once(bytes) {
|
|
143
|
+
yield bytes;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Where a push reads its datasets: a deployed repository given its URL, a
|
|
147
|
+
* local one given its path.
|
|
148
|
+
*
|
|
149
|
+
* @param from - The repository ({@link datasetRepositoryArg})
|
|
150
|
+
* @returns The repository
|
|
151
|
+
* @throws {Error} When a local path holds no repository this e3 can open, or a URL names none
|
|
152
|
+
*/
|
|
153
|
+
export async function datasetRepository(from) {
|
|
154
|
+
return from.startsWith('https://') || from.startsWith('http://') ? remoteRepository(from) : localRepository(await openLocalRepository(from));
|
|
155
|
+
}
|
|
156
|
+
/** The entries of a local workspace's tree, each with its leaf. */
|
|
157
|
+
function localEntries(nodes, prefix = []) {
|
|
158
|
+
return nodes.flatMap((node) => {
|
|
159
|
+
if (node.kind === 'tree')
|
|
160
|
+
return localEntries(node.children, [...prefix, node.name]);
|
|
161
|
+
const entry = entryOf(prefix, node.name);
|
|
162
|
+
return entry === null ? [] : [{ ...entry, leaf: node }];
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/** A local repository's datasets, read through e3-core. */
|
|
166
|
+
function localRepository(repo) {
|
|
167
|
+
const storage = new LocalStorage();
|
|
168
|
+
const trees = new Map();
|
|
169
|
+
const treeOf = (ws) => {
|
|
170
|
+
let tree = trees.get(ws);
|
|
171
|
+
if (tree === undefined)
|
|
172
|
+
trees.set(ws, tree = workspaceGetTree(storage, repo, ws, [], { includeTypes: true, includeStatus: true }));
|
|
173
|
+
return tree;
|
|
174
|
+
};
|
|
175
|
+
return {
|
|
176
|
+
async find(args) {
|
|
177
|
+
const lookups = [];
|
|
178
|
+
for (const arg of args) {
|
|
179
|
+
let tree;
|
|
180
|
+
try {
|
|
181
|
+
tree = await treeOf(arg.workspace);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
if (!(err instanceof WorkspaceNotFoundError || err instanceof WorkspaceNotDeployedError || err instanceof InvalidNameError))
|
|
185
|
+
throw err;
|
|
186
|
+
lookups.push({ refused: 'not_found', message: err.message });
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const entry = entryNamed(localEntries(tree), arg);
|
|
190
|
+
if ('refused' in entry) {
|
|
191
|
+
lookups.push(entry);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const { leaf, kind } = entry;
|
|
195
|
+
if (leaf.refType === 'unassigned') {
|
|
196
|
+
lookups.push({ refused: 'unassigned', message: unassignedWords(arg, kind) });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (leaf.refType === 'null' || leaf.hash === undefined) {
|
|
200
|
+
lookups.push({ found: nullValue(arg, kind, leaf.datasetType) });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const hash = leaf.hash;
|
|
204
|
+
// Pinned by its hash: what a repository holds under a hash never changes
|
|
205
|
+
lookups.push({ found: { arg, kind, hash, open: () => Promise.resolve(localBytes(storage, repo, hash)) } });
|
|
206
|
+
}
|
|
207
|
+
return lookups;
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* A stored value's bytes: a collection spliced from its segments (a record
|
|
213
|
+
* that declares an index read through its primary, as every reader reads
|
|
214
|
+
* it), any other value as stored, by ranges.
|
|
215
|
+
*/
|
|
216
|
+
async function* localBytes(storage, repo, hash) {
|
|
217
|
+
const opened = await openDatasetObject(storage, repo, hash);
|
|
218
|
+
if (opened.manifest !== null) {
|
|
219
|
+
yield* (await DatasetSegments.open(storage, repo, opened.hash)).splice({ readAhead: READ_AHEAD });
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const { size } = await storage.objects.stat(repo, opened.hash);
|
|
223
|
+
for (let at = 0; at < size; at += READ_BYTES)
|
|
224
|
+
yield await storage.objects.readRange(repo, opened.hash, at, Math.min(READ_BYTES, size - at));
|
|
225
|
+
}
|
|
226
|
+
/** A deployed repository's datasets, read through its API with the login e3 and e3-cloud share. */
|
|
227
|
+
function remoteRepository(from) {
|
|
228
|
+
const { baseUrl, repo } = parseRepoUrl(from);
|
|
229
|
+
const options = async () => ({ token: await getValidToken(baseUrl) });
|
|
230
|
+
const indexes = new Map();
|
|
231
|
+
const indexOf = (ws) => {
|
|
232
|
+
let index = indexes.get(ws);
|
|
233
|
+
if (index === undefined) {
|
|
234
|
+
indexes.set(ws, index = (async () => {
|
|
235
|
+
const items = await datasetListRecursive(baseUrl, repo, ws, [], await options());
|
|
236
|
+
return items.flatMap((item) => {
|
|
237
|
+
if (item.type !== 'dataset')
|
|
238
|
+
return [];
|
|
239
|
+
// A listing's path is a keypath, `.inputs.customers`, as e3-cli's resolver splits it
|
|
240
|
+
const segments = item.value.path.split('.').filter((s) => s.length > 0);
|
|
241
|
+
const name = segments.at(-1);
|
|
242
|
+
const entry = name === undefined ? null : entryOf(segments.slice(0, -1), name);
|
|
243
|
+
return entry === null ? [] : [entry];
|
|
244
|
+
});
|
|
245
|
+
})());
|
|
246
|
+
}
|
|
247
|
+
return index;
|
|
248
|
+
};
|
|
249
|
+
return {
|
|
250
|
+
async find(args) {
|
|
251
|
+
const lookups = [];
|
|
252
|
+
for (const arg of args) {
|
|
253
|
+
let index;
|
|
254
|
+
try {
|
|
255
|
+
index = await indexOf(arg.workspace);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
if (!(err instanceof ApiError) || !['workspace_not_found', 'workspace_not_deployed', 'invalid_name'].includes(err.code))
|
|
259
|
+
throw err;
|
|
260
|
+
lookups.push({ refused: 'not_found', message: `${arg.workspace}: ${err.code.replace(/_/g, ' ')}` });
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const entry = entryNamed(index, arg);
|
|
264
|
+
if ('refused' in entry) {
|
|
265
|
+
lookups.push(entry);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const { kind, path } = entry;
|
|
269
|
+
const status = await datasetGetStatus(baseUrl, repo, arg.workspace, path, await options());
|
|
270
|
+
if (status.refType === 'unassigned') {
|
|
271
|
+
lookups.push({ refused: 'unassigned', message: unassignedWords(arg, kind) });
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (status.refType === 'null' || status.hash.type === 'none') {
|
|
275
|
+
lookups.push({ found: nullValue(arg, kind, status.type) });
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
const hash = status.hash.value;
|
|
279
|
+
lookups.push({
|
|
280
|
+
found: {
|
|
281
|
+
arg,
|
|
282
|
+
kind,
|
|
283
|
+
hash,
|
|
284
|
+
open: async () => {
|
|
285
|
+
const read = await datasetGetStream(baseUrl, repo, arg.workspace, path, await options());
|
|
286
|
+
if (read.hash !== hash) {
|
|
287
|
+
// Moved since it was measured: its bytes are another value's
|
|
288
|
+
await read.chunks.return?.(undefined);
|
|
289
|
+
throw new DatasetMovedError(arg.arg);
|
|
290
|
+
}
|
|
291
|
+
return movesRaised(read.chunks, arg.arg);
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return lookups;
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/** A remote read's chunks, a move the client finds while they stream raised as the push's own. */
|
|
301
|
+
async function* movesRaised(chunks, arg) {
|
|
302
|
+
try {
|
|
303
|
+
yield* chunks;
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
if (err instanceof DatasetHashMismatchError)
|
|
307
|
+
throw new DatasetMovedError(arg);
|
|
308
|
+
throw err;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/** Bytes, one after another, in one new array. */
|
|
312
|
+
function joined(parts) {
|
|
313
|
+
const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
|
|
314
|
+
let at = 0;
|
|
315
|
+
for (const part of parts) {
|
|
316
|
+
out.set(part, at);
|
|
317
|
+
at += part.length;
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* A dataset's value read once for its size, its SHA-256 and the type its
|
|
323
|
+
* header declares, the bytes kept when they are few; and its bytes for the
|
|
324
|
+
* upload, read again pinned to the same value and checked as they end.
|
|
325
|
+
*
|
|
326
|
+
* @param found - The dataset
|
|
327
|
+
* @returns The measures and the bytes
|
|
328
|
+
* @throws {DatasetMovedError} When it moves while it is read
|
|
329
|
+
* @throws {Error} When its bytes are no beast2, which a stored value always is
|
|
330
|
+
*/
|
|
331
|
+
export async function measuredDataset(found) {
|
|
332
|
+
const digest = createHash('sha256');
|
|
333
|
+
let size = 0;
|
|
334
|
+
let kept = [];
|
|
335
|
+
// The head, until its type section is in hand: a short head fails to read as
|
|
336
|
+
// a malformed one does, so it is read again as more arrives
|
|
337
|
+
let head = [];
|
|
338
|
+
let headBytes = 0;
|
|
339
|
+
let type = null;
|
|
340
|
+
let headError = null;
|
|
341
|
+
for await (const chunk of await found.open()) {
|
|
342
|
+
digest.update(chunk);
|
|
343
|
+
size += chunk.length;
|
|
344
|
+
if (kept !== null) {
|
|
345
|
+
kept.push(chunk);
|
|
346
|
+
if (size > KEPT_BYTES)
|
|
347
|
+
kept = null;
|
|
348
|
+
}
|
|
349
|
+
if (type === null && headError === null) {
|
|
350
|
+
head.push(chunk);
|
|
351
|
+
headBytes += chunk.length;
|
|
352
|
+
try {
|
|
353
|
+
type = readBeast2Type(joined(head));
|
|
354
|
+
head = [];
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
if (headBytes >= HEAD_TYPE_MAX_BYTES) {
|
|
358
|
+
headError = err;
|
|
359
|
+
head = [];
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (type === null) {
|
|
365
|
+
try {
|
|
366
|
+
if (headError !== null)
|
|
367
|
+
throw headError;
|
|
368
|
+
type = readBeast2Type(joined(head));
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
throw new Error(`${found.arg.arg} holds no beast2 value: ${err instanceof Error ? err.message : String(err)}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
const sha256 = digest.digest('hex');
|
|
375
|
+
const whole = kept;
|
|
376
|
+
const bytes = {
|
|
377
|
+
size,
|
|
378
|
+
ranged: whole !== null,
|
|
379
|
+
read: whole !== null ? (start) => slicesFrom(whole, start) : (start) => checkedFrom(found, start, size, sha256),
|
|
380
|
+
};
|
|
381
|
+
return { size, sha256, type, origin: { path: filesDatasetPathText(found.arg.workspace, found.arg.name), hash: found.hash }, bytes };
|
|
382
|
+
}
|
|
383
|
+
/** Kept bytes from an offset on. */
|
|
384
|
+
// eslint-disable-next-line @typescript-eslint/require-await -- bytes in memory, as the async iterable a push reads
|
|
385
|
+
async function* slicesFrom(chunks, start) {
|
|
386
|
+
let at = 0;
|
|
387
|
+
for (const chunk of chunks) {
|
|
388
|
+
const end = at + chunk.length;
|
|
389
|
+
if (end > start)
|
|
390
|
+
yield at >= start ? chunk : chunk.subarray(start - at);
|
|
391
|
+
at = end;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* A dataset's bytes from an offset on, read again from its start (a stream
|
|
396
|
+
* reads no other way), each byte hashed, and refused as they end when they
|
|
397
|
+
* are not the bytes measured.
|
|
398
|
+
*/
|
|
399
|
+
async function* checkedFrom(found, start, size, sha256) {
|
|
400
|
+
const digest = createHash('sha256');
|
|
401
|
+
let at = 0;
|
|
402
|
+
for await (const chunk of await found.open()) {
|
|
403
|
+
digest.update(chunk);
|
|
404
|
+
const end = at + chunk.length;
|
|
405
|
+
if (end > start)
|
|
406
|
+
yield at >= start ? chunk : chunk.subarray(start - at);
|
|
407
|
+
at = end;
|
|
408
|
+
}
|
|
409
|
+
if (at !== size || digest.digest('hex') !== sha256)
|
|
410
|
+
throw new DatasetMovedError(found.arg.arg);
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=dataset-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataset-source.js","sourceRoot":"","sources":["../../src/dataset-source.ts"],"names":[],"mappings":"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"}
|