@elaraai/e3-types 1.0.75 → 1.0.77

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.
@@ -60,6 +60,24 @@ export const PackageDatasetsType = PackageDataType;
60
60
  * };
61
61
  * ```
62
62
  */
63
+ /**
64
+ * Where a dataset's initial value comes from, when it is not in the package.
65
+ *
66
+ * @remarks
67
+ * A package carries the DESCRIPTOR, never the bytes: `e3.input('table', T,
68
+ * variant('file', './TABLE.beast2'))` puts `{ file: { path } }` here and leaves
69
+ * the ref `unassigned`, and deploy resolves it — adopting the file into the
70
+ * object store by hash, so a new delivery under the same path is a new hash
71
+ * whose consumers re-run. An inline `variant('value', v)` needs no descriptor:
72
+ * its bytes are an object in the bundle like any other.
73
+ *
74
+ * A variant so that further source kinds can be appended later without a wire
75
+ * break; `file` is the only one today.
76
+ */
77
+ export const DatasetSourceWireType = VariantType({
78
+ /** A path on the machine that DEPLOYS the package, resolved at deploy. */
79
+ file: StructType({ path: StringType }),
80
+ });
63
81
  export const PackageObjectType = StructType({
64
82
  /** Tasks defined in this package: name -> task object hash */
65
83
  tasks: DictType(StringType, StringType),
@@ -71,6 +89,20 @@ export const PackageObjectType = StructType({
71
89
  * BEAST2 encodes struct fields positionally in declaration order, so new
72
90
  * fields MUST be appended LAST — never inserted between existing fields. */
73
91
  records: DictType(StringType, StringType),
92
+ /** Unresolved dataset sources: refPath (e.g. "inputs/table") -> descriptor.
93
+ * Appended LAST, per the positional rule above. */
94
+ sources: DictType(StringType, DatasetSourceWireType),
95
+ });
96
+ /**
97
+ * The pre-`sources` package object wire shape (tasks, data, functions,
98
+ * records), kept only so {@link decodePackageObject} can read packages exported
99
+ * before path-initialised inputs existed.
100
+ */
101
+ const RecordsEraPackageObjectType = StructType({
102
+ tasks: DictType(StringType, StringType),
103
+ data: PackageDataType,
104
+ functions: DictType(StringType, StringType),
105
+ records: DictType(StringType, StringType),
74
106
  });
75
107
  /**
76
108
  * The pre-`records` package object wire shape (tasks, data, functions), kept
@@ -92,16 +124,17 @@ const LegacyPackageObjectType = StructType({
92
124
  data: PackageDataType,
93
125
  });
94
126
  const decodeCurrent = decodeBeast2For(PackageObjectType);
127
+ const decodeRecordsEra = decodeBeast2For(RecordsEraPackageObjectType);
95
128
  const decodeFunctionsEra = decodeBeast2For(FunctionsEraPackageObjectType);
96
129
  const decodeLegacy = decodeBeast2For(LegacyPackageObjectType);
97
130
  /**
98
- * Decode a `PackageObject` from BEAST2 bytes, tolerating the two older wire
131
+ * Decode a `PackageObject` from BEAST2 bytes, tolerating the older wire
99
132
  * formats (dual-decode migration).
100
133
  *
101
134
  * Every package-read path — local AND cloud — must use this instead of
102
135
  * `decodeBeast2For(PackageObjectType)` directly, so packages exported before
103
- * the `records`/`functions` fields existed keep decoding. Older bytes decode
104
- * with the missing maps defaulted to empty.
136
+ * the `sources`/`records`/`functions` fields existed keep decoding. Older
137
+ * bytes decode with the missing maps defaulted to empty.
105
138
  */
106
139
  export function decodePackageObject(data) {
107
140
  try {
@@ -109,16 +142,22 @@ export function decodePackageObject(data) {
109
142
  }
110
143
  catch (err) {
111
144
  try {
112
- const fnEra = decodeFunctionsEra(data);
113
- return { tasks: fnEra.tasks, data: fnEra.data, functions: fnEra.functions, records: new Map() };
145
+ const recEra = decodeRecordsEra(data);
146
+ return { ...recEra, sources: new Map() };
114
147
  }
115
148
  catch {
116
149
  try {
117
- const legacy = decodeLegacy(data);
118
- return { tasks: legacy.tasks, data: legacy.data, functions: new Map(), records: new Map() };
150
+ const fnEra = decodeFunctionsEra(data);
151
+ return { tasks: fnEra.tasks, data: fnEra.data, functions: fnEra.functions, records: new Map(), sources: new Map() };
119
152
  }
120
153
  catch {
121
- throw err; // no known shape — surface the current-format error
154
+ try {
155
+ const legacy = decodeLegacy(data);
156
+ return { tasks: legacy.tasks, data: legacy.data, functions: new Map(), records: new Map(), sources: new Map() };
157
+ }
158
+ catch {
159
+ throw err; // no known shape — surface the current-format error
160
+ }
122
161
  }
123
162
  }
124
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/package.ts"],"names":[],"mappings":"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"}
@@ -142,13 +142,35 @@ export declare const PartitionTaskMetadataType: StructType<{
142
142
  readonly combine: OptionType<BlobType>;
143
143
  /** Target carved-slice size in wire bytes — the only sizing knob. */
144
144
  readonly targetPartitionBytes: IntegerType;
145
+ /**
146
+ * `encodeEastIR` bundle of the per-key merge `(Key, Value, Value) -> Value`
147
+ * for a Dict output; `none` otherwise.
148
+ *
149
+ * Its presence (or {@link mergeSets}) selects the SEGMENT-MERGE assembly:
150
+ * partials are walked by their segment fences in the orchestrator, disjoint
151
+ * segments are byte-copied exactly as a splice does, and only overlapping
152
+ * ones are decoded, merged and re-encoded. Appended LAST (BEAST2 encodes
153
+ * struct fields positionally) with a dual decoder — see
154
+ * {@link decodePartitionTaskMetadata}.
155
+ */
156
+ readonly merge: OptionType<BlobType>;
157
+ /** Whether a Set output assembles by segment merge (union). The Set twin of
158
+ * {@link merge}, which needs no function. Appended LAST. */
159
+ readonly mergeSets: BooleanType;
145
160
  }>;
146
161
  export type PartitionTaskMetadataType = typeof PartitionTaskMetadataType;
147
162
  export type PartitionTaskMetadata = ValueTypeOf<typeof PartitionTaskMetadataType>;
148
163
  /** Encode a {@link PartitionTaskMetadataType} value for `TaskObject.metadata`. */
149
164
  export declare const encodePartitionTaskMetadata: (value: PartitionTaskMetadata) => Uint8Array;
150
- /** Decode a `TaskObject.metadata` blob of a {@link TASK_KIND_PARTITION} task. */
151
- export declare const decodePartitionTaskMetadata: (data: Uint8Array) => PartitionTaskMetadata;
165
+ /**
166
+ * Decode a `TaskObject.metadata` blob of a {@link TASK_KIND_PARTITION} task,
167
+ * tolerating the pre-`merge` wire format (dual-decode migration).
168
+ *
169
+ * @param data - the metadata blob
170
+ * @returns the decoded metadata, with `merge`/`mergeSets` defaulted off for
171
+ * older bytes
172
+ */
173
+ export declare function decodePartitionTaskMetadata(data: Uint8Array): PartitionTaskMetadata;
152
174
  /**
153
175
  * Metadata of a {@link TASK_KIND_STREAM} task.
154
176
  *
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAA0C,MAAM,eAAe,CAAC;AAIvK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,cAAc;IACzB,kFAAkF;;IAElF,uEAAuE;;;;IAEvE,sEAAsE;;;;IAEtE,sFAAsF;;IAEtF,6FAA6F;;IAE7F;;;;;;;OAOG;;;;;;;;;;;;;;;IAEH;;;;;OAKG;;EAEH,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC;AAmB5D;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAW7D;AAMD;;;;kEAIkE;AAClE,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C;;;qDAGqD;AACrD,eAAO,MAAM,gBAAgB,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB;IACpC,2EAA2E;;IAE3E;mFAC+E;;IAE/E;sDACkD;;IAElD,qEAAqE;;EAErE,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,OAAO,yBAAyB,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAElF,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,UAChC,CAAC;AAE7C,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,qBACpB,CAAC;AAE7C;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC;8BAC0B;;IAE1B;;qBAEiB;;EAEjB,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,UAC7B,CAAC;AAE1C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,kBACpB,CAAC"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAA0C,MAAM,eAAe,CAAC;AAIvK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,cAAc;IACzB,kFAAkF;;IAElF,uEAAuE;;;;IAEvE,sEAAsE;;;;IAEtE,sFAAsF;;IAEtF,6FAA6F;;IAE7F;;;;;;;OAOG;;;;;;;;;;;;;;;IAEH;;;;;OAKG;;EAEH,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC;AAmB5D;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAW7D;AAMD;;;;kEAIkE;AAClE,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C;;;qDAGqD;AACrD,eAAO,MAAM,gBAAgB,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB;IACpC,2EAA2E;;IAE3E;mFAC+E;;IAE/E;sDACkD;;IAElD,qEAAqE;;IAErE;;;;;;;;;;OAUG;;IAEH;iEAC6D;;EAE7D,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,OAAO,yBAAyB,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAclF,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,UAChC,CAAC;AAK7C;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,qBAAqB,CAUnF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC;8BAC0B;;IAE1B;;qBAEiB;;EAEjB,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,UAC7B,CAAC;AAE1C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,kBACpB,CAAC"}
package/dist/src/task.js CHANGED
@@ -156,11 +156,58 @@ export const PartitionTaskMetadataType = StructType({
156
156
  combine: OptionType(BlobType),
157
157
  /** Target carved-slice size in wire bytes — the only sizing knob. */
158
158
  targetPartitionBytes: IntegerType,
159
+ /**
160
+ * `encodeEastIR` bundle of the per-key merge `(Key, Value, Value) -> Value`
161
+ * for a Dict output; `none` otherwise.
162
+ *
163
+ * Its presence (or {@link mergeSets}) selects the SEGMENT-MERGE assembly:
164
+ * partials are walked by their segment fences in the orchestrator, disjoint
165
+ * segments are byte-copied exactly as a splice does, and only overlapping
166
+ * ones are decoded, merged and re-encoded. Appended LAST (BEAST2 encodes
167
+ * struct fields positionally) with a dual decoder — see
168
+ * {@link decodePartitionTaskMetadata}.
169
+ */
170
+ merge: OptionType(BlobType),
171
+ /** Whether a Set output assembles by segment merge (union). The Set twin of
172
+ * {@link merge}, which needs no function. Appended LAST. */
173
+ mergeSets: BooleanType,
174
+ });
175
+ /**
176
+ * The pre-`merge` partition metadata wire shape, kept only so
177
+ * {@link decodePartitionTaskMetadata} can read tasks exported before the
178
+ * segment-merge assembly existed.
179
+ */
180
+ const PreMergePartitionTaskMetadataType = StructType({
181
+ partitions: IntegerType,
182
+ by: OptionType(BlobType),
183
+ combine: OptionType(BlobType),
184
+ targetPartitionBytes: IntegerType,
159
185
  });
160
186
  /** Encode a {@link PartitionTaskMetadataType} value for `TaskObject.metadata`. */
161
187
  export const encodePartitionTaskMetadata = encodeBeast2For(PartitionTaskMetadataType);
162
- /** Decode a `TaskObject.metadata` blob of a {@link TASK_KIND_PARTITION} task. */
163
- export const decodePartitionTaskMetadata = decodeBeast2For(PartitionTaskMetadataType);
188
+ const decodeCurrentPartitionMetadata = decodeBeast2For(PartitionTaskMetadataType);
189
+ const decodePreMergePartitionMetadata = decodeBeast2For(PreMergePartitionTaskMetadataType);
190
+ /**
191
+ * Decode a `TaskObject.metadata` blob of a {@link TASK_KIND_PARTITION} task,
192
+ * tolerating the pre-`merge` wire format (dual-decode migration).
193
+ *
194
+ * @param data - the metadata blob
195
+ * @returns the decoded metadata, with `merge`/`mergeSets` defaulted off for
196
+ * older bytes
197
+ */
198
+ export function decodePartitionTaskMetadata(data) {
199
+ try {
200
+ return decodeCurrentPartitionMetadata(data);
201
+ }
202
+ catch (err) {
203
+ try {
204
+ return { ...decodePreMergePartitionMetadata(data), merge: none, mergeSets: false };
205
+ }
206
+ catch {
207
+ throw err; // no known shape — surface the current-format error
208
+ }
209
+ }
210
+ }
164
211
  /**
165
212
  * Metadata of a {@link TASK_KIND_STREAM} task.
166
213
  *
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,46 @@
7
7
  *
8
8
  * Used by both the API server and client for large dataset uploads
9
9
  * that exceed inline body size limits.
10
+ *
11
+ * Two protocol versions share these types. A client names the version it speaks
12
+ * with `?protocol=N` on the init and commit requests (a request without it is
13
+ * version 1), and a server answers only in the forms that version understands —
14
+ * every case version 2 adds sorts after the version-1 cases, so the tags a
15
+ * version-1 client decodes keep their numbers.
16
+ */
17
+ import { VariantType, StructType, StringType, IntegerType, NullType, DictType, type ValueTypeOf } from '@elaraai/east';
18
+ /**
19
+ * The dataset transfer protocol version this build speaks.
20
+ *
21
+ * @remarks
22
+ * Version 2 lets the server plan an upload as parts — each sent to its own URL
23
+ * with the request headers the server names, so an object store can bind a
24
+ * checksum to a single PUT or take a multipart upload larger than one PUT
25
+ * allows — and lets a commit answer `processing` while the server verifies the
26
+ * bytes, for the client to poll.
27
+ */
28
+ export declare const TRANSFER_PROTOCOL_VERSION = 2;
29
+ /**
30
+ * How many parts an upload of `size` bytes has when planned with `partBytes`.
31
+ *
32
+ * @param size - The upload's size in bytes
33
+ * @param partBytes - The size of every part but the last
34
+ * @returns The part count — at least 1
35
+ */
36
+ export declare function transferPartCount(size: number | bigint, partBytes: number | bigint): number;
37
+ /**
38
+ * The byte range part `part` of an upload covers.
39
+ *
40
+ * @param size - The upload's size in bytes
41
+ * @param partBytes - The size of every part but the last
42
+ * @param part - The part's number, from 1
43
+ * @returns The half-open range `[start, end)`, or `null` when the upload has no
44
+ * such part
10
45
  */
11
- import { VariantType, StructType, StringType, IntegerType, NullType, type ValueTypeOf } from '@elaraai/east';
46
+ export declare function transferPartRange(size: number | bigint, partBytes: number | bigint, part: number): {
47
+ start: number;
48
+ end: number;
49
+ } | null;
12
50
  /**
13
51
  * Transfer upload init request.
14
52
  *
@@ -26,7 +64,15 @@ export type TransferUploadRequest = ValueTypeOf<typeof TransferUploadRequestType
26
64
  * Transfer upload init response.
27
65
  *
28
66
  * - `completed`: Object already exists (dedup), dataset ref updated
29
- * - `upload`: Staging slot created, client should upload then call done
67
+ * - `upload`: Staging slot created; the client PUTs every byte to `uploadUrl`,
68
+ * then commits
69
+ * - `upload_parts` (protocol 2): the client sends the bytes as parts of
70
+ * `partBytes` bytes each (the last part holds the remainder, and an upload no
71
+ * larger than `partBytes` is one part). Part `n` (1-based) is the byte range
72
+ * `[(n - 1) * partBytes, min(size, n * partBytes))`; its URL and required
73
+ * headers come from `GET …/upload/<id>/parts/<n>`. Parts may be sent in any
74
+ * order and concurrently, and re-sending a part replaces it. The client
75
+ * commits once every part is sent.
30
76
  */
31
77
  export declare const TransferUploadResponseType: VariantType<{
32
78
  readonly completed: NullType;
@@ -34,19 +80,40 @@ export declare const TransferUploadResponseType: VariantType<{
34
80
  readonly id: StringType;
35
81
  readonly uploadUrl: StringType;
36
82
  }>;
83
+ readonly upload_parts: StructType<{
84
+ readonly id: StringType;
85
+ readonly partBytes: IntegerType;
86
+ }>;
37
87
  }>;
38
88
  export type TransferUploadResponse = ValueTypeOf<typeof TransferUploadResponseType>;
39
89
  /**
40
- * Transfer done response.
90
+ * Where and how to send one part of a protocol-2 upload.
91
+ *
92
+ * @property url - The URL the client PUTs the part's bytes to, without an
93
+ * `Authorization` header (it may be a presigned object-store URL)
94
+ * @property headers - Request headers the PUT must carry exactly as given — a
95
+ * presigned URL can sign them, e.g. the checksum an object store verifies the
96
+ * bytes against
97
+ */
98
+ export declare const TransferPartResponseType: StructType<{
99
+ readonly url: StringType;
100
+ readonly headers: DictType<StringType, StringType>;
101
+ }>;
102
+ export type TransferPartResponse = ValueTypeOf<typeof TransferPartResponseType>;
103
+ /**
104
+ * Transfer done response — the commit's answer, and the poll's.
41
105
  *
42
106
  * - `completed`: Hash verified, object stored, dataset ref updated
43
107
  * - `error`: Hash mismatch or other failure
108
+ * - `processing` (protocol 2): the server is still verifying the bytes; poll
109
+ * `GET …/upload/<id>` until it answers `completed` or `error`
44
110
  */
45
111
  export declare const TransferDoneResponseType: VariantType<{
46
112
  readonly completed: NullType;
47
113
  readonly error: StructType<{
48
114
  readonly message: StringType;
49
115
  }>;
116
+ readonly processing: NullType;
50
117
  }>;
51
118
  export type TransferDoneResponse = ValueTypeOf<typeof TransferDoneResponseType>;
52
119
  //# sourceMappingURL=transfer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7G;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;;;EAGpC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAElF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;EAMrC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;EAKnC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvH;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAI3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;;;EAGpC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAElF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;EAUrC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB;;;EAGnC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;;;;EAMnC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -7,8 +7,53 @@
7
7
  *
8
8
  * Used by both the API server and client for large dataset uploads
9
9
  * that exceed inline body size limits.
10
+ *
11
+ * Two protocol versions share these types. A client names the version it speaks
12
+ * with `?protocol=N` on the init and commit requests (a request without it is
13
+ * version 1), and a server answers only in the forms that version understands —
14
+ * every case version 2 adds sorts after the version-1 cases, so the tags a
15
+ * version-1 client decodes keep their numbers.
16
+ */
17
+ import { VariantType, StructType, StringType, IntegerType, NullType, DictType } from '@elaraai/east';
18
+ /**
19
+ * The dataset transfer protocol version this build speaks.
20
+ *
21
+ * @remarks
22
+ * Version 2 lets the server plan an upload as parts — each sent to its own URL
23
+ * with the request headers the server names, so an object store can bind a
24
+ * checksum to a single PUT or take a multipart upload larger than one PUT
25
+ * allows — and lets a commit answer `processing` while the server verifies the
26
+ * bytes, for the client to poll.
27
+ */
28
+ export const TRANSFER_PROTOCOL_VERSION = 2;
29
+ /**
30
+ * How many parts an upload of `size` bytes has when planned with `partBytes`.
31
+ *
32
+ * @param size - The upload's size in bytes
33
+ * @param partBytes - The size of every part but the last
34
+ * @returns The part count — at least 1
35
+ */
36
+ export function transferPartCount(size, partBytes) {
37
+ const total = BigInt(size);
38
+ const each = BigInt(partBytes);
39
+ return total <= each ? 1 : Number((total + each - 1n) / each);
40
+ }
41
+ /**
42
+ * The byte range part `part` of an upload covers.
43
+ *
44
+ * @param size - The upload's size in bytes
45
+ * @param partBytes - The size of every part but the last
46
+ * @param part - The part's number, from 1
47
+ * @returns The half-open range `[start, end)`, or `null` when the upload has no
48
+ * such part
10
49
  */
11
- import { VariantType, StructType, StringType, IntegerType, NullType } from '@elaraai/east';
50
+ export function transferPartRange(size, partBytes, part) {
51
+ if (!Number.isInteger(part) || part < 1 || part > transferPartCount(size, partBytes))
52
+ return null;
53
+ const start = BigInt(part - 1) * BigInt(partBytes);
54
+ const end = start + BigInt(partBytes) < BigInt(size) ? start + BigInt(partBytes) : BigInt(size);
55
+ return { start: Number(start), end: Number(end) };
56
+ }
12
57
  /**
13
58
  * Transfer upload init request.
14
59
  *
@@ -25,7 +70,15 @@ export const TransferUploadRequestType = StructType({
25
70
  * Transfer upload init response.
26
71
  *
27
72
  * - `completed`: Object already exists (dedup), dataset ref updated
28
- * - `upload`: Staging slot created, client should upload then call done
73
+ * - `upload`: Staging slot created; the client PUTs every byte to `uploadUrl`,
74
+ * then commits
75
+ * - `upload_parts` (protocol 2): the client sends the bytes as parts of
76
+ * `partBytes` bytes each (the last part holds the remainder, and an upload no
77
+ * larger than `partBytes` is one part). Part `n` (1-based) is the byte range
78
+ * `[(n - 1) * partBytes, min(size, n * partBytes))`; its URL and required
79
+ * headers come from `GET …/upload/<id>/parts/<n>`. Parts may be sent in any
80
+ * order and concurrently, and re-sending a part replaces it. The client
81
+ * commits once every part is sent.
29
82
  */
30
83
  export const TransferUploadResponseType = VariantType({
31
84
  completed: NullType,
@@ -33,17 +86,37 @@ export const TransferUploadResponseType = VariantType({
33
86
  id: StringType,
34
87
  uploadUrl: StringType,
35
88
  }),
89
+ upload_parts: StructType({
90
+ id: StringType,
91
+ partBytes: IntegerType,
92
+ }),
93
+ });
94
+ /**
95
+ * Where and how to send one part of a protocol-2 upload.
96
+ *
97
+ * @property url - The URL the client PUTs the part's bytes to, without an
98
+ * `Authorization` header (it may be a presigned object-store URL)
99
+ * @property headers - Request headers the PUT must carry exactly as given — a
100
+ * presigned URL can sign them, e.g. the checksum an object store verifies the
101
+ * bytes against
102
+ */
103
+ export const TransferPartResponseType = StructType({
104
+ url: StringType,
105
+ headers: DictType(StringType, StringType),
36
106
  });
37
107
  /**
38
- * Transfer done response.
108
+ * Transfer done response — the commit's answer, and the poll's.
39
109
  *
40
110
  * - `completed`: Hash verified, object stored, dataset ref updated
41
111
  * - `error`: Hash mismatch or other failure
112
+ * - `processing` (protocol 2): the server is still verifying the bytes; poll
113
+ * `GET …/upload/<id>` until it answers `completed` or `error`
42
114
  */
43
115
  export const TransferDoneResponseType = VariantType({
44
116
  completed: NullType,
45
117
  error: StructType({
46
118
  message: StringType,
47
119
  }),
120
+ processing: NullType,
48
121
  });
49
122
  //# sourceMappingURL=transfer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAE7G;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;IAClD,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;CAClB,CAAC,CAAC;AAGH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC;IACpD,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,UAAU,CAAC;QACjB,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,UAAU;KACtB,CAAC;CACH,CAAC,CAAC;AAGH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;IAClD,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,UAAU,CAAC;QAChB,OAAO,EAAE,UAAU;KACpB,CAAC;CACH,CAAC,CAAC"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/transfer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAEvH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB,EAAE,SAA0B;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAqB,EACrB,SAA0B,EAC1B,IAAY;IAEZ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;IAClD,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,WAAW;CAClB,CAAC,CAAC;AAGH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC;IACpD,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,UAAU,CAAC;QACjB,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,UAAU;KACtB,CAAC;IACF,YAAY,EAAE,UAAU,CAAC;QACvB,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,WAAW;KACvB,CAAC;CACH,CAAC,CAAC;AAGH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;IACjD,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CAC1C,CAAC,CAAC;AAGH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC;IAClD,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,UAAU,CAAC;QAChB,OAAO,EAAE,UAAU;KACpB,CAAC;IACF,UAAU,EAAE,QAAQ;CACrB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=transfer.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.spec.d.ts","sourceRoot":"","sources":["../../src/transfer.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The dataset transfer protocol's two invariants that live in e3-types.
7
+ *
8
+ * Part arithmetic is shared by the client that cuts the bytes and the server
9
+ * that places them, so an off-by-one on either side would corrupt uploads
10
+ * silently until the commit's hash check. And protocol 2 only adds variant
11
+ * cases: a version-1 client decodes a version-1 answer from a new server, and a
12
+ * new client decodes an old server's answers, only while every added case sorts
13
+ * after the version-1 cases and so leaves their tags unchanged.
14
+ */
15
+ import { describe, it } from 'node:test';
16
+ import * as assert from 'node:assert';
17
+ import { NullType, StringType, StructType, VariantType, decodeBeast2For, encodeBeast2For, variant } from '@elaraai/east';
18
+ import { TransferDoneResponseType, TransferUploadResponseType, transferPartCount, transferPartRange, } from './transfer.js';
19
+ describe('transferPartCount / transferPartRange', () => {
20
+ it('cuts an upload into full parts and a remainder', () => {
21
+ assert.strictEqual(transferPartCount(10, 4), 3);
22
+ assert.deepStrictEqual(transferPartRange(10, 4, 1), { start: 0, end: 4 });
23
+ assert.deepStrictEqual(transferPartRange(10, 4, 2), { start: 4, end: 8 });
24
+ assert.deepStrictEqual(transferPartRange(10, 4, 3), { start: 8, end: 10 });
25
+ });
26
+ it('gives an exact multiple no empty trailing part', () => {
27
+ assert.strictEqual(transferPartCount(8, 4), 2);
28
+ assert.deepStrictEqual(transferPartRange(8, 4, 2), { start: 4, end: 8 });
29
+ assert.strictEqual(transferPartRange(8, 4, 3), null);
30
+ });
31
+ it('sends an upload no larger than a part as one part', () => {
32
+ assert.strictEqual(transferPartCount(3, 4), 1);
33
+ assert.strictEqual(transferPartCount(4, 4), 1);
34
+ assert.deepStrictEqual(transferPartRange(3, 4, 1), { start: 0, end: 3 });
35
+ });
36
+ it('has no part 0, no fractional part and none past the end', () => {
37
+ assert.strictEqual(transferPartRange(10, 4, 0), null);
38
+ assert.strictEqual(transferPartRange(10, 4, 1.5), null);
39
+ assert.strictEqual(transferPartRange(10, 4, 4), null);
40
+ });
41
+ it('stays exact past 2^32 bytes, taking sizes as bigint or number', () => {
42
+ const size = 5n * 1024n ** 4n + 1n; // 5 TiB and a byte
43
+ const partBytes = 512n * 1024n ** 2n;
44
+ assert.strictEqual(transferPartCount(size, partBytes), 10241);
45
+ assert.deepStrictEqual(transferPartRange(Number(size), Number(partBytes), 10241), {
46
+ start: Number(size) - 1,
47
+ end: Number(size),
48
+ });
49
+ });
50
+ });
51
+ describe('transfer wire compatibility across protocol versions', () => {
52
+ // The version-1 shapes, as a client and server built before protocol 2 hold them.
53
+ const UploadResponseV1 = VariantType({
54
+ completed: NullType,
55
+ upload: StructType({ id: StringType, uploadUrl: StringType }),
56
+ });
57
+ const DoneResponseV1 = VariantType({
58
+ completed: NullType,
59
+ error: StructType({ message: StringType }),
60
+ });
61
+ it('keeps the init answers a version-1 client decodes', () => {
62
+ const upload = variant('upload', { id: 'abc', uploadUrl: 'http://h/api/uploads/abc' });
63
+ assert.deepStrictEqual(decodeBeast2For(UploadResponseV1)(encodeBeast2For(TransferUploadResponseType)(upload)), upload);
64
+ assert.deepStrictEqual(decodeBeast2For(TransferUploadResponseType)(encodeBeast2For(UploadResponseV1)(upload)), upload);
65
+ const completed = variant('completed', null);
66
+ assert.deepStrictEqual(decodeBeast2For(UploadResponseV1)(encodeBeast2For(TransferUploadResponseType)(completed)), completed);
67
+ });
68
+ it('keeps the commit answers a version-1 client decodes', () => {
69
+ for (const done of [variant('completed', null), variant('error', { message: 'hash mismatch' })]) {
70
+ assert.deepStrictEqual(decodeBeast2For(DoneResponseV1)(encodeBeast2For(TransferDoneResponseType)(done)), done);
71
+ assert.deepStrictEqual(decodeBeast2For(TransferDoneResponseType)(encodeBeast2For(DoneResponseV1)(done)), done);
72
+ }
73
+ });
74
+ });
75
+ //# sourceMappingURL=transfer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.spec.js","sourceRoot":"","sources":["../../src/transfer.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/e3-types",
3
- "version": "1.0.75",
3
+ "version": "1.0.77",
4
4
  "description": "Shared type definitions for e3 (East Execution Engine)",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -18,7 +18,7 @@
18
18
  "directory": "libs/e3/packages/e3-types"
19
19
  },
20
20
  "peerDependencies": {
21
- "@elaraai/east": "1.0.75"
21
+ "@elaraai/east": "1.0.77"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^22.0.0",
package/src/api.ts CHANGED
@@ -69,6 +69,15 @@ export const DataflowErrorType = StructType({ message: StringType });
69
69
  export const PermissionDeniedErrorType = StructType({ path: StringType });
70
70
  export const InternalErrorType = StructType({ message: StringType });
71
71
  export const RepositoryNotFoundErrorType = StructType({ repo: StringType });
72
+ /** A write refused at the door because the bytes' wire type is not the type the
73
+ * dataset declares. `message` is the shared one-line rendering (declared type,
74
+ * given type, first differing field) so a remote `e3 dataset set` prints the
75
+ * line a local one does. */
76
+ export const DatasetTypeMismatchErrorType = StructType({
77
+ workspace: StringType,
78
+ path: StringType,
79
+ message: StringType,
80
+ });
72
81
 
73
82
  export const ErrorType = VariantType({
74
83
  repository_not_found: RepositoryNotFoundErrorType,
@@ -87,6 +96,9 @@ export const ErrorType = VariantType({
87
96
  dataflow_aborted: NullType,
88
97
  permission_denied: PermissionDeniedErrorType,
89
98
  internal: InternalErrorType,
99
+ // Appended last: BEAST2 encodes a variant case by index, so a case added at
100
+ // the end leaves every existing payload decodable.
101
+ dataset_type_mismatch: DatasetTypeMismatchErrorType,
90
102
  });
91
103
 
92
104
  // =============================================================================
@@ -725,6 +737,12 @@ export const DatasetStatusDetailType = StructType({
725
737
  refType: StringType,
726
738
  hash: OptionType(StringType),
727
739
  size: OptionType(IntegerType),
740
+ /** Segment and element counts of a stored collection, read from the blob's
741
+ * trailing index — so a re-pointed input is inspectable without decoding
742
+ * it. `none` for a non-collection or an unset dataset. Appended LAST, per
743
+ * the positional struct rule. */
744
+ segments: OptionType(IntegerType),
745
+ rows: OptionType(IntegerType),
728
746
  });
729
747
 
730
748
  // =============================================================================