@invisible-labs/sdk 0.6.0-devnet.3 → 0.6.0-devnet.5

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 (45) hide show
  1. package/README.md +129 -15
  2. package/dist/.invisible-sdk-build-target.json +7 -0
  3. package/dist/{chunk-QQSI3ZD7.js → chunk-3MDHAS4D.js} +109 -17
  4. package/dist/chunk-3MDHAS4D.js.map +1 -0
  5. package/dist/{chunk-NKRVQXRP.js → chunk-3TGQ4CZ3.js} +297 -11
  6. package/dist/chunk-3TGQ4CZ3.js.map +1 -0
  7. package/dist/chunk-DCTYBUY3.js +258 -0
  8. package/dist/chunk-DCTYBUY3.js.map +1 -0
  9. package/dist/{chunk-NHEHCUS5.js → chunk-EBWTAXNT.js} +3 -3
  10. package/dist/{chunk-NHEHCUS5.js.map → chunk-EBWTAXNT.js.map} +1 -1
  11. package/dist/{chunk-V5HXJRBW.js → chunk-HJFMDMPY.js} +3 -3
  12. package/dist/chunk-HJFMDMPY.js.map +1 -0
  13. package/dist/{chunk-GHBQF3A7.js → chunk-QRN46R3F.js} +5 -2
  14. package/dist/chunk-QRN46R3F.js.map +1 -0
  15. package/dist/chunk-Y7AK6RBV.js +4189 -0
  16. package/dist/chunk-Y7AK6RBV.js.map +1 -0
  17. package/dist/{coordinator-VVJ33WF2.js → coordinator-PEWHNZ7I.js} +3 -3
  18. package/dist/{coordinator-VVJ33WF2.js.map → coordinator-PEWHNZ7I.js.map} +1 -1
  19. package/dist/events.js +3 -3
  20. package/dist/index.d.ts +69 -353
  21. package/dist/index.js +161 -43
  22. package/dist/index.js.map +1 -1
  23. package/dist/lp.d.ts +76 -18
  24. package/dist/lp.js +511 -111
  25. package/dist/lp.js.map +1 -1
  26. package/dist/presets.d.ts +7 -40
  27. package/dist/presets.js +10 -68
  28. package/dist/presets.js.map +1 -1
  29. package/dist/stats.js +1 -1
  30. package/dist/storage.js +2 -243
  31. package/dist/storage.js.map +1 -1
  32. package/dist/{errors-N2touVm4.d.ts → types.generated-YhFu9ZBR.d.ts} +65 -4
  33. package/dist/user.d.ts +134 -8
  34. package/dist/user.js +991 -250
  35. package/dist/user.js.map +1 -1
  36. package/package.json +5 -31
  37. package/dist/chunk-BWCGNTN5.js +0 -1153
  38. package/dist/chunk-BWCGNTN5.js.map +0 -1
  39. package/dist/chunk-DIA6U2CV.js +0 -1927
  40. package/dist/chunk-DIA6U2CV.js.map +0 -1
  41. package/dist/chunk-GHBQF3A7.js.map +0 -1
  42. package/dist/chunk-NKRVQXRP.js.map +0 -1
  43. package/dist/chunk-QQSI3ZD7.js.map +0 -1
  44. package/dist/chunk-V5HXJRBW.js.map +0 -1
  45. package/dist/types.generated-BSEBz4jR.d.ts +0 -68
package/dist/presets.d.ts CHANGED
@@ -1,43 +1,10 @@
1
- import { C as CoordinatorEndpoint } from './types.generated-BSEBz4jR.js';
1
+ /** Coordinator URL presets. Keep URL selection separate from security policy. */
2
+ declare const INVISIBLE_COORDINATOR_URL = "wss://tee-azure.invisible.exchange/ws-noise";
2
3
 
3
- /**
4
- * `@invisible-labs/sdk/presets` - optional Invisible coordinator endpoint presets.
5
- *
6
- * This is the ONLY module permitted to name an `invisible.exchange` host (spec
7
- * section 6.2). Partners who self-host ignore it entirely and pass their own
8
- * `CoordinatorEndpoint[]` to `createSession`. The core never imports this module.
9
- *
10
- * Production presets embed an approved Azure TDX boot measurement and trust
11
- * roots. The caller must provide the separately approved coordinator binary
12
- * hash before a production endpoint can be constructed. Dormant or
13
- * development targets keep placeholders until approval.
14
- */
4
+ /** Coordinator URL conveniences for the published SDK surface. */
15
5
 
16
- /**
17
- * Production GCP TDX coordinator endpoint.
18
- *
19
- * Currently dormant: GCP is neither the live production nor development TEE
20
- * path. Kept only for a future explicit GCP relight, or a partner self-hosting
21
- * on GCP.
22
- */
23
- declare function invisibleProdGcp(): CoordinatorEndpoint[];
24
- /** Production Azure TDX coordinator endpoint for the current prod/devnet release. */
25
- declare function invisibleProdAzure(approvedBinaryHash: string): CoordinatorEndpoint[];
26
- /**
27
- * The currently-active Invisible production preset. Integrators that just want
28
- * "Invisible prod" use this and stay on whichever cloud is live.
29
- *
30
- * Switching the prod target between Azure and GCP is this one line:
31
- * `export const invisibleProd = invisibleProdAzure` -> `invisibleProdGcp`.
32
- */
33
- declare const invisibleProd: typeof invisibleProdAzure;
34
- /** Public Invisible devnet, served by the simplified Azure prod coordinator. */
35
- declare const invisibleDevnet: typeof invisibleProdAzure;
36
- /** Dormant GCP development coordinator endpoint. Not the active dev target today. */
37
- declare function invisibleDevGcp(): CoordinatorEndpoint[];
38
- /** Azure development coordinator endpoint. The active dev TEE today. */
39
- declare function invisibleDevAzure(): CoordinatorEndpoint[];
40
- /** The currently-active Invisible development preset. */
41
- declare const invisibleDev: typeof invisibleDevAzure;
6
+ declare function invisibleProd(): string;
7
+ declare function invisibleProdAzure(): string;
8
+ declare function invisibleDevnet(): string;
42
9
 
