@teepin/sdk 0.2.1 → 0.3.0-rc.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.
Files changed (134) hide show
  1. package/README.md +41 -36
  2. package/dist/cjs/client.js +42 -4
  3. package/dist/cjs/client.js.map +1 -1
  4. package/dist/cjs/direct/bytes.js +50 -0
  5. package/dist/cjs/direct/bytes.js.map +1 -0
  6. package/dist/cjs/direct/common.js +167 -0
  7. package/dist/cjs/direct/common.js.map +1 -0
  8. package/dist/cjs/direct/downloads-plan.js +127 -0
  9. package/dist/cjs/direct/downloads-plan.js.map +1 -0
  10. package/dist/cjs/direct/engine.js +405 -0
  11. package/dist/cjs/direct/engine.js.map +1 -0
  12. package/dist/cjs/direct/formats.js +44 -0
  13. package/dist/cjs/direct/formats.js.map +1 -0
  14. package/dist/cjs/direct/hpke.js +275 -0
  15. package/dist/cjs/direct/hpke.js.map +1 -0
  16. package/dist/cjs/direct/journal.js +80 -0
  17. package/dist/cjs/direct/journal.js.map +1 -0
  18. package/dist/cjs/direct/large.js +850 -0
  19. package/dist/cjs/direct/large.js.map +1 -0
  20. package/dist/cjs/direct/reads.js +1314 -0
  21. package/dist/cjs/direct/reads.js.map +1 -0
  22. package/dist/cjs/direct/sha256.js +122 -0
  23. package/dist/cjs/direct/sha256.js.map +1 -0
  24. package/dist/cjs/direct/tws1.js +480 -0
  25. package/dist/cjs/direct/tws1.js.map +1 -0
  26. package/dist/cjs/direct/uploads.js +1706 -0
  27. package/dist/cjs/direct/uploads.js.map +1 -0
  28. package/dist/cjs/errors.js +70 -13
  29. package/dist/cjs/errors.js.map +1 -1
  30. package/dist/cjs/index.js +5 -1
  31. package/dist/cjs/index.js.map +1 -1
  32. package/dist/cjs/links.js +195 -0
  33. package/dist/cjs/links.js.map +1 -0
  34. package/dist/cjs/node/downloads.js +835 -0
  35. package/dist/cjs/node/downloads.js.map +1 -0
  36. package/dist/cjs/node/journal.js +841 -0
  37. package/dist/cjs/node/journal.js.map +1 -0
  38. package/dist/cjs/node/uploads.js +219 -0
  39. package/dist/cjs/node/uploads.js.map +1 -0
  40. package/dist/cjs/node.js +26 -39
  41. package/dist/cjs/node.js.map +1 -1
  42. package/dist/cjs/storage.js +214 -184
  43. package/dist/cjs/storage.js.map +1 -1
  44. package/dist/cjs/transfer.js +18 -351
  45. package/dist/cjs/transfer.js.map +1 -1
  46. package/dist/esm/client.js +42 -4
  47. package/dist/esm/client.js.map +1 -1
  48. package/dist/esm/direct/bytes.js +42 -0
  49. package/dist/esm/direct/bytes.js.map +1 -0
  50. package/dist/esm/direct/common.js +155 -0
  51. package/dist/esm/direct/common.js.map +1 -0
  52. package/dist/esm/direct/downloads-plan.js +117 -0
  53. package/dist/esm/direct/downloads-plan.js.map +1 -0
  54. package/dist/esm/direct/engine.js +385 -0
  55. package/dist/esm/direct/engine.js.map +1 -0
  56. package/dist/esm/direct/formats.js +40 -0
  57. package/dist/esm/direct/formats.js.map +1 -0
  58. package/dist/esm/direct/hpke.js +262 -0
  59. package/dist/esm/direct/hpke.js.map +1 -0
  60. package/dist/esm/direct/journal.js +75 -0
  61. package/dist/esm/direct/journal.js.map +1 -0
  62. package/dist/esm/direct/large.js +816 -0
  63. package/dist/esm/direct/large.js.map +1 -0
  64. package/dist/esm/direct/reads.js +1275 -0
  65. package/dist/esm/direct/reads.js.map +1 -0
  66. package/dist/esm/direct/sha256.js +118 -0
  67. package/dist/esm/direct/sha256.js.map +1 -0
  68. package/dist/esm/direct/tws1.js +460 -0
  69. package/dist/esm/direct/tws1.js.map +1 -0
  70. package/dist/esm/direct/uploads.js +1660 -0
  71. package/dist/esm/direct/uploads.js.map +1 -0
  72. package/dist/esm/errors.js +64 -11
  73. package/dist/esm/errors.js.map +1 -1
  74. package/dist/esm/index.js +1 -0
  75. package/dist/esm/index.js.map +1 -1
  76. package/dist/esm/links.js +189 -0
  77. package/dist/esm/links.js.map +1 -0
  78. package/dist/esm/node/downloads.js +829 -0
  79. package/dist/esm/node/downloads.js.map +1 -0
  80. package/dist/esm/node/journal.js +824 -0
  81. package/dist/esm/node/journal.js.map +1 -0
  82. package/dist/esm/node/uploads.js +187 -0
  83. package/dist/esm/node/uploads.js.map +1 -0
  84. package/dist/esm/node.js +17 -14
  85. package/dist/esm/node.js.map +1 -1
  86. package/dist/esm/storage.js +214 -184
  87. package/dist/esm/storage.js.map +1 -1
  88. package/dist/esm/transfer.js +19 -349
  89. package/dist/esm/transfer.js.map +1 -1
  90. package/dist/types/client.d.ts +45 -4
  91. package/dist/types/client.d.ts.map +1 -1
  92. package/dist/types/direct/bytes.d.ts +11 -0
  93. package/dist/types/direct/bytes.d.ts.map +1 -0
  94. package/dist/types/direct/common.d.ts +47 -0
  95. package/dist/types/direct/common.d.ts.map +1 -0
  96. package/dist/types/direct/downloads-plan.d.ts +75 -0
  97. package/dist/types/direct/downloads-plan.d.ts.map +1 -0
  98. package/dist/types/direct/engine.d.ts +191 -0
  99. package/dist/types/direct/engine.d.ts.map +1 -0
  100. package/dist/types/direct/formats.d.ts +9 -0
  101. package/dist/types/direct/formats.d.ts.map +1 -0
  102. package/dist/types/direct/hpke.d.ts +55 -0
  103. package/dist/types/direct/hpke.d.ts.map +1 -0
  104. package/dist/types/direct/journal.d.ts +55 -0
  105. package/dist/types/direct/journal.d.ts.map +1 -0
  106. package/dist/types/direct/large.d.ts +170 -0
  107. package/dist/types/direct/large.d.ts.map +1 -0
  108. package/dist/types/direct/reads.d.ts +306 -0
  109. package/dist/types/direct/reads.d.ts.map +1 -0
  110. package/dist/types/direct/sha256.d.ts +16 -0
  111. package/dist/types/direct/sha256.d.ts.map +1 -0
  112. package/dist/types/direct/tws1.d.ts +157 -0
  113. package/dist/types/direct/tws1.d.ts.map +1 -0
  114. package/dist/types/direct/uploads.d.ts +461 -0
  115. package/dist/types/direct/uploads.d.ts.map +1 -0
  116. package/dist/types/errors.d.ts +47 -8
  117. package/dist/types/errors.d.ts.map +1 -1
  118. package/dist/types/index.d.ts +1 -0
  119. package/dist/types/index.d.ts.map +1 -1
  120. package/dist/types/links.d.ts +86 -0
  121. package/dist/types/links.d.ts.map +1 -0
  122. package/dist/types/node/downloads.d.ts +73 -0
  123. package/dist/types/node/downloads.d.ts.map +1 -0
  124. package/dist/types/node/journal.d.ts +162 -0
  125. package/dist/types/node/journal.d.ts.map +1 -0
  126. package/dist/types/node/uploads.d.ts +86 -0
  127. package/dist/types/node/uploads.d.ts.map +1 -0
  128. package/dist/types/node.d.ts +4 -2
  129. package/dist/types/node.d.ts.map +1 -1
  130. package/dist/types/storage.d.ts +107 -64
  131. package/dist/types/storage.d.ts.map +1 -1
  132. package/dist/types/transfer.d.ts +14 -23
  133. package/dist/types/transfer.d.ts.map +1 -1
  134. package/package.json +2 -2
