@turnkey/sdk-browser 1.15.0 → 2.0.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/__clients__/base-client.d.ts +7 -0
  3. package/dist/__clients__/base-client.d.ts.map +1 -0
  4. package/dist/__clients__/base-client.js +13 -0
  5. package/dist/__clients__/base-client.js.map +1 -0
  6. package/dist/__clients__/base-client.mjs +11 -0
  7. package/dist/__clients__/base-client.mjs.map +1 -0
  8. package/dist/__clients__/browser-clients.d.ts +243 -0
  9. package/dist/__clients__/browser-clients.d.ts.map +1 -0
  10. package/dist/__clients__/browser-clients.js +633 -0
  11. package/dist/__clients__/browser-clients.js.map +1 -0
  12. package/dist/__clients__/browser-clients.mjs +628 -0
  13. package/dist/__clients__/browser-clients.mjs.map +1 -0
  14. package/dist/__generated__/sdk-client-base.d.ts.map +1 -1
  15. package/dist/__generated__/sdk-client-base.js +106 -110
  16. package/dist/__generated__/sdk-client-base.js.map +1 -1
  17. package/dist/__generated__/sdk-client-base.mjs +106 -110
  18. package/dist/__generated__/sdk-client-base.mjs.map +1 -1
  19. package/dist/__generated__/version.d.ts +1 -1
  20. package/dist/__generated__/version.d.ts.map +1 -1
  21. package/dist/__generated__/version.js +1 -1
  22. package/dist/__generated__/version.mjs +1 -1
  23. package/dist/__types__/base.d.ts +12 -0
  24. package/dist/__types__/base.d.ts.map +1 -1
  25. package/dist/__types__/base.js +5 -0
  26. package/dist/__types__/base.js.map +1 -1
  27. package/dist/__types__/base.mjs +6 -1
  28. package/dist/__types__/base.mjs.map +1 -1
  29. package/dist/constants.d.ts +2 -0
  30. package/dist/constants.d.ts.map +1 -0
  31. package/dist/constants.js +6 -0
  32. package/dist/constants.js.map +1 -0
  33. package/dist/constants.mjs +4 -0
  34. package/dist/constants.mjs.map +1 -0
  35. package/dist/index.d.ts +4 -4
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +9 -4
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +3 -2
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/models.d.ts +1 -1
  42. package/dist/models.d.ts.map +1 -1
  43. package/dist/sdk-client.d.ts +34 -85
  44. package/dist/sdk-client.d.ts.map +1 -1
  45. package/dist/sdk-client.js +75 -245
  46. package/dist/sdk-client.js.map +1 -1
  47. package/dist/sdk-client.mjs +69 -239
  48. package/dist/sdk-client.mjs.map +1 -1
  49. package/dist/storage.d.ts +23 -3
  50. package/dist/storage.d.ts.map +1 -1
  51. package/dist/storage.js +17 -0
  52. package/dist/storage.js.map +1 -1
  53. package/dist/storage.mjs +17 -1
  54. package/dist/storage.mjs.map +1 -1
  55. package/package.json +8 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,68 @@
