@teepin/sdk 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -36
- package/dist/cjs/client.js +42 -4
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/direct/bytes.js +50 -0
- package/dist/cjs/direct/bytes.js.map +1 -0
- package/dist/cjs/direct/common.js +167 -0
- package/dist/cjs/direct/common.js.map +1 -0
- package/dist/cjs/direct/downloads-plan.js +127 -0
- package/dist/cjs/direct/downloads-plan.js.map +1 -0
- package/dist/cjs/direct/engine.js +405 -0
- package/dist/cjs/direct/engine.js.map +1 -0
- package/dist/cjs/direct/formats.js +44 -0
- package/dist/cjs/direct/formats.js.map +1 -0
- package/dist/cjs/direct/hpke.js +275 -0
- package/dist/cjs/direct/hpke.js.map +1 -0
- package/dist/cjs/direct/journal.js +80 -0
- package/dist/cjs/direct/journal.js.map +1 -0
- package/dist/cjs/direct/large.js +850 -0
- package/dist/cjs/direct/large.js.map +1 -0
- package/dist/cjs/direct/reads.js +1314 -0
- package/dist/cjs/direct/reads.js.map +1 -0
- package/dist/cjs/direct/sha256.js +122 -0
- package/dist/cjs/direct/sha256.js.map +1 -0
- package/dist/cjs/direct/tws1.js +480 -0
- package/dist/cjs/direct/tws1.js.map +1 -0
- package/dist/cjs/direct/uploads.js +1706 -0
- package/dist/cjs/direct/uploads.js.map +1 -0
- package/dist/cjs/errors.js +70 -13
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/links.js +195 -0
- package/dist/cjs/links.js.map +1 -0
- package/dist/cjs/node/downloads.js +835 -0
- package/dist/cjs/node/downloads.js.map +1 -0
- package/dist/cjs/node/journal.js +841 -0
- package/dist/cjs/node/journal.js.map +1 -0
- package/dist/cjs/node/uploads.js +219 -0
- package/dist/cjs/node/uploads.js.map +1 -0
- package/dist/cjs/node.js +26 -39
- package/dist/cjs/node.js.map +1 -1
- package/dist/cjs/storage.js +214 -184
- package/dist/cjs/storage.js.map +1 -1
- package/dist/cjs/transfer.js +18 -351
- package/dist/cjs/transfer.js.map +1 -1
- package/dist/esm/client.js +42 -4
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/direct/bytes.js +42 -0
- package/dist/esm/direct/bytes.js.map +1 -0
- package/dist/esm/direct/common.js +155 -0
- package/dist/esm/direct/common.js.map +1 -0
- package/dist/esm/direct/downloads-plan.js +117 -0
- package/dist/esm/direct/downloads-plan.js.map +1 -0
- package/dist/esm/direct/engine.js +385 -0
- package/dist/esm/direct/engine.js.map +1 -0
- package/dist/esm/direct/formats.js +40 -0
- package/dist/esm/direct/formats.js.map +1 -0
- package/dist/esm/direct/hpke.js +262 -0
- package/dist/esm/direct/hpke.js.map +1 -0
- package/dist/esm/direct/journal.js +75 -0
- package/dist/esm/direct/journal.js.map +1 -0
- package/dist/esm/direct/large.js +816 -0
- package/dist/esm/direct/large.js.map +1 -0
- package/dist/esm/direct/reads.js +1275 -0
- package/dist/esm/direct/reads.js.map +1 -0
- package/dist/esm/direct/sha256.js +118 -0
- package/dist/esm/direct/sha256.js.map +1 -0
- package/dist/esm/direct/tws1.js +460 -0
- package/dist/esm/direct/tws1.js.map +1 -0
- package/dist/esm/direct/uploads.js +1660 -0
- package/dist/esm/direct/uploads.js.map +1 -0
- package/dist/esm/errors.js +64 -11
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/links.js +189 -0
- package/dist/esm/links.js.map +1 -0
- package/dist/esm/node/downloads.js +829 -0
- package/dist/esm/node/downloads.js.map +1 -0
- package/dist/esm/node/journal.js +824 -0
- package/dist/esm/node/journal.js.map +1 -0
- package/dist/esm/node/uploads.js +187 -0
- package/dist/esm/node/uploads.js.map +1 -0
- package/dist/esm/node.js +17 -14
- package/dist/esm/node.js.map +1 -1
- package/dist/esm/storage.js +214 -184
- package/dist/esm/storage.js.map +1 -1
- package/dist/esm/transfer.js +19 -349
- package/dist/esm/transfer.js.map +1 -1
- package/dist/types/client.d.ts +45 -4
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/direct/bytes.d.ts +11 -0
- package/dist/types/direct/bytes.d.ts.map +1 -0
- package/dist/types/direct/common.d.ts +47 -0
- package/dist/types/direct/common.d.ts.map +1 -0
- package/dist/types/direct/downloads-plan.d.ts +75 -0
- package/dist/types/direct/downloads-plan.d.ts.map +1 -0
- package/dist/types/direct/engine.d.ts +191 -0
- package/dist/types/direct/engine.d.ts.map +1 -0
- package/dist/types/direct/formats.d.ts +9 -0
- package/dist/types/direct/formats.d.ts.map +1 -0
- package/dist/types/direct/hpke.d.ts +55 -0
- package/dist/types/direct/hpke.d.ts.map +1 -0
- package/dist/types/direct/journal.d.ts +55 -0
- package/dist/types/direct/journal.d.ts.map +1 -0
- package/dist/types/direct/large.d.ts +170 -0
- package/dist/types/direct/large.d.ts.map +1 -0
- package/dist/types/direct/reads.d.ts +306 -0
- package/dist/types/direct/reads.d.ts.map +1 -0
- package/dist/types/direct/sha256.d.ts +16 -0
- package/dist/types/direct/sha256.d.ts.map +1 -0
- package/dist/types/direct/tws1.d.ts +157 -0
- package/dist/types/direct/tws1.d.ts.map +1 -0
- package/dist/types/direct/uploads.d.ts +461 -0
- package/dist/types/direct/uploads.d.ts.map +1 -0
- package/dist/types/errors.d.ts +47 -8
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/links.d.ts +86 -0
- package/dist/types/links.d.ts.map +1 -0
- package/dist/types/node/downloads.d.ts +73 -0
- package/dist/types/node/downloads.d.ts.map +1 -0
- package/dist/types/node/journal.d.ts +162 -0
- package/dist/types/node/journal.d.ts.map +1 -0
- package/dist/types/node/uploads.d.ts +86 -0
- package/dist/types/node/uploads.d.ts.map +1 -0
- package/dist/types/node.d.ts +4 -2
- package/dist/types/node.d.ts.map +1 -1
- package/dist/types/storage.d.ts +107 -64
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/transfer.d.ts +14 -23
- package/dist/types/transfer.d.ts.map +1 -1
- 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.
|
|
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
|
|
146
|
-
|
|
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`.
|
|
171
|
-
parts
|
|
172
|
-
|
|
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
|
|
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
|
-
###
|
|
213
|
+
### Share links
|
|
217
214
|
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
```
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
- `
|
|
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
|
package/dist/cjs/client.js
CHANGED
|
@@ -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.
|
|
12
|
+
exports.VERSION = '0.3.0';
|
|
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
|
-
/**
|
|
91
|
-
|
|
92
|
-
|
|
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. */
|
package/dist/cjs/client.js.map
CHANGED
|
@@ -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
|