package/README.md CHANGED
@@ -31,8 +31,7 @@ const teepin = new TeepinClient(); // reads TEEPIN_API_KEY and TEEPIN_BASE_URL
31
31
  // or: new TeepinClient({ apiKey: 'tpk_...' })
32
32
  ```
33
33
 
34
- Keep your API key on your server. To let a browser download or upload one file, sign a link on your server (see
35
- [Signed links](#signed-links)).
34
+ Keep your API key on your server.
36
35
 
37
36
  ## Teepin Inference
38
37
 
@@ -142,8 +141,9 @@ This SDK adds the attestation results, billing-safe retries and Teepin's typed e
142
141
 
143
142
  ## Teepin Storage
144
143
 
145
- Buckets and files, with large uploads in parallel parts. The key needs `storage:read` to read and `storage:write`
146
- to write.
144
+ Buckets and files. Files are encrypted on this device and sent straight to the storage network, and every byte read
145
+ is verified on this device before it is used: no file byte passes through Teepin's API. The key needs `storage:read`
146
+ to read and `storage:write` to write.
147
147
 
148
148
  ### Buckets
149
149
 
@@ -167,20 +167,29 @@ const info = await teepin.storage.statObject('my-bucket', 'notes.txt'); // size,
167
167
 
168
168
  ### Large files
169
169
 
170
- Files on disk use `@teepin/sdk/node`. An upload of any size goes in one request up to 16 MiB, and in parallel
171
- parts above that. Each part is retried on its own and checked against the bytes sent. `resume` continues an upload
172
- that was cut off. A download fetches ranges in parallel and checks the SHA-256.
170
+ Files on disk use `@teepin/sdk/node`. Files up to 16 MiB are packed together, and larger ones go in parallel
171
+ parts, each retried on its own. A large file's upload is journaled on disk, so `resumeUploads` finishes it after a
172
+ crash or a lost connection; `uploadFiles` uploads many files as one such run. A download fetches ranges in parallel
173
+ and checks the SHA-256.
173
174
 
174
175
  ```typescript