1
1
  # @turnkey/sdk-browser
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 93540e7: ## Major Package Updates
8
+
9
+ ### @turnkey/sdk-browser
10
+
11
+ - create abstract `TurnkeyBaseClient` class which extends `TurnkeySDKClientBase`
12
+ - `TurnkeyBrowserClient`, `TurnkeyIframeClient`, `TurnkeyPasskeyClient`, and `TurnkeyWalletClient` all extend `TurnkeyBaseClient`
13
+ - TurnkeyBrowserClient
14
+ - Session Management
15
+ - `refreshSession` - attempts to refresh an existing, active session and will extend the session expiry using the `expirationSeconds` parameter
16
+ - loginWithBundle - authenticate a user via a credential bundle and creates a read-write session
17
+ - loginWithPasskey - attempts to authenticate a user via passkey and create a read-only or read-write session
18
+ - loginWithSession - takes a `Session`, which can be either read-only or read-write, created via a server action and attempts to authenticate the user
19
+ - TurnkeyPasskeyClient
20
+ - Session Management
21
+ - createPasskeySession - leverages passkey authentication to create a read-write session. Once authenticated, the user will not be prompted for additional passkey taps.
22
+
23
+ ### @turnkey/sdk-react
24
+
25
+ - update `TurnkeyContext` to use new `.getSession()` method to check if there is an active session
26
+ - `OTPVerification` component no longer receives `authIframeClient` or `onValidateSuccess` props
27
+
28
+ ## Minor Package Updates
29
+
30
+ ### @turnkey/sdk-server
31
+
32
+ - expose `sendCredential` server action
33
+ - add `SessionType` enum
34
+ - `READ_ONLY` & `READ_WRITE`
35
+
36
+ ### @turnkey/eip-1193-provider
37
+
38
+ - update dependencies in `package.json`
39
+ - moved from `peerDependencies` to `dependencies`
40
+ - `"@turnkey/http": "workspace:*"`
41
+ - `"@turnkey/sdk-browser": "workspace:*"`
42
+ - moved from `devDependencies` to `dependencies`
43
+ - `"@turnkey/api-key-stamper": "workspace:*"`
44
+ - specify TypeScript version ^5.1.5
45
+
46
+ ### Minor Changes
47
+
48
+ - 9147962: add dangerouslyOverrideIframeKeyTtl option to override iframe embedded key TTL (for longer lived read/write sessions)
49
+
50
+ ### Patch Changes
51
+
52
+ - Updated dependencies [9147962]
53
+ - @turnkey/iframe-stamper@2.3.0
54
+ - @turnkey/crypto@2.3.1
55
+
56
+ ## 1.16.0
57
+
58
+ ### Minor Changes
59
+
60
+ - 233ae71: Add updateUserAuth, addUserAuth, deleteUserAuth helper functions
61
+
62
+ ### Patch Changes
63
+
64
+ - @turnkey/crypto@2.3.1
65
+
3
66
  ## 1.15.0
4
67
 
5
68
  ### Minor Changes