43
- export { invisibleDev, invisibleDevAzure, invisibleDevGcp, invisibleDevnet, invisibleProd, invisibleProdAzure, invisibleProdGcp };
10
+ export { INVISIBLE_COORDINATOR_URL, invisibleDevnet, invisibleProd, invisibleProdAzure };
package/dist/presets.js CHANGED
@@ -1,77 +1,19 @@
1
- import { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from './chunk-DIA6U2CV.js';
2
- import './chunk-GHBQF3A7.js';
3
1
  import './chunk-VR6T6OJS.js';
4
2
 
5
- // src/presets/azure-prod-maa.generated.ts
6
- var AZURE_PROD_MAA_TRUST = {
7
- issuer: "https://sharedweu.weu.attest.azure.net",
8
- jwksUrl: "https://sharedweu.weu.attest.azure.net/certs",
9
- policyHash: "9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco"};
3
+ // src/presets/coordinatorUrls.ts
4
+ var INVISIBLE_COORDINATOR_URL = "wss://tee-azure.invisible.exchange/ws-noise";
10
5
 
11
- // src/presets/index.ts
12
- var PLACEHOLDER_PIN = {
13
- mrtd: "",
14
- intelRootFingerprint: ""
15
- };
16
- var BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;
17
- var AZURE_PROD_RELEASE_PIN = {
18
- mrtd: "a2e61f1316e9e367e9c1f7a0adc98c48eb13875c399c85d286cee5ea2b05e57f2df9f61d903b0ae7ac5607d843dfffc1",
19
- runtimeProfile: "prod-devnet-simplified",
20
- intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,
21
- azureMaa: {
22
- issuer: AZURE_PROD_MAA_TRUST.issuer,
23
- jwksUrl: AZURE_PROD_MAA_TRUST.jwksUrl,
24
- policyHash: AZURE_PROD_MAA_TRUST.policyHash
25
- }
26
- };
27
- function invisibleProdGcp() {
28
- return [
29
- {
30
- wsUrl: "wss://tee.invisible.exchange/ws-noise",
31
- expectedHostname: "tee.invisible.exchange",
32
- releasePin: { ...PLACEHOLDER_PIN },
33
- requiredMode: "prod"
34
- }
35
- ];
6
+ // src/coordinator-url-presets.ts
7
+ function invisibleProd() {
8
+ return INVISIBLE_COORDINATOR_URL;
36
9
  }
37
- function invisibleProdAzure(approvedBinaryHash) {
38
- const binaryHash = typeof approvedBinaryHash === "string" ? approvedBinaryHash.toLowerCase() : "";
39
- if (!BINARY_HASH_HEX.test(binaryHash)) {
40
- throw new Error("invisibleProdAzure requires an approved 64-character binary SHA-256 hash");
41
- }
42
- return [
43
- {
44
- wsUrl: "wss://tee-azure.invisible.exchange/ws-noise",
45
- expectedHostname: "tee-azure.invisible.exchange",
46
- releasePin: { ...AZURE_PROD_RELEASE_PIN, binaryHash },
47
- requiredMode: "prod"
48
- }
49
- ];
10
+ function invisibleProdAzure() {
11
+ return INVISIBLE_COORDINATOR_URL;
50
12
  }
51
- var invisibleProd = invisibleProdAzure;
52
- var invisibleDevnet = invisibleProdAzure;
53
- function invisibleDevGcp() {
54
- return [
55
- {
56
- wsUrl: "wss://tee-dev.invisible.exchange/ws-noise",
57
- expectedHostname: "tee-dev.invisible.exchange",
58
- releasePin: { ...PLACEHOLDER_PIN },
59
- requiredMode: "dev"
60
- }
61
- ];
13
+ function invisibleDevnet() {
14
+ return INVISIBLE_COORDINATOR_URL;
62
15
  }
63
- function invisibleDevAzure() {
64
- return [
65
- {
66
- wsUrl: "wss://tee-azure-dev.invisible.exchange/ws-noise",
67
- expectedHostname: "tee-azure-dev.invisible.exchange",
68
- releasePin: { ...PLACEHOLDER_PIN },
69
- requiredMode: "dev"
70
- }
71
- ];
72
- }
73
- var invisibleDev = invisibleDevAzure;
74
16
 
75
- export { invisibleDev, invisibleDevAzure, invisibleDevGcp, invisibleDevnet, invisibleProd, invisibleProdAzure, invisibleProdGcp };
17
+ export { INVISIBLE_COORDINATOR_URL, invisibleDevnet, invisibleProd, invisibleProdAzure };
76
18
  //# sourceMappingURL=presets.js.map
77
19
  //# sourceMappingURL=presets.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/presets/azure-prod-maa.generated.ts","../src/presets/index.ts"],"names":[],"mappings":";;;;;AACO,IAAM,oBAAA,GAAuB;AAAA,EAClC,MAAA,EAAQ,wCAAA;AAAA,EACR,OAAA,EAAS,8CAAA;AAAA,EACT,UAAA,EAAY,6CAEd,CAAA;;;ACWA,IAAM,eAAA,GAAkB;AAAA,EACtB,IAAA,EAAM,EAAA;AAAA,EACN,oBAAA,EAAsB;AACxB,CAAA;AAEA,IAAM,eAAA,GAAkB,iBAAA;AAExB,IAAM,sBAAA,GAAyB;AAAA,EAC7B,IAAA,EAAM,kGAAA;AAAA,EACN,cAAA,EAAgB,wBAAA;AAAA,EAChB,oBAAA,EAAsB,oCAAA;AAAA,EACtB,QAAA,EAAU;AAAA,IACR,QAAQ,oBAAA,CAAqB,MAAA;AAAA,IAC7B,SAAS,oBAAA,CAAqB,OAAA;AAAA,IAC9B,YAAY,oBAAA,CAAqB;AAAA;AAErC,CAAA;AASO,SAAS,gBAAA,GAA0C;AACxD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,uCAAA;AAAA,MACP,gBAAA,EAAkB,wBAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,SAAS,mBAAmB,kBAAA,EAAmD;AACpF,EAAA,MAAM,aAAa,OAAO,kBAAA,KAAuB,QAAA,GAAW,kBAAA,CAAmB,aAAY,GAAI,EAAA;AAC/F,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,6CAAA;AAAA,MACP,gBAAA,EAAkB,8BAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,sBAAA,EAAwB,UAAA,EAAW;AAAA,MACpD,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AASO,IAAM,aAAA,GAAgB;AAGtB,IAAM,eAAA,GAAkB;AAGxB,SAAS,eAAA,GAAyC;AACvD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,2CAAA;AAAA,MACP,gBAAA,EAAkB,4BAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,SAAS,iBAAA,GAA2C;AACzD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,iDAAA;AAAA,MACP,gBAAA,EAAkB,kCAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,IAAM,YAAA,GAAe","file":"presets.js","sourcesContent":["// Generated by npm run release:trust-policy:generate-sdk. Do not edit.\nexport const AZURE_PROD_MAA_TRUST = {\n issuer: \"https://sharedweu.weu.attest.azure.net\",\n jwksUrl: \"https://sharedweu.weu.attest.azure.net/certs\",\n policyHash: \"9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco\",\n trustSetVersion: \"azure-prod-maa-v1\",\n} as const;\n","/**\n * `@invisible-labs/sdk/presets` - optional Invisible coordinator endpoint presets.\n *\n * This is the ONLY module permitted to name an `invisible.exchange` host (spec\n * section 6.2). Partners who self-host ignore it entirely and pass their own\n * `CoordinatorEndpoint[]` to `createSession`. The core never imports this module.\n *\n * Production presets embed an approved Azure TDX boot measurement and trust\n * roots. The caller must provide the separately approved coordinator binary\n * hash before a production endpoint can be constructed. Dormant or\n * development targets keep placeholders until approval.\n */\n\nimport { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from \"../attestation/verifier.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\nimport { AZURE_PROD_MAA_TRUST } from \"./azure-prod-maa.generated.js\";\n\nconst PLACEHOLDER_PIN = {\n mrtd: \"\",\n intelRootFingerprint: \"\",\n} as const;\n\nconst BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;\n\nconst AZURE_PROD_RELEASE_PIN = {\n mrtd: \"a2e61f1316e9e367e9c1f7a0adc98c48eb13875c399c85d286cee5ea2b05e57f2df9f61d903b0ae7ac5607d843dfffc1\",\n runtimeProfile: \"prod-devnet-simplified\",\n intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,\n azureMaa: {\n issuer: AZURE_PROD_MAA_TRUST.issuer,\n jwksUrl: AZURE_PROD_MAA_TRUST.jwksUrl,\n policyHash: AZURE_PROD_MAA_TRUST.policyHash,\n },\n} as const;\n\n/**\n * Production GCP TDX coordinator endpoint.\n *\n * Currently dormant: GCP is neither the live production nor development TEE\n * path. Kept only for a future explicit GCP relight, or a partner self-hosting\n * on GCP.\n */\nexport function invisibleProdGcp(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee.invisible.exchange/ws-noise\",\n expectedHostname: \"tee.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"prod\",\n },\n ];\n}\n\n/** Production Azure TDX coordinator endpoint for the current prod/devnet release. */\nexport function invisibleProdAzure(approvedBinaryHash: string): CoordinatorEndpoint[] {\n const binaryHash = typeof approvedBinaryHash === \"string\" ? approvedBinaryHash.toLowerCase() : \"\";\n if (!BINARY_HASH_HEX.test(binaryHash)) {\n throw new Error(\"invisibleProdAzure requires an approved 64-character binary SHA-256 hash\");\n }\n return [\n {\n wsUrl: \"wss://tee-azure.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-azure.invisible.exchange\",\n releasePin: { ...AZURE_PROD_RELEASE_PIN, binaryHash },\n requiredMode: \"prod\",\n },\n ];\n}\n\n/**\n * The currently-active Invisible production preset. Integrators that just want\n * \"Invisible prod\" use this and stay on whichever cloud is live.\n *\n * Switching the prod target between Azure and GCP is this one line:\n * `export const invisibleProd = invisibleProdAzure` -> `invisibleProdGcp`.\n */\nexport const invisibleProd = invisibleProdAzure;\n\n/** Public Invisible devnet, served by the simplified Azure prod coordinator. */\nexport const invisibleDevnet = invisibleProdAzure;\n\n/** Dormant GCP development coordinator endpoint. Not the active dev target today. */\nexport function invisibleDevGcp(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee-dev.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-dev.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"dev\",\n },\n ];\n}\n\n/** Azure development coordinator endpoint. The active dev TEE today. */\nexport function invisibleDevAzure(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee-azure-dev.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-azure-dev.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"dev\",\n },\n ];\n}\n\n/** The currently-active Invisible development preset. */\nexport const invisibleDev = invisibleDevAzure;\n"]}
1
+ {"version":3,"sources":["../src/presets/coordinatorUrls.ts","../src/coordinator-url-presets.ts"],"names":[],"mappings":";;;AAEO,IAAM,yBAAA,GAA4B;;;ACIlC,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,yBAAA;AACT;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,yBAAA;AACT;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,yBAAA;AACT","file":"presets.js","sourcesContent":["/** Coordinator URL presets. Keep URL selection separate from security policy. */\n\nexport const INVISIBLE_COORDINATOR_URL = \"wss://tee-azure.invisible.exchange/ws-noise\";\nexport const AZURE_DEV_COORDINATOR_URL = \"wss://tee-azure-dev.invisible.exchange/ws-noise\";\n","/** Coordinator URL conveniences for the published SDK surface. */\n\nimport { INVISIBLE_COORDINATOR_URL } from \"./presets/coordinatorUrls.js\";\n\nexport { INVISIBLE_COORDINATOR_URL } from \"./presets/coordinatorUrls.js\";\n\nexport function invisibleProd(): string {\n return INVISIBLE_COORDINATOR_URL;\n}\n\nexport function invisibleProdAzure(): string {\n return INVISIBLE_COORDINATOR_URL;\n}\n\nexport function invisibleDevnet(): string {\n return INVISIBLE_COORDINATOR_URL;\n}\n"]}
package/dist/stats.js CHANGED
@@ -1,4 +1,4 @@
1
- import { NotImplementedError } from './chunk-GHBQF3A7.js';
1
+ import { NotImplementedError } from './chunk-QRN46R3F.js';
2
2
  import './chunk-VR6T6OJS.js';
3
3
 
4
4
  // src/stats/index.ts
package/dist/storage.js CHANGED
@@ -1,246 +1,5 @@
1
- import { StorageError } from './chunk-GHBQF3A7.js';
1
+ export { browserStorage, extensionStorage, inMemoryStorage } from './chunk-DCTYBUY3.js';
2
+ import './chunk-QRN46R3F.js';
2
3
  import './chunk-VR6T6OJS.js';
3
-
4
- // src/storage/index.ts
5
- var STORAGE_KEY_PREFIX = "invisible:sdk:storage:v1:";
6
- var STORAGE_KEY_SEPARATOR = ":";
7
- var BASE64URL_PAD = "=";
8
- var BASE64URL_PLUS = "+";
9
- var BASE64URL_SLASH = "/";
10
- var BASE64URL_MINUS = "-";
11
- var BASE64URL_UNDERSCORE = "_";
12
- var BYTE_STRING_CHUNK_SIZE = 32768;
13
- var EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL = "TRUSTED_CONTEXTS";
14
- function inMemoryStorage() {
15
- const namespaces = /* @__PURE__ */ new Map();
16
- const bucket = (namespace) => {
17
- let inner = namespaces.get(namespace);
18
- if (!inner) {
19
- inner = /* @__PURE__ */ new Map();
20
- namespaces.set(namespace, inner);
21
- }
22
- return inner;
23
- };
24
- return {
25
- kind: "memory",
26
- async put(namespace, key, value) {
27
- bucket(namespace).set(key, value);
28
- },
29
- async get(namespace, key) {
30
- return namespaces.get(namespace)?.get(key) ?? null;
31
- },
32
- async list(namespace) {
33
- return [...namespaces.get(namespace)?.keys() ?? []];
34
- },
35
- async remove(namespace, key) {
36
- namespaces.get(namespace)?.delete(key);
37
- }
38
- };
39
- }
40
- function browserStorage(options = {}) {
41
- const storage = options.storage ?? defaultBrowserStorage();
42
- if (!storage) throw new StorageError("STORAGE_NOT_AVAILABLE", "localStorage is unavailable");
43
- return {
44
- kind: "browser",
45
- async put(namespace, key, value) {
46
- try {
47
- storage.setItem(storageKey(namespace, key), bytesToBase64Url(value));
48
- } catch (cause) {
49
- throw browserOperationError(cause);
50
- }
51
- },
52
- async get(namespace, key) {
53
- try {
54
- const value = storage.getItem(storageKey(namespace, key));
55
- return value === null ? null : base64UrlToBytes(value);
56
- } catch (cause) {
57
- throw browserOperationError(cause);
58
- }
59
- },
60
- async list(namespace) {
61
- try {
62
- const prefix = storageKeyPrefix(namespace);
63
- const keys = [];
64
- for (let index = 0; index < storage.length; index += 1) {
65
- const storedKey = storage.key(index);
66
- if (storedKey?.startsWith(prefix)) {
67
- keys.push(decodeStorageSegment(storedKey.slice(prefix.length)));
68
- }
69
- }
70
- return keys;
71
- } catch (cause) {
72
- throw browserOperationError(cause);
73
- }
74
- },
75
- async remove(namespace, key) {
76
- try {
77
- storage.removeItem(storageKey(namespace, key));
78
- } catch (cause) {
79
- throw browserOperationError(cause);
80
- }
81
- }
82
- };
83
- }
84
- function extensionStorage(options = {}) {
85
- const storage = options.storage ?? defaultExtensionStorage();
86
- if (!storage) {
87
- throw new StorageError("STORAGE_NOT_AVAILABLE", "extension local storage is unavailable");
88
- }
89
- const runtime = options.runtime ?? defaultExtensionRuntime();
90
- const trustedAccess = options.restrictAccessToTrustedContexts === false ? Promise.resolve() : extensionSetAccessLevel(storage, runtime);
91
- return {
92
- kind: "extension",
93
- async put(namespace, key, value) {
94
- await trustedAccess;
95
- await extensionSet(storage, runtime, {
96
- [storageKey(namespace, key)]: bytesToBase64Url(value)
97
- });
98
- },
99
- async get(namespace, key) {
100
- await trustedAccess;
101
- const storedKey = storageKey(namespace, key);
102
- const values = await extensionGet(storage, runtime, storedKey);
103
- const value = values[storedKey];
104
- return typeof value === "string" ? base64UrlToBytes(value) : null;
105
- },
106
- async list(namespace) {
107
- await trustedAccess;
108
- const prefix = storageKeyPrefix(namespace);
109
- const values = await extensionGet(storage, runtime, null);
110
- return Object.keys(values).filter((key) => key.startsWith(prefix)).map((key) => decodeStorageSegment(key.slice(prefix.length)));
111
- },
112
- async remove(namespace, key) {
113
- await trustedAccess;
114
- await extensionRemove(storage, runtime, storageKey(namespace, key));
115
- }
116
- };
117
- }
118
- function storageKey(namespace, key) {
119
- return `${storageKeyPrefix(namespace)}${encodeStorageSegment(key)}`;
120
- }
121
- function storageKeyPrefix(namespace) {
122
- return `${STORAGE_KEY_PREFIX}${encodeStorageSegment(namespace)}${STORAGE_KEY_SEPARATOR}`;
123
- }
124
- function encodeStorageSegment(value) {
125
- return encodeURIComponent(value);
126
- }
127
- function decodeStorageSegment(value) {
128
- return decodeURIComponent(value);
129
- }
130
- function bytesToBase64Url(value) {
131
- let binary = "";
132
- for (let index = 0; index < value.length; index += BYTE_STRING_CHUNK_SIZE) {
133
- binary += String.fromCharCode(...value.slice(index, index + BYTE_STRING_CHUNK_SIZE));
134
- }
135
- return btoa(binary).split(BASE64URL_PLUS).join(BASE64URL_MINUS).split(BASE64URL_SLASH).join(BASE64URL_UNDERSCORE).split(BASE64URL_PAD).join("");
136
- }
137
- function base64UrlToBytes(value) {
138
- try {
139
- const base64 = value.split(BASE64URL_MINUS).join(BASE64URL_PLUS).split(BASE64URL_UNDERSCORE).join(BASE64URL_SLASH).padEnd(Math.ceil(value.length / 4) * 4, BASE64URL_PAD);
140
- return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));
141
- } catch (cause) {
142
- throw new StorageError("STORAGE_DECRYPT_FAILED", "stored value is not valid base64url", {
143
- cause
144
- });
145
- }
146
- }
147
- function defaultBrowserStorage() {
148
- try {
149
- return globalThis.localStorage;
150
- } catch (cause) {
151
- throw new StorageError("STORAGE_NOT_AVAILABLE", "localStorage is unavailable", { cause });
152
- }
153
- }
154
- function browserOperationError(cause) {
155
- if (cause instanceof StorageError) return cause;
156
- return new StorageError(
157
- "STORAGE_NOT_AVAILABLE",
158
- storageErrorMessage(cause) ?? "localStorage operation failed",
159
- { cause }
160
- );
161
- }
162
- function defaultExtensionStorage() {
163
- const global = globalThis;
164
- return global.chrome?.storage?.local ?? global.browser?.storage?.local;
165
- }
166
- function defaultExtensionRuntime() {
167
- const global = globalThis;
168
- return global.chrome?.runtime ?? global.browser?.runtime;
169
- }
170
- function extensionGet(storage, runtime, keys) {
171
- return new Promise((resolve, reject) => {
172
- const maybePromise = storage.get(keys, (items) => {
173
- const error = extensionLastError(runtime);
174
- if (error) reject(extensionOperationError(error));
175
- else resolve(items);
176
- });
177
- if (isPromise(maybePromise)) {
178
- maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));
179
- }
180
- });
181
- }
182
- function extensionSet(storage, runtime, items) {
183
- return new Promise((resolve, reject) => {
184
- const maybePromise = storage.set(items, () => {
185
- const error = extensionLastError(runtime);
186
- if (error) reject(extensionOperationError(error));
187
- else resolve();
188
- });
189
- if (isPromise(maybePromise))
190
- maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));
191
- });
192
- }
193
- function extensionRemove(storage, runtime, key) {
194
- return new Promise((resolve, reject) => {
195
- const maybePromise = storage.remove(key, () => {
196
- const error = extensionLastError(runtime);
197
- if (error) reject(extensionOperationError(error));
198
- else resolve();
199
- });
200
- if (isPromise(maybePromise))
201
- maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));
202
- });
203
- }
204
- function extensionSetAccessLevel(storage, runtime) {
205
- const setAccessLevel = storage.setAccessLevel;
206
- if (!setAccessLevel) return Promise.resolve();
207
- return new Promise((resolve, reject) => {
208
- const maybePromise = setAccessLevel.call(
209
- storage,
210
- { accessLevel: EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL },
211
- () => {
212
- const error = extensionLastError(runtime);
213
- if (error) reject(extensionOperationError(error));
214
- else resolve();
215
- }
216
- );
217
- if (isPromise(maybePromise))
218
- maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));
219
- });
220
- }
221
- function extensionLastError(runtime) {
222
- return runtime?.lastError ?? null;
223
- }
224
- function extensionOperationError(error) {
225
- if (error instanceof StorageError) return error;
226
- return new StorageError(
227
- "STORAGE_NOT_AVAILABLE",
228
- storageErrorMessage(error) ?? "extension storage operation failed",
229
- { cause: error }
230
- );
231
- }
232
- function storageErrorMessage(error) {
233
- if (error instanceof Error) return error.message;
234
- if (typeof error === "object" && error !== null && "message" in error) {
235
- const message = error.message;
236
- if (typeof message === "string") return message;
237
- }
238
- return void 0;
239
- }
240
- function isPromise(value) {
241
- return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
242
- }
243
-
244
- export { browserStorage, extensionStorage, inMemoryStorage };
245
4
  //# sourceMappingURL=storage.js.map
