@turnkey/sdk-browser 0.0.1 → 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/CHANGELOG.md +6 -0
- package/dist/__generated__/sdk-client-base.d.ts.map +1 -1
- package/dist/__generated__/sdk-client-base.js +173 -43
- package/dist/__generated__/sdk-client-base.js.map +1 -1
- package/dist/__generated__/sdk-client-base.mjs +173 -43
- package/dist/__generated__/sdk-client-base.mjs.map +1 -1
- package/dist/__generated__/version.d.ts +1 -1
- package/dist/__generated__/version.js +1 -1
- package/dist/__generated__/version.mjs +1 -1
- 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/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/models.d.ts +0 -5
- package/dist/models.d.ts.map +1 -1
- package/dist/sdk-client.d.ts +18 -22
- package/dist/sdk-client.d.ts.map +1 -1
- package/dist/sdk-client.js +70 -131
- package/dist/sdk-client.js.map +1 -1
- package/dist/sdk-client.mjs +69 -132
- package/dist/sdk-client.mjs.map +1 -1
- package/dist/storage.d.ts +2 -6
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +5 -9
- package/dist/storage.js.map +1 -1
- package/dist/storage.mjs +5 -9
- package/dist/storage.mjs.map +1 -1
- package/dist/turnkey-helpers.d.ts +2 -0
- package/dist/turnkey-helpers.d.ts.map +1 -1
- package/dist/turnkey-helpers.js +13 -0
- package/dist/turnkey-helpers.js.map +1 -1
- package/dist/turnkey-helpers.mjs +12 -1
- package/dist/turnkey-helpers.mjs.map +1 -1
- package/package.json +4 -3
- package/dist/constants.d.ts +0 -4
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -18
- package/dist/constants.js.map +0 -1
- package/dist/constants.mjs +0 -15
- package/dist/constants.mjs.map +0 -1
package/dist/sdk-client.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var apiKeyStamper = require('@turnkey/api-key-stamper');
|
|
4
3
|
var webauthnStamper = require('@turnkey/webauthn-stamper');
|
|
5
4
|
var iframeStamper = require('@turnkey/iframe-stamper');
|
|
6
5
|
var http = require('@turnkey/http');
|
|
7
6
|
var version = require('./__generated__/version.js');
|
|
7
|
+
var window = require('./__polyfills__/window.js');
|
|
8
8
|
var base = require('./__types__/base.js');
|
|
9
9
|
var sdkClientBase = require('./__generated__/sdk-client-base.js');
|
|
10
|
-
var elliptic = require('elliptic');
|
|
11
10
|
var storage = require('./storage.js');
|
|
12
11
|
var utils = require('./utils.js');
|
|
13
|
-
var constants = require('./constants.js');
|
|
14
12
|
|
|
15
13
|
class TurnkeyBrowserSDK {
|
|
16
14
|
constructor(config) {
|
|
@@ -20,10 +18,11 @@ class TurnkeyBrowserSDK {
|
|
|
20
18
|
return;
|
|
21
19
|
}
|
|
22
20
|
if (currentUser?.readOnlySession?.sessionExpiry > Date.now()) {
|
|
23
|
-
return new
|
|
21
|
+
return new TurnkeyBrowserClient({
|
|
24
22
|
readOnlySession: currentUser?.readOnlySession?.session,
|
|
25
23
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
26
|
-
organizationId:
|
|
24
|
+
organizationId: currentUser?.organization?.organizationId ??
|
|
25
|
+
this.config.defaultOrganizationId,
|
|
27
26
|
});
|
|
28
27
|
}
|
|
29
28
|
else {
|
|
@@ -31,50 +30,38 @@ class TurnkeyBrowserSDK {
|
|
|
31
30
|
}
|
|
32
31
|
return;
|
|
33
32
|
};
|
|
34
|
-
this.
|
|
33
|
+
this.passkeyClient = (rpId) => {
|
|
35
34
|
const targetRpId = rpId ?? this.config.rpId ?? window.location.hostname;
|
|
36
35
|
if (!targetRpId) {
|
|
37
|
-
throw new Error("Tried to initialize a passkey
|
|
36
|
+
throw new Error("Tried to initialize a passkey client with no rpId defined");
|
|
38
37
|
}
|
|
39
38
|
const webauthnStamper$1 = new webauthnStamper.WebauthnStamper({
|
|
40
39
|
rpId: targetRpId,
|
|
41
40
|
});
|
|
42
|
-
return new
|
|
41
|
+
return new TurnkeyPasskeyClient({
|
|
43
42
|
stamper: webauthnStamper$1,
|
|
44
43
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
45
44
|
organizationId: this.config.defaultOrganizationId,
|
|
46
45
|
});
|
|
47
46
|
};
|
|
48
|
-
this.
|
|
47
|
+
this.iframeClient = async (iframeContainer, iframeUrl) => {
|
|
49
48
|
const targetIframeUrl = iframeUrl ?? this.config.iframeUrl;
|
|
50
49
|
if (!targetIframeUrl) {
|
|
51
50
|
throw new Error("Tried to initialize iframeSigner with no iframeUrl defined");
|
|
52
51
|
}
|
|
53
|
-
const TurnkeyIframeElementId = "turnkey-
|
|
52
|
+
const TurnkeyIframeElementId = "turnkey-default-iframe-element-id";
|
|
54
53
|
const iframeStamper$1 = new iframeStamper.IframeStamper({
|
|
55
54
|
iframeUrl: targetIframeUrl,
|
|
56
55
|
iframeElementId: TurnkeyIframeElementId,
|
|
57
56
|
iframeContainer: iframeContainer,
|
|
58
57
|
});
|
|
59
58
|
await iframeStamper$1.init();
|
|
60
|
-
return new
|
|
59
|
+
return new TurnkeyIframeClient({
|
|
61
60
|
stamper: iframeStamper$1,
|
|
62
61
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
63
62
|
organizationId: this.config.defaultOrganizationId,
|
|
64
63
|
});
|
|
65
64
|
};
|
|
66
|
-
this.sessionSigner = async () => {
|
|
67
|
-
const signingSession = await storage.getStorageValue(storage.StorageKeys.CurrentSigningSession);
|
|
68
|
-
const sessionStamper = new apiKeyStamper.ApiKeyStamper({
|
|
69
|
-
apiPublicKey: signingSession.publicKey,
|
|
70
|
-
apiPrivateKey: signingSession.privateKey,
|
|
71
|
-
});
|
|
72
|
-
return new TurnkeySDKBrowserClient({
|
|
73
|
-
stamper: sessionStamper,
|
|
74
|
-
apiBaseUrl: this.config.apiBaseUrl,
|
|
75
|
-
organizationId: this.config.defaultOrganizationId,
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
65
|
this.serverSign = async (methodName, params, serverSignUrl) => {
|
|
79
66
|
const targetServerSignUrl = serverSignUrl ?? this.config.serverSignUrl;
|
|
80
67
|
if (!targetServerSignUrl) {
|
|
@@ -107,14 +94,62 @@ class TurnkeyBrowserSDK {
|
|
|
107
94
|
return data;
|
|
108
95
|
};
|
|
109
96
|
// Local
|
|
97
|
+
this.getCurrentSubOrganization = async () => {
|
|
98
|
+
const currentUser = await this.getCurrentUser();
|
|
99
|
+
return currentUser?.organization;
|
|
100
|
+
};
|
|
101
|
+
this.getCurrentUser = async () => {
|
|
102
|
+
return await storage.getStorageValue(storage.StorageKeys.CurrentUser);
|
|
103
|
+
};
|
|
104
|
+
this.logoutUser = async () => {
|
|
105
|
+
await storage.removeStorageValue(storage.StorageKeys.CurrentUser);
|
|
106
|
+
return true;
|
|
107
|
+
};
|
|
108
|
+
this.config = config;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
class TurnkeyBrowserClient extends sdkClientBase.TurnkeySDKClientBase {
|
|
112
|
+
constructor(config) {
|
|
113
|
+
super(config);
|
|
114
|
+
this.login = async () => {
|
|
115
|
+
const readOnlySessionResult = await this.createReadOnlySession({});
|
|
116
|
+
const org = {
|
|
117
|
+
organizationId: readOnlySessionResult.organizationId,
|
|
118
|
+
organizationName: readOnlySessionResult.organizationName,
|
|
119
|
+
};
|
|
120
|
+
const currentUser = {
|
|
121
|
+
userId: readOnlySessionResult.userId,
|
|
122
|
+
username: readOnlySessionResult.username,
|
|
123
|
+
organization: org,
|
|
124
|
+
readOnlySession: {
|
|
125
|
+
session: readOnlySessionResult.session,
|
|
126
|
+
sessionExpiry: Number(readOnlySessionResult.sessionExpiry),
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
await storage.setStorageValue(storage.StorageKeys.CurrentUser, currentUser);
|
|
130
|
+
return readOnlySessionResult;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
class TurnkeyPasskeyClient extends TurnkeyBrowserClient {
|
|
135
|
+
constructor(config) {
|
|
136
|
+
super(config);
|
|
110
137
|
this.createUserPasskey = async (config = {}) => {
|
|
111
138
|
const challenge = utils.generateRandomBuffer();
|
|
112
139
|
const encodedChallenge = utils.base64UrlEncode(challenge);
|
|
113
140
|
const authenticatorUserId = utils.generateRandomBuffer();
|
|
141
|
+
// WebAuthn credential options options can be found here:
|
|
142
|
+
// https://www.w3.org/TR/webauthn-2/#sctn-sample-registration
|
|
143
|
+
//
|
|
144
|
+
// All pubkey algorithms can be found here: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
|
|
145
|
+
// Turnkey only supports ES256 (-7) and RS256 (-257)
|
|
146
|
+
//
|
|
147
|
+
// The pubkey type only supports one value, "public-key"
|
|
148
|
+
// See https://www.w3.org/TR/webauthn-2/#enumdef-publickeycredentialtype for more details
|
|
114
149
|
const webauthnConfig = {
|
|
115
150
|
publicKey: {
|
|
116
151
|
rp: {
|
|
117
|
-
id: config.publicKey?.rp?.id ??
|
|
152
|
+
id: config.publicKey?.rp?.id ?? this.rpId,
|
|
118
153
|
name: config.publicKey?.rp?.name ?? "",
|
|
119
154
|
},
|
|
120
155
|
challenge: config.publicKey?.challenge ?? challenge,
|
|
@@ -126,8 +161,8 @@ class TurnkeyBrowserSDK {
|
|
|
126
161
|
],
|
|
127
162
|
user: {
|
|
128
163
|
id: config.publicKey?.user?.id ?? authenticatorUserId,
|
|
129
|
-
name: config.publicKey?.user?.name ?? "",
|
|
130
|
-
displayName: config.publicKey?.user?.displayName ?? "",
|
|
164
|
+
name: config.publicKey?.user?.name ?? "Default User",
|
|
165
|
+
displayName: config.publicKey?.user?.displayName ?? "Default User",
|
|
131
166
|
},
|
|
132
167
|
authenticatorSelection: {
|
|
133
168
|
requireResidentKey: config.publicKey?.authenticatorSelection?.requireResidentKey ??
|
|
@@ -146,118 +181,22 @@ class TurnkeyBrowserSDK {
|
|
|
146
181
|
attestation: attestation,
|
|
147
182
|
};
|
|
148
183
|
};
|
|
149
|
-
this.
|
|
150
|
-
const currentUser = await this.getCurrentUser();
|
|
151
|
-
return currentUser?.organization;
|
|
152
|
-
};
|
|
153
|
-
this.getCurrentUser = async () => {
|
|
154
|
-
return await storage.getStorageValue(storage.StorageKeys.CurrentUser);
|
|
155
|
-
};
|
|
156
|
-
this.getCurrentSigningSession = async () => {
|
|
157
|
-
return await storage.getStorageValue(storage.StorageKeys.CurrentSigningSession);
|
|
158
|
-
};
|
|
159
|
-
this.isSigningSessionActive = async () => {
|
|
160
|
-
const signingSession = await this.getCurrentSigningSession();
|
|
161
|
-
if (signingSession && signingSession.expiration > Date.now()) {
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
return false;
|
|
165
|
-
};
|
|
166
|
-
this.logoutUser = async () => {
|
|
167
|
-
await storage.removeStorageValue(storage.StorageKeys.CurrentUser);
|
|
168
|
-
await storage.removeStorageValue(storage.StorageKeys.CurrentSubOrganization);
|
|
169
|
-
return true;
|
|
170
|
-
};
|
|
171
|
-
this.config = config;
|
|
184
|
+
this.rpId = config.stamper.rpId;
|
|
172
185
|
}
|
|
173
186
|
}
|
|
174
|
-
class
|
|
187
|
+
class TurnkeyIframeClient extends TurnkeyBrowserClient {
|
|
175
188
|
constructor(config) {
|
|
176
189
|
super(config);
|
|
177
|
-
this.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
return await this.createWallet({
|
|
181
|
-
walletName: params.walletName,
|
|
182
|
-
accounts: [constants.DEFAULT_SOLANA_WALLET_ACCOUNT],
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
default: {
|
|
186
|
-
return await this.createWallet({
|
|
187
|
-
walletName: params.walletName,
|
|
188
|
-
accounts: [constants.DEFAULT_ETHEREUM_WALLET_ACCOUNT],
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
this.createNextWalletAccount = async (params) => {
|
|
194
|
-
const walletAccounts = await this.getWalletAccounts({
|
|
195
|
-
walletId: params.walletId,
|
|
196
|
-
});
|
|
197
|
-
const lastAccount = walletAccounts.accounts[walletAccounts.accounts.length - 1];
|
|
198
|
-
const lastAccountPath = lastAccount.path.split("/");
|
|
199
|
-
const lastAccountPathIndex = lastAccountPath[3].replace(/[^0-9]/g, "");
|
|
200
|
-
const nextPathIndex = Number(lastAccountPathIndex) + 1;
|
|
201
|
-
lastAccountPath[3] = `${nextPathIndex}'`;
|
|
202
|
-
const nextAccountPath = lastAccountPath.join("/");
|
|
203
|
-
return await this.createWalletAccounts({
|
|
204
|
-
walletId: params.walletId,
|
|
205
|
-
accounts: [
|
|
206
|
-
{
|
|
207
|
-
curve: lastAccount.curve,
|
|
208
|
-
pathFormat: lastAccount.pathFormat,
|
|
209
|
-
addressFormat: lastAccount.addressFormat,
|
|
210
|
-
path: nextAccountPath,
|
|
211
|
-
},
|
|
212
|
-
],
|
|
213
|
-
});
|
|
214
|
-
};
|
|
215
|
-
this.login = async () => {
|
|
216
|
-
const readOnlySessionResult = await this.createReadOnlySession({});
|
|
217
|
-
const org = {
|
|
218
|
-
organizationId: readOnlySessionResult.organizationId,
|
|
219
|
-
organizationName: readOnlySessionResult.organizationName,
|
|
220
|
-
};
|
|
221
|
-
const currentUser = {
|
|
222
|
-
userId: readOnlySessionResult.userId,
|
|
223
|
-
username: readOnlySessionResult.username,
|
|
224
|
-
organization: org,
|
|
225
|
-
readOnlySession: {
|
|
226
|
-
session: readOnlySessionResult.session,
|
|
227
|
-
sessionExpiry: Number(readOnlySessionResult.sessionExpiry),
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
await storage.setStorageValue(storage.StorageKeys.CurrentUser, currentUser);
|
|
231
|
-
await storage.setStorageValue(storage.StorageKeys.CurrentSubOrganization, org);
|
|
232
|
-
return readOnlySessionResult;
|
|
233
|
-
};
|
|
234
|
-
this.createSigningSessionKey = async (params) => {
|
|
235
|
-
const currentUser = await storage.getStorageValue(storage.StorageKeys.CurrentUser);
|
|
236
|
-
const ec = new elliptic.ec("p256");
|
|
237
|
-
const keyPair = ec.genKeyPair();
|
|
238
|
-
const signingSession = {
|
|
239
|
-
publicKey: keyPair.getPublic(true, "hex"),
|
|
240
|
-
privateKey: keyPair.getPrivate("hex"),
|
|
241
|
-
expiration: Date.now() + params.duration * 1000,
|
|
242
|
-
};
|
|
243
|
-
const response = await this.createApiKeys({
|
|
244
|
-
apiKeys: [
|
|
245
|
-
{
|
|
246
|
-
apiKeyName: `Short-lived Signing Session Key ${Date.now()}`,
|
|
247
|
-
publicKey: signingSession.publicKey,
|
|
248
|
-
expirationSeconds: `${params.duration}`,
|
|
249
|
-
},
|
|
250
|
-
],
|
|
251
|
-
userId: currentUser.userId,
|
|
252
|
-
});
|
|
253
|
-
if (response) {
|
|
254
|
-
storage.setStorageValue(storage.StorageKeys.CurrentSigningSession, signingSession);
|
|
255
|
-
}
|
|
256
|
-
return response;
|
|
190
|
+
this.injectCredentialBundle = async (credentialBundle) => {
|
|
191
|
+
const stamper = this.config.stamper;
|
|
192
|
+
return await stamper.injectCredentialBundle(credentialBundle);
|
|
257
193
|
};
|
|
194
|
+
this.iframePublicKey = config.stamper.iframePublicKey;
|
|
258
195
|
}
|
|
259
196
|
}
|
|
260
197
|
|
|
198
|
+
exports.TurnkeyBrowserClient = TurnkeyBrowserClient;
|
|
261
199
|
exports.TurnkeyBrowserSDK = TurnkeyBrowserSDK;
|
|
262
|
-
exports.
|
|
200
|
+
exports.TurnkeyIframeClient = TurnkeyIframeClient;
|
|
201
|
+
exports.TurnkeyPasskeyClient = TurnkeyPasskeyClient;
|
|
263
202
|
//# sourceMappingURL=sdk-client.js.map
|
package/dist/sdk-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-client.js","sources":["../src/sdk-client.ts"],"sourcesContent":[null],"names":["webauthnStamper","WebauthnStamper","iframeStamper","IframeStamper","
|
|
1
|
+
{"version":3,"file":"sdk-client.js","sources":["../src/sdk-client.ts"],"sourcesContent":[null],"names":["WindowWrapper","webauthnStamper","WebauthnStamper","iframeStamper","IframeStamper","VERSION","TurnkeyRequestError","getStorageValue","StorageKeys","removeStorageValue","TurnkeySDKClientBase","setStorageValue","generateRandomBuffer","base64UrlEncode","getWebAuthnAttestation"],"mappings":"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"}
|
package/dist/sdk-client.mjs
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { ApiKeyStamper } from '@turnkey/api-key-stamper';
|
|
2
1
|
import { WebauthnStamper } from '@turnkey/webauthn-stamper';
|
|
3
2
|
import { IframeStamper } from '@turnkey/iframe-stamper';
|
|
4
3
|
import { getWebAuthnAttestation } from '@turnkey/http';
|
|
5
4
|
import { VERSION } from './__generated__/version.mjs';
|
|
5
|
+
import WindowWrapper from './__polyfills__/window.mjs';
|
|
6
6
|
import { TurnkeyRequestError } from './__types__/base.mjs';
|
|
7
7
|
import { TurnkeySDKClientBase } from './__generated__/sdk-client-base.mjs';
|
|
8
|
-
import elliptic from 'elliptic';
|
|
9
8
|
import { getStorageValue, StorageKeys, removeStorageValue, setStorageValue } from './storage.mjs';
|
|
10
9
|
import { generateRandomBuffer, base64UrlEncode } from './utils.mjs';
|
|
11
|
-
import { DEFAULT_ETHEREUM_WALLET_ACCOUNT, DEFAULT_SOLANA_WALLET_ACCOUNT } from './constants.mjs';
|
|
12
10
|
|
|
13
11
|
class TurnkeyBrowserSDK {
|
|
14
12
|
constructor(config) {
|
|
@@ -18,10 +16,11 @@ class TurnkeyBrowserSDK {
|
|
|
18
16
|
return;
|
|
19
17
|
}
|
|
20
18
|
if (currentUser?.readOnlySession?.sessionExpiry > Date.now()) {
|
|
21
|
-
return new
|
|
19
|
+
return new TurnkeyBrowserClient({
|
|
22
20
|
readOnlySession: currentUser?.readOnlySession?.session,
|
|
23
21
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
24
|
-
organizationId:
|
|
22
|
+
organizationId: currentUser?.organization?.organizationId ??
|
|
23
|
+
this.config.defaultOrganizationId,
|
|
25
24
|
});
|
|
26
25
|
}
|
|
27
26
|
else {
|
|
@@ -29,50 +28,38 @@ class TurnkeyBrowserSDK {
|
|
|
29
28
|
}
|
|
30
29
|
return;
|
|
31
30
|
};
|
|
32
|
-
this.
|
|
33
|
-
const targetRpId = rpId ?? this.config.rpId ??
|
|
31
|
+
this.passkeyClient = (rpId) => {
|
|
32
|
+
const targetRpId = rpId ?? this.config.rpId ?? WindowWrapper.location.hostname;
|
|
34
33
|
if (!targetRpId) {
|
|
35
|
-
throw new Error("Tried to initialize a passkey
|
|
34
|
+
throw new Error("Tried to initialize a passkey client with no rpId defined");
|
|
36
35
|
}
|
|
37
36
|
const webauthnStamper = new WebauthnStamper({
|
|
38
37
|
rpId: targetRpId,
|
|
39
38
|
});
|
|
40
|
-
return new
|
|
39
|
+
return new TurnkeyPasskeyClient({
|
|
41
40
|
stamper: webauthnStamper,
|
|
42
41
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
43
42
|
organizationId: this.config.defaultOrganizationId,
|
|
44
43
|
});
|
|
45
44
|
};
|
|
46
|
-
this.
|
|
45
|
+
this.iframeClient = async (iframeContainer, iframeUrl) => {
|
|
47
46
|
const targetIframeUrl = iframeUrl ?? this.config.iframeUrl;
|
|
48
47
|
if (!targetIframeUrl) {
|
|
49
48
|
throw new Error("Tried to initialize iframeSigner with no iframeUrl defined");
|
|
50
49
|
}
|
|
51
|
-
const TurnkeyIframeElementId = "turnkey-
|
|
50
|
+
const TurnkeyIframeElementId = "turnkey-default-iframe-element-id";
|
|
52
51
|
const iframeStamper = new IframeStamper({
|
|
53
52
|
iframeUrl: targetIframeUrl,
|
|
54
53
|
iframeElementId: TurnkeyIframeElementId,
|
|
55
54
|
iframeContainer: iframeContainer,
|
|
56
55
|
});
|
|
57
56
|
await iframeStamper.init();
|
|
58
|
-
return new
|
|
57
|
+
return new TurnkeyIframeClient({
|
|
59
58
|
stamper: iframeStamper,
|
|
60
59
|
apiBaseUrl: this.config.apiBaseUrl,
|
|
61
60
|
organizationId: this.config.defaultOrganizationId,
|
|
62
61
|
});
|
|
63
62
|
};
|
|
64
|
-
this.sessionSigner = async () => {
|
|
65
|
-
const signingSession = await getStorageValue(StorageKeys.CurrentSigningSession);
|
|
66
|
-
const sessionStamper = new ApiKeyStamper({
|
|
67
|
-
apiPublicKey: signingSession.publicKey,
|
|
68
|
-
apiPrivateKey: signingSession.privateKey,
|
|
69
|
-
});
|
|
70
|
-
return new TurnkeySDKBrowserClient({
|
|
71
|
-
stamper: sessionStamper,
|
|
72
|
-
apiBaseUrl: this.config.apiBaseUrl,
|
|
73
|
-
organizationId: this.config.defaultOrganizationId,
|
|
74
|
-
});
|
|
75
|
-
};
|
|
76
63
|
this.serverSign = async (methodName, params, serverSignUrl) => {
|
|
77
64
|
const targetServerSignUrl = serverSignUrl ?? this.config.serverSignUrl;
|
|
78
65
|
if (!targetServerSignUrl) {
|
|
@@ -105,14 +92,62 @@ class TurnkeyBrowserSDK {
|
|
|
105
92
|
return data;
|
|
106
93
|
};
|
|
107
94
|
// Local
|
|
95
|
+
this.getCurrentSubOrganization = async () => {
|
|
96
|
+
const currentUser = await this.getCurrentUser();
|
|
97
|
+
return currentUser?.organization;
|
|
98
|
+
};
|
|
99
|
+
this.getCurrentUser = async () => {
|
|
100
|
+
return await getStorageValue(StorageKeys.CurrentUser);
|
|
101
|
+
};
|
|
102
|
+
this.logoutUser = async () => {
|
|
103
|
+
await removeStorageValue(StorageKeys.CurrentUser);
|
|
104
|
+
return true;
|
|
105
|
+
};
|
|
106
|
+
this.config = config;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
class TurnkeyBrowserClient extends TurnkeySDKClientBase {
|
|
110
|
+
constructor(config) {
|
|
111
|
+
super(config);
|
|
112
|
+
this.login = async () => {
|
|
113
|
+
const readOnlySessionResult = await this.createReadOnlySession({});
|
|
114
|
+
const org = {
|
|
115
|
+
organizationId: readOnlySessionResult.organizationId,
|
|
116
|
+
organizationName: readOnlySessionResult.organizationName,
|
|
117
|
+
};
|
|
118
|
+
const currentUser = {
|
|
119
|
+
userId: readOnlySessionResult.userId,
|
|
120
|
+
username: readOnlySessionResult.username,
|
|
121
|
+
organization: org,
|
|
122
|
+
readOnlySession: {
|
|
123
|
+
session: readOnlySessionResult.session,
|
|
124
|
+
sessionExpiry: Number(readOnlySessionResult.sessionExpiry),
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
await setStorageValue(StorageKeys.CurrentUser, currentUser);
|
|
128
|
+
return readOnlySessionResult;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
class TurnkeyPasskeyClient extends TurnkeyBrowserClient {
|
|
133
|
+
constructor(config) {
|
|
134
|
+
super(config);
|
|
108
135
|
this.createUserPasskey = async (config = {}) => {
|
|
109
136
|
const challenge = generateRandomBuffer();
|
|
110
137
|
const encodedChallenge = base64UrlEncode(challenge);
|
|
111
138
|
const authenticatorUserId = generateRandomBuffer();
|
|
139
|
+
// WebAuthn credential options options can be found here:
|
|
140
|
+
// https://www.w3.org/TR/webauthn-2/#sctn-sample-registration
|
|
141
|
+
//
|
|
142
|
+
// All pubkey algorithms can be found here: https://www.iana.org/assignments/cose/cose.xhtml#algorithms
|
|
143
|
+
// Turnkey only supports ES256 (-7) and RS256 (-257)
|
|
144
|
+
//
|
|
145
|
+
// The pubkey type only supports one value, "public-key"
|
|
146
|
+
// See https://www.w3.org/TR/webauthn-2/#enumdef-publickeycredentialtype for more details
|
|
112
147
|
const webauthnConfig = {
|
|
113
148
|
publicKey: {
|
|
114
149
|
rp: {
|
|
115
|
-
id: config.publicKey?.rp?.id ??
|
|
150
|
+
id: config.publicKey?.rp?.id ?? this.rpId,
|
|
116
151
|
name: config.publicKey?.rp?.name ?? "",
|
|
117
152
|
},
|
|
118
153
|
challenge: config.publicKey?.challenge ?? challenge,
|
|
@@ -124,8 +159,8 @@ class TurnkeyBrowserSDK {
|
|
|
124
159
|
],
|
|
125
160
|
user: {
|
|
126
161
|
id: config.publicKey?.user?.id ?? authenticatorUserId,
|
|
127
|
-
name: config.publicKey?.user?.name ?? "",
|
|
128
|
-
displayName: config.publicKey?.user?.displayName ?? "",
|
|
162
|
+
name: config.publicKey?.user?.name ?? "Default User",
|
|
163
|
+
displayName: config.publicKey?.user?.displayName ?? "Default User",
|
|
129
164
|
},
|
|
130
165
|
authenticatorSelection: {
|
|
131
166
|
requireResidentKey: config.publicKey?.authenticatorSelection?.requireResidentKey ??
|
|
@@ -144,117 +179,19 @@ class TurnkeyBrowserSDK {
|
|
|
144
179
|
attestation: attestation,
|
|
145
180
|
};
|
|
146
181
|
};
|
|
147
|
-
this.
|
|
148
|
-
const currentUser = await this.getCurrentUser();
|
|
149
|
-
return currentUser?.organization;
|
|
150
|
-
};
|
|
151
|
-
this.getCurrentUser = async () => {
|
|
152
|
-
return await getStorageValue(StorageKeys.CurrentUser);
|
|
153
|
-
};
|
|
154
|
-
this.getCurrentSigningSession = async () => {
|
|
155
|
-
return await getStorageValue(StorageKeys.CurrentSigningSession);
|
|
156
|
-
};
|
|
157
|
-
this.isSigningSessionActive = async () => {
|
|
158
|
-
const signingSession = await this.getCurrentSigningSession();
|
|
159
|
-
if (signingSession && signingSession.expiration > Date.now()) {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
return false;
|
|
163
|
-
};
|
|
164
|
-
this.logoutUser = async () => {
|
|
165
|
-
await removeStorageValue(StorageKeys.CurrentUser);
|
|
166
|
-
await removeStorageValue(StorageKeys.CurrentSubOrganization);
|
|
167
|
-
return true;
|
|
168
|
-
};
|
|
169
|
-
this.config = config;
|
|
182
|
+
this.rpId = config.stamper.rpId;
|
|
170
183
|
}
|
|
171
184
|
}
|
|
172
|
-
class
|
|
185
|
+
class TurnkeyIframeClient extends TurnkeyBrowserClient {
|
|
173
186
|
constructor(config) {
|
|
174
187
|
super(config);
|
|
175
|
-
this.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return await this.createWallet({
|
|
179
|
-
walletName: params.walletName,
|
|
180
|
-
accounts: [DEFAULT_SOLANA_WALLET_ACCOUNT],
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
default: {
|
|
184
|
-
return await this.createWallet({
|
|
185
|
-
walletName: params.walletName,
|
|
186
|
-
accounts: [DEFAULT_ETHEREUM_WALLET_ACCOUNT],
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
this.createNextWalletAccount = async (params) => {
|
|
192
|
-
const walletAccounts = await this.getWalletAccounts({
|
|
193
|
-
walletId: params.walletId,
|
|
194
|
-
});
|
|
195
|
-
const lastAccount = walletAccounts.accounts[walletAccounts.accounts.length - 1];
|
|
196
|
-
const lastAccountPath = lastAccount.path.split("/");
|
|
197
|
-
const lastAccountPathIndex = lastAccountPath[3].replace(/[^0-9]/g, "");
|
|
198
|
-
const nextPathIndex = Number(lastAccountPathIndex) + 1;
|
|
199
|
-
lastAccountPath[3] = `${nextPathIndex}'`;
|
|
200
|
-
const nextAccountPath = lastAccountPath.join("/");
|
|
201
|
-
return await this.createWalletAccounts({
|
|
202
|
-
walletId: params.walletId,
|
|
203
|
-
accounts: [
|
|
204
|
-
{
|
|
205
|
-
curve: lastAccount.curve,
|
|
206
|
-
pathFormat: lastAccount.pathFormat,
|
|
207
|
-
addressFormat: lastAccount.addressFormat,
|
|
208
|
-
path: nextAccountPath,
|
|
209
|
-
},
|
|
210
|
-
],
|
|
211
|
-
});
|
|
212
|
-
};
|
|
213
|
-
this.login = async () => {
|
|
214
|
-
const readOnlySessionResult = await this.createReadOnlySession({});
|
|
215
|
-
const org = {
|
|
216
|
-
organizationId: readOnlySessionResult.organizationId,
|
|
217
|
-
organizationName: readOnlySessionResult.organizationName,
|
|
218
|
-
};
|
|
219
|
-
const currentUser = {
|
|
220
|
-
userId: readOnlySessionResult.userId,
|
|
221
|
-
username: readOnlySessionResult.username,
|
|
222
|
-
organization: org,
|
|
223
|
-
readOnlySession: {
|
|
224
|
-
session: readOnlySessionResult.session,
|
|
225
|
-
sessionExpiry: Number(readOnlySessionResult.sessionExpiry),
|
|
226
|
-
},
|
|
227
|
-
};
|
|
228
|
-
await setStorageValue(StorageKeys.CurrentUser, currentUser);
|
|
229
|
-
await setStorageValue(StorageKeys.CurrentSubOrganization, org);
|
|
230
|
-
return readOnlySessionResult;
|
|
231
|
-
};
|
|
232
|
-
this.createSigningSessionKey = async (params) => {
|
|
233
|
-
const currentUser = await getStorageValue(StorageKeys.CurrentUser);
|
|
234
|
-
const ec = new elliptic.ec("p256");
|
|
235
|
-
const keyPair = ec.genKeyPair();
|
|
236
|
-
const signingSession = {
|
|
237
|
-
publicKey: keyPair.getPublic(true, "hex"),
|
|
238
|
-
privateKey: keyPair.getPrivate("hex"),
|
|
239
|
-
expiration: Date.now() + params.duration * 1000,
|
|
240
|
-
};
|
|
241
|
-
const response = await this.createApiKeys({
|
|
242
|
-
apiKeys: [
|
|
243
|
-
{
|
|
244
|
-
apiKeyName: `Short-lived Signing Session Key ${Date.now()}`,
|
|
245
|
-
publicKey: signingSession.publicKey,
|
|
246
|
-
expirationSeconds: `${params.duration}`,
|
|
247
|
-
},
|
|
248
|
-
],
|
|
249
|
-
userId: currentUser.userId,
|
|
250
|
-
});
|
|
251
|
-
if (response) {
|
|
252
|
-
setStorageValue(StorageKeys.CurrentSigningSession, signingSession);
|
|
253
|
-
}
|
|
254
|
-
return response;
|
|
188
|
+
this.injectCredentialBundle = async (credentialBundle) => {
|
|
189
|
+
const stamper = this.config.stamper;
|
|
190
|
+
return await stamper.injectCredentialBundle(credentialBundle);
|
|
255
191
|
};
|
|
192
|
+
this.iframePublicKey = config.stamper.iframePublicKey;
|
|
256
193
|
}
|
|
257
194
|
}
|
|
258
195
|
|
|
259
|
-
export { TurnkeyBrowserSDK,
|
|
196
|
+
export { TurnkeyBrowserClient, TurnkeyBrowserSDK, TurnkeyIframeClient, TurnkeyPasskeyClient };
|
|
260
197
|
//# sourceMappingURL=sdk-client.mjs.map
|