@turnkey/core 1.0.0-beta.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 (149) hide show
  1. package/LICENSE +201 -0
  2. package/README.MD +5 -0
  3. package/dist/__clients__/core.d.ts +1010 -0
  4. package/dist/__clients__/core.d.ts.map +1 -0
  5. package/dist/__clients__/core.js +2358 -0
  6. package/dist/__clients__/core.js.map +1 -0
  7. package/dist/__clients__/core.mjs +2356 -0
  8. package/dist/__clients__/core.mjs.map +1 -0
  9. package/dist/__generated__/sdk-client-base.d.ts +211 -0
  10. package/dist/__generated__/sdk-client-base.d.ts.map +1 -0
  11. package/dist/__generated__/sdk-client-base.js +3219 -0
  12. package/dist/__generated__/sdk-client-base.js.map +1 -0
  13. package/dist/__generated__/sdk-client-base.mjs +3217 -0
  14. package/dist/__generated__/sdk-client-base.mjs.map +1 -0
  15. package/dist/__generated__/version.d.ts +2 -0
  16. package/dist/__generated__/version.d.ts.map +1 -0
  17. package/dist/__generated__/version.js +6 -0
  18. package/dist/__generated__/version.js.map +1 -0
  19. package/dist/__generated__/version.mjs +4 -0
  20. package/dist/__generated__/version.mjs.map +1 -0
  21. package/dist/__inputs__/public_api.types.d.ts +5170 -0
  22. package/dist/__inputs__/public_api.types.d.ts.map +1 -0
  23. package/dist/__polyfills__/window.d.ts +15 -0
  24. package/dist/__polyfills__/window.d.ts.map +1 -0
  25. package/dist/__polyfills__/window.js +30 -0
  26. package/dist/__polyfills__/window.js.map +1 -0
  27. package/dist/__polyfills__/window.mjs +28 -0
  28. package/dist/__polyfills__/window.mjs.map +1 -0
  29. package/dist/__stampers__/api/base.d.ts +20 -0
  30. package/dist/__stampers__/api/base.d.ts.map +1 -0
  31. package/dist/__stampers__/api/base.js +67 -0
  32. package/dist/__stampers__/api/base.js.map +1 -0
  33. package/dist/__stampers__/api/base.mjs +65 -0
  34. package/dist/__stampers__/api/base.mjs.map +1 -0
  35. package/dist/__stampers__/api/mobile/stamper.d.ts +13 -0
  36. package/dist/__stampers__/api/mobile/stamper.d.ts.map +1 -0
  37. package/dist/__stampers__/api/mobile/stamper.js +69 -0
  38. package/dist/__stampers__/api/mobile/stamper.js.map +1 -0
  39. package/dist/__stampers__/api/mobile/stamper.mjs +67 -0
  40. package/dist/__stampers__/api/mobile/stamper.mjs.map +1 -0
  41. package/dist/__stampers__/api/web/stamper.d.ts +14 -0
  42. package/dist/__stampers__/api/web/stamper.d.ts.map +1 -0
  43. package/dist/__stampers__/api/web/stamper.js +212 -0
  44. package/dist/__stampers__/api/web/stamper.js.map +1 -0
  45. package/dist/__stampers__/api/web/stamper.mjs +210 -0
  46. package/dist/__stampers__/api/web/stamper.mjs.map +1 -0
  47. package/dist/__stampers__/passkey/base.d.ts +18 -0
  48. package/dist/__stampers__/passkey/base.d.ts.map +1 -0
  49. package/dist/__stampers__/passkey/base.js +138 -0
  50. package/dist/__stampers__/passkey/base.js.map +1 -0
  51. package/dist/__stampers__/passkey/base.mjs +134 -0
  52. package/dist/__stampers__/passkey/base.mjs.map +1 -0
  53. package/dist/__storage__/base.d.ts +3 -0
  54. package/dist/__storage__/base.d.ts.map +1 -0
  55. package/dist/__storage__/base.js +27 -0
  56. package/dist/__storage__/base.js.map +1 -0
  57. package/dist/__storage__/base.mjs +25 -0
  58. package/dist/__storage__/base.mjs.map +1 -0
  59. package/dist/__storage__/mobile/storage.d.ts +18 -0
  60. package/dist/__storage__/mobile/storage.d.ts.map +1 -0
  61. package/dist/__storage__/mobile/storage.js +74 -0
  62. package/dist/__storage__/mobile/storage.js.map +1 -0
  63. package/dist/__storage__/mobile/storage.mjs +72 -0
  64. package/dist/__storage__/mobile/storage.mjs.map +1 -0
  65. package/dist/__storage__/web/storage.d.ts +19 -0
  66. package/dist/__storage__/web/storage.d.ts.map +1 -0
  67. package/dist/__storage__/web/storage.js +79 -0
  68. package/dist/__storage__/web/storage.js.map +1 -0
  69. package/dist/__storage__/web/storage.mjs +77 -0
  70. package/dist/__storage__/web/storage.mjs.map +1 -0
  71. package/dist/__types__/base.d.ts +407 -0
  72. package/dist/__types__/base.d.ts.map +1 -0
  73. package/dist/__types__/base.js +88 -0
  74. package/dist/__types__/base.js.map +1 -0
  75. package/dist/__types__/base.mjs +84 -0
  76. package/dist/__types__/base.mjs.map +1 -0
  77. package/dist/__wallet__/base.d.ts +3 -0
  78. package/dist/__wallet__/base.d.ts.map +1 -0
  79. package/dist/__wallet__/base.js +24 -0
  80. package/dist/__wallet__/base.js.map +1 -0
  81. package/dist/__wallet__/base.mjs +22 -0
  82. package/dist/__wallet__/base.mjs.map +1 -0
  83. package/dist/__wallet__/connector.d.ts +33 -0
  84. package/dist/__wallet__/connector.d.ts.map +1 -0
  85. package/dist/__wallet__/connector.js +63 -0
  86. package/dist/__wallet__/connector.js.map +1 -0
  87. package/dist/__wallet__/connector.mjs +61 -0
  88. package/dist/__wallet__/connector.mjs.map +1 -0
  89. package/dist/__wallet__/mobile/manager.d.ts +35 -0
  90. package/dist/__wallet__/mobile/manager.d.ts.map +1 -0
  91. package/dist/__wallet__/mobile/manager.js +95 -0
  92. package/dist/__wallet__/mobile/manager.js.map +1 -0
  93. package/dist/__wallet__/mobile/manager.mjs +93 -0
  94. package/dist/__wallet__/mobile/manager.mjs.map +1 -0
  95. package/dist/__wallet__/stamper.d.ts +19 -0
  96. package/dist/__wallet__/stamper.d.ts.map +1 -0
  97. package/dist/__wallet__/stamper.js +116 -0
  98. package/dist/__wallet__/stamper.js.map +1 -0
  99. package/dist/__wallet__/stamper.mjs +113 -0
  100. package/dist/__wallet__/stamper.mjs.map +1 -0
  101. package/dist/__wallet__/wallet-connect/base.d.ts +83 -0
  102. package/dist/__wallet__/wallet-connect/base.d.ts.map +1 -0
  103. package/dist/__wallet__/wallet-connect/base.js +362 -0
  104. package/dist/__wallet__/wallet-connect/base.js.map +1 -0
  105. package/dist/__wallet__/wallet-connect/base.mjs +360 -0
  106. package/dist/__wallet__/wallet-connect/base.mjs.map +1 -0
  107. package/dist/__wallet__/wallet-connect/client.d.ts +78 -0
  108. package/dist/__wallet__/wallet-connect/client.d.ts.map +1 -0
  109. package/dist/__wallet__/wallet-connect/client.js +139 -0
  110. package/dist/__wallet__/wallet-connect/client.js.map +1 -0
  111. package/dist/__wallet__/wallet-connect/client.mjs +137 -0
  112. package/dist/__wallet__/wallet-connect/client.mjs.map +1 -0
  113. package/dist/__wallet__/web/manager.d.ts +41 -0
  114. package/dist/__wallet__/web/manager.d.ts.map +1 -0
  115. package/dist/__wallet__/web/manager.js +115 -0
  116. package/dist/__wallet__/web/manager.js.map +1 -0
  117. package/dist/__wallet__/web/manager.mjs +113 -0
  118. package/dist/__wallet__/web/manager.mjs.map +1 -0
  119. package/dist/__wallet__/web/native/ethereum.d.ts +67 -0
  120. package/dist/__wallet__/web/native/ethereum.d.ts.map +1 -0
  121. package/dist/__wallet__/web/native/ethereum.js +248 -0
  122. package/dist/__wallet__/web/native/ethereum.js.map +1 -0
  123. package/dist/__wallet__/web/native/ethereum.mjs +245 -0
  124. package/dist/__wallet__/web/native/ethereum.mjs.map +1 -0
  125. package/dist/__wallet__/web/native/solana.d.ts +19 -0
  126. package/dist/__wallet__/web/native/solana.d.ts.map +1 -0
  127. package/dist/__wallet__/web/native/solana.js +149 -0
  128. package/dist/__wallet__/web/native/solana.js.map +1 -0
  129. package/dist/__wallet__/web/native/solana.mjs +146 -0
  130. package/dist/__wallet__/web/native/solana.mjs.map +1 -0
  131. package/dist/index.d.ts +9 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +78 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/index.mjs +8 -0
  136. package/dist/index.mjs.map +1 -0
  137. package/dist/turnkey-helpers.d.ts +68 -0
  138. package/dist/turnkey-helpers.d.ts.map +1 -0
  139. package/dist/turnkey-helpers.js +466 -0
  140. package/dist/turnkey-helpers.js.map +1 -0
  141. package/dist/turnkey-helpers.mjs +399 -0
  142. package/dist/turnkey-helpers.mjs.map +1 -0
  143. package/dist/utils.d.ts +54 -0
  144. package/dist/utils.d.ts.map +1 -0
  145. package/dist/utils.js +596 -0
  146. package/dist/utils.js.map +1 -0
  147. package/dist/utils.mjs +574 -0
  148. package/dist/utils.mjs.map +1 -0
  149. package/package.json +67 -0
