@sparkvault/sdk-mobile 6.0.2 → 7.0.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 +5 -5
- package/dist/account.d.ts +4 -3
- package/dist/account.js +16 -11
- package/dist/account.js.map +1 -1
- package/dist/app-sdk/email-address.d.ts +37 -0
- package/dist/app-sdk/email-address.js +91 -0
- package/dist/app-sdk/email-address.js.map +1 -0
- package/dist/app-sdk/encoding.d.ts +64 -0
- package/dist/app-sdk/encoding.js +245 -0
- package/dist/app-sdk/encoding.js.map +1 -0
- package/dist/app-sdk/entropy-contract.d.ts +33 -0
- package/dist/app-sdk/entropy-contract.js +51 -0
- package/dist/app-sdk/entropy-contract.js.map +1 -0
- package/dist/app-sdk/filename.d.ts +93 -0
- package/dist/app-sdk/filename.js +161 -0
- package/dist/app-sdk/filename.js.map +1 -0
- package/dist/app-sdk/forge-url.d.ts +107 -0
- package/dist/app-sdk/forge-url.js +222 -0
- package/dist/app-sdk/forge-url.js.map +1 -0
- package/dist/app-sdk/ids.d.ts +48 -0
- package/dist/app-sdk/ids.js +65 -0
- package/dist/app-sdk/ids.js.map +1 -0
- package/dist/app-sdk/ingot-access-log.d.ts +29 -0
- package/dist/app-sdk/ingot-access-log.js +49 -0
- package/dist/app-sdk/ingot-access-log.js.map +1 -0
- package/dist/app-sdk/phone.d.ts +37 -0
- package/dist/app-sdk/phone.js +134 -0
- package/dist/app-sdk/phone.js.map +1 -0
- package/dist/app-sdk/platform-domains.d.ts +41 -0
- package/dist/app-sdk/platform-domains.js +82 -0
- package/dist/app-sdk/platform-domains.js.map +1 -0
- package/dist/app-sdk/request-path.d.ts +49 -0
- package/dist/app-sdk/request-path.js +81 -0
- package/dist/app-sdk/request-path.js.map +1 -0
- package/dist/app-sdk/transient.d.ts +23 -0
- package/dist/app-sdk/transient.js +29 -0
- package/dist/app-sdk/transient.js.map +1 -0
- package/dist/app-sdk/vat-refusal.d.ts +66 -0
- package/dist/app-sdk/vat-refusal.js +69 -0
- package/dist/app-sdk/vat-refusal.js.map +1 -0
- package/dist/billing.d.ts +9 -17
- package/dist/billing.js +14 -17
- package/dist/billing.js.map +1 -1
- package/dist/config.d.ts +7 -1
- package/dist/config.js +10 -17
- package/dist/config.js.map +1 -1
- package/dist/encoding.d.ts +30 -4
- package/dist/encoding.js +89 -83
- package/dist/encoding.js.map +1 -1
- package/dist/entropy.d.ts +25 -4
- package/dist/entropy.js +62 -15
- package/dist/entropy.js.map +1 -1
- package/dist/entropy.test-d.d.ts +40 -0
- package/dist/entropy.test-d.js +12 -0
- package/dist/entropy.test-d.js.map +1 -0
- package/dist/errors.d.ts +67 -17
- package/dist/errors.js +70 -27
- package/dist/errors.js.map +1 -1
- package/dist/folders.js +8 -7
- package/dist/folders.js.map +1 -1
- package/dist/http.d.ts +57 -15
- package/dist/http.js +125 -138
- package/dist/http.js.map +1 -1
- package/dist/identity-dialog.js +4 -30
- package/dist/identity-dialog.js.map +1 -1
- package/dist/identity-input.d.ts +39 -0
- package/dist/identity-input.js +59 -0
- package/dist/identity-input.js.map +1 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/ingots.d.ts +51 -18
- package/dist/ingots.js +132 -122
- package/dist/ingots.js.map +1 -1
- package/dist/mutex.d.ts +1 -2
- package/dist/mutex.js +0 -6
- package/dist/mutex.js.map +1 -1
- package/dist/notify.d.ts +7 -2
- package/dist/notify.js +12 -15
- package/dist/notify.js.map +1 -1
- package/dist/notify.test-d.d.ts +3 -2
- package/dist/notify.test-d.js +1 -1
- package/dist/products/identity.d.ts +5 -0
- package/dist/products/identity.js +40 -35
- package/dist/products/identity.js.map +1 -1
- package/dist/request-path.d.ts +32 -0
- package/dist/request-path.js +35 -0
- package/dist/request-path.js.map +1 -0
- package/dist/sparks.js +16 -15
- package/dist/sparks.js.map +1 -1
- package/dist/tus.d.ts +19 -2
- package/dist/tus.js +86 -35
- package/dist/tus.js.map +1 -1
- package/dist/types.d.ts +167 -15
- package/dist/users.d.ts +12 -5
- package/dist/users.js +27 -19
- package/dist/users.js.map +1 -1
- package/dist/validation.d.ts +20 -5
- package/dist/validation.js +29 -27
- package/dist/validation.js.map +1 -1
- package/dist/vaults.d.ts +34 -83
- package/dist/vaults.js +64 -44
- package/dist/vaults.js.map +1 -1
- package/dist/vaults.test-d.d.ts +22 -0
- package/dist/vaults.test-d.js +14 -0
- package/dist/vaults.test-d.js.map +1 -0
- package/package.json +4 -2
- package/src/account.ts +16 -11
- package/src/app-sdk/email-address.js +94 -0
- package/src/app-sdk/encoding.js +250 -0
- package/src/app-sdk/entropy-contract.js +56 -0
- package/src/app-sdk/filename.js +174 -0
- package/src/app-sdk/forge-url.js +224 -0
- package/src/app-sdk/ids.js +71 -0
- package/src/app-sdk/ingot-access-log.js +51 -0
- package/src/app-sdk/phone.js +139 -0
- package/src/app-sdk/platform-domains.js +99 -0
- package/src/app-sdk/request-path.js +81 -0
- package/src/app-sdk/transient.js +30 -0
- package/src/app-sdk/vat-refusal.js +74 -0
- package/src/billing.ts +16 -25
- package/src/config.ts +16 -23
- package/src/encoding.ts +91 -103
- package/src/entropy.test-d.ts +47 -0
- package/src/entropy.ts +86 -20
- package/src/errors.ts +93 -33
- package/src/folders.ts +8 -7
- package/src/http.ts +145 -150
- package/src/identity-dialog.tsx +4 -37
- package/src/identity-input.ts +70 -0
- package/src/index.ts +11 -3
- package/src/ingots.ts +173 -159
- package/src/mutex.ts +1 -8
- package/src/notify.test-d.ts +3 -1
- package/src/notify.ts +19 -17
- package/src/products/identity.ts +45 -39
- package/src/request-path.ts +45 -0
- package/src/sparks.ts +16 -13
- package/src/tus.ts +90 -37
- package/src/types.ts +165 -15
- package/src/users.ts +27 -17
- package/src/validation.ts +30 -24
- package/src/vaults.test-d.ts +29 -0
- package/src/vaults.ts +87 -153
- package/dist/platform-domains.generated.d.ts +0 -2
- package/dist/platform-domains.generated.js +0 -16
- package/dist/platform-domains.generated.js.map +0 -1
- package/src/platform-domains.generated.ts +0 -17
package/dist/encoding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"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"}
|
package/dist/entropy.d.ts
CHANGED
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
import type { MobileHttpClient } from './http.js';
|
|
2
|
-
|
|
2
|
+
/** An output format the entropy endpoint serves (the platform's entropy contract). */
|
|
3
|
+
export type EntropyFormat = 'hex' | 'base64' | 'base64url' | 'alphanumeric' | 'alphanumeric-mixed' | 'password' | 'numeric' | 'uuid' | 'bytes';
|
|
3
4
|
export interface GenerateEntropyOptions {
|
|
5
|
+
/** Number of random bytes: 1–1024, or 1–512 for alphanumeric, alphanumeric-mixed and password. */
|
|
4
6
|
bytes: number;
|
|
7
|
+
/** Output format. Defaults to base64. */
|
|
5
8
|
format?: EntropyFormat;
|
|
6
9
|
}
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
/** The endpoint's answer: `value` is a number array for the `bytes` format and a string for every other. */
|
|
11
|
+
export interface EntropyResponse<Value extends string | number[] = string | number[]> {
|
|
12
|
+
value: Value;
|
|
9
13
|
num_bytes: number;
|
|
10
14
|
format?: EntropyFormat;
|
|
15
|
+
reference_id?: string;
|
|
11
16
|
}
|
|
12
17
|
export declare class MobileEntropyClient {
|
|
13
18
|
private readonly http;
|
|
14
19
|
constructor(http: MobileHttpClient);
|
|
20
|
+
generate(options: GenerateEntropyOptions & {
|
|
21
|
+
format: 'bytes';
|
|
22
|
+
}): Promise<EntropyResponse<number[]>>;
|
|
23
|
+
generate(options: GenerateEntropyOptions & {
|
|
24
|
+
format?: Exclude<EntropyFormat, 'bytes'>;
|
|
25
|
+
}): Promise<EntropyResponse<string>>;
|
|
15
26
|
generate(options: GenerateEntropyOptions): Promise<EntropyResponse>;
|
|
16
27
|
generateBytes(bytes: number): Promise<Uint8Array>;
|
|
17
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Random bytes for the signed-in client's own working values (a key's id, a
|
|
30
|
+
* secret's server share), from POST /v1/entropy/first-party: answered to an
|
|
31
|
+
* interactive SparkVault session only, never plan- or bandwidth-gated and
|
|
32
|
+
* never recorded as the account's usage. Values an integration asks for come
|
|
33
|
+
* from `generate` / `generateBytes`.
|
|
34
|
+
*
|
|
35
|
+
* @param bytes - 1 to the entropy contract's ceiling (MAX_DRAW_BYTES)
|
|
36
|
+
* @returns exactly `bytes` bytes
|
|
37
|
+
*/
|
|
38
|
+
drawFirstParty(bytes: number): Promise<Uint8Array>;
|
|
18
39
|
}
|
package/dist/entropy.js
CHANGED
|
@@ -1,35 +1,82 @@
|
|
|
1
|
-
import { base64ToBytes } from './encoding.js';
|
|
1
|
+
import { base64ToBytes } from './app-sdk/encoding.js';
|
|
2
|
+
import { ENTROPY_FORMATS, MAX_DRAW_BYTES, isEntropyFormat, maxBytesFor } from './app-sdk/entropy-contract.js';
|
|
2
3
|
import { SparkVaultMobileError, SparkVaultValidationError } from './errors.js';
|
|
4
|
+
import { apiPath } from './request-path.js';
|
|
3
5
|
export class MobileEntropyClient {
|
|
4
6
|
constructor(http) {
|
|
5
7
|
this.http = http;
|
|
6
8
|
}
|
|
7
9
|
async generate(options) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
const format = options.format ?? 'base64';
|
|
11
|
+
validateEntropyRequest(options.bytes, format);
|
|
12
|
+
const response = await this.http.post(apiPath `/entropy/generate`, {
|
|
10
13
|
num_bytes: options.bytes,
|
|
11
|
-
format
|
|
14
|
+
format,
|
|
12
15
|
});
|
|
13
16
|
return response.data;
|
|
14
17
|
}
|
|
15
18
|
async generateBytes(bytes) {
|
|
16
19
|
const response = await this.generate({ bytes, format: 'base64' });
|
|
17
|
-
|
|
18
|
-
throw new SparkVaultMobileError('Entropy endpoint returned no value');
|
|
19
|
-
}
|
|
20
|
-
const entropy = base64ToBytes(response.value);
|
|
21
|
-
if (entropy.length !== bytes) {
|
|
22
|
-
throw new SparkVaultMobileError(`Entropy length mismatch: expected ${bytes}, got ${entropy.length}`);
|
|
23
|
-
}
|
|
24
|
-
return entropy;
|
|
20
|
+
return drawnBytes(response.value, bytes);
|
|
25
21
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Random bytes for the signed-in client's own working values (a key's id, a
|
|
24
|
+
* secret's server share), from POST /v1/entropy/first-party: answered to an
|
|
25
|
+
* interactive SparkVault session only, never plan- or bandwidth-gated and
|
|
26
|
+
* never recorded as the account's usage. Values an integration asks for come
|
|
27
|
+
* from `generate` / `generateBytes`.
|
|
28
|
+
*
|
|
29
|
+
* @param bytes - 1 to the entropy contract's ceiling (MAX_DRAW_BYTES)
|
|
30
|
+
* @returns exactly `bytes` bytes
|
|
31
|
+
*/
|
|
32
|
+
async drawFirstParty(bytes) {
|
|
33
|
+
if (!Number.isInteger(bytes) || bytes < 1 || bytes > MAX_DRAW_BYTES) {
|
|
34
|
+
throw new SparkVaultValidationError(`Entropy byte count must be an integer from 1 to ${MAX_DRAW_BYTES}`, {
|
|
29
35
|
field: 'bytes',
|
|
30
36
|
received: bytes,
|
|
31
37
|
});
|
|
32
38
|
}
|
|
39
|
+
const response = await this.http.post(apiPath `/entropy/first-party`, {
|
|
40
|
+
num_bytes: bytes,
|
|
41
|
+
});
|
|
42
|
+
return drawnBytes(response.data.value, bytes);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The bytes a draw answered as base64, refused unless they are exactly the
|
|
47
|
+
* bytes asked for, so a malformed answer fails the operation that asked for it.
|
|
48
|
+
*/
|
|
49
|
+
function drawnBytes(value, bytes) {
|
|
50
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
51
|
+
throw new SparkVaultMobileError('Entropy endpoint returned no value');
|
|
52
|
+
}
|
|
53
|
+
const entropy = base64ToBytes(value);
|
|
54
|
+
if (entropy === null) {
|
|
55
|
+
throw new SparkVaultMobileError('Entropy endpoint returned a value that is not base64');
|
|
56
|
+
}
|
|
57
|
+
if (entropy.length !== bytes) {
|
|
58
|
+
throw new SparkVaultMobileError(`Entropy length mismatch: expected ${bytes}, got ${entropy.length}`);
|
|
59
|
+
}
|
|
60
|
+
return entropy;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Refuse a request the endpoint would refuse, before it is sent: the format must
|
|
64
|
+
* be one the endpoint serves, and the byte count an integer from 1 to that
|
|
65
|
+
* format's ceiling.
|
|
66
|
+
*/
|
|
67
|
+
function validateEntropyRequest(bytes, format) {
|
|
68
|
+
if (!isEntropyFormat(format)) {
|
|
69
|
+
throw new SparkVaultValidationError(`Entropy format must be one of: ${ENTROPY_FORMATS.join(', ')}`, {
|
|
70
|
+
field: 'format',
|
|
71
|
+
received: format,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const max = maxBytesFor(format);
|
|
75
|
+
if (!Number.isInteger(bytes) || bytes < 1 || bytes > max) {
|
|
76
|
+
throw new SparkVaultValidationError(`Entropy byte count must be an integer from 1 to ${max} for the ${format} format`, {
|
|
77
|
+
field: 'bytes',
|
|
78
|
+
received: bytes,
|
|
79
|
+
});
|
|
33
80
|
}
|
|
34
81
|
}
|
|
35
82
|
//# sourceMappingURL=entropy.js.map
|
package/dist/entropy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entropy.js","sourceRoot":"","sources":["../src/entropy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"entropy.js","sourceRoot":"","sources":["../src/entropy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entropy wire-contract assertions — COMPILE-TIME ONLY (see notify.test-d.ts for
|
|
3
|
+
* why these live in `src` under a `.test-d.ts` name).
|
|
4
|
+
*
|
|
5
|
+
* The endpoint answers a `bytes` request with a number array and every other
|
|
6
|
+
* format with a string, so `generate` is typed per format, and a format known
|
|
7
|
+
* only as an EntropyFormat resolves to either shape. The format list
|
|
8
|
+
* itself is pinned to the platform contract at runtime by
|
|
9
|
+
* tests/app-sdk-mirrors.test.ts.
|
|
10
|
+
*/
|
|
11
|
+
import type { EntropyFormat, MobileEntropyClient } from './entropy.js';
|
|
12
|
+
/** Fails to compile unless `T` resolves to exactly `true`. */
|
|
13
|
+
type Assert<T extends true> = T;
|
|
14
|
+
/** Invariant type equality: `A` and `B` must be the same type, not merely mutually assignable. */
|
|
15
|
+
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
16
|
+
/** What `generate` resolves to for a call with `Options`: its first overload that accepts them. */
|
|
17
|
+
type Answer<Options> = MobileEntropyClient['generate'] extends {
|
|
18
|
+
(options: infer First): infer FirstResult;
|
|
19
|
+
(options: infer Second): infer SecondResult;
|
|
20
|
+
(options: infer Third): infer ThirdResult;
|
|
21
|
+
} ? Options extends First ? Awaited<FirstResult> : Options extends Second ? Awaited<SecondResult> : Options extends Third ? Awaited<ThirdResult> : never : never;
|
|
22
|
+
export type EntropyWireContract = [
|
|
23
|
+
Assert<Equals<EntropyFormat, 'hex' | 'base64' | 'base64url' | 'alphanumeric' | 'alphanumeric-mixed' | 'password' | 'numeric' | 'uuid' | 'bytes'>>,
|
|
24
|
+
Assert<Equals<Answer<{
|
|
25
|
+
bytes: number;
|
|
26
|
+
format: 'bytes';
|
|
27
|
+
}>['value'], number[]>>,
|
|
28
|
+
Assert<Equals<Answer<{
|
|
29
|
+
bytes: number;
|
|
30
|
+
format: 'password';
|
|
31
|
+
}>['value'], string>>,
|
|
32
|
+
Assert<Equals<Answer<{
|
|
33
|
+
bytes: number;
|
|
34
|
+
}>['value'], string>>,
|
|
35
|
+
Assert<Equals<Answer<{
|
|
36
|
+
bytes: number;
|
|
37
|
+
format: EntropyFormat;
|
|
38
|
+
}>['value'], string | number[]>>
|
|
39
|
+
];
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entropy wire-contract assertions — COMPILE-TIME ONLY (see notify.test-d.ts for
|
|
3
|
+
* why these live in `src` under a `.test-d.ts` name).
|
|
4
|
+
*
|
|
5
|
+
* The endpoint answers a `bytes` request with a number array and every other
|
|
6
|
+
* format with a string, so `generate` is typed per format, and a format known
|
|
7
|
+
* only as an EntropyFormat resolves to either shape. The format list
|
|
8
|
+
* itself is pinned to the platform contract at runtime by
|
|
9
|
+
* tests/app-sdk-mirrors.test.ts.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=entropy.test-d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entropy.test-d.js","sourceRoot":"","sources":["../src/entropy.test-d.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -50,10 +50,10 @@ export declare class SparkVaultTimeoutError extends SparkVaultMobileError {
|
|
|
50
50
|
constructor(message?: string);
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
53
|
-
* Thrown when a download is requested against an ingot
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
53
|
+
* Thrown when a download is requested against an ingot whose upload Forge has
|
|
54
|
+
* not activated yet (status `uploading`). Transient by nature, but retrying
|
|
55
|
+
* immediately will not help — callers should back off until the ingot becomes
|
|
56
|
+
* active.
|
|
57
57
|
*/
|
|
58
58
|
export declare class IngotNotReadyError extends SparkVaultMobileError {
|
|
59
59
|
/** Server-reported ingot status at the time of the request, when known. */
|
|
@@ -64,6 +64,34 @@ export declare class IngotNotReadyError extends SparkVaultMobileError {
|
|
|
64
64
|
meta?: ApiMeta;
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
+
/** The ingot a create was refused over, as the server read it. */
|
|
68
|
+
export interface IngotNameHolder {
|
|
69
|
+
ingotId: string;
|
|
70
|
+
/**
|
|
71
|
+
* Lifecycle status of the holder: `active` when its upload finished,
|
|
72
|
+
* `uploading` when it has not (only a `refuse` create is refused over an
|
|
73
|
+
* unfinished holder; `complete_pending` completes one).
|
|
74
|
+
*/
|
|
75
|
+
status: string;
|
|
76
|
+
sizeBytes: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Thrown when a create is refused because an ingot already holds the name in
|
|
80
|
+
* the target folder (409 `details.reason === 'NAME_HELD'`): with
|
|
81
|
+
* `onNameConflict: 'complete_pending'` a published holder, with `'refuse'` any
|
|
82
|
+
* holder. The server decided before writing anything, so the holder is
|
|
83
|
+
* untouched; `holder` is the row it read, which lets the caller act on it
|
|
84
|
+
* (send its bytes into its own row by id, adopt it, or try another name)
|
|
85
|
+
* without a second read.
|
|
86
|
+
*/
|
|
87
|
+
export declare class IngotNameHeldError extends SparkVaultMobileError {
|
|
88
|
+
readonly holder: IngotNameHolder;
|
|
89
|
+
constructor(message: string, options: {
|
|
90
|
+
holder: IngotNameHolder;
|
|
91
|
+
details?: Record<string, unknown>;
|
|
92
|
+
meta?: ApiMeta;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
67
95
|
export declare class TusUploadError extends SparkVaultMobileError {
|
|
68
96
|
readonly cause: Error | null;
|
|
69
97
|
readonly filename: string | null;
|
|
@@ -136,32 +164,54 @@ export declare function isNetworkError(err: unknown): boolean;
|
|
|
136
164
|
* per-upload token minted with the ingot (expired, consumed, or bound to a
|
|
137
165
|
* different session) — not the vault session. Re-unsealing the vault cannot
|
|
138
166
|
* fix it; the caller creates a new upload session (`POST /ingots`) instead.
|
|
139
|
-
* Use `
|
|
140
|
-
* rejections apart.
|
|
167
|
+
* Use `vatRefusalReason` to tell the API's VAT refusals apart.
|
|
141
168
|
*/
|
|
142
169
|
export declare function isAuthError(err: unknown): boolean;
|
|
143
170
|
/**
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
171
|
+
* The reason the API refused the vault access token, or null when the error
|
|
172
|
+
* is not a VAT refusal:
|
|
173
|
+
* - `VAT_INVALID` (401): no, a malformed, unknown or swept token, or one a
|
|
174
|
+
* since-revoked DVAK minted — unseal again. Never the login.
|
|
175
|
+
* - `VAT_EXPIRED` (403): the token outlived its TTL — unseal again and
|
|
176
|
+
* retry the same request as-is.
|
|
177
|
+
* - `VAT_READ_ONLY` (403): a View Only token on a write — no unseal fixes it.
|
|
178
|
+
* A 403 with no reason is a token for another vault or account; a 401 with no
|
|
179
|
+
* reason is the login itself.
|
|
180
|
+
*/
|
|
181
|
+
export declare function vatRefusalReason(err: unknown): string | null;
|
|
182
|
+
/**
|
|
183
|
+
* True when the API refused the vault access token because it has expired
|
|
184
|
+
* (403 `VAT_EXPIRED`). Re-unsealing the vault mints a fresh VAT and the same
|
|
185
|
+
* request can be retried as-is.
|
|
148
186
|
*/
|
|
149
187
|
export declare function isVatExpiredError(err: unknown): err is SparkVaultMobileError;
|
|
150
188
|
/**
|
|
151
|
-
* True when the vault access token is valid but read-only
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
189
|
+
* True when the vault access token is valid but read-only (403
|
|
190
|
+
* `VAT_READ_ONLY`): the session was unsealed with a read-only access level, so
|
|
191
|
+
* a write cannot succeed by retrying or by re-unsealing the same way — the
|
|
192
|
+
* caller needs write access to the vault.
|
|
155
193
|
*/
|
|
156
194
|
export declare function isReadOnlyVaultError(err: unknown): err is SparkVaultMobileError;
|
|
195
|
+
/**
|
|
196
|
+
* True for the API's 404 not-found answer: the resource it names does not
|
|
197
|
+
* exist (or is not this caller's to see). The only answer that says a vault,
|
|
198
|
+
* an ingot or a key's vault is missing; a rate limit, an outage or a refused
|
|
199
|
+
* session says nothing about it. Never true for a `TusUploadError`: Forge's
|
|
200
|
+
* 404 is an upload session that is gone, not a missing resource.
|
|
201
|
+
*/
|
|
202
|
+
export declare function isNotFoundError(err: unknown): err is SparkVaultMobileError;
|
|
157
203
|
/** True for a 429 rate-limit response — retry after a cooldown, never immediately. */
|
|
158
204
|
export declare function isRateLimitError(err: unknown): boolean;
|
|
159
205
|
/** Type guard for the still-processing-ingot download failure. */
|
|
160
206
|
export declare function isIngotNotReadyError(err: unknown): err is IngotNotReadyError;
|
|
207
|
+
/** Type guard for a create refused over the same-name ingot holding its name. */
|
|
208
|
+
export declare function isIngotNameHeldError(err: unknown): err is IngotNameHeldError;
|
|
161
209
|
/**
|
|
162
|
-
* True when retrying a failed download can succeed.
|
|
163
|
-
*
|
|
164
|
-
*
|
|
210
|
+
* True when retrying a failed download can succeed. A validation failure always
|
|
211
|
+
* fails the same way again, and an HTTP refusal is retried only when the
|
|
212
|
+
* platform's retry rule (`isTransientHttpStatus`, mirrored from
|
|
213
|
+
* `@sparkvault/app-sdk/transient`) calls it transient; every other failure
|
|
214
|
+
* (connectivity, an answer that could not be read) is worth another attempt.
|
|
165
215
|
*/
|
|
166
216
|
export declare function isRetryableDownloadError(err: unknown): boolean;
|
|
167
217
|
/**
|
package/dist/errors.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isTransientHttpStatus } from './app-sdk/transient.js';
|
|
2
|
+
import { VAT_REFUSAL_REASONS, vatRefusalReason as readVatRefusalReason } from './app-sdk/vat-refusal.js';
|
|
1
3
|
function isQuotaResource(value) {
|
|
2
4
|
return value === 'storage' || value === 'bandwidth';
|
|
3
5
|
}
|
|
@@ -78,10 +80,10 @@ export class SparkVaultTimeoutError extends SparkVaultMobileError {
|
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
/**
|
|
81
|
-
* Thrown when a download is requested against an ingot
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
83
|
+
* Thrown when a download is requested against an ingot whose upload Forge has
|
|
84
|
+
* not activated yet (status `uploading`). Transient by nature, but retrying
|
|
85
|
+
* immediately will not help — callers should back off until the ingot becomes
|
|
86
|
+
* active.
|
|
85
87
|
*/
|
|
86
88
|
export class IngotNotReadyError extends SparkVaultMobileError {
|
|
87
89
|
constructor(message = 'Ingot is not ready for download yet', options = {}) {
|
|
@@ -96,6 +98,23 @@ export class IngotNotReadyError extends SparkVaultMobileError {
|
|
|
96
98
|
Object.setPrototypeOf(this, IngotNotReadyError.prototype);
|
|
97
99
|
}
|
|
98
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Thrown when a create is refused because an ingot already holds the name in
|
|
103
|
+
* the target folder (409 `details.reason === 'NAME_HELD'`): with
|
|
104
|
+
* `onNameConflict: 'complete_pending'` a published holder, with `'refuse'` any
|
|
105
|
+
* holder. The server decided before writing anything, so the holder is
|
|
106
|
+
* untouched; `holder` is the row it read, which lets the caller act on it
|
|
107
|
+
* (send its bytes into its own row by id, adopt it, or try another name)
|
|
108
|
+
* without a second read.
|
|
109
|
+
*/
|
|
110
|
+
export class IngotNameHeldError extends SparkVaultMobileError {
|
|
111
|
+
constructor(message, options) {
|
|
112
|
+
super(message, { code: 'CONFLICT', statusCode: 409, details: options.details, meta: options.meta });
|
|
113
|
+
this.name = 'IngotNameHeldError';
|
|
114
|
+
this.holder = options.holder;
|
|
115
|
+
Object.setPrototypeOf(this, IngotNameHeldError.prototype);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
99
118
|
export class TusUploadError extends SparkVaultMobileError {
|
|
100
119
|
constructor(message, options = {}) {
|
|
101
120
|
super(message, {
|
|
@@ -171,8 +190,7 @@ export function isNetworkError(err) {
|
|
|
171
190
|
* per-upload token minted with the ingot (expired, consumed, or bound to a
|
|
172
191
|
* different session) — not the vault session. Re-unsealing the vault cannot
|
|
173
192
|
* fix it; the caller creates a new upload session (`POST /ingots`) instead.
|
|
174
|
-
* Use `
|
|
175
|
-
* rejections apart.
|
|
193
|
+
* Use `vatRefusalReason` to tell the API's VAT refusals apart.
|
|
176
194
|
*/
|
|
177
195
|
export function isAuthError(err) {
|
|
178
196
|
return (err instanceof SparkVaultMobileError &&
|
|
@@ -180,26 +198,48 @@ export function isAuthError(err) {
|
|
|
180
198
|
(err.statusCode === 401 || err.statusCode === 403));
|
|
181
199
|
}
|
|
182
200
|
/**
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
201
|
+
* The reason the API refused the vault access token, or null when the error
|
|
202
|
+
* is not a VAT refusal:
|
|
203
|
+
* - `VAT_INVALID` (401): no, a malformed, unknown or swept token, or one a
|
|
204
|
+
* since-revoked DVAK minted — unseal again. Never the login.
|
|
205
|
+
* - `VAT_EXPIRED` (403): the token outlived its TTL — unseal again and
|
|
206
|
+
* retry the same request as-is.
|
|
207
|
+
* - `VAT_READ_ONLY` (403): a View Only token on a write — no unseal fixes it.
|
|
208
|
+
* A 403 with no reason is a token for another vault or account; a 401 with no
|
|
209
|
+
* reason is the login itself.
|
|
210
|
+
*/
|
|
211
|
+
export function vatRefusalReason(err) {
|
|
212
|
+
if (!(err instanceof SparkVaultMobileError) || err instanceof TusUploadError) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
return readVatRefusalReason(err);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* True when the API refused the vault access token because it has expired
|
|
219
|
+
* (403 `VAT_EXPIRED`). Re-unsealing the vault mints a fresh VAT and the same
|
|
220
|
+
* request can be retried as-is.
|
|
187
221
|
*/
|
|
188
222
|
export function isVatExpiredError(err) {
|
|
189
|
-
return (err
|
|
190
|
-
(err.statusCode === 401 || err.statusCode === 403) &&
|
|
191
|
-
err.details?.reason === 'VAT_EXPIRED');
|
|
223
|
+
return vatRefusalReason(err) === VAT_REFUSAL_REASONS.EXPIRED;
|
|
192
224
|
}
|
|
193
225
|
/**
|
|
194
|
-
* True when the vault access token is valid but read-only
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
226
|
+
* True when the vault access token is valid but read-only (403
|
|
227
|
+
* `VAT_READ_ONLY`): the session was unsealed with a read-only access level, so
|
|
228
|
+
* a write cannot succeed by retrying or by re-unsealing the same way — the
|
|
229
|
+
* caller needs write access to the vault.
|
|
198
230
|
*/
|
|
199
231
|
export function isReadOnlyVaultError(err) {
|
|
200
|
-
return (err
|
|
201
|
-
|
|
202
|
-
|
|
232
|
+
return vatRefusalReason(err) === VAT_REFUSAL_REASONS.READ_ONLY;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* True for the API's 404 not-found answer: the resource it names does not
|
|
236
|
+
* exist (or is not this caller's to see). The only answer that says a vault,
|
|
237
|
+
* an ingot or a key's vault is missing; a rate limit, an outage or a refused
|
|
238
|
+
* session says nothing about it. Never true for a `TusUploadError`: Forge's
|
|
239
|
+
* 404 is an upload session that is gone, not a missing resource.
|
|
240
|
+
*/
|
|
241
|
+
export function isNotFoundError(err) {
|
|
242
|
+
return err instanceof SparkVaultMobileError && !(err instanceof TusUploadError) && err.statusCode === 404;
|
|
203
243
|
}
|
|
204
244
|
/** True for a 429 rate-limit response — retry after a cooldown, never immediately. */
|
|
205
245
|
export function isRateLimitError(err) {
|
|
@@ -210,19 +250,22 @@ export function isRateLimitError(err) {
|
|
|
210
250
|
export function isIngotNotReadyError(err) {
|
|
211
251
|
return err instanceof IngotNotReadyError;
|
|
212
252
|
}
|
|
253
|
+
/** Type guard for a create refused over the same-name ingot holding its name. */
|
|
254
|
+
export function isIngotNameHeldError(err) {
|
|
255
|
+
return err instanceof IngotNameHeldError;
|
|
256
|
+
}
|
|
213
257
|
/**
|
|
214
|
-
* True when retrying a failed download can succeed.
|
|
215
|
-
*
|
|
216
|
-
*
|
|
258
|
+
* True when retrying a failed download can succeed. A validation failure always
|
|
259
|
+
* fails the same way again, and an HTTP refusal is retried only when the
|
|
260
|
+
* platform's retry rule (`isTransientHttpStatus`, mirrored from
|
|
261
|
+
* `@sparkvault/app-sdk/transient`) calls it transient; every other failure
|
|
262
|
+
* (connectivity, an answer that could not be read) is worth another attempt.
|
|
217
263
|
*/
|
|
218
264
|
export function isRetryableDownloadError(err) {
|
|
219
265
|
if (err instanceof SparkVaultValidationError)
|
|
220
266
|
return false;
|
|
221
267
|
const status = err instanceof SparkVaultMobileError ? err.statusCode : undefined;
|
|
222
|
-
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
return true;
|
|
268
|
+
return typeof status !== 'number' || status < 400 || isTransientHttpStatus(status);
|
|
226
269
|
}
|
|
227
270
|
/**
|
|
228
271
|
* Single source of truth for turning a 402 response into a typed gate error.
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/folders.js
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
import { validateFolderId, validateIngotId, validateVaultId } from './validation.js';
|
|
2
|
+
import { apiPath } from './request-path.js';
|
|
2
3
|
export class MobileFoldersClient {
|
|
3
4
|
constructor(http) {
|
|
4
5
|
this.http = http;
|
|
5
6
|
}
|
|
6
7
|
async list(vaultId, vat) {
|
|
7
8
|
validateVaultId(vaultId);
|
|
8
|
-
const response = await this.http.get(`/vaults/${vaultId}/folders`, { vat });
|
|
9
|
+
const response = await this.http.get(apiPath `/vaults/${vaultId}/folders`, { vat });
|
|
9
10
|
return response.data;
|
|
10
11
|
}
|
|
11
12
|
async get(vaultId, folderId, vat) {
|
|
12
13
|
validateVaultId(vaultId);
|
|
13
14
|
validateFolderId(folderId);
|
|
14
|
-
const response = await this.http.get(`/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
15
|
+
const response = await this.http.get(apiPath `/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
15
16
|
return response.data;
|
|
16
17
|
}
|
|
17
18
|
async getBreadcrumb(vaultId, folderId, vat) {
|
|
18
19
|
validateVaultId(vaultId);
|
|
19
20
|
validateFolderId(folderId);
|
|
20
|
-
const response = await this.http.get(`/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
21
|
+
const response = await this.http.get(apiPath `/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
21
22
|
return response.data.breadcrumb ?? [];
|
|
22
23
|
}
|
|
23
24
|
async create(vaultId, vat, data) {
|
|
24
25
|
validateVaultId(vaultId);
|
|
25
|
-
const response = await this.http.post(`/vaults/${vaultId}/folders`, data, { vat });
|
|
26
|
+
const response = await this.http.post(apiPath `/vaults/${vaultId}/folders`, data, { vat });
|
|
26
27
|
return response.data;
|
|
27
28
|
}
|
|
28
29
|
async update(vaultId, folderId, vat, data) {
|
|
29
30
|
validateVaultId(vaultId);
|
|
30
31
|
validateFolderId(folderId);
|
|
31
|
-
const response = await this.http.put(`/vaults/${vaultId}/folders/${folderId}`, data, { vat });
|
|
32
|
+
const response = await this.http.put(apiPath `/vaults/${vaultId}/folders/${folderId}`, data, { vat });
|
|
32
33
|
return response.data;
|
|
33
34
|
}
|
|
34
35
|
async move(vaultId, folderId, vat, newParentId) {
|
|
@@ -40,7 +41,7 @@ export class MobileFoldersClient {
|
|
|
40
41
|
async delete(vaultId, folderId, vat) {
|
|
41
42
|
validateVaultId(vaultId);
|
|
42
43
|
validateFolderId(folderId);
|
|
43
|
-
await this.http.delete(`/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
44
|
+
await this.http.delete(apiPath `/vaults/${vaultId}/folders/${folderId}`, { vat });
|
|
44
45
|
}
|
|
45
46
|
async moveIngot(vaultId, ingotId, vat, folderId) {
|
|
46
47
|
validateVaultId(vaultId);
|
|
@@ -48,7 +49,7 @@ export class MobileFoldersClient {
|
|
|
48
49
|
if (folderId !== null) {
|
|
49
50
|
validateFolderId(folderId);
|
|
50
51
|
}
|
|
51
|
-
await this.http.patch(`/vaults/${vaultId}/ingots/${ingotId}`, { folder_id: folderId }, { vat });
|
|
52
|
+
await this.http.patch(apiPath `/vaults/${vaultId}/ingots/${ingotId}`, { folder_id: folderId }, { vat });
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
//# sourceMappingURL=folders.js.map
|
package/dist/folders.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../src/folders.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../src/folders.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,OAAO,mBAAmB;IAG9B,YAAY,IAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,GAAW;QACrC,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,OAAO,CAAA,WAAW,OAAO,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACxG,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW;QACtD,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,OAAO,CAAA,WAAW,OAAO,YAAY,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACvG,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW;QAChE,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAClC,OAAO,CAAA,WAAW,OAAO,YAAY,QAAQ,EAAE,EAC/C,EAAE,GAAG,EAAE,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAW,EAAE,IAAyB;QAClE,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAS,OAAO,CAAA,WAAW,OAAO,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAClG,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW,EAAE,IAAyB;QACpF,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,OAAO,CAAA,WAAW,OAAO,YAAY,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7G,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW,EAAE,WAA0B;QACnF,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW,EAAE,MAAe;QAC7E,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,QAAgB,EAAE,GAAW;QACzD,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA,WAAW,OAAO,YAAY,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,OAAe,EAAE,GAAW,EAAE,QAAuB;QACpF,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA,WAAW,OAAO,WAAW,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACzG,CAAC;CACF"}
|