@0xkey-io/core 0.1.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/LICENSE +201 -0
- package/README.MD +7 -0
- package/dist/0xkey-helpers.d.ts +68 -0
- package/dist/0xkey-helpers.d.ts.map +1 -0
- package/dist/0xkey-helpers.js +466 -0
- package/dist/0xkey-helpers.js.map +1 -0
- package/dist/0xkey-helpers.mjs +399 -0
- package/dist/0xkey-helpers.mjs.map +1 -0
- package/dist/__clients__/core.d.ts +1201 -0
- package/dist/__clients__/core.d.ts.map +1 -0
- package/dist/__clients__/core.js +3489 -0
- package/dist/__clients__/core.js.map +1 -0
- package/dist/__clients__/core.mjs +3487 -0
- package/dist/__clients__/core.mjs.map +1 -0
- package/dist/__generated__/sdk-client-base.d.ts +281 -0
- package/dist/__generated__/sdk-client-base.d.ts.map +1 -0
- package/dist/__generated__/sdk-client-base.js +3906 -0
- package/dist/__generated__/sdk-client-base.js.map +1 -0
- package/dist/__generated__/sdk-client-base.mjs +3904 -0
- package/dist/__generated__/sdk-client-base.mjs.map +1 -0
- package/dist/__generated__/version.d.ts +2 -0
- package/dist/__generated__/version.d.ts.map +1 -0
- package/dist/__generated__/version.js +6 -0
- package/dist/__generated__/version.js.map +1 -0
- package/dist/__generated__/version.mjs +4 -0
- package/dist/__generated__/version.mjs.map +1 -0
- package/dist/__inputs__/public_api.types.d.ts +6014 -0
- package/dist/__inputs__/public_api.types.d.ts.map +1 -0
- package/dist/__polyfills__/jest.setup.webcrypto.d.ts +2 -0
- package/dist/__polyfills__/jest.setup.webcrypto.d.ts.map +1 -0
- package/dist/__polyfills__/window.d.ts +15 -0
- package/dist/__polyfills__/window.d.ts.map +1 -0
- package/dist/__polyfills__/window.js +30 -0
- package/dist/__polyfills__/window.js.map +1 -0
- package/dist/__polyfills__/window.mjs +28 -0
- package/dist/__polyfills__/window.mjs.map +1 -0
- package/dist/__stampers__/api/base.d.ts +27 -0
- package/dist/__stampers__/api/base.d.ts.map +1 -0
- package/dist/__stampers__/api/base.js +102 -0
- package/dist/__stampers__/api/base.js.map +1 -0
- package/dist/__stampers__/api/base.mjs +100 -0
- package/dist/__stampers__/api/base.mjs.map +1 -0
- package/dist/__stampers__/api/mobile/stamper.d.ts +15 -0
- package/dist/__stampers__/api/mobile/stamper.d.ts.map +1 -0
- package/dist/__stampers__/api/mobile/stamper.js +119 -0
- package/dist/__stampers__/api/mobile/stamper.js.map +1 -0
- package/dist/__stampers__/api/mobile/stamper.mjs +117 -0
- package/dist/__stampers__/api/mobile/stamper.mjs.map +1 -0
- package/dist/__stampers__/api/web/stamper.d.ts +14 -0
- package/dist/__stampers__/api/web/stamper.d.ts.map +1 -0
- package/dist/__stampers__/api/web/stamper.js +201 -0
- package/dist/__stampers__/api/web/stamper.js.map +1 -0
- package/dist/__stampers__/api/web/stamper.mjs +199 -0
- package/dist/__stampers__/api/web/stamper.mjs.map +1 -0
- package/dist/__stampers__/passkey/base.d.ts +16 -0
- package/dist/__stampers__/passkey/base.d.ts.map +1 -0
- package/dist/__stampers__/passkey/base.js +138 -0
- package/dist/__stampers__/passkey/base.js.map +1 -0
- package/dist/__stampers__/passkey/base.mjs +134 -0
- package/dist/__stampers__/passkey/base.mjs.map +1 -0
- package/dist/__storage__/base.d.ts +3 -0
- package/dist/__storage__/base.d.ts.map +1 -0
- package/dist/__storage__/base.js +27 -0
- package/dist/__storage__/base.js.map +1 -0
- package/dist/__storage__/base.mjs +25 -0
- package/dist/__storage__/base.mjs.map +1 -0
- package/dist/__storage__/mobile/storage.d.ts +18 -0
- package/dist/__storage__/mobile/storage.d.ts.map +1 -0
- package/dist/__storage__/mobile/storage.js +76 -0
- package/dist/__storage__/mobile/storage.js.map +1 -0
- package/dist/__storage__/mobile/storage.mjs +74 -0
- package/dist/__storage__/mobile/storage.mjs.map +1 -0
- package/dist/__storage__/web/storage.d.ts +19 -0
- package/dist/__storage__/web/storage.d.ts.map +1 -0
- package/dist/__storage__/web/storage.js +79 -0
- package/dist/__storage__/web/storage.js.map +1 -0
- package/dist/__storage__/web/storage.mjs +77 -0
- package/dist/__storage__/web/storage.mjs.map +1 -0
- package/dist/__typedoc-entry__/index.d.ts +3 -0
- package/dist/__typedoc-entry__/index.d.ts.map +1 -0
- package/dist/__types__/auth.d.ts +120 -0
- package/dist/__types__/auth.d.ts.map +1 -0
- package/dist/__types__/auth.js +7 -0
- package/dist/__types__/auth.js.map +1 -0
- package/dist/__types__/auth.mjs +5 -0
- package/dist/__types__/auth.mjs.map +1 -0
- package/dist/__types__/config.d.ts +145 -0
- package/dist/__types__/config.d.ts.map +1 -0
- package/dist/__types__/enums.d.ts +59 -0
- package/dist/__types__/enums.d.ts.map +1 -0
- package/dist/__types__/enums.js +72 -0
- package/dist/__types__/enums.js.map +1 -0
- package/dist/__types__/enums.mjs +70 -0
- package/dist/__types__/enums.mjs.map +1 -0
- package/dist/__types__/error.d.ts +13 -0
- package/dist/__types__/error.d.ts.map +1 -0
- package/dist/__types__/error.js +18 -0
- package/dist/__types__/error.js.map +1 -0
- package/dist/__types__/error.mjs +16 -0
- package/dist/__types__/error.mjs.map +1 -0
- package/dist/__types__/export.d.ts +10 -0
- package/dist/__types__/export.d.ts.map +1 -0
- package/dist/__types__/external-wallets.d.ts +203 -0
- package/dist/__types__/external-wallets.d.ts.map +1 -0
- package/dist/__types__/http.d.ts +17 -0
- package/dist/__types__/http.d.ts.map +1 -0
- package/dist/__types__/http.js +11 -0
- package/dist/__types__/http.js.map +1 -0
- package/dist/__types__/http.mjs +9 -0
- package/dist/__types__/http.mjs.map +1 -0
- package/dist/__types__/index.d.ts +10 -0
- package/dist/__types__/index.d.ts.map +1 -0
- package/dist/__types__/method-types/import-export-params.d.ts +38 -0
- package/dist/__types__/method-types/import-export-params.d.ts.map +1 -0
- package/dist/__types__/method-types/shared.d.ts +378 -0
- package/dist/__types__/method-types/shared.d.ts.map +1 -0
- package/dist/__wallet__/base.d.ts +14 -0
- package/dist/__wallet__/base.d.ts.map +1 -0
- package/dist/__wallet__/base.js +35 -0
- package/dist/__wallet__/base.js.map +1 -0
- package/dist/__wallet__/base.mjs +33 -0
- package/dist/__wallet__/base.mjs.map +1 -0
- package/dist/__wallet__/connector.d.ts +60 -0
- package/dist/__wallet__/connector.d.ts.map +1 -0
- package/dist/__wallet__/connector.js +93 -0
- package/dist/__wallet__/connector.js.map +1 -0
- package/dist/__wallet__/connector.mjs +91 -0
- package/dist/__wallet__/connector.mjs.map +1 -0
- package/dist/__wallet__/mobile/manager.d.ts +51 -0
- package/dist/__wallet__/mobile/manager.d.ts.map +1 -0
- package/dist/__wallet__/mobile/manager.js +115 -0
- package/dist/__wallet__/mobile/manager.js.map +1 -0
- package/dist/__wallet__/mobile/manager.mjs +113 -0
- package/dist/__wallet__/mobile/manager.mjs.map +1 -0
- package/dist/__wallet__/stamper.d.ts +90 -0
- package/dist/__wallet__/stamper.d.ts.map +1 -0
- package/dist/__wallet__/stamper.js +183 -0
- package/dist/__wallet__/stamper.js.map +1 -0
- package/dist/__wallet__/stamper.mjs +180 -0
- package/dist/__wallet__/stamper.mjs.map +1 -0
- package/dist/__wallet__/wallet-connect/base.d.ts +182 -0
- package/dist/__wallet__/wallet-connect/base.d.ts.map +1 -0
- package/dist/__wallet__/wallet-connect/base.js +606 -0
- package/dist/__wallet__/wallet-connect/base.js.map +1 -0
- package/dist/__wallet__/wallet-connect/base.mjs +604 -0
- package/dist/__wallet__/wallet-connect/base.mjs.map +1 -0
- package/dist/__wallet__/wallet-connect/client.d.ts +132 -0
- package/dist/__wallet__/wallet-connect/client.d.ts.map +1 -0
- package/dist/__wallet__/wallet-connect/client.js +262 -0
- package/dist/__wallet__/wallet-connect/client.js.map +1 -0
- package/dist/__wallet__/wallet-connect/client.mjs +260 -0
- package/dist/__wallet__/wallet-connect/client.mjs.map +1 -0
- package/dist/__wallet__/web/manager.d.ts +70 -0
- package/dist/__wallet__/web/manager.d.ts.map +1 -0
- package/dist/__wallet__/web/manager.js +177 -0
- package/dist/__wallet__/web/manager.js.map +1 -0
- package/dist/__wallet__/web/manager.mjs +175 -0
- package/dist/__wallet__/web/manager.mjs.map +1 -0
- package/dist/__wallet__/web/native/ethereum.d.ts +101 -0
- package/dist/__wallet__/web/native/ethereum.d.ts.map +1 -0
- package/dist/__wallet__/web/native/ethereum.js +339 -0
- package/dist/__wallet__/web/native/ethereum.js.map +1 -0
- package/dist/__wallet__/web/native/ethereum.mjs +336 -0
- package/dist/__wallet__/web/native/ethereum.mjs.map +1 -0
- package/dist/__wallet__/web/native/solana.d.ts +72 -0
- package/dist/__wallet__/web/native/solana.d.ts.map +1 -0
- package/dist/__wallet__/web/native/solana.js +215 -0
- package/dist/__wallet__/web/native/solana.js.map +1 -0
- package/dist/__wallet__/web/native/solana.mjs +212 -0
- package/dist/__wallet__/web/native/solana.mjs.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils.d.ts +160 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +1047 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +1007 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { pointEncode, uint8ArrayToHexString, stringToBase64urlString } from '@0xkey-io/encoding';
|
|
2
|
+
import { assertValidP256ECDSAKeyPair } from '../../../utils.mjs';
|
|
3
|
+
import { SignatureFormat } from '@0xkey-io/api-key-stamper';
|
|
4
|
+
|
|
5
|
+
const DB_NAME = "ZeroXKeyStamperDB";
|
|
6
|
+
const DB_STORE = "KeyStore";
|
|
7
|
+
const stampHeaderName = "X-Stamp";
|
|
8
|
+
/**
|
|
9
|
+
* `SubtleCrypto.sign(...)` outputs signature in IEEE P1363 format:
|
|
10
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign#ecdsa
|
|
11
|
+
*
|
|
12
|
+
* ZeroXKey expects the signature encoding to be DER-encoded ASN.1.
|
|
13
|
+
*
|
|
14
|
+
* Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L114
|
|
15
|
+
*
|
|
16
|
+
* Transform an ECDSA signature in IEEE 1363 encoding to DER encoding.
|
|
17
|
+
*
|
|
18
|
+
* @param ieee the ECDSA signature in IEEE encoding
|
|
19
|
+
* @return ECDSA signature in DER encoding
|
|
20
|
+
*/
|
|
21
|
+
function convertEcdsaIeee1363ToDer(ieee) {
|
|
22
|
+
if (ieee.length % 2 != 0 || ieee.length == 0 || ieee.length > 132) {
|
|
23
|
+
throw new Error("Invalid IEEE P1363 signature encoding. Length: " + ieee.length);
|
|
24
|
+
}
|
|
25
|
+
const r = toUnsignedBigNum(ieee.subarray(0, ieee.length / 2));
|
|
26
|
+
const s = toUnsignedBigNum(ieee.subarray(ieee.length / 2, ieee.length));
|
|
27
|
+
let offset = 0;
|
|
28
|
+
const length = 1 + 1 + r.length + 1 + 1 + s.length;
|
|
29
|
+
let der;
|
|
30
|
+
if (length >= 128) {
|
|
31
|
+
der = new Uint8Array(length + 3);
|
|
32
|
+
der[offset++] = 48;
|
|
33
|
+
der[offset++] = 128 + 1;
|
|
34
|
+
der[offset++] = length;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
der = new Uint8Array(length + 2);
|
|
38
|
+
der[offset++] = 48;
|
|
39
|
+
der[offset++] = length;
|
|
40
|
+
}
|
|
41
|
+
der[offset++] = 2;
|
|
42
|
+
der[offset++] = r.length;
|
|
43
|
+
der.set(r, offset);
|
|
44
|
+
offset += r.length;
|
|
45
|
+
der[offset++] = 2;
|
|
46
|
+
der[offset++] = s.length;
|
|
47
|
+
der.set(s, offset);
|
|
48
|
+
return der;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Code modified from https://github.com/google/tink/blob/6f74b99a2bfe6677e3670799116a57268fd067fa/javascript/subtle/elliptic_curves.ts#L311
|
|
52
|
+
*
|
|
53
|
+
* Transform a big integer in big endian to minimal unsigned form which has
|
|
54
|
+
* no extra zero at the beginning except when the highest bit is set.
|
|
55
|
+
*/
|
|
56
|
+
function toUnsignedBigNum(bytes) {
|
|
57
|
+
let start = 0;
|
|
58
|
+
while (start < bytes.length && bytes[start] == 0) {
|
|
59
|
+
start++;
|
|
60
|
+
}
|
|
61
|
+
if (start == bytes.length) {
|
|
62
|
+
start = bytes.length - 1;
|
|
63
|
+
}
|
|
64
|
+
let extraZero = 0;
|
|
65
|
+
if ((bytes[start] & 128) == 128) {
|
|
66
|
+
extraZero = 1;
|
|
67
|
+
}
|
|
68
|
+
const res = new Uint8Array(bytes.length - start + extraZero);
|
|
69
|
+
res.set(bytes.subarray(start), extraZero);
|
|
70
|
+
return res;
|
|
71
|
+
}
|
|
72
|
+
class IndexedDbStamper {
|
|
73
|
+
constructor() {
|
|
74
|
+
if (typeof window === "undefined") {
|
|
75
|
+
throw new Error("IndexedDB is only available in the browser");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async openDb() {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
const request = indexedDB.open(DB_NAME, 1);
|
|
81
|
+
request.onupgradeneeded = (event) => {
|
|
82
|
+
const db = event.target.result;
|
|
83
|
+
if (!db.objectStoreNames.contains(DB_STORE)) {
|
|
84
|
+
db.createObjectStore(DB_STORE);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
request.onsuccess = () => resolve(request.result);
|
|
88
|
+
request.onerror = () => reject(request.error);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async storeKeyPair(publicKeyHex, privateKey) {
|
|
92
|
+
const db = await this.openDb();
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const tx = db.transaction(DB_STORE, "readwrite");
|
|
95
|
+
const store = tx.objectStore(DB_STORE);
|
|
96
|
+
store.put(privateKey, publicKeyHex);
|
|
97
|
+
tx.oncomplete = () => {
|
|
98
|
+
db.close();
|
|
99
|
+
resolve();
|
|
100
|
+
};
|
|
101
|
+
tx.onerror = () => reject(tx.error);
|
|
102
|
+
tx.onabort = () => reject(tx.error);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async getPrivateKey(publicKeyHex) {
|
|
106
|
+
const db = await this.openDb();
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const tx = db.transaction(DB_STORE, "readonly");
|
|
109
|
+
const store = tx.objectStore(DB_STORE);
|
|
110
|
+
const request = store.get(publicKeyHex);
|
|
111
|
+
request.onsuccess = () => {
|
|
112
|
+
db.close();
|
|
113
|
+
resolve(request.result || null);
|
|
114
|
+
};
|
|
115
|
+
request.onerror = () => {
|
|
116
|
+
db.close();
|
|
117
|
+
reject(request.error);
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async listKeyPairs() {
|
|
122
|
+
const db = await this.openDb();
|
|
123
|
+
return new Promise((resolve, reject) => {
|
|
124
|
+
const tx = db.transaction(DB_STORE, "readonly");
|
|
125
|
+
const store = tx.objectStore(DB_STORE);
|
|
126
|
+
const request = store.getAllKeys();
|
|
127
|
+
request.onsuccess = () => {
|
|
128
|
+
db.close();
|
|
129
|
+
resolve(request.result);
|
|
130
|
+
};
|
|
131
|
+
request.onerror = () => {
|
|
132
|
+
db.close();
|
|
133
|
+
reject(request.error);
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async createKeyPair(externalKeyPair) {
|
|
138
|
+
let privateKey;
|
|
139
|
+
let publicKey;
|
|
140
|
+
if (externalKeyPair) {
|
|
141
|
+
await assertValidP256ECDSAKeyPair(externalKeyPair);
|
|
142
|
+
privateKey = externalKeyPair.privateKey;
|
|
143
|
+
publicKey = externalKeyPair.publicKey;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const keyPair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, false, // Non-extractable private key
|
|
147
|
+
["sign", "verify"]);
|
|
148
|
+
privateKey = keyPair.privateKey;
|
|
149
|
+
publicKey = keyPair.publicKey;
|
|
150
|
+
}
|
|
151
|
+
const rawPubKey = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
|
|
152
|
+
const compressedPubKey = pointEncode(rawPubKey);
|
|
153
|
+
const compressedHex = uint8ArrayToHexString(compressedPubKey);
|
|
154
|
+
await this.storeKeyPair(compressedHex, privateKey);
|
|
155
|
+
return compressedHex;
|
|
156
|
+
}
|
|
157
|
+
async deleteKeyPair(publicKeyHex) {
|
|
158
|
+
const db = await this.openDb();
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
const tx = db.transaction(DB_STORE, "readwrite");
|
|
161
|
+
const store = tx.objectStore(DB_STORE);
|
|
162
|
+
store.delete(publicKeyHex);
|
|
163
|
+
tx.oncomplete = () => {
|
|
164
|
+
db.close();
|
|
165
|
+
resolve();
|
|
166
|
+
};
|
|
167
|
+
tx.onerror = () => reject(tx.error);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
async sign(payload, publicKeyHex, format) {
|
|
171
|
+
const privateKey = await this.getPrivateKey(publicKeyHex);
|
|
172
|
+
if (!privateKey) {
|
|
173
|
+
throw new Error("Key not found for publicKey: " + publicKeyHex);
|
|
174
|
+
}
|
|
175
|
+
const encodedPayload = new TextEncoder().encode(payload);
|
|
176
|
+
const signatureIeee1363 = await crypto.subtle.sign({ name: "ECDSA", hash: { name: "SHA-256" } }, privateKey, encodedPayload);
|
|
177
|
+
if (format === SignatureFormat.Raw) {
|
|
178
|
+
return uint8ArrayToHexString(new Uint8Array(signatureIeee1363));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
return uint8ArrayToHexString(convertEcdsaIeee1363ToDer(new Uint8Array(signatureIeee1363)));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async stamp(payload, publicKeyHex) {
|
|
185
|
+
const signature = await this.sign(payload, publicKeyHex, SignatureFormat.Der);
|
|
186
|
+
const stamp = {
|
|
187
|
+
publicKey: publicKeyHex,
|
|
188
|
+
scheme: "SIGNATURE_SCHEME_TK_API_P256",
|
|
189
|
+
signature,
|
|
190
|
+
};
|
|
191
|
+
return {
|
|
192
|
+
stampHeaderName,
|
|
193
|
+
stampHeaderValue: stringToBase64urlString(JSON.stringify(stamp)),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { IndexedDbStamper };
|
|
199
|
+
//# sourceMappingURL=stamper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stamper.mjs","sources":["../../../../src/__stampers__/api/web/stamper.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Passkey, TStamp, TStamper, TPasskeyStamperConfig, ZeroXKeyAuthenticatorParams } from "../../__types__";
|
|
2
|
+
export declare class CrossPlatformPasskeyStamper implements TStamper {
|
|
3
|
+
private stamper;
|
|
4
|
+
private config;
|
|
5
|
+
constructor(config: TPasskeyStamperConfig);
|
|
6
|
+
init(): Promise<void>;
|
|
7
|
+
stamp(payload: string): Promise<TStamp>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a passkey for an end-user, taking care of various lower-level details.
|
|
10
|
+
*
|
|
11
|
+
* @returns {Promise<Passkey>}
|
|
12
|
+
*/
|
|
13
|
+
createWebPasskey: (config?: Record<any, any>) => Promise<Passkey>;
|
|
14
|
+
createReactNativePasskey: (config?: Record<any, any>) => Promise<ZeroXKeyAuthenticatorParams>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/__stampers__/passkey/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,qBAAqB,EACrB,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAWzB,qBAAa,2BAA4B,YAAW,QAAQ;IAC1D,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAKnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCrB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C;;;;OAIG;IACH,gBAAgB,YACN,OAAO,GAAG,EAAE,GAAG,CAAC,KACvB,QAAQ,OAAO,CAAC,CA8DjB;IAEF,wBAAwB,YACd,OAAO,GAAG,EAAE,GAAG,CAAC,KACvB,QAAQ,2BAA2B,CAAC,CAsBrC;CACH"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('../../utils.js');
|
|
4
|
+
var webauthnStamper = require('@0xkey-io/webauthn-stamper');
|
|
5
|
+
var encoding = require('@0xkey-io/encoding');
|
|
6
|
+
var http = require('@0xkey-io/http');
|
|
7
|
+
var uuid = require('uuid');
|
|
8
|
+
|
|
9
|
+
function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
|
|
10
|
+
|
|
11
|
+
let PasskeyStamperModule;
|
|
12
|
+
class CrossPlatformPasskeyStamper {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
/**
|
|
15
|
+
* Create a passkey for an end-user, taking care of various lower-level details.
|
|
16
|
+
*
|
|
17
|
+
* @returns {Promise<Passkey>}
|
|
18
|
+
*/
|
|
19
|
+
this.createWebPasskey = async (config = {}) => {
|
|
20
|
+
const challenge = utils.generateRandomBuffer();
|
|
21
|
+
const encodedChallenge = encoding.base64StringToBase64UrlEncodedString(btoa(String.fromCharCode(...new Uint8Array(challenge))));
|
|
22
|
+
const authenticatorUserId = utils.generateRandomBuffer();
|
|
23
|
+
// WebAuthn credential options options can be found here:
|
|
24
|
+
// https://www.w3.org/TR/webauthn-2/#sctn-sample-registration
|
|
25
|
+
//
|
|
26
|
+
// All pubkey algorithms can be found here: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
|
|
27
|
+
// ZeroXKey only supports ES256 (-7) and RS256 (-257)
|
|
28
|
+
//
|
|
29
|
+
// The pubkey type only supports one value, "public-key"
|
|
30
|
+
// See https://www.w3.org/TR/webauthn-2/#enumdef-publickeycredentialtype for more details
|
|
31
|
+
// TODO: consider un-nesting these config params
|
|
32
|
+
const webauthnConfig = {
|
|
33
|
+
publicKey: {
|
|
34
|
+
rp: {
|
|
35
|
+
id: config.publicKey?.rp?.id ?? this.config.rpId,
|
|
36
|
+
name: config.publicKey?.rp?.name ?? "",
|
|
37
|
+
},
|
|
38
|
+
challenge: config.publicKey?.challenge ?? challenge,
|
|
39
|
+
pubKeyCredParams: config.publicKey?.pubKeyCredParams ?? [
|
|
40
|
+
{
|
|
41
|
+
type: "public-key",
|
|
42
|
+
alg: -7,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
type: "public-key",
|
|
46
|
+
alg: -257,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
user: {
|
|
50
|
+
id: config.publicKey?.user?.id ?? authenticatorUserId,
|
|
51
|
+
name: config.publicKey?.user?.name ?? "Default User",
|
|
52
|
+
displayName: config.publicKey?.user?.displayName ?? "Default User",
|
|
53
|
+
},
|
|
54
|
+
authenticatorSelection: {
|
|
55
|
+
authenticatorAttachment: config.publicKey?.authenticatorSelection?.authenticatorAttachment ??
|
|
56
|
+
undefined, // default to empty
|
|
57
|
+
requireResidentKey: config.publicKey?.authenticatorSelection?.requireResidentKey ??
|
|
58
|
+
true,
|
|
59
|
+
residentKey: config.publicKey?.authenticatorSelection?.residentKey ?? "required",
|
|
60
|
+
userVerification: config.publicKey?.authenticatorSelection?.userVerification ??
|
|
61
|
+
"preferred",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const attestation = await http.getWebAuthnAttestation(webauthnConfig);
|
|
66
|
+
return {
|
|
67
|
+
encodedChallenge: config.publicKey?.challenge
|
|
68
|
+
? encoding.base64StringToBase64UrlEncodedString(config.publicKey?.challenge)
|
|
69
|
+
: encodedChallenge,
|
|
70
|
+
attestation,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
this.createReactNativePasskey = async (config = {}) => {
|
|
74
|
+
const { name, displayName, authenticatorName } = config;
|
|
75
|
+
const { createPasskey } = PasskeyStamperModule; // We do a 'selective' import when initializing the stamper. This is safe to do here.
|
|
76
|
+
if (!createPasskey) {
|
|
77
|
+
throw new Error("Ensure you have @0xkey-io/react-native-passkey-stamper installed and linked correctly. Are you not on React Native?");
|
|
78
|
+
}
|
|
79
|
+
return await createPasskey({
|
|
80
|
+
rp: {
|
|
81
|
+
id: this.config.rpId,
|
|
82
|
+
name: this.config.rpName ?? "ZeroXKey",
|
|
83
|
+
},
|
|
84
|
+
user: {
|
|
85
|
+
id: uuid.v4(),
|
|
86
|
+
name,
|
|
87
|
+
displayName,
|
|
88
|
+
},
|
|
89
|
+
authenticatorName: authenticatorName ?? name ?? "End-User Passkey",
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
// Use init method to set up the stamper based on the platform. It's async, so can't be done in the constructor.
|
|
93
|
+
this.config = config;
|
|
94
|
+
}
|
|
95
|
+
async init() {
|
|
96
|
+
if (utils.isWeb()) {
|
|
97
|
+
const { default: WindowWrapper } = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('../../__polyfills__/window.js')); });
|
|
98
|
+
this.stamper = new webauthnStamper.WebauthnStamper({
|
|
99
|
+
...this.config,
|
|
100
|
+
rpId: this.config.rpId ?? WindowWrapper.location.hostname,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else if (utils.isReactNative()) {
|
|
104
|
+
try {
|
|
105
|
+
// Dynamic import to prevent bundling the native module in web environments.
|
|
106
|
+
let PasskeyStamper;
|
|
107
|
+
try {
|
|
108
|
+
PasskeyStamperModule = require("@0xkey-io/react-native-passkey-stamper");
|
|
109
|
+
PasskeyStamper = PasskeyStamperModule.PasskeyStamper;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new Error("Please install react-native-passkeys and @0xkey-io/react-native-passkey-stamper in your app to use passkeys.");
|
|
113
|
+
}
|
|
114
|
+
this.stamper = new PasskeyStamper({
|
|
115
|
+
...this.config,
|
|
116
|
+
rpId: this.config.rpId,
|
|
117
|
+
allowCredentials: this.config.allowCredentials?.map((cred) => ({
|
|
118
|
+
id: encoding.uint8ArrayToHexString(cred.id),
|
|
119
|
+
type: cred.type,
|
|
120
|
+
transports: cred.transports,
|
|
121
|
+
})),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new Error(`Failed to load passkey stamper for react-native: ${error}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw new Error("Unsupported platform for passkey stamper");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async stamp(payload) {
|
|
133
|
+
return await this.stamper.stamp(payload);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
exports.CrossPlatformPasskeyStamper = CrossPlatformPasskeyStamper;
|
|
138
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sources":["../../../src/__stampers__/passkey/base.ts"],"sourcesContent":[null],"names":["generateRandomBuffer","base64StringToBase64UrlEncodedString","getWebAuthnAttestation","uuidv4","isWeb","WebauthnStamper","isReactNative","uint8ArrayToHexString"],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { generateRandomBuffer, isWeb, isReactNative } from '../../utils.mjs';
|
|
2
|
+
import { WebauthnStamper } from '@0xkey-io/webauthn-stamper';
|
|
3
|
+
import { base64StringToBase64UrlEncodedString, uint8ArrayToHexString } from '@0xkey-io/encoding';
|
|
4
|
+
import { getWebAuthnAttestation } from '@0xkey-io/http';
|
|
5
|
+
import { v4 } from 'uuid';
|
|
6
|
+
|
|
7
|
+
let PasskeyStamperModule;
|
|
8
|
+
class CrossPlatformPasskeyStamper {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
/**
|
|
11
|
+
* Create a passkey for an end-user, taking care of various lower-level details.
|
|
12
|
+
*
|
|
13
|
+
* @returns {Promise<Passkey>}
|
|
14
|
+
*/
|
|
15
|
+
this.createWebPasskey = async (config = {}) => {
|
|
16
|
+
const challenge = generateRandomBuffer();
|
|
17
|
+
const encodedChallenge = base64StringToBase64UrlEncodedString(btoa(String.fromCharCode(...new Uint8Array(challenge))));
|
|
18
|
+
const authenticatorUserId = generateRandomBuffer();
|
|
19
|
+
// WebAuthn credential options options can be found here:
|
|
20
|
+
// https://www.w3.org/TR/webauthn-2/#sctn-sample-registration
|
|
21
|
+
//
|
|
22
|
+
// All pubkey algorithms can be found here: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
|
|
23
|
+
// ZeroXKey only supports ES256 (-7) and RS256 (-257)
|
|
24
|
+
//
|
|
25
|
+
// The pubkey type only supports one value, "public-key"
|
|
26
|
+
// See https://www.w3.org/TR/webauthn-2/#enumdef-publickeycredentialtype for more details
|
|
27
|
+
// TODO: consider un-nesting these config params
|
|
28
|
+
const webauthnConfig = {
|
|
29
|
+
publicKey: {
|
|
30
|
+
rp: {
|
|
31
|
+
id: config.publicKey?.rp?.id ?? this.config.rpId,
|
|
32
|
+
name: config.publicKey?.rp?.name ?? "",
|
|
33
|
+
},
|
|
34
|
+
challenge: config.publicKey?.challenge ?? challenge,
|
|
35
|
+
pubKeyCredParams: config.publicKey?.pubKeyCredParams ?? [
|
|
36
|
+
{
|
|
37
|
+
type: "public-key",
|
|
38
|
+
alg: -7,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
type: "public-key",
|
|
42
|
+
alg: -257,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
user: {
|
|
46
|
+
id: config.publicKey?.user?.id ?? authenticatorUserId,
|
|
47
|
+
name: config.publicKey?.user?.name ?? "Default User",
|
|
48
|
+
displayName: config.publicKey?.user?.displayName ?? "Default User",
|
|
49
|
+
},
|
|
50
|
+
authenticatorSelection: {
|
|
51
|
+
authenticatorAttachment: config.publicKey?.authenticatorSelection?.authenticatorAttachment ??
|
|
52
|
+
undefined, // default to empty
|
|
53
|
+
requireResidentKey: config.publicKey?.authenticatorSelection?.requireResidentKey ??
|
|
54
|
+
true,
|
|
55
|
+
residentKey: config.publicKey?.authenticatorSelection?.residentKey ?? "required",
|
|
56
|
+
userVerification: config.publicKey?.authenticatorSelection?.userVerification ??
|
|
57
|
+
"preferred",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const attestation = await getWebAuthnAttestation(webauthnConfig);
|
|
62
|
+
return {
|
|
63
|
+
encodedChallenge: config.publicKey?.challenge
|
|
64
|
+
? base64StringToBase64UrlEncodedString(config.publicKey?.challenge)
|
|
65
|
+
: encodedChallenge,
|
|
66
|
+
attestation,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
this.createReactNativePasskey = async (config = {}) => {
|
|
70
|
+
const { name, displayName, authenticatorName } = config;
|
|
71
|
+
const { createPasskey } = PasskeyStamperModule; // We do a 'selective' import when initializing the stamper. This is safe to do here.
|
|
72
|
+
if (!createPasskey) {
|
|
73
|
+
throw new Error("Ensure you have @0xkey-io/react-native-passkey-stamper installed and linked correctly. Are you not on React Native?");
|
|
74
|
+
}
|
|
75
|
+
return await createPasskey({
|
|
76
|
+
rp: {
|
|
77
|
+
id: this.config.rpId,
|
|
78
|
+
name: this.config.rpName ?? "ZeroXKey",
|
|
79
|
+
},
|
|
80
|
+
user: {
|
|
81
|
+
id: v4(),
|
|
82
|
+
name,
|
|
83
|
+
displayName,
|
|
84
|
+
},
|
|
85
|
+
authenticatorName: authenticatorName ?? name ?? "End-User Passkey",
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
// Use init method to set up the stamper based on the platform. It's async, so can't be done in the constructor.
|
|
89
|
+
this.config = config;
|
|
90
|
+
}
|
|
91
|
+
async init() {
|
|
92
|
+
if (isWeb()) {
|
|
93
|
+
const { default: WindowWrapper } = await import('../../__polyfills__/window.mjs');
|
|
94
|
+
this.stamper = new WebauthnStamper({
|
|
95
|
+
...this.config,
|
|
96
|
+
rpId: this.config.rpId ?? WindowWrapper.location.hostname,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else if (isReactNative()) {
|
|
100
|
+
try {
|
|
101
|
+
// Dynamic import to prevent bundling the native module in web environments.
|
|
102
|
+
let PasskeyStamper;
|
|
103
|
+
try {
|
|
104
|
+
PasskeyStamperModule = require("@0xkey-io/react-native-passkey-stamper");
|
|
105
|
+
PasskeyStamper = PasskeyStamperModule.PasskeyStamper;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new Error("Please install react-native-passkeys and @0xkey-io/react-native-passkey-stamper in your app to use passkeys.");
|
|
109
|
+
}
|
|
110
|
+
this.stamper = new PasskeyStamper({
|
|
111
|
+
...this.config,
|
|
112
|
+
rpId: this.config.rpId,
|
|
113
|
+
allowCredentials: this.config.allowCredentials?.map((cred) => ({
|
|
114
|
+
id: uint8ArrayToHexString(cred.id),
|
|
115
|
+
type: cred.type,
|
|
116
|
+
transports: cred.transports,
|
|
117
|
+
})),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`Failed to load passkey stamper for react-native: ${error}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw new Error("Unsupported platform for passkey stamper");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async stamp(payload) {
|
|
129
|
+
return await this.stamper.stamp(payload);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { CrossPlatformPasskeyStamper };
|
|
134
|
+
//# sourceMappingURL=base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.mjs","sources":["../../../src/__stampers__/passkey/base.ts"],"sourcesContent":[null],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/__storage__/base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAgBjE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var storage = require('./web/storage.js');
|
|
4
|
+
var utils = require('../utils.js');
|
|
5
|
+
|
|
6
|
+
// TODO (Amir): Turn this into a class that extends StorageBase and make an init function. See stamper
|
|
7
|
+
async function createStorageManager() {
|
|
8
|
+
if (utils.isReactNative()) {
|
|
9
|
+
try {
|
|
10
|
+
// Dynamic import to prevent bundling the native module in web environments
|
|
11
|
+
const { MobileStorageManager } = await Promise.resolve().then(function () { return require('./mobile/storage.js'); });
|
|
12
|
+
return new MobileStorageManager();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
throw new Error(`Failed to load storage manager for react-native: ${error}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (utils.isWeb()) {
|
|
19
|
+
return new storage.WebStorageManager();
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
throw new Error("Unsupported environment for storage manager.");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.createStorageManager = createStorageManager;
|
|
27
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sources":["../../src/__storage__/base.ts"],"sourcesContent":[null],"names":["isReactNative","isWeb","WebStorageManager"],"mappings":";;;;;AAIA;AACO,eAAe,oBAAoB,GAAA;IACxC,IAAIA,mBAAa,EAAE,EAAE;AACnB,QAAA,IAAI;;YAEF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,oDAAO,qBAAkB,KAAC;YACjE,OAAO,IAAI,oBAAoB,EAAE;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAA,CAAE,CAC5D;QACH;IACF;SAAO,IAAIC,WAAK,EAAE,EAAE;QAClB,OAAO,IAAIC,yBAAiB,EAAE;IAChC;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;IACjE;AACF;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { WebStorageManager } from './web/storage.mjs';
|
|
2
|
+
import { isReactNative, isWeb } from '../utils.mjs';
|
|
3
|
+
|
|
4
|
+
// TODO (Amir): Turn this into a class that extends StorageBase and make an init function. See stamper
|
|
5
|
+
async function createStorageManager() {
|
|
6
|
+
if (isReactNative()) {
|
|
7
|
+
try {
|
|
8
|
+
// Dynamic import to prevent bundling the native module in web environments
|
|
9
|
+
const { MobileStorageManager } = await import('./mobile/storage.mjs');
|
|
10
|
+
return new MobileStorageManager();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
throw new Error(`Failed to load storage manager for react-native: ${error}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else if (isWeb()) {
|
|
17
|
+
return new WebStorageManager();
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
throw new Error("Unsupported environment for storage manager.");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { createStorageManager };
|
|
25
|
+
//# sourceMappingURL=base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.mjs","sources":["../../src/__storage__/base.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;AACO,eAAe,oBAAoB,GAAA;IACxC,IAAI,aAAa,EAAE,EAAE;AACnB,QAAA,IAAI;;YAEF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,OAAO,sBAAkB,CAAC;YACjE,OAAO,IAAI,oBAAoB,EAAE;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAA,CAAE,CAC5D;QACH;IACF;SAAO,IAAI,KAAK,EAAE,EAAE;QAClB,OAAO,IAAI,iBAAiB,EAAE;IAChC;SAAO;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;IACjE;AACF;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type StorageBase } from "../../__types__";
|
|
2
|
+
import type { Session } from "@0xkey-io/sdk-types";
|
|
3
|
+
export declare class MobileStorageManager implements StorageBase {
|
|
4
|
+
private static ALL_SESSION_KEYS;
|
|
5
|
+
private static ACTIVE_SESSION_KEY;
|
|
6
|
+
getStorageValue: (sessionKey: string) => Promise<any>;
|
|
7
|
+
setStorageValue: (sessionKey: string, storageValue: any) => Promise<void>;
|
|
8
|
+
setActiveSessionKey: (sessionKey: string) => Promise<void>;
|
|
9
|
+
removeStorageValue: (sessionKey: string) => Promise<void>;
|
|
10
|
+
storeSession: (session: string, sessionKey?: string) => Promise<void>;
|
|
11
|
+
getSession: (sessionKey?: string) => Promise<Session | undefined>;
|
|
12
|
+
getActiveSessionKey: () => Promise<string | undefined>;
|
|
13
|
+
getActiveSession: () => Promise<Session | undefined>;
|
|
14
|
+
listSessionKeys: () => Promise<string[]>;
|
|
15
|
+
clearSession: (sessionKey: string) => Promise<void>;
|
|
16
|
+
clearAllSessions: () => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/__storage__/mobile/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAanD,qBAAa,oBAAqB,YAAW,WAAW;IACtD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAgC;IAC/D,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAkC;IAEnE,eAAe,eAAsB,MAAM,KAAG,QAAQ,GAAG,CAAC,CAGxD;IAEF,eAAe,eACD,MAAM,gBACJ,GAAG,KAChB,QAAQ,IAAI,CAAC,CAEd;IAEF,mBAAmB,eAAsB,MAAM,KAAG,QAAQ,IAAI,CAAC,CAK7D;IAEF,kBAAkB,eAAsB,MAAM,KAAG,QAAQ,IAAI,CAAC,CAE5D;IAEF,YAAY,YACD,MAAM,eACH,MAAM,KACjB,QAAQ,IAAI,CAAC,CAiBd;IAEF,UAAU,gBACI,MAAM,KACjB,QAAQ,OAAO,GAAG,SAAS,CAAC,CAE7B;IAEF,mBAAmB,QAAa,QAAQ,MAAM,GAAG,SAAS,CAAC,CAEzD;IAEF,gBAAgB,QAAa,QAAQ,OAAO,GAAG,SAAS,CAAC,CAGvD;IAEF,eAAe,QAAa,QAAQ,MAAM,EAAE,CAAC,CAK3C;IAEF,YAAY,eAAsB,MAAM,KAAG,QAAQ,IAAI,CAAC,CAWtD;IAEF,gBAAgB,QAAa,QAAQ,IAAI,CAAC,CAKxC;CACH"}
|