@@ -0,0 +1,138 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../../utils.js');
4
+ var webauthnStamper = require('@turnkey/webauthn-stamper');
5
+ var encoding = require('@turnkey/encoding');
6
+ var http = require('@turnkey/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
+ // Turnkey 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 @turnkey/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 ?? "Turnkey",
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("@turnkey/react-native-passkey-stamper");
109
+ PasskeyStamper = PasskeyStamperModule.PasskeyStamper;
110
+ }
111
+ catch {
112
+ throw new Error("Please install react-native-passkeys and @turnkey/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 '@turnkey/webauthn-stamper';
3
+ import { base64StringToBase64UrlEncodedString, uint8ArrayToHexString } from '@turnkey/encoding';
4
+ import { getWebAuthnAttestation } from '@turnkey/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
+ // Turnkey 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 @turnkey/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 ?? "Turnkey",
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("@turnkey/react-native-passkey-stamper");
105
+ PasskeyStamper = PasskeyStamperModule.PasskeyStamper;
106
+ }
107
+ catch {
108
+ throw new Error("Please install react-native-passkeys and @turnkey/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,3 @@
1
+ import type { StorageBase } from "@types";
2
+ export declare function createStorageManager(): Promise<StorageBase>;
3
+ //# sourceMappingURL=base.d.ts.map
@@ -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,QAAQ,CAAC;AAG1C,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;;QACjC,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAA,CAAE,CAC5D;;;SAEE,IAAIC,WAAK,EAAE,EAAE;QAClB,OAAO,IAAIC,yBAAiB,EAAE;;SACzB;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;;AAEnE;;;;"}
@@ -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;;QACjC,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAA,CAAE,CAC5D;;;SAEE,IAAI,KAAK,EAAE,EAAE;QAClB,OAAO,IAAI,iBAAiB,EAAE;;SACzB;AACL,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;;AAEnE;;;;"}
@@ -0,0 +1,18 @@
1
+ import { type StorageBase } from "@types";
2
+ import type { Session } from "@turnkey/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,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAalD,qBAAa,oBAAqB,YAAW,WAAW;IACtD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA+B;IAC9D,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAiC;IAE5D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAKjD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAqC,GAChD,OAAO,CAAC,IAAI,CAAC;IAmBV,UAAU,CACd,UAAU,GAAE,MAAqC,GAChD,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAIzB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIlD,gBAAgB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKhD,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOpC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAMxC"}
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ var base = require('../../__types__/base.js');
4
+ var utils = require('../../utils.js');
5
+
6
+ let AsyncStorage;
7
+ try {
8
+ const mod = require("@react-native-async-storage/async-storage");
9
+ AsyncStorage = mod.default ?? mod;
10
+ }
11
+ catch {
12
+ throw new Error("Please install @react-native-async-storage/async-storage in your app to use MobileStorageManager");
13
+ }
14
+ class MobileStorageManager {
15
+ async getStorageValue(sessionKey) {
16
+ const item = await AsyncStorage.getItem(sessionKey);
17
+ return item ? JSON.parse(item) : undefined;
18
+ }
19
+ async setStorageValue(sessionKey, storageValue) {
20
+ await AsyncStorage.setItem(sessionKey, JSON.stringify(storageValue));
21
+ }
22
+ async setActiveSessionKey(sessionKey) {
23
+ await AsyncStorage.setItem(MobileStorageManager.ACTIVE_SESSION_KEY, sessionKey);
24
+ }
25
+ async removeStorageValue(sessionKey) {
26
+ await AsyncStorage.removeItem(sessionKey);
27
+ }
28
+ async storeSession(session, sessionKey = base.SessionKey.DefaultSessionkey) {
29
+ const sessionWithMetadata = utils.parseSession(session);
30
+ await this.setStorageValue(sessionKey, sessionWithMetadata);
31
+ const raw = await this.getStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
32
+ const keys = Array.isArray(raw) ? raw : [];
33
+ if (!keys.includes(sessionKey)) {
34
+ keys.push(sessionKey);
35
+ await this.setStorageValue(MobileStorageManager.ALL_SESSION_KEYS, keys);
36
+ }
37
+ await this.setStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY, sessionKey);
38
+ }
39
+ async getSession(sessionKey = base.SessionKey.DefaultSessionkey) {
40
+ return this.getStorageValue(sessionKey);
41
+ }
42
+ async getActiveSessionKey() {
43
+ return this.getStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
44
+ }
45
+ async getActiveSession() {
46
+ const key = await this.getActiveSessionKey();
47
+ return key ? this.getSession(key) : undefined;
48
+ }
49
+ async listSessionKeys() {
50
+ const raw = await this.getStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
51
+ return Array.isArray(raw) ? raw : [];
52
+ }
53
+ async clearSession(sessionKey) {
54
+ await this.removeStorageValue(sessionKey);
55
+ const keys = await this.listSessionKeys();
56
+ const updated = keys.filter((k) => k !== sessionKey);
57
+ await this.setStorageValue(MobileStorageManager.ALL_SESSION_KEYS, updated);
58
+ const active = await this.getActiveSessionKey();
59
+ if (active === sessionKey) {
60
+ await this.removeStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
61
+ }
62
+ }
63
+ async clearAllSessions() {
64
+ const keys = await this.listSessionKeys();
65
+ await Promise.all(keys.map((k) => AsyncStorage.removeItem(k)));
66
+ await this.removeStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
67
+ await this.removeStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
68
+ }
69
+ }
70
+ MobileStorageManager.ALL_SESSION_KEYS = "@turnkey/all-session-keys";
71
+ MobileStorageManager.ACTIVE_SESSION_KEY = "@turnkey/active-session-key";
72
+
73
+ exports.MobileStorageManager = MobileStorageManager;
74
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sources":["../../../src/__storage__/mobile/storage.ts"],"sourcesContent":[null],"names":["SessionKey","parseSession"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { SessionKey } from '../../__types__/base.mjs';
2
+ import { parseSession } from '../../utils.mjs';
3
+
4
+ let AsyncStorage;
5
+ try {
6
+ const mod = require("@react-native-async-storage/async-storage");
7
+ AsyncStorage = mod.default ?? mod;
8
+ }
9
+ catch {
10
+ throw new Error("Please install @react-native-async-storage/async-storage in your app to use MobileStorageManager");
11
+ }
12
+ class MobileStorageManager {
13
+ async getStorageValue(sessionKey) {
14
+ const item = await AsyncStorage.getItem(sessionKey);
15
+ return item ? JSON.parse(item) : undefined;
16
+ }
17
+ async setStorageValue(sessionKey, storageValue) {
18
+ await AsyncStorage.setItem(sessionKey, JSON.stringify(storageValue));
19
+ }
20
+ async setActiveSessionKey(sessionKey) {
21
+ await AsyncStorage.setItem(MobileStorageManager.ACTIVE_SESSION_KEY, sessionKey);
22
+ }
23
+ async removeStorageValue(sessionKey) {
24
+ await AsyncStorage.removeItem(sessionKey);
25
+ }
26
+ async storeSession(session, sessionKey = SessionKey.DefaultSessionkey) {
27
+ const sessionWithMetadata = parseSession(session);
28
+ await this.setStorageValue(sessionKey, sessionWithMetadata);
29
+ const raw = await this.getStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
30
+ const keys = Array.isArray(raw) ? raw : [];
31
+ if (!keys.includes(sessionKey)) {
32
+ keys.push(sessionKey);
33
+ await this.setStorageValue(MobileStorageManager.ALL_SESSION_KEYS, keys);
34
+ }
35
+ await this.setStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY, sessionKey);
36
+ }
37
+ async getSession(sessionKey = SessionKey.DefaultSessionkey) {
38
+ return this.getStorageValue(sessionKey);
39
+ }
40
+ async getActiveSessionKey() {
41
+ return this.getStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
42
+ }
43
+ async getActiveSession() {
44
+ const key = await this.getActiveSessionKey();
45
+ return key ? this.getSession(key) : undefined;
46
+ }
47
+ async listSessionKeys() {
48
+ const raw = await this.getStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
49
+ return Array.isArray(raw) ? raw : [];
50
+ }
51
+ async clearSession(sessionKey) {
52
+ await this.removeStorageValue(sessionKey);
53
+ const keys = await this.listSessionKeys();
54
+ const updated = keys.filter((k) => k !== sessionKey);
55
+ await this.setStorageValue(MobileStorageManager.ALL_SESSION_KEYS, updated);
56
+ const active = await this.getActiveSessionKey();
57
+ if (active === sessionKey) {
58
+ await this.removeStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
59
+ }
60
+ }
61
+ async clearAllSessions() {
62
+ const keys = await this.listSessionKeys();
63
+ await Promise.all(keys.map((k) => AsyncStorage.removeItem(k)));
64
+ await this.removeStorageValue(MobileStorageManager.ALL_SESSION_KEYS);
65
+ await this.removeStorageValue(MobileStorageManager.ACTIVE_SESSION_KEY);
66
+ }
67
+ }
68
+ MobileStorageManager.ALL_SESSION_KEYS = "@turnkey/all-session-keys";
69
+ MobileStorageManager.ACTIVE_SESSION_KEY = "@turnkey/active-session-key";
70
+
71
+ export { MobileStorageManager };
72
+ //# sourceMappingURL=storage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.mjs","sources":["../../../src/__storage__/mobile/storage.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type StorageBase, type Wallet } from "@types";
2
+ import { type Session } from "@turnkey/sdk-types";
3
+ export declare class WebStorageManager 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: Session | string | string[]) => 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
+ storeWallets: (wallets: Wallet[]) => Promise<void>;
18
+ }
19
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/__storage__/web/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAc,MAAM,QAAQ,CAAC;AAEnE,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,oBAAoB,CAAC;AAI5B,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA+B;IAC9D,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAiC;IAElE,eAAe,eAAsB,MAAM,KAAG,QAAQ,GAAG,CAAC,CAGxD;IAEF,eAAe,eACD,MAAM,gBACJ,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,KACxC,QAAQ,IAAI,CAAC,CAQd;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,CAkBd;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,CAI3C;IAEF,YAAY,eAAsB,MAAM,KAAG,QAAQ,IAAI,CAAC,CAStD;IAEF,gBAAgB,QAAa,QAAQ,IAAI,CAAC,CAKxC;IAEF,YAAY,YAAmB,MAAM,EAAE,KAAG,QAAQ,IAAI,CAAC,CAIrD;CACH"}