@aexhq/sdk 0.52.0 → 0.53.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.
Files changed (37) hide show
  1. package/README.md +99 -41
  2. package/dist/client/aex.d.ts +6 -1
  3. package/dist/client/aex.js +51 -10
  4. package/dist/client/aex.js.map +1 -1
  5. package/dist/client/credentials.d.ts +3 -3
  6. package/dist/client/credentials.js +8 -8
  7. package/dist/client/credentials.js.map +1 -1
  8. package/dist/client/routing.d.ts +1 -1
  9. package/dist/client/routing.js +2 -5
  10. package/dist/client/routing.js.map +1 -1
  11. package/dist/files/workspace-files.d.ts +55 -0
  12. package/dist/files/workspace-files.js +150 -0
  13. package/dist/files/workspace-files.js.map +1 -0
  14. package/dist/generated/errors.js +2 -17
  15. package/dist/generated/errors.js.map +1 -1
  16. package/dist/generated/models.d.ts +248 -796
  17. package/dist/generated/models.js +4 -4
  18. package/dist/generated/models.js.map +1 -1
  19. package/dist/generated/resources.d.ts +72 -519
  20. package/dist/generated/resources.js +49 -428
  21. package/dist/generated/resources.js.map +1 -1
  22. package/dist/generated/routes.d.ts +4 -4
  23. package/dist/generated/routes.js +190 -1600
  24. package/dist/generated/routes.js.map +1 -1
  25. package/dist/index.d.ts +4 -2
  26. package/dist/index.js +2 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/transport/transport.d.ts +9 -1
  29. package/dist/transport/transport.js +79 -1
  30. package/dist/transport/transport.js.map +1 -1
  31. package/package.json +1 -5
  32. package/dist/node/session-file-limits.d.ts +0 -4
  33. package/dist/node/session-file-limits.js +0 -7
  34. package/dist/node/session-file-limits.js.map +0 -1
  35. package/dist/node/session-files.d.ts +0 -80
  36. package/dist/node/session-files.js +0 -254
  37. package/dist/node/session-files.js.map +0 -1