@@ -0,0 +1,7 @@
1
+ import type { TurnkeySDKClientConfig, AuthClient } from "@types";
2
+ import { TurnkeySDKClientBase } from "../__generated__/sdk-client-base";
3
+ export declare abstract class TurnkeyBaseClient extends TurnkeySDKClientBase {
4
+ authClient?: AuthClient | undefined;
5
+ constructor(config: TurnkeySDKClientConfig, authClient?: AuthClient);
6
+ }
7
+ //# sourceMappingURL=base-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-client.d.ts","sourceRoot":"","sources":["../../src/__clients__/base-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,8BAAsB,iBAAkB,SAAQ,oBAAoB;IAClE,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;gBAExB,MAAM,EAAE,sBAAsB,EAAE,UAAU,CAAC,EAAE,UAAU;CAIpE"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var sdkClientBase = require('../__generated__/sdk-client-base.js');
4
+
5
+ class TurnkeyBaseClient extends sdkClientBase.TurnkeySDKClientBase {
6
+ constructor(config, authClient) {
7
+ super(config);
8
+ this.authClient = authClient;
9
+ }
10
+ }
11
+
12
+ exports.TurnkeyBaseClient = TurnkeyBaseClient;
13
+ //# sourceMappingURL=base-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-client.js","sources":["../../src/__clients__/base-client.ts"],"sourcesContent":[null],"names":["TurnkeySDKClientBase"],"mappings":";;;;AAGM,MAAgB,iBAAkB,SAAQA,kCAAoB,CAAA;IAGlE,WAAY,CAAA,MAA8B,EAAE,UAAuB,EAAA;QACjE,KAAK,CAAC,MAAM,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AACF;;;;"}
@@ -0,0 +1,11 @@
1
+ import { TurnkeySDKClientBase } from '../__generated__/sdk-client-base.mjs';
2
+
3
+ class TurnkeyBaseClient extends TurnkeySDKClientBase {
4
+ constructor(config, authClient) {
5
+ super(config);
6
+ this.authClient = authClient;
7
+ }
8
+ }
9
+
10
+ export { TurnkeyBaseClient };
11
+ //# sourceMappingURL=base-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-client.mjs","sources":["../../src/__clients__/base-client.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGM,MAAgB,iBAAkB,SAAQ,oBAAoB,CAAA;IAGlE,WAAY,CAAA,MAA8B,EAAE,UAAuB,EAAA;QACjE,KAAK,CAAC,MAAM,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AACF;;;;"}
@@ -0,0 +1,243 @@
1
+ import type { WalletInterface } from "@turnkey/wallet-stamper";
2
+ import type { KeyFormat } from "@turnkey/iframe-stamper";
3
+ import type * as SdkApiTypes from "../__generated__/sdk_api_types";
4
+ import { TurnkeyBaseClient } from "../__clients__/base-client";
5
+ import { AuthClient, TurnkeySDKClientConfig, SessionType, TurnkeyWalletClientConfig } from "@types";
6
+ import type { ReadWriteSession, Passkey } from "@models";
7
+ import { Session } from "@storage";
8
+ export interface OauthProvider {
9
+ providerName: string;
10
+ oidcToken: string;
11
+ }
12
+ export interface ApiKey {
13
+ apiKeyName: string;
14
+ publicKey: string;
15
+ curveType: "API_KEY_CURVE_P256" | "API_KEY_CURVE_SECP256K1" | "API_KEY_CURVE_ED25519";
16
+ expirationSeconds?: string;
17
+ }
18
+ export interface Authenticator {
19
+ authenticatorName: string;
20
+ challenge: string;
21
+ attestation: {
22
+ credentialId: string;
23
+ clientDataJson: string;
24
+ attestationObject: string;
25
+ transports: ("AUTHENTICATOR_TRANSPORT_BLE" | "AUTHENTICATOR_TRANSPORT_INTERNAL" | "AUTHENTICATOR_TRANSPORT_NFC" | "AUTHENTICATOR_TRANSPORT_USB" | "AUTHENTICATOR_TRANSPORT_HYBRID")[];
26
+ };
27
+ }
28
+ interface UpdateUserAuthParams {
29
+ userId: string;
30
+ phoneNumber?: string | null;
31
+ email?: string | null;
32
+ authenticators?: {
33
+ add?: Authenticator[];
34
+ deleteIds?: string[];
35
+ };
36
+ oauthProviders?: {
37
+ add?: OauthProvider[];
38
+ deleteIds?: string[];
39
+ };
40
+ apiKeys?: {
41
+ add?: ApiKey[];
42
+ deleteIds?: string[];
43
+ };
44
+ }
45
+ interface DeleteUserAuthParams {
46
+ userId: string;
47
+ phoneNumber?: boolean;
48
+ email?: boolean;
49
+ authenticatorIds?: string[];
50
+ oauthProviderIds?: string[];
51
+ apiKeyIds?: string[];
52
+ }
53
+ interface AddUserAuthParams {
54
+ userId: string;
55
+ phoneNumber?: string;
56
+ email?: string;
57
+ authenticators?: Authenticator[];
58
+ oauthProviders?: OauthProvider[];
59
+ apiKeys?: ApiKey[];
60
+ }
61
+ export declare class TurnkeyBrowserClient extends TurnkeyBaseClient {
62
+ constructor(config: TurnkeySDKClientConfig, authClient?: AuthClient);
63
+ login: (config?: {
64
+ organizationId?: string;
65
+ }) => Promise<SdkApiTypes.TCreateReadOnlySessionResponse>;
66
+ /**
67
+ * Creates a read-write session. This method infers the current user's organization ID and target userId.
68
+ * To be used in conjunction with an `iframeStamper`: the resulting session's credential bundle can be
69
+ * injected into an iframeStamper to create a session that enables both read and write requests.
70
+ *
71
+ * @param targetEmbeddedKey
72
+ * @param expirationSeconds
73
+ * @param userId
74
+ * @returns {Promise<void>}
75
+ */
76
+ refereshSession: (sessionType?: SessionType, targetPublicKey?: string, expirationSeconds?: string) => Promise<void>;
77
+ /**
78
+ * Log in with a bundle. This method uses a bundle sent to the end user email
79
+ * To be used in conjunction with an `iframeStamper`.
80
+ *
81
+ * @param bundle
82
+ * @param expirationSeconds
83
+ * @returns {Promise<void>}
84
+ */
85
+ loginWithBundle: (bundle: string, expirationSeconds: string) => Promise<void>;
86
+ /**
87
+ * Log in with a session object. This method uses a session object from server actions and stores it and the active client in local storage
88
+ * To be used in conjunction with an `iframeStamper`.
89
+ *
90
+ * @param session
91
+ * @returns {Promise<void>}
92
+ */
93
+ loginWithSession: (session: Session) => Promise<void>;
94
+ /**
95
+ * Log in with a passkey.
96
+ * To be used in conjunction with a `passkeyStamper`
97
+ *
98
+ * @param session
99
+ * @returns {Promise<void>}
100
+ */
101
+ loginWithPasskey: (sessionType: SessionType | undefined, iframeClient: TurnkeyIframeClient, targetPublicKey?: string, expirationSeconds?: string) => Promise<void>;
102
+ /**
103
+ * Log in with a browser wallet.
104
+ *
105
+ * @param session
106
+ * @returns {Promise<void>}
107
+ */
108
+ loginWithWallet: (sessionType: SessionType | undefined, iframeClient: TurnkeyIframeClient, targetPublicKey?: string, expirationSeconds?: string) => Promise<void>;
109
+ /**
110
+ * Creates a read-write session. This method infers the current user's organization ID and target userId.
111
+ * To be used in conjunction with an `iframeStamper`: the resulting session's credential bundle can be
112
+ * injected into an iframeStamper to create a session that enables both read and write requests.
113
+ *
114
+ * @param targetEmbeddedKey
115
+ * @param expirationSeconds
116
+ * @param userId
117
+ * @returns {Promise<SdkApiTypes.TCreateReadWriteSessionResponse>}
118
+ */
119
+ loginWithReadWriteSession: (targetEmbeddedKey: string, expirationSeconds?: string, userId?: string) => Promise<SdkApiTypes.TCreateReadWriteSessionResponse>;
120
+ /**
121
+ * Logs in with an existing auth bundle. this bundle enables both read and write requests.
122
+ *
123
+ * @param credentialBundle
124
+ * @param expirationSeconds
125
+ * @returns {Promise<boolean>}
126
+ */
127
+ loginWithAuthBundle: (credentialBundle: string, expirationSeconds?: string) => Promise<boolean>;
128
+ /**
129
+ * Removes authentication factors from an end user.
130
+ *
131
+ * This function allows selectively removing:
132
+ * - Phone number
133
+ * - Email
134
+ * - Authenticators (by ID)
135
+ * - OAuth providers (by ID)
136
+ * - API keys (by ID)
137
+ *
138
+ * All removal operations are executed in parallel if multiple
139
+ * parameters are provided.
140
+ *
141
+ * @param params - A structured object containing all the removal parameters
142
+ * @param params.userId - Unique identifier of the user
143
+ * @param params.phoneNumber - true to remove the phone number
144
+ * @param params.email - true to remove the email
145
+ * @param params.authenticatorIds - Array of authenticator IDs to remove
146
+ * @param params.oauthProviderIds - Array of OAuth provider IDs to remove
147
+ * @param params.apiKeyIds - Array of API key IDs to remove
148
+ * @returns A promise that resolves to an array of results from each removal operation
149
+ */
150
+ deleteUserAuth: (params: DeleteUserAuthParams) => Promise<any[]>;
151
+ /**
152
+ * Adds or updates authentication factors for an end user.
153
+ *
154
+ * This function allows selectively adding:
155
+ * - Phone number
156
+ * - Email
157
+ * - Authenticators
158
+ * - OAuth providers
159
+ * - API keys
160
+ *
161
+ * All additions/updates are executed in parallel if multiple
162
+ * parameters are provided.
163
+ *
164
+ * @param params - A structured object containing all the addition/update parameters
165
+ * @param params.userId - Unique identifier of the user
166
+ * @param params.phoneNumber - New phone number for the user
167
+ * @param params.email - New email address for the user
168
+ * @param params.authenticators - Array of authenticator objects to create
169
+ * @param params.oauthProviders - Array of OAuth provider objects to create
170
+ * @param params.apiKeys - Array of API key objects to create
171
+ * @returns A promise that resolves to an array of results from each addition or update
172
+ */
173
+ addUserAuth: (params: AddUserAuthParams) => Promise<any[]>;
174
+ /**
175
+ * Comprehensive authentication update for an end user.
176
+ * Combines add/update and delete operations into a single call.
177
+ *
178
+ * The behavior is driven by whether values are set to:
179
+ * - A string/array (to create or update)
180
+ * - `null` or an array of IDs (to remove)
181
+ *
182
+ * All operations are executed in parallel where applicable.
183
+ *
184
+ * @param params - A structured object containing all the update parameters
185
+ * @param params.userId - Unique identifier of the user
186
+ * @param params.phoneNumber - String to set (new phone) or `null` to remove
187
+ * @param params.email - String to set (new email) or `null` to remove
188
+ * @param params.authenticators - Object describing authenticators to add or remove
189
+ * @param params.oauthProviders - Object describing OAuth providers to add or remove
190
+ * @param params.apiKeys - Object describing API keys to add or remove
191
+ *
192
+ * @returns A promise that resolves to a boolean indicating overall success
193
+ */
194
+ updateUserAuth(params: UpdateUserAuthParams): Promise<boolean>;
195
+ }
196
+ export declare class TurnkeyPasskeyClient extends TurnkeyBrowserClient {
197
+ rpId: string;
198
+ constructor(config: TurnkeySDKClientConfig);
199
+ /**
200
+ * Create a passkey for an end-user, taking care of various lower-level details.
201
+ *
202
+ * @returns {Promise<Passkey>}
203
+ */
204
+ createUserPasskey: (config?: Record<any, any>) => Promise<Passkey>;
205
+ /**
206
+ * Uses passkey authentication to create a read-write session, via an embedded API key,
207
+ * and stores + returns the resulting auth bundle that contains the encrypted API key.
208
+ * This auth bundle (also referred to as a credential bundle) can be injected into an `iframeStamper`,
209
+ * resulting in a touch-free authenticator. Unlike `loginWithReadWriteSession`, this method
210
+ * assumes the end-user's organization ID (i.e. the sub-organization ID) is already known.
211
+ *
212
+ * @param userId
213
+ * @param targetEmbeddedKey
214
+ * @param expirationSeconds
215
+ * @param curveType
216
+ * @returns {Promise<ReadWriteSession>}
217
+ */
218
+ createPasskeySession: (userId: string, targetEmbeddedKey: string, expirationSeconds?: string, organizationId?: string) => Promise<ReadWriteSession>;
219
+ }
220
+ /**
221
+ * TurnkeyIframeClient is a client that uses an iframe to interact with the Turnkey API.
222
+ * It is used to create read-write sessions, and to inject credential bundles into the iframe.
223
+ * It is also used to extract encrypted credential bundles from the iframe.
224
+ * @extends TurnkeyBrowserClient
225
+ */
226
+ export declare class TurnkeyIframeClient extends TurnkeyBrowserClient {
227
+ iframePublicKey: string | null;
228
+ constructor(config: TurnkeySDKClientConfig);
229
+ injectCredentialBundle: (credentialBundle: string) => Promise<boolean>;
230
+ injectWalletExportBundle: (credentialBundle: string, organizationId: string) => Promise<boolean>;
231
+ injectKeyExportBundle: (credentialBundle: string, organizationId: string, keyFormat?: KeyFormat | undefined) => Promise<boolean>;
232
+ injectImportBundle: (bundle: string, organizationId: string, userId: string) => Promise<boolean>;
233
+ extractWalletEncryptedBundle: () => Promise<string>;
234
+ extractKeyEncryptedBundle: () => Promise<string>;
235
+ }
236
+ export declare class TurnkeyWalletClient extends TurnkeyBrowserClient {
237
+ private wallet;
238
+ constructor(config: TurnkeyWalletClientConfig);
239
+ getPublicKey(): Promise<string>;
240
+ getWalletInterface(): WalletInterface;
241
+ }
242
+ export {};
243
+ //# sourceMappingURL=browser-clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-clients.d.ts","sourceRoot":"","sources":["../../src/__clients__/browser-clients.ts"],"names":[],"mappings":"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"}