@invisible-labs/sdk 0.6.0-devnet.4 → 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.
- package/README.md +70 -13
- package/dist/.invisible-sdk-build-target.json +2 -2
- package/dist/{chunk-UADJCUPK.js → chunk-3MDHAS4D.js} +6 -5
- package/dist/chunk-3MDHAS4D.js.map +1 -0
- package/dist/{chunk-E4DCEDAG.js → chunk-3TGQ4CZ3.js} +178 -2
- package/dist/chunk-3TGQ4CZ3.js.map +1 -0
- package/dist/chunk-DCTYBUY3.js +258 -0
- package/dist/chunk-DCTYBUY3.js.map +1 -0
- package/dist/{chunk-NHEHCUS5.js → chunk-EBWTAXNT.js} +3 -3
- package/dist/{chunk-NHEHCUS5.js.map → chunk-EBWTAXNT.js.map} +1 -1
- package/dist/{chunk-V5HXJRBW.js → chunk-HJFMDMPY.js} +3 -3
- package/dist/chunk-HJFMDMPY.js.map +1 -0
- package/dist/{chunk-GHBQF3A7.js → chunk-QRN46R3F.js} +5 -2
- package/dist/chunk-QRN46R3F.js.map +1 -0
- package/dist/chunk-Y7AK6RBV.js +4189 -0
- package/dist/chunk-Y7AK6RBV.js.map +1 -0
- package/dist/{coordinator-ZNLGAYXD.js → coordinator-PEWHNZ7I.js} +3 -3
- package/dist/{coordinator-ZNLGAYXD.js.map → coordinator-PEWHNZ7I.js.map} +1 -1
- package/dist/events.js +3 -3
- package/dist/index.d.ts +14 -4
- package/dist/index.js +74 -11
- package/dist/index.js.map +1 -1
- package/dist/lp.d.ts +33 -9
- package/dist/lp.js +305 -45
- package/dist/lp.js.map +1 -1
- package/dist/presets.d.ts +6 -2
- package/dist/presets.js +8 -8
- package/dist/presets.js.map +1 -1
- package/dist/stats.js +1 -1
- package/dist/storage.js +2 -243
- package/dist/storage.js.map +1 -1
- package/dist/{types.generated-DJBTjLpP.d.ts → types.generated-YhFu9ZBR.d.ts} +29 -4
- package/dist/user.d.ts +31 -4
- package/dist/user.js +409 -57
- package/dist/user.js.map +1 -1
- package/package.json +4 -1
- package/dist/chunk-5NNEO7IK.js +0 -1150
- package/dist/chunk-5NNEO7IK.js.map +0 -1
- package/dist/chunk-BRDLLGCZ.js +0 -59
- package/dist/chunk-BRDLLGCZ.js.map +0 -1
- package/dist/chunk-DIA6U2CV.js +0 -1927
- package/dist/chunk-DIA6U2CV.js.map +0 -1
- package/dist/chunk-E4DCEDAG.js.map +0 -1
- package/dist/chunk-GHBQF3A7.js.map +0 -1
- package/dist/chunk-UADJCUPK.js.map +0 -1
- package/dist/chunk-V5HXJRBW.js.map +0 -1
package/dist/presets.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Coordinator URL presets. Keep URL selection separate from security policy. */
|
|
2
|
+
declare const INVISIBLE_COORDINATOR_URL = "wss://tee-azure.invisible.exchange/ws-noise";
|
|
3
|
+
|
|
4
|
+
/** Coordinator URL conveniences for the published SDK surface. */
|
|
5
|
+
|
|
2
6
|
declare function invisibleProd(): string;
|
|
3
7
|
declare function invisibleProdAzure(): string;
|
|
4
8
|
declare function invisibleDevnet(): string;
|
|
5
9
|
|
|
6
|
-
export { invisibleDevnet, invisibleProd, invisibleProdAzure };
|
|
10
|
+
export { INVISIBLE_COORDINATOR_URL, invisibleDevnet, invisibleProd, invisibleProdAzure };
|
package/dist/presets.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { AZURE_PROD_COORDINATOR_URL } from './chunk-BRDLLGCZ.js';
|
|
2
|
-
import './chunk-DIA6U2CV.js';
|
|
3
|
-
import './chunk-GHBQF3A7.js';
|
|
4
1
|
import './chunk-VR6T6OJS.js';
|
|
5
2
|
|
|
6
|
-
// src/
|
|
3
|
+
// src/presets/coordinatorUrls.ts
|
|
4
|
+
var INVISIBLE_COORDINATOR_URL = "wss://tee-azure.invisible.exchange/ws-noise";
|
|
5
|
+
|
|
6
|
+
// src/coordinator-url-presets.ts
|
|
7
7
|
function invisibleProd() {
|
|
8
|
-
return
|
|
8
|
+
return INVISIBLE_COORDINATOR_URL;
|
|
9
9
|
}
|
|
10
10
|
function invisibleProdAzure() {
|
|
11
|
-
return
|
|
11
|
+
return INVISIBLE_COORDINATOR_URL;
|
|
12
12
|
}
|
|
13
13
|
function invisibleDevnet() {
|
|
14
|
-
return
|
|
14
|
+
return INVISIBLE_COORDINATOR_URL;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export { invisibleDevnet, invisibleProd, invisibleProdAzure };
|
|
17
|
+
export { INVISIBLE_COORDINATOR_URL, invisibleDevnet, invisibleProd, invisibleProdAzure };
|
|
18
18
|
//# sourceMappingURL=presets.js.map
|
|
19
19
|
//# sourceMappingURL=presets.js.map
|
package/dist/presets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
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
package/dist/storage.js
CHANGED
|
@@ -1,246 +1,5 @@
|
|
|
1
|
-
|
|
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
|
package/dist/storage.js.map
CHANGED
|
@@ -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
|
-
|
|
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,6 +136,12 @@ declare function isInvisibleError(value: unknown): value is InvisibleError;
|
|
|
122
136
|
*/
|
|
123
137
|
declare function normalizeError(error: unknown, fallback?: string): string;
|
|
124
138
|
|
|
139
|
+
type RuntimeMeasurements = {
|
|
140
|
+
readonly rtmr0: string;
|
|
141
|
+
readonly rtmr1: string;
|
|
142
|
+
readonly rtmr2: string;
|
|
143
|
+
readonly rtmr3: string;
|
|
144
|
+
};
|
|
125
145
|
type LpPositionView = {
|
|
126
146
|
readonly id: string;
|
|
127
147
|
readonly status: "dkg_pending" | "active" | "withdrawing" | "closed";
|
|
@@ -136,6 +156,11 @@ type LpPositionView = {
|
|
|
136
156
|
readonly [key: string]: unknown;
|
|
137
157
|
}[];
|
|
138
158
|
readonly createdAt: number;
|
|
159
|
+
readonly redemptionPermission?: {
|
|
160
|
+
readonly state: "unknown" | "locked" | "enabled";
|
|
161
|
+
readonly grantRevision: number;
|
|
162
|
+
readonly observedAtMs: number;
|
|
163
|
+
};
|
|
139
164
|
};
|
|
140
165
|
type PayoutDestination = {
|
|
141
166
|
readonly address: string;
|
|
@@ -158,4 +183,4 @@ type StorageEnvelope = {
|
|
|
158
183
|
readonly createdAtMs: number;
|
|
159
184
|
};
|
|
160
185
|
|
|
161
|
-
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,
|
|
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 };
|
package/dist/user.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { S as Session } from './session-DFuy54C-.js';
|
|
2
|
-
import { P as PayoutPolicy } from './types.generated-
|
|
3
|
-
export { I as InvalidDepositAmountError } from './types.generated-
|
|
2
|
+
import { P as PayoutPolicy } from './types.generated-YhFu9ZBR.js';
|
|
3
|
+
export { I as InvalidDepositAmountError } from './types.generated-YhFu9ZBR.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Acceptance receipts (spec section 8.2).
|
|
@@ -18,6 +18,7 @@ interface AcceptanceReceipt {
|
|
|
18
18
|
readonly state?: string;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/** Shared normal-user transfer types used without importing an actor entrypoint. */
|
|
21
22
|
type ClientSwapState = "new" | "awaiting_dkg" | "awaiting_deposit" | "awaiting_delegation" | "awaiting_delegate_ack" | "awaiting_delegate_ack_after_deposit" | "ready_for_settlement" | "settling" | "completed" | "refunded" | "failed";
|
|
22
23
|
type PayoutSpec = {
|
|
23
24
|
readonly mode: "instant";
|
|
@@ -46,6 +47,7 @@ type SpendingPolicySnapshot = {
|
|
|
46
47
|
readonly fee_lamports: number;
|
|
47
48
|
readonly net_payout_lamports: number;
|
|
48
49
|
};
|
|
50
|
+
|
|
49
51
|
type PayoutExecutedPayload = {
|
|
50
52
|
readonly index: number;
|
|
51
53
|
readonly amount_lamports: number;
|
|
@@ -199,7 +201,7 @@ type ResumePreDelegationParams = {
|
|
|
199
201
|
readonly resumeSecret: Uint8Array;
|
|
200
202
|
readonly syncSecret?: Uint8Array;
|
|
201
203
|
readonly recoveryCommitment: Uint8Array;
|
|
202
|
-
/** The policy snapshot
|
|
204
|
+
/** The policy snapshot returned when the contract was first allocated. */
|
|
203
205
|
readonly policySnapshot: SpendingPolicySnapshot;
|
|
204
206
|
/** Called before DkgRound2 so recovery can persist the generated Alice share. */
|
|
205
207
|
readonly onDelegateShareReady?: RunSwapParams["onDelegateShareReady"];
|
|
@@ -214,6 +216,31 @@ type ResumePreDelegationResult = {
|
|
|
214
216
|
readonly delegatedAtMs: number;
|
|
215
217
|
};
|
|
216
218
|
|
|
219
|
+
declare const CLIENT_PERSISTENCE_SCHEMA_VERSION = 1;
|
|
220
|
+
type PersistedTransferStage = "allocation" | "ready" | "terminal-cleaned";
|
|
221
|
+
/** Public, local-only projection of an SDK-owned normal-user transfer record. */
|
|
222
|
+
interface PersistedTransfer {
|
|
223
|
+
readonly schemaVersion: typeof CLIENT_PERSISTENCE_SCHEMA_VERSION;
|
|
224
|
+
readonly stage: PersistedTransferStage;
|
|
225
|
+
readonly swapId: string;
|
|
226
|
+
readonly amountLamports: number;
|
|
227
|
+
readonly destinationAddress: string;
|
|
228
|
+
readonly policySnapshot: SpendingPolicySnapshot;
|
|
229
|
+
readonly status: ClientSwapState;
|
|
230
|
+
readonly stateVersion?: number;
|
|
231
|
+
readonly updatedAtMs: number;
|
|
232
|
+
readonly coordinatorTimestampMs?: number;
|
|
233
|
+
readonly depositAddress?: string;
|
|
234
|
+
readonly depositExpiresAtMs?: number;
|
|
235
|
+
readonly delegatedAtMs?: number;
|
|
236
|
+
readonly syncSecret?: Uint8Array;
|
|
237
|
+
readonly recoveryCode?: Uint8Array;
|
|
238
|
+
}
|
|
239
|
+
declare function listPersistedTransfers(session: Session): Promise<readonly PersistedTransfer[]>;
|
|
240
|
+
declare function getPersistedTransfer(session: Session, swapId: string): Promise<PersistedTransfer | null>;
|
|
241
|
+
declare function removePersistedTransfer(session: Session, swapId: string): Promise<void>;
|
|
242
|
+
declare function purgePersistedTransfers(session: Session): Promise<void>;
|
|
243
|
+
|
|
217
244
|
/**
|
|
218
245
|
* Payout policy validation (spec sections 4.3.1 and 10.1).
|
|
219
246
|
*
|
|
@@ -356,4 +383,4 @@ interface RequestRefundArgs {
|
|
|
356
383
|
*/
|
|
357
384
|
declare function requestRefund(session: Session, args: RequestRefundArgs): Promise<RefundAcceptanceReceipt>;
|
|
358
385
|
|
|
359
|
-
export { type ContractRequestArgs, type ContractRequestResult, INSTANT_PAYOUT_WINDOW_MS, MAX_ENTRY_AMOUNT_LAMPORTS, MIN_ENTRY_AMOUNT_LAMPORTS, type NormalUserActorSyncSnapshot, type NormalUserRefundability, type NormalUserSettlementPhase, PAYOUT_WINDOW_MILLISECONDS_PER_SECOND, type PayoutExecutedPayload, RECOVERY_CODE_BYTE_LENGTH, type RefundAcceptanceReceipt, type RefundExecutedPayload, type RequestRefundArgs, type ResumePreDelegationParams, type ResumePreDelegationResult, SUPPORTED_TOTAL_DEADLINE_MS, type SourceLiquidityUse, type SpendingPolicySnapshot, type SyncUserResponse, type SyncUserResponsePayload, type WithdrawExecutedPayload, commitmentFromCode, contractRequest, generateRecoveryCode, recoveryCodeFromHex, recoveryCodeFromUserInput, recoveryCodeToHex, requestRefund, resumePreDelegation, sync };
|
|
386
|
+
export { type ContractRequestArgs, type ContractRequestResult, INSTANT_PAYOUT_WINDOW_MS, MAX_ENTRY_AMOUNT_LAMPORTS, MIN_ENTRY_AMOUNT_LAMPORTS, type NormalUserActorSyncSnapshot, type NormalUserRefundability, type NormalUserSettlementPhase, PAYOUT_WINDOW_MILLISECONDS_PER_SECOND, type PayoutExecutedPayload, type PersistedTransfer, type PersistedTransferStage, RECOVERY_CODE_BYTE_LENGTH, type RefundAcceptanceReceipt, type RefundExecutedPayload, type RequestRefundArgs, type ResumePreDelegationParams, type ResumePreDelegationResult, SUPPORTED_TOTAL_DEADLINE_MS, type SourceLiquidityUse, type SpendingPolicySnapshot, type SyncUserResponse, type SyncUserResponsePayload, type WithdrawExecutedPayload, commitmentFromCode, contractRequest, generateRecoveryCode, getPersistedTransfer, listPersistedTransfers, purgePersistedTransfers, recoveryCodeFromHex, recoveryCodeFromUserInput, recoveryCodeToHex, removePersistedTransfer, requestRefund, resumePreDelegation, sync };
|