175
- import { uploadFile, downloadFile } from '@teepin/sdk/node';
176
+ import { uploadFile, downloadFile, resumeUploads } from '@teepin/sdk/node';
176
177
 
177
178
  await uploadFile(teepin.storage, 'my-bucket', 'videos/a.mp4', './a.mp4', {
178
- resume: true,
179
179
  onProgress: (done, total) => console.log(`${done} of ${total}`),
180
180
  });
181
181
  await downloadFile(teepin.storage, 'my-bucket', 'videos/a.mp4', './copy.mp4');
182
+
183
+ await resumeUploads(teepin.storage); // finishes what an earlier process left unfinished
182
184
  ```
183
185
 
186
+ On a slow connection, uploads use smaller requests. The client measures how fast its uploads to storage go (a request
187
+ that gets no answer in time counts too, so a slow connection is noticed from the first requests), and when a request
188
+ would take more than about 4 minutes, packs shrink below 9 MiB, an object too large for one such request (over 5 MiB)
189
+ goes in parts instead of a pack, and new uploads use smaller parts (down to 5 MiB, the smallest allowed). A file that
190
+ still can't be sent, because even 5 MiB parts would be too slow or it would need more than 3,000 parts, throws
191
+ `TooLargeError` with `reason` `"connection_speed"` before anything is sent.
192
+
184
193
  ### List
185
194
 
186
195
  ```typescript
@@ -191,42 +200,35 @@ for await (const obj of teepin.storage.objects('my-bucket', 'videos/')) console.
191
200
  const page = await teepin.storage.listObjects('my-bucket', { prefix: 'videos/', delimiter: '/' });
192
201
  ```
193
202
 
194
- ### Signed links
195
-
196
- Links that work without your key, for a limited time:
197
-
198
- ```typescript
199
- const link = await teepin.storage.presignDownload('my-bucket', 'videos/a.mp4', { expiresIn: 3600 });
200
- console.log(link.url);
201
-
202
- const up = await teepin.storage.presignUpload('my-bucket', 'inbox/upload.bin', { maxBytes: 100 * 2 ** 20 });
203
- // In the browser: one PUT to the link your server signed.
204
- await fetch(up.url, { method: up.method, headers: up.headers, body: file });
205
- ```
206
-
207
203
  ### Rename, copy and delete
208
204
 
209
205
  ```typescript
210
206
  await teepin.storage.renameObject('my-bucket', 'videos/a.mp4', 'archive/a.mp4'); // instant at any size
211
- await teepin.storage.copyObject('backup', 'a.mp4', 'my-bucket', 'archive/a.mp4'); // to backup/a.mp4, from my-bucket
207
+ await teepin.storage.copyObject('backup', 'a.mp4', 'my-bucket', 'archive/a.mp4'); // read and uploaded again, to backup/a.mp4
212
208
  await teepin.storage.deleteObject('my-bucket', 'notes.txt');
209
+ await teepin.storage.deleteObject('my-bucket', 'notes.txt', { ifMatch: etag }); // only if it still has statObject's etag, else PreconditionFailedError
213
210
  await teepin.storage.deleteObjects('my-bucket', ['a.txt', 'b.txt']); // up to 1000 a request
