@zerodev/wallet-core 0.0.3 → 0.0.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/dist/_cjs/actions/auth/getAuthenticators.js.map +1 -1
- package/dist/_cjs/actions/auth/index.js +3 -1
- package/dist/_cjs/actions/auth/index.js.map +1 -1
- package/dist/_cjs/actions/auth/logout.js +23 -0
- package/dist/_cjs/actions/auth/logout.js.map +1 -0
- package/dist/_cjs/actions/index.js +2 -1
- package/dist/_cjs/actions/index.js.map +1 -1
- package/dist/_cjs/actions/wallet/getUserWallet.js +1 -1
- package/dist/_cjs/actions/wallet/getUserWallet.js.map +1 -1
- package/dist/_cjs/actions/wallet/signingUtils.js +23 -3
- package/dist/_cjs/actions/wallet/signingUtils.js.map +1 -1
- package/dist/_cjs/adapters/viem.js +26 -9
- package/dist/_cjs/adapters/viem.js.map +1 -1
- package/dist/_cjs/client/decorators/client.js +1 -0
- package/dist/_cjs/client/decorators/client.js.map +1 -1
- package/dist/_cjs/client/transports/rest.js.map +1 -1
- package/dist/_cjs/core/createZeroDevWalletCore.js +297 -168
- package/dist/_cjs/core/createZeroDevWalletCore.js.map +1 -1
- package/dist/_cjs/index.js +2 -1
- package/dist/_cjs/index.js.map +1 -1
- package/dist/_cjs/index.native.js +2 -1
- package/dist/_cjs/index.native.js.map +1 -1
- package/dist/_cjs/native/stampers/secureStore.js +94 -17
- package/dist/_cjs/native/stampers/secureStore.js.map +1 -1
- package/dist/_cjs/stampers/indexedDbStamper.js +34 -0
- package/dist/_cjs/stampers/indexedDbStamper.js.map +1 -1
- package/dist/_cjs/storage/manager.js +144 -17
- package/dist/_cjs/storage/manager.js.map +1 -1
- package/dist/_cjs/utils/buildClientSignature.js +4 -1
- package/dist/_cjs/utils/buildClientSignature.js.map +1 -1
- package/dist/_cjs/utils/derToRawSignature.js +12 -0
- package/dist/_cjs/utils/derToRawSignature.js.map +1 -1
- package/dist/_cjs/utils/exportPrivateKey.js +1 -1
- package/dist/_cjs/utils/exportPrivateKey.js.map +1 -1
- package/dist/_cjs/utils/utils.js +27 -6
- package/dist/_cjs/utils/utils.js.map +1 -1
- package/dist/_esm/actions/auth/getAuthenticators.js +3 -2
- package/dist/_esm/actions/auth/getAuthenticators.js.map +1 -1
- package/dist/_esm/actions/auth/index.js +1 -0
- package/dist/_esm/actions/auth/index.js.map +1 -1
- package/dist/_esm/actions/auth/logout.js +21 -0
- package/dist/_esm/actions/auth/logout.js.map +1 -0
- package/dist/_esm/actions/index.js +1 -1
- package/dist/_esm/actions/index.js.map +1 -1
- package/dist/_esm/actions/wallet/getUserWallet.js +3 -1
- package/dist/_esm/actions/wallet/getUserWallet.js.map +1 -1
- package/dist/_esm/actions/wallet/signingUtils.js +24 -4
- package/dist/_esm/actions/wallet/signingUtils.js.map +1 -1
- package/dist/_esm/adapters/viem.js +27 -10
- package/dist/_esm/adapters/viem.js.map +1 -1
- package/dist/_esm/client/decorators/client.js +2 -1
- package/dist/_esm/client/decorators/client.js.map +1 -1
- package/dist/_esm/client/transports/rest.js.map +1 -1
- package/dist/_esm/core/createZeroDevWalletCore.js +320 -186
- package/dist/_esm/core/createZeroDevWalletCore.js.map +1 -1
- package/dist/_esm/index.js +1 -1
- package/dist/_esm/index.js.map +1 -1
- package/dist/_esm/index.native.js +1 -1
- package/dist/_esm/index.native.js.map +1 -1
- package/dist/_esm/native/stampers/secureStore.js +111 -18
- package/dist/_esm/native/stampers/secureStore.js.map +1 -1
- package/dist/_esm/stampers/indexedDbStamper.js +36 -0
- package/dist/_esm/stampers/indexedDbStamper.js.map +1 -1
- package/dist/_esm/storage/manager.js +150 -22
- package/dist/_esm/storage/manager.js.map +1 -1
- package/dist/_esm/utils/buildClientSignature.js +4 -1
- package/dist/_esm/utils/buildClientSignature.js.map +1 -1
- package/dist/_esm/utils/derToRawSignature.js +12 -0
- package/dist/_esm/utils/derToRawSignature.js.map +1 -1
- package/dist/_esm/utils/exportPrivateKey.js +1 -1
- package/dist/_esm/utils/exportPrivateKey.js.map +1 -1
- package/dist/_esm/utils/utils.js +27 -6
- package/dist/_esm/utils/utils.js.map +1 -1
- package/dist/_types/actions/auth/getAuthenticators.d.ts +19 -2
- package/dist/_types/actions/auth/getAuthenticators.d.ts.map +1 -1
- package/dist/_types/actions/auth/index.d.ts +2 -1
- package/dist/_types/actions/auth/index.d.ts.map +1 -1
- package/dist/_types/actions/auth/logout.d.ts +11 -0
- package/dist/_types/actions/auth/logout.d.ts.map +1 -0
- package/dist/_types/actions/index.d.ts +1 -1
- package/dist/_types/actions/index.d.ts.map +1 -1
- package/dist/_types/actions/wallet/getUserWallet.d.ts.map +1 -1
- package/dist/_types/actions/wallet/signingUtils.d.ts.map +1 -1
- package/dist/_types/adapters/viem.d.ts.map +1 -1
- package/dist/_types/client/decorators/client.d.ts +3 -1
- package/dist/_types/client/decorators/client.d.ts.map +1 -1
- package/dist/_types/client/transports/rest.d.ts +3 -3
- package/dist/_types/client/transports/rest.d.ts.map +1 -1
- package/dist/_types/core/createZeroDevWalletCore.d.ts +8 -1
- package/dist/_types/core/createZeroDevWalletCore.d.ts.map +1 -1
- package/dist/_types/index.d.ts +2 -2
- package/dist/_types/index.d.ts.map +1 -1
- package/dist/_types/index.native.d.ts +2 -2
- package/dist/_types/index.native.d.ts.map +1 -1
- package/dist/_types/native/stampers/secureStore.d.ts.map +1 -1
- package/dist/_types/stampers/indexedDbStamper.d.ts.map +1 -1
- package/dist/_types/stampers/types.d.ts +6 -0
- package/dist/_types/stampers/types.d.ts.map +1 -1
- package/dist/_types/storage/manager.d.ts +3 -0
- package/dist/_types/storage/manager.d.ts.map +1 -1
- package/dist/_types/types/session.d.ts +2 -0
- package/dist/_types/types/session.d.ts.map +1 -1
- package/dist/_types/utils/buildClientSignature.d.ts +1 -1
- package/dist/_types/utils/buildClientSignature.d.ts.map +1 -1
- package/dist/_types/utils/derToRawSignature.d.ts.map +1 -1
- package/dist/_types/utils/utils.d.ts +1 -1
- package/dist/_types/utils/utils.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/actions/auth/getAuthenticators.ts +20 -2
- package/src/actions/auth/index.ts +6 -0
- package/src/actions/auth/logout.ts +35 -0
- package/src/actions/index.ts +4 -0
- package/src/actions/wallet/getUserWallet.ts +3 -1
- package/src/actions/wallet/signingUtils.ts +43 -4
- package/src/adapters/viem.ts +40 -12
- package/src/client/decorators/client.ts +7 -0
- package/src/client/transports/rest.ts +4 -4
- package/src/core/createZeroDevWalletCore.ts +393 -205
- package/src/index.native.ts +4 -0
- package/src/index.ts +4 -0
- package/src/native/stampers/secureStore.ts +119 -24
- package/src/stampers/indexedDbStamper.ts +47 -0
- package/src/stampers/types.ts +6 -0
- package/src/storage/manager.ts +205 -25
- package/src/types/session.ts +2 -0
- package/src/utils/buildClientSignature.ts +4 -2
- package/src/utils/derToRawSignature.ts +16 -2
- package/src/utils/exportPrivateKey.ts +1 -1
- package/src/utils/utils.ts +30 -9
package/dist/_esm/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export {
|
|
|
8
8
|
// Auth actions
|
|
9
9
|
authenticateWithEmail, authenticateWithOAuth, getAuthenticators,
|
|
10
10
|
// Wallet actions
|
|
11
|
-
getUserWallet, getWhoami, loginWithOTP, registerWithOTP, sign7702Authorization, signMessage, signTransaction, signTypedDataV4, signUserOperation, } from './actions/index.js';
|
|
11
|
+
getUserWallet, getWhoami, loginWithOTP, logout, registerWithOTP, sign7702Authorization, signMessage, signTransaction, signTypedDataV4, signUserOperation, } from './actions/index.js';
|
|
12
12
|
// Adapters
|
|
13
13
|
export { toViemAccount } from './adapters/viem.js';
|
|
14
14
|
// Client decorators
|
package/dist/_esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,IAAI,aAAa,EAAE,EAAE,CAAC;IACpB,0GAA0G;IAC1G,OAAO,CAAC,IAAI,CACV,wMAAwM,CACzM,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,IAAI,aAAa,EAAE,EAAE,CAAC;IACpB,0GAA0G;IAC1G,OAAO,CAAC,IAAI,CACV,wMAAwM,CACzM,CAAA;AACH,CAAC;AAuCD,UAAU;AACV,OAAO;AACL,eAAe;AACf,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB;AACjB,iBAAiB;AACjB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,MAAM,EACN,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAE3B,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,oBAAoB;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAOpE,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,YAAY,EAEZ,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAK/C,WAAW;AACX,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAcjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO,EACL,mBAAmB,GAEpB,MAAM,8BAA8B,CAAA"}
|
|
@@ -3,7 +3,7 @@ if (!isReactNative()) {
|
|
|
3
3
|
// biome-ignore lint/suspicious/noConsole: Warning users if they try to use the web entry on React Native.
|
|
4
4
|
console.warn('@zerodev/wallet-core/react-native: the React Native entry was loaded outside a React Native runtime. If this is a non-RN context, import `@zerodev/wallet-core` (the bare specifier) instead.');
|
|
5
5
|
}
|
|
6
|
-
export { authenticateWithEmail, authenticateWithOAuth, getAuthenticators, getUserWallet, getWhoami, loginWithOTP, registerWithOTP, sign7702Authorization, signMessage, signTransaction, signTypedDataV4, signUserOperation, } from './actions/index.js';
|
|
6
|
+
export { authenticateWithEmail, authenticateWithOAuth, getAuthenticators, getUserWallet, getWhoami, loginWithOTP, logout, registerWithOTP, sign7702Authorization, signMessage, signTransaction, signTypedDataV4, signUserOperation, } from './actions/index.js';
|
|
7
7
|
export { toViemAccount } from './adapters/viem.js';
|
|
8
8
|
export { zeroDevWalletActions } from './client/decorators/client.js';
|
|
9
9
|
export { createBaseClient, createClient, zeroDevWalletTransport, } from './client/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.js","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;IACrB,0GAA0G;IAC1G,OAAO,CAAC,IAAI,CACV,+LAA+L,CAChM,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"index.native.js","sourceRoot":"","sources":["../../src/index.native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;IACrB,0GAA0G;IAC1G,OAAO,CAAC,IAAI,CACV,+LAA+L,CAChM,CAAA;AACH,CAAC;AAyCD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,MAAM,EACN,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAOpE,OAAO,EACL,gBAAgB,EAChB,YAAY,EAEZ,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAK/C,mEAAmE;AACnE,8EAA8E;AAC9E,4EAA4E;AAC5E,oEAAoE;AACpE,OAAO,EACL,mBAAmB,GAEpB,MAAM,iCAAiC,CAAA;AAYxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import { ApiKeyStamper, SignatureFormat } from '@turnkey/api-key-stamper';
|
|
2
|
-
import { generateP256KeyPair } from '@turnkey/crypto';
|
|
2
|
+
import { generateP256KeyPair, verifyStampSignature } from '@turnkey/crypto';
|
|
3
3
|
import * as SecureStore from 'expo-secure-store';
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const KEY_PAIR = 'zerodev.keyPair';
|
|
5
|
+
const LEGACY_PUBLIC_KEY = 'zerodev.publicKey';
|
|
6
|
+
const LEGACY_PRIVATE_KEY = 'zerodev.privateKey';
|
|
7
|
+
const KEY_PAIR_CHECK = 'ZeroDev Wallet key-pair ownership check';
|
|
8
|
+
function parseKeyPair(value) {
|
|
9
|
+
if (!value)
|
|
10
|
+
return null;
|
|
11
|
+
try {
|
|
12
|
+
const pair = JSON.parse(value);
|
|
13
|
+
if (typeof pair.publicKey !== 'string' ||
|
|
14
|
+
!pair.publicKey ||
|
|
15
|
+
typeof pair.privateKey !== 'string' ||
|
|
16
|
+
!pair.privateKey) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return pair;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
6
25
|
class SecureStoreStamperInner {
|
|
7
26
|
constructor() {
|
|
8
27
|
Object.defineProperty(this, "publicKeyHex", {
|
|
@@ -13,36 +32,85 @@ class SecureStoreStamperInner {
|
|
|
13
32
|
});
|
|
14
33
|
}
|
|
15
34
|
async init() {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
35
|
+
const storedPair = parseKeyPair(await SecureStore.getItemAsync(KEY_PAIR));
|
|
36
|
+
if (storedPair && (await this.isUsable(storedPair))) {
|
|
37
|
+
this.publicKeyHex = storedPair.publicKey;
|
|
38
|
+
return;
|
|
20
39
|
}
|
|
21
|
-
|
|
22
|
-
|
|
40
|
+
const publicKey = await SecureStore.getItemAsync(LEGACY_PUBLIC_KEY);
|
|
41
|
+
const privateKey = await SecureStore.getItemAsync(LEGACY_PRIVATE_KEY);
|
|
42
|
+
if (publicKey &&
|
|
43
|
+
privateKey &&
|
|
44
|
+
(await this.isUsable({ publicKey, privateKey }))) {
|
|
45
|
+
await this.persistKeyPair({ publicKey, privateKey });
|
|
46
|
+
await Promise.all([
|
|
47
|
+
SecureStore.deleteItemAsync(LEGACY_PUBLIC_KEY),
|
|
48
|
+
SecureStore.deleteItemAsync(LEGACY_PRIVATE_KEY),
|
|
49
|
+
]);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// No usable stored credential — missing, corrupt, or mismatched (e.g. a
|
|
53
|
+
// broken key written before this validation existed). Mint a fresh pair
|
|
54
|
+
// rather than throwing: a key that fails the ownership check can't produce
|
|
55
|
+
// a valid stamp anyway, and a thrown init would brick the app — it could
|
|
56
|
+
// neither log out nor reset the stamper (both need a constructed SDK). The
|
|
57
|
+
// user simply re-authenticates from a clean state. Only validation failures
|
|
58
|
+
// land here; SecureStore I/O errors still propagate (we never discard a key
|
|
59
|
+
// just because a read/write transiently failed).
|
|
60
|
+
await this.resetKeyPair();
|
|
61
|
+
}
|
|
62
|
+
// True if the stored pair passes the ownership check. Isolates validation
|
|
63
|
+
// (pure crypto) from I/O so init() can distinguish an unusable key (reset)
|
|
64
|
+
// from a transient SecureStore failure (propagate).
|
|
65
|
+
async isUsable(pair) {
|
|
66
|
+
try {
|
|
67
|
+
await this.validateKeyPair(pair);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
23
72
|
}
|
|
24
73
|
}
|
|
25
74
|
async getPublicKey() {
|
|
26
75
|
return this.publicKeyHex;
|
|
27
76
|
}
|
|
28
77
|
async resetKeyPair(externalKeyPair) {
|
|
29
|
-
await this.clear();
|
|
30
78
|
const pair = externalKeyPair ?? generateP256KeyPair();
|
|
31
|
-
await
|
|
32
|
-
|
|
79
|
+
await this.persistKeyPair(pair);
|
|
80
|
+
}
|
|
81
|
+
async persistKeyPair(pair) {
|
|
82
|
+
await this.validateKeyPair(pair);
|
|
83
|
+
// SecureStore replaces one value atomically. Update memory only after the
|
|
84
|
+
// durable write succeeds, so a failed rotation preserves the live pair.
|
|
85
|
+
await SecureStore.setItemAsync(KEY_PAIR, JSON.stringify(pair));
|
|
33
86
|
this.publicKeyHex = pair.publicKey;
|
|
34
87
|
}
|
|
88
|
+
async validateKeyPair(pair) {
|
|
89
|
+
try {
|
|
90
|
+
const signature = await new ApiKeyStamper({
|
|
91
|
+
apiPublicKey: pair.publicKey,
|
|
92
|
+
apiPrivateKey: pair.privateKey,
|
|
93
|
+
}).sign(KEY_PAIR_CHECK, SignatureFormat.Der);
|
|
94
|
+
if (await verifyStampSignature(pair.publicKey, signature, KEY_PAIR_CHECK)) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Normalize invalid encoding and mismatched-key failures below.
|
|
100
|
+
}
|
|
101
|
+
throw new Error('Stored public and private keys do not match.');
|
|
102
|
+
}
|
|
35
103
|
async getTurnkeyApiKeyStamper() {
|
|
36
104
|
if (!this.publicKeyHex) {
|
|
37
105
|
throw new Error('Key not initialized. Call init() or resetKeyPair() first.');
|
|
38
106
|
}
|
|
39
|
-
const
|
|
40
|
-
if (!
|
|
41
|
-
throw new Error('No
|
|
107
|
+
const pair = parseKeyPair(await SecureStore.getItemAsync(KEY_PAIR));
|
|
108
|
+
if (!pair || pair.publicKey !== this.publicKeyHex) {
|
|
109
|
+
throw new Error('No matching key pair found in secure store.');
|
|
42
110
|
}
|
|
43
111
|
return new ApiKeyStamper({
|
|
44
112
|
apiPublicKey: this.publicKeyHex,
|
|
45
|
-
apiPrivateKey: privateKey,
|
|
113
|
+
apiPrivateKey: pair.privateKey,
|
|
46
114
|
});
|
|
47
115
|
}
|
|
48
116
|
async stamp(payload) {
|
|
@@ -55,8 +123,13 @@ class SecureStoreStamperInner {
|
|
|
55
123
|
return stamper.sign(payload, SignatureFormat.Der);
|
|
56
124
|
}
|
|
57
125
|
async clear() {
|
|
58
|
-
|
|
59
|
-
|
|
126
|
+
// Remove legacy recovery sources first. If this fails, keep the atomic
|
|
127
|
+
// record authoritative so a later init cannot resurrect a revoked key.
|
|
128
|
+
await Promise.all([
|
|
129
|
+
SecureStore.deleteItemAsync(LEGACY_PUBLIC_KEY),
|
|
130
|
+
SecureStore.deleteItemAsync(LEGACY_PRIVATE_KEY),
|
|
131
|
+
]);
|
|
132
|
+
await SecureStore.deleteItemAsync(KEY_PAIR);
|
|
60
133
|
this.publicKeyHex = null;
|
|
61
134
|
}
|
|
62
135
|
}
|
|
@@ -97,6 +170,7 @@ export async function createSecureStoreStamper() {
|
|
|
97
170
|
return inner.sign(payload);
|
|
98
171
|
},
|
|
99
172
|
async clear() {
|
|
173
|
+
pendingKeyPair = null;
|
|
100
174
|
await inner.clear();
|
|
101
175
|
},
|
|
102
176
|
async resetKeyPair() {
|
|
@@ -108,6 +182,22 @@ export async function createSecureStoreStamper() {
|
|
|
108
182
|
pendingKeyPair = keyPair;
|
|
109
183
|
return keyPair.publicKey;
|
|
110
184
|
},
|
|
185
|
+
async stampPending(payload) {
|
|
186
|
+
if (!pendingKeyPair)
|
|
187
|
+
throw new Error('No pending key rotation');
|
|
188
|
+
return new ApiKeyStamper({
|
|
189
|
+
apiPublicKey: pendingKeyPair.publicKey,
|
|
190
|
+
apiPrivateKey: pendingKeyPair.privateKey,
|
|
191
|
+
}).stamp(payload);
|
|
192
|
+
},
|
|
193
|
+
async signPending(payload) {
|
|
194
|
+
if (!pendingKeyPair)
|
|
195
|
+
throw new Error('No pending key rotation');
|
|
196
|
+
return new ApiKeyStamper({
|
|
197
|
+
apiPublicKey: pendingKeyPair.publicKey,
|
|
198
|
+
apiPrivateKey: pendingKeyPair.privateKey,
|
|
199
|
+
}).sign(payload, SignatureFormat.Der);
|
|
200
|
+
},
|
|
111
201
|
async commitKeyRotation() {
|
|
112
202
|
if (!pendingKeyPair) {
|
|
113
203
|
throw new Error('No pending key rotation to commit');
|
|
@@ -115,6 +205,9 @@ export async function createSecureStoreStamper() {
|
|
|
115
205
|
await inner.resetKeyPair(pendingKeyPair);
|
|
116
206
|
pendingKeyPair = null;
|
|
117
207
|
},
|
|
208
|
+
async discardKeyRotation() {
|
|
209
|
+
pendingKeyPair = null;
|
|
210
|
+
},
|
|
118
211
|
};
|
|
119
212
|
}
|
|
120
213
|
//# sourceMappingURL=secureStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secureStore.js","sourceRoot":"","sources":["../../../../src/native/stampers/secureStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"secureStore.js","sourceRoot":"","sources":["../../../../src/native/stampers/secureStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
|
+
import { p256 } from '@noble/curves/nist.js';
|
|
1
2
|
import { IndexedDbStamper as TurnkeyIndexedDbStamper } from '@turnkey/indexed-db-stamper';
|
|
2
3
|
import { generateCompressedPublicKeyFromKeyPair } from '../utils/utils.js';
|
|
4
|
+
async function signWithKeyPair(keyPair, payload) {
|
|
5
|
+
const rawSignature = new Uint8Array(await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, keyPair.privateKey, new TextEncoder().encode(payload)));
|
|
6
|
+
return p256.Signature.fromBytes(rawSignature, 'compact').toHex('der');
|
|
7
|
+
}
|
|
8
|
+
function encodeStamp(publicKey, signature) {
|
|
9
|
+
const json = JSON.stringify({
|
|
10
|
+
publicKey,
|
|
11
|
+
scheme: 'SIGNATURE_SCHEME_TK_API_P256',
|
|
12
|
+
signature,
|
|
13
|
+
});
|
|
14
|
+
return btoa(json).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
15
|
+
}
|
|
3
16
|
export async function createIndexedDbStamper() {
|
|
4
17
|
const inner = new TurnkeyIndexedDbStamper();
|
|
5
18
|
await inner.init();
|
|
6
19
|
let pendingKeyPair = null;
|
|
20
|
+
// A rotation must be prepared before it can be stamped/signed with; centralize
|
|
21
|
+
// the guard so the pending-key paths don't each repeat it.
|
|
22
|
+
const requirePending = () => {
|
|
23
|
+
if (!pendingKeyPair)
|
|
24
|
+
throw new Error('No pending key rotation');
|
|
25
|
+
return pendingKeyPair;
|
|
26
|
+
};
|
|
7
27
|
return {
|
|
8
28
|
async getPublicKey() {
|
|
9
29
|
return await inner.getPublicKey();
|
|
@@ -15,6 +35,7 @@ export async function createIndexedDbStamper() {
|
|
|
15
35
|
return await inner.sign(payload);
|
|
16
36
|
},
|
|
17
37
|
async clear() {
|
|
38
|
+
pendingKeyPair = null;
|
|
18
39
|
await inner.clear();
|
|
19
40
|
},
|
|
20
41
|
async resetKeyPair() {
|
|
@@ -26,6 +47,18 @@ export async function createIndexedDbStamper() {
|
|
|
26
47
|
pendingKeyPair = keyPair;
|
|
27
48
|
return await generateCompressedPublicKeyFromKeyPair(keyPair);
|
|
28
49
|
},
|
|
50
|
+
async stampPending(payload) {
|
|
51
|
+
const keyPair = requirePending();
|
|
52
|
+
const publicKey = await generateCompressedPublicKeyFromKeyPair(keyPair);
|
|
53
|
+
const signature = await signWithKeyPair(keyPair, payload);
|
|
54
|
+
return {
|
|
55
|
+
stampHeaderName: 'X-Stamp',
|
|
56
|
+
stampHeaderValue: encodeStamp(publicKey, signature),
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
async signPending(payload) {
|
|
60
|
+
return signWithKeyPair(requirePending(), payload);
|
|
61
|
+
},
|
|
29
62
|
async commitKeyRotation() {
|
|
30
63
|
if (!pendingKeyPair) {
|
|
31
64
|
throw new Error('No pending key rotation to commit');
|
|
@@ -33,6 +66,9 @@ export async function createIndexedDbStamper() {
|
|
|
33
66
|
await inner.resetKeyPair(pendingKeyPair);
|
|
34
67
|
pendingKeyPair = null;
|
|
35
68
|
},
|
|
69
|
+
async discardKeyRotation() {
|
|
70
|
+
pendingKeyPair = null;
|
|
71
|
+
},
|
|
36
72
|
};
|
|
37
73
|
}
|
|
38
74
|
//# sourceMappingURL=indexedDbStamper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACzF,OAAO,EAAE,sCAAsC,EAAE,MAAM,mBAAmB,CAAA;AAG1E,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAC3C,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAElB,IAAI,cAAc,GAAyB,IAAI,CAAA;IAE/C,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,cAAc,GAAG,IAAI,CAAA;YACrB,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QAC5B,CAAC;QACD,KAAK,CAAC,kBAAkB;YACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EACtC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAA;YACD,cAAc,GAAG,OAAO,CAAA;YACxB,OAAO,MAAM,sCAAsC,CAAC,OAAO,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK,CAAC,iBAAiB;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACxC,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,82 @@
|
|
|
1
1
|
import { normalizeTimestamp } from '../utils/utils.js';
|
|
2
|
+
// Process-wide serialization queue for storage mutations. Every mutating op
|
|
3
|
+
// runs through `withMutation`, which chains onto this tail so read-modify-write
|
|
4
|
+
// sequences over the shared active-session pointer and session list can't
|
|
5
|
+
// interleave and corrupt each other. Module-level (not per-manager) so
|
|
6
|
+
// concurrent managers over the same storage still serialize; the tail swallows
|
|
7
|
+
// each outcome so one failed mutation never jams the queue.
|
|
8
|
+
let mutationTail = Promise.resolve();
|
|
9
|
+
function isStoredSession(value) {
|
|
10
|
+
if (!value || typeof value !== 'object')
|
|
11
|
+
return false;
|
|
12
|
+
const session = value;
|
|
13
|
+
return (typeof session.id === 'string' &&
|
|
14
|
+
typeof session.userId === 'string' &&
|
|
15
|
+
typeof session.organizationId === 'string' &&
|
|
16
|
+
(session.stamperType === 'apiKey' || session.stamperType === 'passkey') &&
|
|
17
|
+
typeof session.token === 'string' &&
|
|
18
|
+
session.token.length > 0 &&
|
|
19
|
+
typeof session.expiry === 'number' &&
|
|
20
|
+
Number.isFinite(session.expiry) &&
|
|
21
|
+
session.expiry > 0 &&
|
|
22
|
+
typeof session.createdAt === 'number' &&
|
|
23
|
+
Number.isFinite(session.createdAt));
|
|
24
|
+
}
|
|
2
25
|
export function createStorageManager(adapter) {
|
|
3
26
|
const ACTIVE_SESSION_KEY = '@zerodev/active_session';
|
|
4
27
|
const ALL_SESSIONS_KEY = '@zerodev/sessions';
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
28
|
+
const SESSION_TRANSITION_KEY = '@zerodev/session_transition';
|
|
29
|
+
const withMutation = async (mutation) => {
|
|
30
|
+
const result = mutationTail.then(mutation);
|
|
31
|
+
mutationTail = result.then(() => undefined, () => undefined);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
const parseSessionKeys = (value) => {
|
|
35
|
+
if (!value)
|
|
36
|
+
return [];
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(value);
|
|
39
|
+
if (!Array.isArray(parsed) ||
|
|
40
|
+
!parsed.every((key) => typeof key === 'string')) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const restoreItem = async (key, value) => {
|
|
50
|
+
if (value === null)
|
|
51
|
+
await adapter.removeItem(key);
|
|
52
|
+
else
|
|
53
|
+
await adapter.setItem(key, value);
|
|
54
|
+
};
|
|
55
|
+
const storeSessionUnlocked = async (sessionData, sessionKey) => {
|
|
56
|
+
const recordKey = sessionKey;
|
|
57
|
+
const [previousRecord, previousIndex, previousActive] = await Promise.all([
|
|
58
|
+
adapter.getItem(recordKey),
|
|
59
|
+
adapter.getItem(ALL_SESSIONS_KEY),
|
|
60
|
+
adapter.getItem(ACTIVE_SESSION_KEY),
|
|
61
|
+
]);
|
|
62
|
+
try {
|
|
63
|
+
await adapter.setItem(recordKey, JSON.stringify(sessionData));
|
|
64
|
+
const sessions = parseSessionKeys(previousIndex) ?? [];
|
|
65
|
+
if (!sessions.includes(sessionKey))
|
|
66
|
+
sessions.push(sessionKey);
|
|
13
67
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(sessions));
|
|
68
|
+
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
await Promise.allSettled([
|
|
72
|
+
restoreItem(recordKey, previousRecord),
|
|
73
|
+
restoreItem(ALL_SESSIONS_KEY, previousIndex),
|
|
74
|
+
restoreItem(ACTIVE_SESSION_KEY, previousActive),
|
|
75
|
+
]);
|
|
76
|
+
throw error;
|
|
14
77
|
}
|
|
15
|
-
// Set as active session
|
|
16
|
-
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
17
78
|
};
|
|
79
|
+
const storeSession = async (sessionData, sessionKey) => withMutation(() => storeSessionUnlocked(sessionData, sessionKey));
|
|
18
80
|
const getActiveSession = async () => {
|
|
19
81
|
const activeKey = await adapter.getItem(ACTIVE_SESSION_KEY);
|
|
20
82
|
if (!activeKey)
|
|
@@ -31,8 +93,12 @@ export function createStorageManager(adapter) {
|
|
|
31
93
|
return undefined;
|
|
32
94
|
try {
|
|
33
95
|
const session = JSON.parse(sessionStr);
|
|
96
|
+
if (!isStoredSession(session)) {
|
|
97
|
+
await clearSession(sessionKey);
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
34
100
|
// Check if session is expired
|
|
35
|
-
if (
|
|
101
|
+
if (normalizeTimestamp(session.expiry) < Date.now()) {
|
|
36
102
|
await clearSession(sessionKey);
|
|
37
103
|
return undefined;
|
|
38
104
|
}
|
|
@@ -44,23 +110,28 @@ export function createStorageManager(adapter) {
|
|
|
44
110
|
return undefined;
|
|
45
111
|
}
|
|
46
112
|
};
|
|
47
|
-
const
|
|
113
|
+
const listSessionKeysUnlocked = async () => {
|
|
48
114
|
const sessionsStr = await adapter.getItem(ALL_SESSIONS_KEY);
|
|
49
|
-
const
|
|
115
|
+
const parsedKeys = parseSessionKeys(sessionsStr);
|
|
116
|
+
if (!parsedKeys) {
|
|
117
|
+
await adapter.removeItem(ALL_SESSIONS_KEY);
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
50
120
|
// Clean up any keys that don't have corresponding sessions
|
|
51
121
|
const validKeys = [];
|
|
52
|
-
for (const key of
|
|
122
|
+
for (const key of parsedKeys) {
|
|
53
123
|
const exists = await adapter.getItem(key);
|
|
54
124
|
if (exists) {
|
|
55
125
|
validKeys.push(key);
|
|
56
126
|
}
|
|
57
127
|
}
|
|
58
128
|
// Update the list if we found invalid keys
|
|
59
|
-
if (validKeys.length !==
|
|
129
|
+
if (validKeys.length !== parsedKeys.length) {
|
|
60
130
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(validKeys));
|
|
61
131
|
}
|
|
62
132
|
return validKeys;
|
|
63
133
|
};
|
|
134
|
+
const listSessionKeys = async () => withMutation(listSessionKeysUnlocked);
|
|
64
135
|
const listSessions = async () => {
|
|
65
136
|
const sessionKeys = await listSessionKeys();
|
|
66
137
|
const sessions = [];
|
|
@@ -78,13 +149,15 @@ export function createStorageManager(adapter) {
|
|
|
78
149
|
if (!session) {
|
|
79
150
|
throw new Error(`Session not found: ${sessionKey}`);
|
|
80
151
|
}
|
|
81
|
-
await
|
|
152
|
+
await withMutation(async () => {
|
|
153
|
+
await adapter.setItem(ACTIVE_SESSION_KEY, sessionKey);
|
|
154
|
+
});
|
|
82
155
|
};
|
|
83
|
-
const
|
|
156
|
+
const clearSessionUnlocked = async (sessionKey) => {
|
|
84
157
|
// Remove the session data
|
|
85
158
|
await adapter.removeItem(sessionKey);
|
|
86
159
|
// Remove from sessions list
|
|
87
|
-
const sessions = await
|
|
160
|
+
const sessions = await listSessionKeysUnlocked();
|
|
88
161
|
const updated = sessions.filter((k) => k !== sessionKey);
|
|
89
162
|
await adapter.setItem(ALL_SESSIONS_KEY, JSON.stringify(updated));
|
|
90
163
|
// Clear active session if it was the cleared one
|
|
@@ -93,15 +166,67 @@ export function createStorageManager(adapter) {
|
|
|
93
166
|
await adapter.removeItem(ACTIVE_SESSION_KEY);
|
|
94
167
|
}
|
|
95
168
|
};
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
169
|
+
const clearSession = async (sessionKey) => withMutation(() => clearSessionUnlocked(sessionKey));
|
|
170
|
+
const clearAllSessions = async () => withMutation(async () => {
|
|
171
|
+
await clearAllSessionsUnlocked();
|
|
172
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
173
|
+
});
|
|
174
|
+
async function clearAllSessionsUnlocked() {
|
|
175
|
+
const sessions = await listSessionKeysUnlocked();
|
|
99
176
|
for (const key of sessions) {
|
|
100
177
|
await adapter.removeItem(key);
|
|
101
178
|
}
|
|
102
|
-
// Clear the metadata
|
|
103
179
|
await adapter.removeItem(ALL_SESSIONS_KEY);
|
|
104
180
|
await adapter.removeItem(ACTIVE_SESSION_KEY);
|
|
181
|
+
}
|
|
182
|
+
const parseTransition = (value) => {
|
|
183
|
+
if (!value)
|
|
184
|
+
return null;
|
|
185
|
+
try {
|
|
186
|
+
const parsed = JSON.parse(value);
|
|
187
|
+
if (!isStoredSession(parsed.sessionData) ||
|
|
188
|
+
typeof parsed.publicKey !== 'string' ||
|
|
189
|
+
!parsed.publicKey) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
return parsed;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const stageSessionTransition = async (sessionData, publicKey) => withMutation(async () => {
|
|
199
|
+
await adapter.setItem(SESSION_TRANSITION_KEY, JSON.stringify({ sessionData, publicKey }));
|
|
200
|
+
});
|
|
201
|
+
const commitSessionTransition = async () => withMutation(async () => {
|
|
202
|
+
const transition = parseTransition(await adapter.getItem(SESSION_TRANSITION_KEY));
|
|
203
|
+
if (!transition) {
|
|
204
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
await clearAllSessionsUnlocked();
|
|
208
|
+
await storeSessionUnlocked(transition.sessionData, transition.sessionData.id);
|
|
209
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
210
|
+
return transition.sessionData;
|
|
211
|
+
});
|
|
212
|
+
const normalizeKey = (key) => key.replace(/^0x/, '').toLowerCase();
|
|
213
|
+
const recoverSessionTransition = async (activePublicKey) => {
|
|
214
|
+
const transition = parseTransition(await adapter.getItem(SESSION_TRANSITION_KEY));
|
|
215
|
+
if (!transition) {
|
|
216
|
+
if (await adapter.getItem(SESSION_TRANSITION_KEY)) {
|
|
217
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
218
|
+
}
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
if (!activePublicKey) {
|
|
222
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
if (normalizeKey(activePublicKey) !== normalizeKey(transition.publicKey)) {
|
|
226
|
+
await adapter.removeItem(SESSION_TRANSITION_KEY);
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
return commitSessionTransition();
|
|
105
230
|
};
|
|
106
231
|
return {
|
|
107
232
|
storeSession,
|
|
@@ -113,6 +238,9 @@ export function createStorageManager(adapter) {
|
|
|
113
238
|
setActiveSession,
|
|
114
239
|
clearSession,
|
|
115
240
|
clearAllSessions,
|
|
241
|
+
stageSessionTransition,
|
|
242
|
+
commitSessionTransition,
|
|
243
|
+
recoverSessionTransition,
|
|
116
244
|
};
|
|
117
245
|
}
|
|
118
246
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,10 @@ function extractTokenIdFromJwt(jwt) {
|
|
|
43
43
|
if (parts.length !== 3) {
|
|
44
44
|
throw new Error('Invalid JWT format');
|
|
45
45
|
}
|
|
46
|
-
const
|
|
46
|
+
const encodedPayload = parts[1];
|
|
47
|
+
if (!encodedPayload)
|
|
48
|
+
throw new Error('Invalid JWT format');
|
|
49
|
+
const payload = JSON.parse(base64UrlDecode(encodedPayload));
|
|
47
50
|
if (!payload.id) {
|
|
48
51
|
throw new Error('JWT payload missing id field');
|
|
49
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildClientSignature.js","sourceRoot":"","sources":["../../../src/utils/buildClientSignature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAW1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAExD,8DAA8D;IAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAExD,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE;QACpB,OAAO;QACP,IAAI,EAAE,kBAAkB;KACzB,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAEhD,6CAA6C;IAC7C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAE1C,uDAAuD;IACvD,0EAA0E;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,eAAe,GAAW,SAAS,CAAC,SAAS,CAAA;IAEnD,mDAAmD;IACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAA;IAEvD,mCAAmC;IACnC,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,
|
|
1
|
+
{"version":3,"file":"buildClientSignature.js","sourceRoot":"","sources":["../../../src/utils/buildClientSignature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAW1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IAElC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAExD,8DAA8D;IAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAA;IAExD,8CAA8C;IAC9C,MAAM,gBAAgB,GAAG;QACvB,KAAK,EAAE,EAAE,SAAS,EAAE;QACpB,OAAO;QACP,IAAI,EAAE,kBAAkB;KACzB,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAEhD,6CAA6C;IAC7C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAE1C,uDAAuD;IACvD,0EAA0E;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACrE,MAAM,eAAe,GAAW,SAAS,CAAC,SAAS,CAAA;IAEnD,mDAAmD;IACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAA;IAEvD,mCAAmC;IACnC,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;IAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,OAAO,CAAC,EAAE,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,2BAA2B;IAC3B,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC"}
|