@@ -1,254 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { link, open, rename, unlink } from "node:fs/promises";
3
- import { basename, dirname, join } from "node:path";
4
- import { AexConfigError } from "../transport/errors.js";
5
- import { liveFileSizeIsAdmitted, } from "./session-file-limits.js";
6
- export const LIVE_FILE_PART_BYTES = 4_194_304;
7
- export { MAX_LIVE_FILE_BYTES } from "./session-file-limits.js";
8
- export const DEFAULT_LIVE_FILE_CONCURRENCY = 4;
9
- export const MAX_LIVE_FILE_CONCURRENCY = 8;
10
- /**
11
- * Bounded Node.js convenience flows for generation-local session files.
12
- *
13
- * Public parts are four MiB, but no whole file is buffered: at most
14
- * `concurrency` part buffers exist. Uploads can resume from verified server
15
- * receipts. Downloads remain in an adjacent temporary file until every part,
16
- * the whole digest, and the server's final exact-version re-stat succeed.
17
- */
18
- export class SessionFiles {
19
- #executor;
20
- constructor(executor) {
21
- this.#executor = executor;
22
- }
23
- async uploadFile(options) {
24
- const concurrency = boundedConcurrency(options.concurrency);
25
- const handle = await open(options.sourcePath, "r");
26
- try {
27
- const before = await handle.stat();
28
- if (!before.isFile())
29
- throw new AexConfigError("live upload source must be a regular file");
30
- if (!liveFileSizeIsAdmitted(before.size)) {
31
- throw new AexConfigError("live upload exceeds the five GiB limit");
32
- }
33
- const digest = await hashHandle(handle, before.size);
34
- const replay = options.idempotencyKey ?? `live-file-${randomUUID()}`;
35
- const upload = await this.#executor.execute("session_files_live_upload_create", { sessionId: options.sessionId }, {
36
- body: {
37
- path: options.path,
38
- sizeBytes: String(before.size),
39
- sha256: digest,
40
- mode: options.mode,
41
- ifGenerationId: options.ifGenerationId,
42
- },
43
- idempotencyKey: replayKey("upload-open", replay),
44
- });
45
- validateUpload(upload, options, before.size, digest);
46
- const receipts = new Map(upload.parts.map((part) => [part.partNumber, part]));
47
- await mapBounded(partNumbers(upload.partCount), concurrency, async (partNumber) => {
48
- const offset = (partNumber - 1) * LIVE_FILE_PART_BYTES;
49
- const length = Math.min(LIVE_FILE_PART_BYTES, before.size - offset);
50
- const bytes = await readExact(handle, offset, length);
51
- const sha256 = digestBytes(bytes);
52
- const existing = receipts.get(partNumber);
53
- if (existing) {
54
- if (decimal(existing.offset) !== offset || existing.sizeBytes !== length
55
- || existing.sha256 !== sha256) {
56
- throw new AexConfigError(`live upload part ${partNumber} conflicts with its receipt`);
57
- }
58
- return;
59
- }
60
- const current = await this.#executor.execute("session_files_live_upload_part_put", { sessionId: options.sessionId, fileUploadId: upload.id, partNumber: String(partNumber) }, { query: { sha256 }, body: bytes });
61
- validateUpload(current, options, before.size, digest, upload.id, upload.generationId);
62
- });
63
- const after = await handle.stat();
64
- if (after.size !== before.size || after.mtimeMs !== before.mtimeMs) {
65
- throw new AexConfigError("live upload source changed during transfer");
66
- }
67
- const complete = await this.#executor.execute("session_files_live_upload_complete", { sessionId: options.sessionId, fileUploadId: upload.id }, { idempotencyKey: replayKey("upload-complete", replay) });
68
- validateUpload(complete, options, before.size, digest, upload.id, upload.generationId);
69
- if (complete.state !== "complete" || complete.parts.length !== complete.partCount) {
70
- throw new AexConfigError("live upload completion returned incomplete state");
71
- }
72
- return complete;
73
- }
74
- finally {
75
- await handle.close();
76
- }
77
- }
78
- async downloadFile(options) {
79
- const concurrency = boundedConcurrency(options.concurrency);
80
- const replay = options.idempotencyKey ?? `live-file-${randomUUID()}`;
81
- const descriptor = await this.#executor.execute("session_files_live_download_create", { sessionId: options.sessionId }, {
82
- body: { path: options.path, ifGenerationId: options.ifGenerationId },
83
- idempotencyKey: replayKey("download-open", replay),
84
- });
85
- const size = validateDownload(descriptor, options);
86
- const temporary = join(dirname(options.destinationPath), `.${basename(options.destinationPath)}.aex-${randomUUID()}.part`);
87
- let handle;
88
- let published = false;
89
- try {
90
- handle = await open(temporary, "wx+");
91
- await handle.truncate(size);
92
- await mapBounded(descriptor.parts, concurrency, async (part) => {
93
- const bytes = await this.#executor.execute("session_files_live_download_part_get", {
94
- sessionId: options.sessionId,
95
- fileDownloadId: descriptor.id,
96
- partNumber: String(part.partNumber),
97
- }, { query: { version: descriptor.version } });
98
- if (!(bytes instanceof Uint8Array) || bytes.byteLength !== part.sizeBytes
99
- || digestBytes(bytes) !== part.sha256) {
100
- throw new AexConfigError(`live download part ${part.partNumber} failed integrity`);
101
- }
102
- await writeExact(handle, bytes, decimal(part.offset));
103
- });
104
- await handle.sync();
105
- const actual = await hashHandle(handle, size);
106
- if (actual !== descriptor.sha256) {
107
- throw new AexConfigError("live download whole-file digest mismatch");
108
- }
109
- const verified = await this.#executor.execute("session_files_live_download_complete", { sessionId: options.sessionId, fileDownloadId: descriptor.id }, {
110
- body: { version: descriptor.version, sha256: actual },
111
- idempotencyKey: replayKey("download-complete", replay),
112
- });
113
- validateVerifiedDownload(verified, descriptor);
114
- await handle.close();
115
- handle = undefined;
116
- if (options.replace) {
117
- await rename(temporary, options.destinationPath);
118
- }
119
- else {
120
- await link(temporary, options.destinationPath);
121
- await unlink(temporary);
122
- }
123
- published = true;
124
- return verified;
125
- }
126
- finally {
127
- if (handle)
128
- await handle.close().catch(() => undefined);
129
- if (!published)
130
- await unlink(temporary).catch(() => undefined);
131
- if (!published) {
132
- await this.#executor.execute("session_files_live_download_delete", { sessionId: options.sessionId, fileDownloadId: descriptor.id }).catch(() => undefined);
133
- }
134
- }
135
- }
136
- }
137
- function boundedConcurrency(value = DEFAULT_LIVE_FILE_CONCURRENCY) {
138
- if (!Number.isInteger(value) || value < 1 || value > MAX_LIVE_FILE_CONCURRENCY) {
139
- throw new AexConfigError(`live-file concurrency must be 1..${MAX_LIVE_FILE_CONCURRENCY}`);
140
- }
141
- return value;
142
- }
143
- function replayKey(phase, seed) {
144
- return createHash("sha256").update(`aex.live-file.${phase}.v1\0${seed}`).digest("hex");
145
- }
146
- function digestBytes(bytes) {
147
- return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
148
- }
149
- async function hashHandle(handle, size) {
150
- const digest = createHash("sha256");
151
- const buffer = Buffer.allocUnsafe(Math.min(1_048_576, Math.max(size, 1)));
152
- let offset = 0;
153
- while (offset < size) {
154
- const length = Math.min(buffer.byteLength, size - offset);
155
- const { bytesRead } = await handle.read(buffer, 0, length, offset);
156
- if (bytesRead !== length)
157
- throw new AexConfigError("file changed or ended during transfer");
158
- digest.update(buffer.subarray(0, bytesRead));
159
- offset += bytesRead;
160
- }
161
- return `sha256:${digest.digest("hex")}`;
162
- }
163
- async function readExact(handle, offset, length) {
164
- const buffer = Buffer.allocUnsafe(length);
165
- let read = 0;
166
- while (read < length) {
167
- const result = await handle.read(buffer, read, length - read, offset + read);
168
- if (result.bytesRead === 0)
169
- throw new AexConfigError("file changed or ended during transfer");
170
- read += result.bytesRead;
171
- }
172
- return buffer;
173
- }
174
- async function writeExact(handle, bytes, offset) {
175
- let written = 0;
176
- while (written < bytes.byteLength) {
177
- const result = await handle.write(bytes, written, bytes.byteLength - written, offset + written);
178
- if (result.bytesWritten === 0)
179
- throw new AexConfigError("temporary download write made no progress");
180
- written += result.bytesWritten;
181
- }
182
- }
183
- function partNumbers(count) {
184
- return Array.from({ length: count }, (_, index) => index + 1);
185
- }
186
- async function mapBounded(values, concurrency, task) {
187
- let next = 0;
188
- await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, async () => {
189
- while (true) {
190
- const index = next++;
191
- if (index >= values.length)
192
- return;
193
- await task(values[index]);
194
- }
195
- }));
196
- }
197
- function decimal(value) {
198
- if (!/^(0|[1-9][0-9]*)$/.test(value))
199
- throw new AexConfigError("invalid canonical decimal");
200
- const parsed = Number(value);
201
- if (!Number.isSafeInteger(parsed))
202
- throw new AexConfigError("decimal exceeds SDK precision");
203
- return parsed;
204
- }
205
- function validateUpload(upload, options, size, sha256, id, generation) {
206
- if (upload.sessionId !== options.sessionId || upload.path !== options.path
207
- || decimal(upload.sizeBytes) !== size || upload.sha256 !== sha256
208
- || upload.partSizeBytes !== LIVE_FILE_PART_BYTES
209
- || upload.partCount !== Math.ceil(size / LIVE_FILE_PART_BYTES)
210
- || (id !== undefined && upload.id !== id)
211
- || (generation !== undefined && upload.generationId !== generation)) {
212
- throw new AexConfigError("live upload response does not match the requested transfer");
213
- }
214
- validateParts(upload.parts, size, upload.partCount);
215
- }
216
- function validateDownload(download, options) {
217
- const size = decimal(download.sizeBytes);
218
- if (download.sessionId !== options.sessionId || download.path !== options.path
219
- || download.state !== "open" || !liveFileSizeIsAdmitted(size)
220
- || download.partSizeBytes !== LIVE_FILE_PART_BYTES
221
- || download.partCount !== Math.ceil(size / LIVE_FILE_PART_BYTES)) {
222
- throw new AexConfigError("invalid live download descriptor");
223
- }
224
- validateParts(download.parts, size, download.partCount);
225
- if (download.parts.length !== download.partCount) {
226
- throw new AexConfigError("live download descriptor omits parts");
227
- }
228
- return size;
229
- }
230
- function validateParts(parts, size, count) {
231
- let previous = 0;
232
- const seen = new Set();
233
- for (const part of parts) {
234
- const offset = decimal(part.offset);
235
- const expectedSize = Math.min(LIVE_FILE_PART_BYTES, size - offset);
236
- if (!Number.isInteger(part.partNumber) || part.partNumber <= previous || part.partNumber > count
237
- || seen.has(part.partNumber) || offset !== (part.partNumber - 1) * LIVE_FILE_PART_BYTES
238
- || part.sizeBytes !== expectedSize || part.sizeBytes < 1
239
- || !/^sha256:[0-9a-f]{64}$/.test(part.sha256)) {
240
- throw new AexConfigError("invalid live-file part descriptor");
241
- }
242
- seen.add(part.partNumber);
243
- previous = part.partNumber;
244
- }
245
- }
246
- function validateVerifiedDownload(verified, opened) {
247
- if (verified.state !== "verified" || verified.id !== opened.id
248
- || verified.sessionId !== opened.sessionId || verified.generationId !== opened.generationId
249
- || verified.path !== opened.path || verified.sizeBytes !== opened.sizeBytes
250
- || verified.sha256 !== opened.sha256 || verified.version !== opened.version) {
251
- throw new AexConfigError("live download verification changed its descriptor");
252
- }
253
- }
254
- //# sourceMappingURL=session-files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-files.js","sourceRoot":"","sources":["../../src/node/session-files.ts"],"names":[],"mappings":"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"}