246
5
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/index.ts"],"names":[],"mappings":"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","file":"storage.js","sourcesContent":["/**\n * `@invisible-labs/sdk/storage` - storage adapters (spec section 7).\n *\n * The SDK persists recoverable secrets (Recovery Code, LP Position Code, LP\n * Refill Key, withdrawal secret) only through a {@link StorageAdapter}. The\n * `memory`, `browser`, and `extension` adapters are real. Browser and\n * extension adapters persist the bytes provided by the caller; callers that need\n * encrypted-at-rest storage can wrap/encrypt bytes before calling `put`.\n */\n\nimport { StorageError } from \"../core/errors.js\";\n\nconst STORAGE_KEY_PREFIX = \"invisible:sdk:storage:v1:\";\nconst STORAGE_KEY_SEPARATOR = \":\";\nconst BASE64URL_PAD = \"=\";\nconst BASE64URL_PLUS = \"+\";\nconst BASE64URL_SLASH = \"/\";\nconst BASE64URL_MINUS = \"-\";\nconst BASE64URL_UNDERSCORE = \"_\";\nconst BYTE_STRING_CHUNK_SIZE = 0x8000;\nconst EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL = \"TRUSTED_CONTEXTS\";\n\n/**\n * A namespaced key/value store for the SDK's recoverable secrets. Values are\n * raw bytes. Callers may store plaintext bytes, pre-wrapped bytes, or encrypted\n * bytes depending on their host product's storage model.\n */\nexport interface StorageAdapter {\n /** Which backing the adapter uses. */\n readonly kind: \"browser\" | \"extension\" | \"server-hkdf\" | \"server-custom\" | \"memory\";\n put(namespace: string, key: string, value: Uint8Array): Promise<void>;\n get(namespace: string, key: string): Promise<Uint8Array | null>;\n list(namespace: string): Promise<string[]>;\n remove(namespace: string, key: string): Promise<void>;\n /** `server-hkdf` only: derive a secret from a stable domain context. */\n derive?(namespace: string, context: string): Promise<Uint8Array>;\n}\n\nexport interface BrowserStorageOptions {\n /** Override for tests or custom host environments. Defaults to `globalThis.localStorage`. */\n readonly storage?: StorageLike;\n}\n\nexport interface ExtensionStorageOptions {\n /** Override for tests or custom extension hosts. Defaults to chrome/browser storage local. */\n readonly storage?: ExtensionStorageArea;\n /** Override for tests or custom extension hosts. Defaults to chrome/browser runtime. */\n readonly runtime?: ExtensionRuntimeLike;\n /**\n * Chrome exposes storage.local to content scripts by default. Keep the default\n * trusted-context restriction when the host API supports it.\n */\n readonly restrictAccessToTrustedContexts?: boolean;\n}\n\ninterface StorageLike {\n readonly length: number;\n key(index: number): string | null;\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\ninterface ExtensionStorageArea {\n get(\n keys?: string | string[] | Record<string, unknown> | null,\n callback?: (items: Record<string, unknown>) => void,\n ): Promise<Record<string, unknown>> | void;\n set(items: Record<string, string>, callback?: () => void): Promise<void> | void;\n remove(keys: string | string[], callback?: () => void): Promise<void> | void;\n setAccessLevel?(details: { accessLevel: string }, callback?: () => void): Promise<void> | void;\n}\n\ninterface ExtensionRuntimeLike {\n readonly lastError?: { readonly message?: string } | null;\n}\n\n/**\n * In-memory adapter. Fully functional, unencrypted, non-persistent - intended\n * for tests and ephemeral flows, never for real secrets at rest.\n */\nexport function inMemoryStorage(): StorageAdapter {\n // Each namespace is a separate inner map rather than a flattened composite\n // key, so a namespace or key containing any character (including a separator)\n // can never collide across namespaces.\n const namespaces = new Map<string, Map<string, Uint8Array>>();\n const bucket = (namespace: string) => {\n let inner = namespaces.get(namespace);\n if (!inner) {\n inner = new Map<string, Uint8Array>();\n namespaces.set(namespace, inner);\n }\n return inner;\n };\n return {\n kind: \"memory\",\n async put(namespace, key, value) {\n bucket(namespace).set(key, value);\n },\n async get(namespace, key) {\n return namespaces.get(namespace)?.get(key) ?? null;\n },\n async list(namespace) {\n return [...(namespaces.get(namespace)?.keys() ?? [])];\n },\n async remove(namespace, key) {\n namespaces.get(namespace)?.delete(key);\n },\n };\n}\n\n/**\n * Browser `localStorage` adapter. Values are stored as base64url-encoded bytes.\n * Encrypt or wrap the bytes before `put` if your product requires encrypted\n * local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if `localStorage` is unavailable.\n */\nexport function browserStorage(options: BrowserStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultBrowserStorage();\n if (!storage) throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\");\n return {\n kind: \"browser\",\n async put(namespace, key, value) {\n try {\n storage.setItem(storageKey(namespace, key), bytesToBase64Url(value));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async get(namespace, key) {\n try {\n const value = storage.getItem(storageKey(namespace, key));\n return value === null ? null : base64UrlToBytes(value);\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async list(namespace) {\n try {\n const prefix = storageKeyPrefix(namespace);\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const storedKey = storage.key(index);\n if (storedKey?.startsWith(prefix)) {\n keys.push(decodeStorageSegment(storedKey.slice(prefix.length)));\n }\n }\n return keys;\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n async remove(namespace, key) {\n try {\n storage.removeItem(storageKey(namespace, key));\n } catch (cause) {\n throw browserOperationError(cause);\n }\n },\n };\n}\n\n/**\n * Browser-extension (`chrome.storage.local` / `browser.storage.local`) adapter.\n * Values are stored as base64url-encoded bytes. Encrypt or wrap the bytes before\n * `put` if your product requires encrypted local persistence.\n *\n * @throws StorageError `STORAGE_NOT_AVAILABLE` if extension storage is unavailable.\n */\nexport function extensionStorage(options: ExtensionStorageOptions = {}): StorageAdapter {\n const storage = options.storage ?? defaultExtensionStorage();\n if (!storage) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"extension local storage is unavailable\");\n }\n const runtime = options.runtime ?? defaultExtensionRuntime();\n const trustedAccess =\n options.restrictAccessToTrustedContexts === false\n ? Promise.resolve()\n : extensionSetAccessLevel(storage, runtime);\n return {\n kind: \"extension\",\n async put(namespace, key, value) {\n await trustedAccess;\n await extensionSet(storage, runtime, {\n [storageKey(namespace, key)]: bytesToBase64Url(value),\n });\n },\n async get(namespace, key) {\n await trustedAccess;\n const storedKey = storageKey(namespace, key);\n const values = await extensionGet(storage, runtime, storedKey);\n const value = values[storedKey];\n return typeof value === \"string\" ? base64UrlToBytes(value) : null;\n },\n async list(namespace) {\n await trustedAccess;\n const prefix = storageKeyPrefix(namespace);\n const values = await extensionGet(storage, runtime, null);\n return Object.keys(values)\n .filter((key) => key.startsWith(prefix))\n .map((key) => decodeStorageSegment(key.slice(prefix.length)));\n },\n async remove(namespace, key) {\n await trustedAccess;\n await extensionRemove(storage, runtime, storageKey(namespace, key));\n },\n };\n}\n\nfunction storageKey(namespace: string, key: string): string {\n return `${storageKeyPrefix(namespace)}${encodeStorageSegment(key)}`;\n}\n\nfunction storageKeyPrefix(namespace: string): string {\n return `${STORAGE_KEY_PREFIX}${encodeStorageSegment(namespace)}${STORAGE_KEY_SEPARATOR}`;\n}\n\nfunction encodeStorageSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction decodeStorageSegment(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction bytesToBase64Url(value: Uint8Array): string {\n let binary = \"\";\n for (let index = 0; index < value.length; index += BYTE_STRING_CHUNK_SIZE) {\n binary += String.fromCharCode(...value.slice(index, index + BYTE_STRING_CHUNK_SIZE));\n }\n return btoa(binary)\n .split(BASE64URL_PLUS)\n .join(BASE64URL_MINUS)\n .split(BASE64URL_SLASH)\n .join(BASE64URL_UNDERSCORE)\n .split(BASE64URL_PAD)\n .join(\"\");\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n try {\n const base64 = value\n .split(BASE64URL_MINUS)\n .join(BASE64URL_PLUS)\n .split(BASE64URL_UNDERSCORE)\n .join(BASE64URL_SLASH)\n .padEnd(Math.ceil(value.length / 4) * 4, BASE64URL_PAD);\n return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));\n } catch (cause) {\n throw new StorageError(\"STORAGE_DECRYPT_FAILED\", \"stored value is not valid base64url\", {\n cause,\n });\n }\n}\n\nfunction defaultBrowserStorage(): StorageLike | undefined {\n try {\n return globalThis.localStorage;\n } catch (cause) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"localStorage is unavailable\", { cause });\n }\n}\n\nfunction browserOperationError(cause: unknown): StorageError {\n if (cause instanceof StorageError) return cause;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(cause) ?? \"localStorage operation failed\",\n { cause },\n );\n}\n\nfunction defaultExtensionStorage(): ExtensionStorageArea | undefined {\n const global = globalThis as {\n chrome?: { storage?: { local?: ExtensionStorageArea } };\n browser?: { storage?: { local?: ExtensionStorageArea } };\n };\n return global.chrome?.storage?.local ?? global.browser?.storage?.local;\n}\n\nfunction defaultExtensionRuntime(): ExtensionRuntimeLike | undefined {\n const global = globalThis as {\n chrome?: { runtime?: ExtensionRuntimeLike };\n browser?: { runtime?: ExtensionRuntimeLike };\n };\n return global.chrome?.runtime ?? global.browser?.runtime;\n}\n\nfunction extensionGet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n keys: string | string[] | Record<string, unknown> | null,\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.get(keys, (items) => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve(items);\n });\n if (isPromise<Record<string, unknown>>(maybePromise)) {\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n }\n });\n}\n\nfunction extensionSet(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n items: Record<string, string>,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.set(items, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionRemove(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n key: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const maybePromise = storage.remove(key, () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n });\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionSetAccessLevel(\n storage: ExtensionStorageArea,\n runtime: ExtensionRuntimeLike | undefined,\n): Promise<void> {\n const setAccessLevel = storage.setAccessLevel;\n if (!setAccessLevel) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const maybePromise = setAccessLevel.call(\n storage,\n { accessLevel: EXTENSION_TRUSTED_CONTEXTS_ACCESS_LEVEL },\n () => {\n const error = extensionLastError(runtime);\n if (error) reject(extensionOperationError(error));\n else resolve();\n },\n );\n if (isPromise<void>(maybePromise))\n maybePromise.then(resolve, (cause) => reject(extensionOperationError(cause)));\n });\n}\n\nfunction extensionLastError(\n runtime: ExtensionRuntimeLike | undefined,\n): { readonly message?: string } | null {\n return runtime?.lastError ?? null;\n}\n\nfunction extensionOperationError(error: unknown): StorageError {\n if (error instanceof StorageError) return error;\n return new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n storageErrorMessage(error) ?? \"extension storage operation failed\",\n { cause: error },\n );\n}\n\nfunction storageErrorMessage(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return undefined;\n}\n\nfunction isPromise<T>(value: unknown): value is Promise<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then: unknown }).then === \"function\"\n );\n}\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"storage.js"}
@@ -12,7 +12,7 @@
12
12
  * The conformance lint allowlists this file for that reason.