214
211
  ```
215
212
 
216
- ### The S3 endpoint
213
+ ### Share links
217
214
 
218
- Teepin Storage also speaks S3 at `https://s3.teepin.com`, so the AWS CLI, boto3, the AWS SDKs and rclone work
219
- unchanged. Create an S3 access key in the console (a project's Settings, then S3 access keys). The region is
220
- `teepin`.
215
+ A share link is a page on the console that anyone holding it can open with no sign-in, to preview or save one
216
+ object, for up to 24 hours (15 minutes by default). It needs `storage:read`. Its token is sealed, so the link names
217
+ no bucket or key, and rides in the URL's fragment (`https://console.teepin.com/l#…`). `openLink` opens one in code,
218
+ with no API key: the bytes come straight from the storage network and are verified on this device. A download that
219
+ began while the link was valid may finish after it expires, for up to 24 hours more.
221
220
 
222
- ```bash
223
- aws configure set aws_access_key_id TPAK... --profile teepin
224
- aws configure set aws_secret_access_key ... --profile teepin
225
- aws configure set region teepin --profile teepin
226
- aws --profile teepin --endpoint-url https://s3.teepin.com s3 ls
227
- ```
221
+ ```typescript
222
+ import { openLink } from '@teepin/sdk';
223
+
224
+ const link = await teepin.storage.createLink('my-bucket', 'reports/q3.pdf', { expiresIn: 3600 });
225
+ console.log(link.url, link.expiresAt);
228
226
 
229
- The buckets are the same ones this SDK and the console show.
227
+ const shared = await openLink(link.url); // InvalidLinkError once it has expired
228
+ console.log(shared.name, shared.size, shared.contentType);
229
+ const body = shared.stream(); // or shared.read(offset, length), or shared.downloadTo(sink)
230
+ shared.close();
231
+ ```
230
232
 
231
233
  ## Errors
232
234
 
@@ -234,10 +236,13 @@ Errors from the API are `APIError` subclasses with the API's stable `code`, `sta
234
236
  `requestId` (for support):
235
237
 
236
238
  - `UnauthorizedError` (401), `PaymentRequiredError` (402), `ForbiddenError` (403), `NotFoundError` (404),
237
- `ConflictError` (409), `PreconditionFailedError` (412), `TooLargeError` (413), `RateLimitError` (429);
239
+ `ConflictError` (409), `PreconditionFailedError` (412), `TooLargeError` (413; `reason` is `"connection_speed"`
240
+ when the connection measured too slow to send a file), `RateLimitError` (429);
238
241
  - `ConnectionError` when the server couldn't be reached;
239
242
  - `StreamError` and `StreamEndedError` for inference streams;
240
- - `ChecksumMismatchError`, `ObjectChangedError` and `UploadError` (with `uploadId`, for resuming) for storage.
243
+ - `DataIntegrityError` (with `ChecksumMismatchError` under it), `ObjectChangedError`, `KeyErasedError`,
244
+ `StorageUnavailableError` and `FileChangedError` for storage, and `InvalidLinkError` (a `ForbiddenError`) for a
245
+ share link that is damaged or has expired.
241
246
 
242
247
  Helpers: `isNotFoundError`, `isRateLimitError`, `isInsufficientCreditError`, `isPermissionError` and
243
248
  `isRetryable`. Storage calls that fail for a passing reason are retried with backoff, up to `maxRetries` times
@@ -3,12 +3,13 @@
3
3
  // Licensed under the Apache License, Version 2.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.backoff = exports.certainlyUnsent = exports.TeepinClient = exports.DEFAULT_BASE_URL = exports.VERSION = void 0;
6
+ const engine_js_1 = require("./direct/engine.js");
6
7
  const errors_js_1 = require("./errors.js");
7
8
  const inference_js_1 = require("./inference.js");
8
9
  const instances_js_1 = require("./instances.js");
9
10
  const storage_js_1 = require("./storage.js");
10
11
  /** This SDK's version, sent in the User-Agent where the runtime allows it. */
11
- exports.VERSION = '0.2.1';
12
+ exports.VERSION = '0.3.0-rc.1';
12
13
  /** The public API. */
13
14
  exports.DEFAULT_BASE_URL = 'https://api.teepin.com';
14
15
  /** An environment variable, where there is an environment (Node, Deno, Bun;
@@ -37,8 +38,17 @@ class TeepinClient {
37
38
  inference;
38
39
  apiKey;
39
40
  projectId;
41
+ /** Milliseconds one call that is not a transfer may take; also how long a storage read waits for its next bytes. */
40
42
  timeout;
41
43
  maxRetries;
44
+ /** Milliseconds a read keeps a data key (ClientConfig.keyCacheTtl); 0 keeps none. */
45
+ keyCacheTtl;
46
+ /** Milliseconds an upload waits for storage to come back (ClientConfig.uploadWait); 0 fails at once. */
47
+ uploadWait;
48
+ /** The most packs or parts in flight at once (ClientConfig.uploadConcurrency). */
49
+ uploadConcurrency;
50
+ /** Where upload runs keep their journals (ClientConfig.stateDir); undefined for the default. */
51
+ stateDir;
42
52
  fetchImpl;
43
53
  /** Waits between retries; replaced in tests. */
44
54
  sleep = sleep;
@@ -48,6 +58,12 @@ class TeepinClient {
48
58
  this.projectId = config.projectId;
49
59
  this.timeout = config.timeout ?? 60000;
50
60
  this.maxRetries = Math.max(0, config.maxRetries ?? 4);
61
+ // 0 turns the cache off (every read fetches its key); undefined is the default. NaN keeps none.
62
+ this.keyCacheTtl = config.keyCacheTtl === undefined ? 600000 : Math.max(0, config.keyCacheTtl) || 0;
63
+ // 0 is a real choice (don't wait out an outage); only undefined takes the environment's or the default. NaN is 0.
64
+ this.uploadWait = config.uploadWait === undefined ? (0, engine_js_1.envNumber)(engine_js_1.UPLOAD_WAIT_ENV, engine_js_1.DEFAULT_UPLOAD_WAIT_MS / 1000) * 1000 : Math.max(0, config.uploadWait) || 0;
65
+ this.uploadConcurrency = Math.max(1, Math.floor(config.uploadConcurrency || (0, engine_js_1.envNumber)(engine_js_1.CONCURRENCY_ENV, engine_js_1.MAX_CONCURRENCY)));
66
+ this.stateDir = config.stateDir || undefined;
51
67
  const f = config.fetch ?? globalThis.fetch;
52
68
  if (!f)
53
69
  throw new errors_js_1.TeepinError('no fetch: use Node 20 or later, or pass config.fetch');
@@ -87,9 +103,28 @@ class TeepinClient {
87
103
  const mode = method === 'GET' || method === 'DELETE' ? 'safe' : 'unsent';
88
104
  return (await this.call({ method, path, json, mode })).data;
89
105
  }
90
- /** An API path as an absolute URL. */
91
- absolute(path) {
92
- return /^https?:\/\//.test(path) ? path : this.baseUrl + path;
106
+ /**
107
+ * Sends a request the control plane signed for the storage network, once: without the API key, and with no retries
108
+ * (the direct engine decides). Resolves once the answer's headers are in, its body then bounded by signal; throws
109
+ * ConnectionError when no answer came (an abort throws the signal's reason) and APIError for an error answer.
110
+ */
111
+ async sendSigned(req) {
112
+ let response;
113
+ try {
114
+ response = await this.fetchImpl(req.url, { method: req.method, headers: req.headers, body: req.body, signal: req.signal });
115
+ }
116
+ catch (err) {
117
+ if (req.signal?.aborted)
118
+ throw req.signal.reason ?? err;
119
+ throw new errors_js_1.ConnectionError(`${req.method} to the storage network: ${err instanceof Error ? err.message : String(err)}`, err);
120
+ }
121
+ if (response.status >= 400)
122
+ throw await decodeError(response);
123
+ return response;
124
+ }
125
+ /** Zeroes the data keys storage reads keep in memory. The client still works: later reads fetch their keys again. */
126
+ close() {
127
+ this.storage.close();
93
128
  }
94
129
  async sendOnce(req, payload) {
95
130
  let url = this.baseUrl + req.path;
@@ -154,6 +189,7 @@ async function decodeError(response) {
154
189
  let code;
155
190
  let type;
156
191
  let deleteAfter;
192
+ let details;
157
193
  const text = await response.text().catch(() => '');
158
194
  try {
159
195
  const body = JSON.parse(text);
@@ -168,6 +204,7 @@ async function decodeError(response) {
168
204
  code = body.code;
169
205
  if (body.delete_after)
170
206
  deleteAfter = new Date(body.delete_after);
207
+ details = body;
171
208
  }
172
209
  }
173
210
  catch {
@@ -182,6 +219,7 @@ async function decodeError(response) {
182
219
  requestId: response.headers.get('X-Request-ID') ?? undefined,
183
220
  retryAfterMs: retry > 0 ? retry * 1000 : undefined,
184
221
  deleteAfter,
222
+ details,
185
223
  });
186
224
  }
187
225
  /** Teepin's own answers that say a billed call was refused before it ran, by status. */
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ // Copyright 2026 TEEPIN Project
3
+ // Licensed under the Apache License, Version 2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.isInt = exports.fromBase64 = exports.utf8 = exports.constantTimeEqual = exports.concat = void 0;
6
+ // Byte helpers the direct-storage formats share.
7
+ /** The bytes of parts, joined into one new array. */
8
+ function concat(parts) {
9
+ let n = 0;
10
+ for (const p of parts)
11
+ n += p.length;
12
+ const out = new Uint8Array(n);
13
+ let off = 0;
14
+ for (const p of parts) {
15
+ out.set(p, off);
16
+ off += p.length;
17
+ }
18
+ return out;
19
+ }
20
+ exports.concat = concat;
21
+ /** Whether a and b hold the same bytes, in time that depends only on their lengths. */
22
+ function constantTimeEqual(a, b) {
23
+ if (a.length !== b.length)
24
+ return false;
25
+ let d = 0;
26
+ for (let i = 0; i < a.length; i++)
27
+ d |= a[i] ^ b[i];
28
+ return d === 0;
29
+ }
30
+ exports.constantTimeEqual = constantTimeEqual;
31
+ /** A string's UTF-8 bytes. */
32
+ function utf8(s) {
33
+ return new TextEncoder().encode(s);
34
+ }
35
+ exports.utf8 = utf8;
36
+ /** The bytes of a base64 string (atob is in Node 16+ and every browser). */
37
+ function fromBase64(s) {
38
+ const bin = atob(s);
39
+ const out = new Uint8Array(bin.length);
40
+ for (let i = 0; i < bin.length; i++)
41
+ out[i] = bin.charCodeAt(i);
42
+ return out;
43
+ }
44
+ exports.fromBase64 = fromBase64;
45
+ /** Whether n is a whole number JavaScript holds exactly. */
46
+ function isInt(n) {
47
+ return Number.isSafeInteger(n);
48
+ }
49
+ exports.isInt = isInt;
50
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../../src/direct/bytes.ts"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,iDAAiD;;;AAEjD,iDAAiD;AAEjD,qDAAqD;AACrD,SAAgB,MAAM,CAAC,KAAmB;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QACrB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChB,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;KACjB;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAVD,wBAUC;AAED,uFAAuF;AACvF,SAAgB,iBAAiB,CAAC,CAAa,EAAE,CAAa;IAC5D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AALD,8CAKC;AAED,8BAA8B;AAC9B,SAAgB,IAAI,CAAC,CAAS;IAC5B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAFD,oBAEC;AAED,4EAA4E;AAC5E,SAAgB,UAAU,CAAC,CAAS;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC;AALD,gCAKC;AAED,4DAA4D;AAC5D,SAAgB,KAAK,CAAC,CAAS;IAC7B,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAFD,sBAEC"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ // Copyright 2026 TEEPIN Project
3
+ // Licensed under the Apache License, Version 2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.Slots = exports.Progress = exports.joinCapped = exports.linked = exports.abortable = exports.Deferred = exports.objectFrom = exports.uuid7 = exports.toBase64 = void 0;
6
+ const str = (v) => (v === undefined || v === null ? '' : String(v));
7
+ const unquote = (etag) => etag.trim().replace(/^W\//, '').replace(/^"|"$/g, '');
8
+ const hex = (b) => Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');
9
+ /** base64 of bytes (btoa is in Node 16+ and every browser). */
10
+ function toBase64(b) {
11
+ let s = '';
12
+ for (let i = 0; i < b.length; i += 0x8000)
13
+ s += String.fromCharCode(...b.subarray(i, i + 0x8000));
14
+ return btoa(s);
15
+ }
16
+ exports.toBase64 = toBase64;
17
+ /** A UUIDv7 (RFC 9562): a millisecond timestamp, then random bits, so ids sort by time. */
18
+ function uuid7() {
19
+ const b = crypto.getRandomValues(new Uint8Array(16));
20
+ let ms = Date.now();
21
+ for (let i = 5; i >= 0; i--) {
22
+ b[i] = ms % 256;
23
+ ms = Math.floor(ms / 256);
24
+ }
25
+ b[6] = (b[6] & 0x0f) | 0x70;
26
+ b[8] = (b[8] & 0x3f) | 0x80;
27
+ const h = hex(b);
28
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
29
+ }
30
+ exports.uuid7 = uuid7;
31
+ /** An object from the API's JSON. */
32
+ function objectFrom(raw) {
33
+ const d = (raw ?? {});
34
+ const date = (v) => new Date(str(v) || NaN);
35
+ return {
36
+ id: str(d.id),
37
+ key: str(d.key),
38
+ size: Number(d.size_bytes ?? 0),
39
+ contentType: d.content_type || undefined,
40
+ metadata: d.metadata,
41
+ checksumSha256: d.checksum_sha256 || undefined,
42
+ etag: unquote(str(d.etag)),
43
+ partCount: Number(d.part_count ?? 0),
44
+ status: str(d.status),
45
+ backend: str(d.backend),
46
+ createdAt: date(d.created_at),
47
+ updatedAt: date(d.updated_at),
48
+ uploadedAt: d.uploaded_at ? date(d.uploaded_at) : undefined,
49
+ };
50
+ }
51
+ exports.objectFrom = objectFrom;
52
+ /** A promise with its resolve at hand. */
53
+ class Deferred {
54
+ promise;
55
+ resolve;
56
+ settled = false;
57
+ constructor() {
58
+ this.promise = new Promise((resolve) => {
59
+ this.resolve = () => {
60
+ this.settled = true;
61
+ resolve();
62
+ };
63
+ });
64
+ }
65
+ }
66
+ exports.Deferred = Deferred;
67
+ /** Resolves when p does, or rejects with signal's reason when it aborts first. */
68
+ function abortable(p, signal) {
69
+ if (!signal)
70
+ return p;
71
+ if (signal.aborted) {
72
+ p.catch(() => undefined);
73
+ return Promise.reject(signal.reason);
74
+ }
75
+ return new Promise((resolve, reject) => {
76
+ const onAbort = () => reject(signal.reason);
77
+ signal.addEventListener('abort', onAbort, { once: true });
78
+ p.then((v) => {
79
+ signal.removeEventListener('abort', onAbort);
80
+ resolve(v);
81
+ }, (err) => {
82
+ signal.removeEventListener('abort', onAbort);
83
+ reject(err);
84
+ });
85
+ });
86
+ }
87
+ exports.abortable = abortable;
88
+ /** A controller that aborts with parent's reason, and a function that unlinks it once it is no longer needed. */
89
+ function linked(parent) {
90
+ const ctl = new AbortController();
91
+ if (!parent)
92
+ return { ctl, unlink: () => { } };
93
+ if (parent.aborted) {
94
+ ctl.abort(parent.reason);
95
+ return { ctl, unlink: () => { } };
96
+ }
97
+ const onAbort = () => ctl.abort(parent.reason);
98
+ parent.addEventListener('abort', onAbort, { once: true });
99
+ return { ctl, unlink: () => parent.removeEventListener('abort', onAbort) };
100
+ }
101
+ exports.linked = linked;
102
+ /** Waits for every task to end, at most ms; whether they all did. Tasks never reject here (callers catch their own). */
103
+ async function joinCapped(tasks, ms) {
104
+ let timer;
105
+ const capped = new Promise((resolve) => {
106
+ timer = setTimeout(() => resolve(false), ms);
107
+ });
108
+ try {
109
+ return await Promise.race([Promise.allSettled(tasks).then(() => true), capped]);
110
+ }
111
+ finally {
112
+ clearTimeout(timer);
113
+ }
114
+ }
115
+ exports.joinCapped = joinCapped;
116
+ /** Bytes done of a total, reported as they go. */
117
+ class Progress {
118
+ total;
119
+ fn;
120
+ done = 0;
121
+ constructor(total, fn) {
122
+ this.total = total;
123
+ this.fn = fn;
124
+ }
125
+ add(n) {
126
+ if (!this.fn || n === 0)
127
+ return;
128
+ this.done += n;
129
+ this.fn(this.done, this.total);
130
+ }
131
+ }
132
+ exports.Progress = Progress;
133
+ /** A semaphore whose waits an abort ends. */
134
+ class Slots {
135
+ free;
136
+ waiters = [];
137
+ constructor(free) {
138
+ this.free = free;
139
+ }
140
+ async acquire(signal) {
141
+ for (;;) {
142
+ signal?.throwIfAborted();
143
+ if (this.free > 0) {
144
+ this.free--;
145
+ return;
146
+ }
147
+ let wake;
148
+ const woken = new Promise((resolve) => (wake = resolve));
149
+ this.waiters.push(wake);
150
+ try {
151
+ await abortable(woken, signal);
152
+ }
153
+ catch (err) {
154
+ this.waiters = this.waiters.filter((w) => w !== wake);
155
+ if (this.free > 0)
156
+ this.waiters.shift()?.(); // a wake-up this call may have taken goes on to the next
157
+ throw err;
158
+ }
159
+ }
160
+ }
161
+ release() {
162
+ this.free++;
163
+ this.waiters.shift()?.();
164
+ }
165
+ }
166
+ exports.Slots = Slots;
167
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/direct/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ // Copyright 2026 TEEPIN Project
3
+ // Licensed under the Apache License, Version 2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.passing = exports.stopsRun = exports.plan = exports.fold = exports.keyParts = exports.partProblem = exports.UnsafePathError = exports.PART_SUFFIX = void 0;
6
+ // Batch downloads' rules that need no file system (TEEPIN-STORAGE-DESIGN.md sections 19.15 and 22.5): a port of the
7
+ // path rules and the plan in teepin-python's _downloads.py.
8
+ //
9
+ // - Which key can be a path under the destination: every part of it a file name; on Windows also without the
10
+ // characters Windows refuses, a device name (with any extension) or a trailing dot or space, on every OS, since a
11
+ // folder may be shared with Windows.
12
+ // - Which keys would land on one file: the same path, or paths that differ only by case where names ignore case.
13
+ // - Which errors leave an object to go on with later (pending), and which stop a whole run.
14
+ //
15
+ // The node entry (src/node/downloads.ts) does the rest: the files, the links, the journal. Nothing here imports a Node
16
+ // module.
17
+ const errors_js_1 = require("../errors.js");
18
+ /** A download is written into its target's path with this added, and renamed into place only when whole. */
19
+ exports.PART_SUFFIX = '.teepin-part';
20
+ /** A key that can't be written under the destination: not a safe path, a link leading out, or another key's file. */
21
+ class UnsafePathError extends errors_js_1.TeepinError {
22
+ constructor(message) {
23
+ super(message);
24
+ this.name = 'UnsafePathError';
25
+ }
26
+ }
27
+ exports.UnsafePathError = UnsafePathError;
28
+ /** Windows' device names: a file named one of these, with any extension, is the device (CON, COM1, ...). */
29
+ const WIN_RESERVED = new Set(['CON', 'PRN', 'AUX', 'NUL', ...['COM', 'LPT'].flatMap((p) => [...'0123456789\u00b9\u00b2\u00b3'].map((d) => p + d))]);
30
+ /** Characters Windows doesn't allow in a file name. */
31
+ const WIN_BAD = new Set([...'<>:"|?*\\', ...Array.from({ length: 31 }, (_, i) => String.fromCharCode(i + 1))]);
32
+ /**
33
+ * Why one part of a key's path can't be a file name ("" when it can). On Windows also: its forbidden characters, a
34
+ * device name with or without an extension, and a trailing dot or space, which Windows drops, so the file would land
35
+ * under another name than the key's.
36
+ */
37
+ function partProblem(part, windows) {
38
+ if (part === '' || part === '.' || part === '..')
39
+ return "an empty, '.' or '..' part";
40
+ if (part.includes('\0'))
41
+ return 'a NUL character';
42
+ if (windows) {
43
+ if ([...part].some((c) => WIN_BAD.has(c)))
44
+ return "a character Windows doesn't allow in a file name";
45
+ if (part.endsWith('.') || part.endsWith(' '))
46
+ return 'a name ending in a dot or a space, which Windows would drop';
47
+ if (WIN_RESERVED.has(part.split('.')[0].replace(/ +$/, '').toUpperCase()))
48
+ return 'a name Windows keeps for a device';
49
+ }
50
+ return '';
51
+ }
52
+ exports.partProblem = partProblem;
53
+ /** A key's path split into its parts, each checked by partProblem: UnsafePathError for the first that can't be a name. */
54
+ function keyParts(rel, windows) {
55
+ const parts = rel.split('/');
56
+ for (const part of parts) {
57
+ const why = partProblem(part, windows);
58
+ if (why)
59
+ throw new UnsafePathError(`${JSON.stringify(rel)} isn't a safe path under the destination: ${why}`);
60
+ }
61
+ return parts;
62
+ }
63
+ exports.keyParts = keyParts;
64
+ /** A path as names that ignore case see it (NFC, then upper and lower case, so a sharp s and "SS" are one), or as it is. */
65
+ function fold(path, insensitive) {
66
+ return insensitive ? path.normalize('NFC').toUpperCase().toLowerCase() : path;
67
+ }
68
+ exports.fold = fold;
69
+ /**
70
+ * (key, relative path) pairs to the plan: folder markers skipped, keys that aren't safe paths failed, and a key whose
71
+ * file another key already takes failed.
72
+ */
73
+ async function plan(pairs, paths) {
74
+ const entries = [];
75
+ const collisions = [];
76
+ const seen = new Map(); // folded path -> the key going there
77
+ for (const [key, rel] of pairs) {
78
+ if (rel === '' || rel.endsWith('/')) {
79
+ const path = paths.shown(rel);
80
+ entries.push({ key, path, result: { key, path, status: 'skipped', resumed: false } });
81
+ continue;
82
+ }
83
+ let path;
84
+ try {
85
+ path = await paths.target(keyParts(rel, paths.windows), rel);
86
+ }
87
+ catch (err) {
88
+ if (!(err instanceof UnsafePathError))
89
+ throw err;
90
+ const shown = paths.shown(rel);
91
+ entries.push({ key, path: shown, result: { key, path: shown, status: 'failed', error: err, resumed: false } });
92
+ continue;
93
+ }
94
+ // Two keys that differ only by case are one file where names ignore case, and so would their part files be.
95
+ const norm = fold(path, paths.insensitive);
96
+ const other = seen.get(norm);
97
+ if (other !== undefined) {
98
+ if (other === key)
99
+ continue; // the same key twice
100
+ const error = new UnsafePathError(`${JSON.stringify(key)} and ${JSON.stringify(other)} both go to ${path}`);
101
+ collisions.push({ key, path, status: 'failed', error, resumed: false });
102
+ continue;
103
+ }
104
+ seen.set(norm, key);
105
+ entries.push({ key, path });
106
+ }
107
+ return { entries, collisions };
108
+ }
109
+ exports.plan = plan;
110
+ /** Errors that stop a whole run: what's left stays pending, to run again (a revoked key, no credit). */
111
+ function stopsRun(err) {
112
+ return err instanceof errors_js_1.UnauthorizedError || err instanceof errors_js_1.ForbiddenError || err instanceof errors_js_1.PaymentRequiredError;
113
+ }
114
+ exports.stopsRun = stopsRun;
115
+ /**
116
+ * An error after which an object's download is kept, to go on with later: one that stops the run, the network, a busy
117
+ * or failing service, or the local disk (full, say: any failed system call).
118
+ */
119
+ function passing(err) {
120
+ if (stopsRun(err) || err instanceof errors_js_1.ConnectionError)
121
+ return true;
122
+ if (err instanceof errors_js_1.APIError)
123
+ return err.statusCode === 429 || err.statusCode >= 500;
124
+ return err instanceof Error && 'syscall' in err && typeof err.syscall === 'string';
125
+ }
126
+ exports.passing = passing;
127
+ //# sourceMappingURL=downloads-plan.js.map