13
13
  */
14
14
  /** Attestation verification failures. Stop; do not retry without a new pin. */
15
- type AttestationErrorCode = "CERT_CHAIN_INVALID" | "TCB_REJECTED" | "FRESHNESS_NONCE_MISMATCH" | "NOISE_BINDING_MISMATCH" | "DEBUG_BIT_SET" | "MRTD_MISMATCH" | "RUNTIME_PROFILE_MISMATCH" | "AZURE_MAA_ISSUER_MISMATCH" | "AZURE_MAA_JWKS_INVALID" | "AZURE_MAA_POLICY_HASH_MISMATCH" | "AZURE_MAA_NOT_COMPLIANT" | "AZURE_MAA_DCAP_MISMATCH" | "AZURE_HCL_KEYS_MISMATCH" | "AZURE_AK_PUB_INVALID" | "AZURE_TPM_AK_QUOTE_INVALID" | "AZURE_TPM_QUALIFYING_DATA_MISMATCH" | "NOT_ATTESTED";
15
+ type AttestationErrorCode = "CERT_CHAIN_INVALID" | "TCB_REJECTED" | "FRESHNESS_NONCE_MISMATCH" | "NOISE_BINDING_MISMATCH" | "DEBUG_BIT_SET" | "MRTD_MISMATCH" | "RUNTIME_MEASUREMENTS_MISMATCH" | "RUNTIME_PROFILE_MISMATCH" | "AZURE_MAA_ISSUER_MISMATCH" | "AZURE_MAA_JWKS_INVALID" | "AZURE_MAA_POLICY_HASH_MISMATCH" | "AZURE_MAA_NOT_COMPLIANT" | "AZURE_MAA_DCAP_MISMATCH" | "AZURE_HCL_KEYS_MISMATCH" | "AZURE_AK_PUB_INVALID" | "AZURE_TPM_AK_QUOTE_INVALID" | "AZURE_TPM_QUALIFYING_DATA_MISMATCH" | "NOT_ATTESTED";
16
16
  /** Transport-level failures. Reconnect through the pool and re-attest. */
17
17
  type TransportErrorCode = "WS_HANDSHAKE_FAILED" | "NOISE_HANDSHAKE_FAILED" | "NOISE_FRAME_TOO_LARGE" | "CONNECTION_LOST";
18
18
  /** Leader/role routing failures. Failover and re-attest. */
@@ -24,7 +24,7 @@ type CoordinatorWireErrorCode = "ERR_INVALID_PAYLOAD" | "ERR_UNEXPECTED_TYPE" |
24
24
  /** Local input-validation failures. Never sent on the wire; fix the input. */
25
25
  type PolicyValidationErrorCode = "INVALID_PAYOUT_PLAN" | "INVALID_WITHDRAWAL_PLAN" | "INVALID_POSITION_AUTH" | "INVALID_REDEMPTION_PLAN" | "INVALID_DESTINATION_ADDRESS" | "INVALID_AMOUNT";
26
26
  /** Storage-adapter failures. */
27
- type StorageErrorCode = "STORAGE_NOT_AVAILABLE" | "STORAGE_KEY_MISSING" | "STORAGE_DECRYPT_FAILED";
27
+ type StorageErrorCode = "STORAGE_NOT_AVAILABLE" | "STORAGE_INVALID_ADAPTER" | "STORAGE_QUOTA_EXCEEDED" | "STORAGE_KEY_MISSING" | "STORAGE_DECRYPT_FAILED";
28
28
  /** Wallet-adapter failures. Bubble to the integrator UX. */
29
29
  type WalletErrorCode = "WALLET_NOT_CONNECTED" | "WALLET_USER_REJECTED" | "WALLET_INVALID_SIGNATURE";
30
30
  /** LP lifecycle local state that callers can branch on. */
@@ -38,6 +38,17 @@ interface InvisibleErrorOptions {
38
38
  /** The underlying error, preserved for debugging. */
39
39
  readonly cause?: unknown;
40
40
  }
41
+ /** Context attached to a client-persistence storage failure. */
42
+ type StorageErrorPhase = "session-init" | "write" | "allocation" | "recovery-code" | "ready" | "sync" | "refund" | "read" | "remove" | "purge";
43
+ /** Options accepted by {@link StorageError}. */
44
+ interface StorageErrorOptions extends InvisibleErrorOptions {
45
+ /** The affected normal-user swap, when known. */
46
+ readonly swapId?: string;
47
+ /** The client-persistence lifecycle phase that failed. */
48
+ readonly phase?: StorageErrorPhase;
49
+ /** True when the coordinator accepted the command before local failure. */
50
+ readonly remoteAccepted?: boolean;
51
+ }
41
52
  /** Options accepted by {@link CommandError}. */
42
53
  interface CommandErrorOptions extends InvisibleErrorOptions {
43
54
  /** Exact coordinator `Error` envelope code, when the rejection came from the wire. */
@@ -90,7 +101,10 @@ declare class PolicyValidationError extends InvisibleError {
90
101
  /** Storage-adapter failure. */
91
102
  declare class StorageError extends InvisibleError {
92
103
  readonly code: StorageErrorCode;
93
- constructor(code: StorageErrorCode, message: string, options?: InvisibleErrorOptions);
104
+ readonly swapId?: string;
105
+ readonly phase?: StorageErrorPhase;
106
+ readonly remoteAccepted?: boolean;
107
+ constructor(code: StorageErrorCode, message: string, options?: StorageErrorOptions);
94
108
  }
95
109
  /** Wallet-adapter failure. */
96
110
  declare class WalletError extends InvisibleError {
@@ -122,4 +136,51 @@ declare function isInvisibleError(value: unknown): value is InvisibleError;
122
136
  */
123
137
  declare function normalizeError(error: unknown, fallback?: string): string;
124
138
 
125
- export { AttestationError as A, CommandError as C, InvalidDepositAmountError as I, LpLifecycleError as L, NotImplementedError as N, PolicyValidationError as P, RoutingError as R, StorageError as S, TransportError as T, WalletError as W, type AttestationErrorCode as a, type CommandErrorCode as b, type CommandErrorOptions as c, type CoordinatorWireErrorCode as d, InvisibleError as e, type InvisibleErrorCode as f, type InvisibleErrorOptions as g, type LpLifecycleErrorCode as h, type NotImplementedErrorCode as i, type PolicyValidationErrorCode as j, type RoutingErrorCode as k, type StorageErrorCode as l, type TransportErrorCode as m, type WalletErrorCode as n, isInvisibleError as o, normalizeError as p };
139
+ type RuntimeMeasurements = {
140
+ readonly rtmr0: string;
141
+ readonly rtmr1: string;
142
+ readonly rtmr2: string;
143
+ readonly rtmr3: string;
144
+ };
145
+ type LpPositionView = {
146
+ readonly id: string;
147
+ readonly status: "dkg_pending" | "active" | "withdrawing" | "closed";
148
+ readonly targetShardCount: number;
149
+ readonly authPublicKey: string;
150
+ readonly refillPublicKey: string;
151
+ readonly withdrawalCommitment: string;
152
+ readonly committedLamports: number;
153
+ readonly earnedLamports: number;
154
+ readonly refillThreshold: number;
155
+ readonly shards: readonly {
156
+ readonly [key: string]: unknown;
157
+ }[];
158
+ readonly createdAt: number;
159
+ readonly redemptionPermission?: {
160
+ readonly state: "unknown" | "locked" | "enabled";
161
+ readonly grantRevision: number;
162
+ readonly observedAtMs: number;
163
+ };
164
+ };
165
+ type PayoutDestination = {
166
+ readonly address: string;
167
+ readonly sharePercent: number;
168
+ readonly minDelayMs?: number;
169
+ readonly maxDelayMs?: number;
170
+ readonly minLamports?: number;
171
+ };
172
+ type PayoutPolicy = {
173
+ readonly destinations: readonly PayoutDestination[];
174
+ readonly totalDeadlineMs?: number;
175
+ readonly batchExclusionId?: string;
176
+ };
177
+ type StorageEnvelope = {
178
+ readonly namespace: string;
179
+ readonly key: string;
180
+ readonly alg: "AES-GCM" | "none";
181
+ readonly ciphertext: string;
182
+ readonly iv?: string;
183
+ readonly createdAtMs: number;
184
+ };
185
+
186
+ export { AttestationError as A, CommandError as C, InvalidDepositAmountError as I, LpLifecycleError as L, NotImplementedError as N, type PayoutPolicy as P, RoutingError as R, type StorageEnvelope as S, TransportError as T, WalletError as W, type AttestationErrorCode as a, type CommandErrorCode as b, type CommandErrorOptions as c, type CoordinatorWireErrorCode as d, InvisibleError as e, type InvisibleErrorCode as f, type InvisibleErrorOptions as g, type LpLifecycleErrorCode as h, type LpPositionView as i, type NotImplementedErrorCode as j, type PayoutDestination as k, PolicyValidationError as l, type PolicyValidationErrorCode as m, type RoutingErrorCode as n, type RuntimeMeasurements as o, StorageError as p, type StorageErrorCode as q, type StorageErrorOptions as r, type StorageErrorPhase as s, type TransportErrorCode as t, type WalletErrorCode as u, isInvisibleError as v, normalizeError as w };