@account-kit/react-native-signer 4.8.0 → 4.10.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/android/src/main/java/com/accountkit/reactnativesigner/core/TEKStamper.kt +84 -25
- package/lib/commonjs/client.js +67 -11
- package/lib/commonjs/client.js.map +1 -1
- package/lib/commonjs/errors.js +15 -0
- package/lib/commonjs/errors.js.map +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/signer.js +2 -0
- package/lib/commonjs/signer.js.map +1 -1
- package/lib/commonjs/utils/base64UrlEncode.js +12 -0
- package/lib/commonjs/utils/base64UrlEncode.js.map +1 -0
- package/lib/commonjs/utils/buffer-polyfill.js +7 -0
- package/lib/commonjs/utils/buffer-polyfill.js.map +1 -0
- package/lib/commonjs/utils/parseUrlParams.js +19 -0
- package/lib/commonjs/utils/parseUrlParams.js.map +1 -0
- package/lib/module/client.js +68 -12
- package/lib/module/client.js.map +1 -1
- package/lib/module/errors.js +10 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/index.js +0 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/signer.js +1 -1
- package/lib/module/signer.js.map +1 -1
- package/lib/module/utils/base64UrlEncode.js +7 -0
- package/lib/module/utils/base64UrlEncode.js.map +1 -0
- package/lib/module/utils/buffer-polyfill.js +7 -0
- package/lib/module/utils/buffer-polyfill.js.map +1 -0
- package/lib/module/utils/parseUrlParams.js +14 -0
- package/lib/module/utils/parseUrlParams.js.map +1 -0
- package/lib/typescript/commonjs/src/client.d.ts +9 -3
- package/lib/typescript/commonjs/src/client.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/errors.d.ts +6 -0
- package/lib/typescript/commonjs/src/errors.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +1 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/signer.d.ts +14 -1
- package/lib/typescript/commonjs/src/signer.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/base64UrlEncode.d.ts +2 -0
- package/lib/typescript/commonjs/src/utils/base64UrlEncode.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/buffer-polyfill.d.ts +2 -0
- package/lib/typescript/commonjs/src/utils/buffer-polyfill.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/parseUrlParams.d.ts +2 -0
- package/lib/typescript/commonjs/src/utils/parseUrlParams.d.ts.map +1 -0
- package/lib/typescript/module/src/client.d.ts +9 -3
- package/lib/typescript/module/src/client.d.ts.map +1 -1
- package/lib/typescript/module/src/errors.d.ts +6 -0
- package/lib/typescript/module/src/errors.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +1 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/signer.d.ts +14 -1
- package/lib/typescript/module/src/signer.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/base64UrlEncode.d.ts +2 -0
- package/lib/typescript/module/src/utils/base64UrlEncode.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/buffer-polyfill.d.ts +2 -0
- package/lib/typescript/module/src/utils/buffer-polyfill.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/parseUrlParams.d.ts +2 -0
- package/lib/typescript/module/src/utils/parseUrlParams.d.ts.map +1 -0
- package/package.json +6 -4
- package/src/client.ts +91 -15
- package/src/errors.ts +10 -0
- package/src/index.tsx +1 -2
- package/src/signer.ts +5 -2
- package/src/utils/base64UrlEncode.ts +11 -0
- package/src/utils/buffer-polyfill.ts +5 -0
- package/src/utils/parseUrlParams.ts +14 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.accountkit.reactnativesigner.core
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
|
+
import android.content.SharedPreferences
|
|
4
5
|
import androidx.security.crypto.EncryptedSharedPreferences
|
|
5
6
|
import androidx.security.crypto.MasterKey
|
|
6
7
|
import com.accountkit.reactnativesigner.core.errors.NoInjectedBundleException
|
|
@@ -19,6 +20,8 @@ import java.nio.ByteBuffer
|
|
|
19
20
|
import java.security.KeyFactory
|
|
20
21
|
import java.security.Security
|
|
21
22
|
import java.security.Signature
|
|
23
|
+
import java.security.KeyStore
|
|
24
|
+
import java.security.KeyStoreException
|
|
22
25
|
|
|
23
26
|
@Serializable
|
|
24
27
|
data class ApiStamp(val publicKey: String, val scheme: String, val signature: String)
|
|
@@ -27,6 +30,8 @@ data class Stamp(val stampHeaderName: String, val stampHeaderValue: String)
|
|
|
27
30
|
|
|
28
31
|
private const val BUNDLE_PRIVATE_KEY = "BUNDLE_PRIVATE_KEY"
|
|
29
32
|
private const val BUNDLE_PUBLIC_KEY = "BUNDLE_PUBLIC_KEY"
|
|
33
|
+
private const val MASTER_KEY_ALIAS = "tek_master_key"
|
|
34
|
+
private const val ENCRYPTED_SHARED_PREFERENCES_FILENAME = "tek_stamper_shared_prefs"
|
|
30
35
|
|
|
31
36
|
class TEKStamper(context: Context) {
|
|
32
37
|
// This is how the docs for EncryptedSharedPreferences recommend creating this setup
|
|
@@ -36,12 +41,6 @@ class TEKStamper(context: Context) {
|
|
|
36
41
|
//
|
|
37
42
|
// we should explore the best practices on how to do this once we reach a phase of further
|
|
38
43
|
// cleanup
|
|
39
|
-
private val masterKey =
|
|
40
|
-
MasterKey.Builder(context.applicationContext)
|
|
41
|
-
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
|
|
42
|
-
// requires that the phone be unlocked
|
|
43
|
-
.setUserAuthenticationRequired(false)
|
|
44
|
-
.build()
|
|
45
44
|
|
|
46
45
|
/**
|
|
47
46
|
* We are using EncryptedSharedPreferences to store 2 pieces of data
|
|
@@ -64,29 +63,35 @@ class TEKStamper(context: Context) {
|
|
|
64
63
|
*
|
|
65
64
|
* The open question is if the storage of the decrypted private key is secure enough though
|
|
66
65
|
*/
|
|
67
|
-
|
|
68
|
-
EncryptedSharedPreferences.create(
|
|
69
|
-
context,
|
|
70
|
-
"tek_stamper_shared_prefs",
|
|
71
|
-
masterKey,
|
|
72
|
-
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
|
|
73
|
-
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
|
|
74
|
-
)
|
|
66
|
+
|
|
75
67
|
|
|
76
|
-
private val tekManager = HpkeTEKManager(sharedPreferences)
|
|
77
68
|
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
|
|
70
|
+
|
|
80
71
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
72
|
+
private lateinit var tekManager: HpkeTEKManager
|
|
73
|
+
private lateinit var sharedPreferences: SharedPreferences
|
|
74
|
+
|
|
75
|
+
init {
|
|
76
|
+
try {
|
|
77
|
+
TinkConfig.register()
|
|
78
|
+
|
|
79
|
+
sharedPreferences = getSharedPreferences(context)
|
|
80
|
+
tekManager = HpkeTEKManager(sharedPreferences)
|
|
81
|
+
|
|
82
|
+
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).javaClass !=
|
|
83
|
+
BouncyCastleProvider::class.java
|
|
84
|
+
) {
|
|
85
|
+
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
|
|
89
|
+
Security.addProvider(BouncyCastleProvider())
|
|
90
|
+
}
|
|
91
|
+
} catch (e: Exception){
|
|
92
|
+
throw RuntimeException("Error creating master key", e)
|
|
89
93
|
}
|
|
94
|
+
|
|
90
95
|
}
|
|
91
96
|
|
|
92
97
|
fun init(): String {
|
|
@@ -196,4 +201,58 @@ class TEKStamper(context: Context) {
|
|
|
196
201
|
)
|
|
197
202
|
return Pair(compressedPublicKey, privateKey)
|
|
198
203
|
}
|
|
204
|
+
|
|
205
|
+
private fun createSharedPreferences(masterKey: MasterKey, context: Context): SharedPreferences {
|
|
206
|
+
return EncryptedSharedPreferences.create(
|
|
207
|
+
context,
|
|
208
|
+
ENCRYPTED_SHARED_PREFERENCES_FILENAME,
|
|
209
|
+
masterKey,
|
|
210
|
+
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
|
|
211
|
+
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private fun createMasterKey(context: Context): MasterKey {
|
|
216
|
+
return MasterKey.Builder(context.applicationContext, MASTER_KEY_ALIAS)
|
|
217
|
+
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
|
|
218
|
+
.setUserAuthenticationRequired(false)
|
|
219
|
+
.build()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
private fun getSharedPreferences(context: Context): SharedPreferences {
|
|
224
|
+
try {
|
|
225
|
+
// Attempt to create or load the EncryptedSharedPreferences file
|
|
226
|
+
val masterKey = createMasterKey(context)
|
|
227
|
+
|
|
228
|
+
return createSharedPreferences(masterKey, context)
|
|
229
|
+
} catch(e: Exception) {
|
|
230
|
+
// Log the Exception
|
|
231
|
+
e.printStackTrace()
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// An error occured creating or retrieving the Shared Preferences file.
|
|
235
|
+
// Delete the existing master key and EncryptedSharedPreferences
|
|
236
|
+
|
|
237
|
+
// first delete the MasterKey
|
|
238
|
+
try {
|
|
239
|
+
val keyStore = KeyStore.getInstance("AndroidKeyStore")
|
|
240
|
+
keyStore.load(null)
|
|
241
|
+
keyStore.deleteEntry(MASTER_KEY_ALIAS)
|
|
242
|
+
} catch (keyStoreDeletionException: Exception) {
|
|
243
|
+
throw RuntimeException("An error occured deleting the Master Key", keyStoreDeletionException)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// attempt to recreate a new EncryptedSharedPreferences file
|
|
247
|
+
try {
|
|
248
|
+
// Create a new MasterKey
|
|
249
|
+
val newMasterKey = createMasterKey(context)
|
|
250
|
+
context.getSharedPreferences(ENCRYPTED_SHARED_PREFERENCES_FILENAME, Context.MODE_PRIVATE).edit().clear().apply()
|
|
251
|
+
context.deleteSharedPreferences(ENCRYPTED_SHARED_PREFERENCES_FILENAME)
|
|
252
|
+
|
|
253
|
+
return createSharedPreferences(newMasterKey, context)
|
|
254
|
+
} catch(retryException: Exception) {
|
|
255
|
+
throw RuntimeException("Couldn't create the required shared preferences file. Ensure you are properly authenticated on this device.", retryException)
|
|
256
|
+
}
|
|
257
|
+
}
|
|
199
258
|
}
|
package/lib/commonjs/client.js
CHANGED
|
@@ -5,29 +5,37 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.RNSignerClientParamsSchema = exports.RNSignerClient = void 0;
|
|
7
7
|
require("./utils/mmkv-localstorage-polyfill.js");
|
|
8
|
+
require("./utils/buffer-polyfill.js");
|
|
8
9
|
var _signer = require("@account-kit/signer");
|
|
9
10
|
var _NativeTEKStamper = _interopRequireDefault(require("./NativeTEKStamper.js"));
|
|
10
11
|
var _zod = require("zod");
|
|
12
|
+
var _reactNativeInappbrowserReborn = require("react-native-inappbrowser-reborn");
|
|
13
|
+
var _parseUrlParams = require("./utils/parseUrlParams.js");
|
|
14
|
+
var _errors = require("./errors.js");
|
|
11
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
16
|
/* eslint-disable import/extensions */
|
|
13
17
|
|
|
14
18
|
const RNSignerClientParamsSchema = exports.RNSignerClientParamsSchema = _zod.z.object({
|
|
15
19
|
connection: _zod.z.custom(),
|
|
16
|
-
rootOrgId: _zod.z.string().optional()
|
|
20
|
+
rootOrgId: _zod.z.string().optional(),
|
|
21
|
+
oauthCallbackUrl: _zod.z.string().optional().default("https://signer.alchemy.com/callback")
|
|
17
22
|
});
|
|
18
23
|
// TODO: need to emit events
|
|
19
24
|
class RNSignerClient extends _signer.BaseSignerClient {
|
|
20
25
|
stamper = _NativeTEKStamper.default;
|
|
26
|
+
validAuthenticatingTypes = ["email", "otp", "oauth"];
|
|
21
27
|
constructor(params) {
|
|
22
28
|
const {
|
|
23
29
|
connection,
|
|
24
|
-
rootOrgId
|
|
30
|
+
rootOrgId,
|
|
31
|
+
oauthCallbackUrl
|
|
25
32
|
} = RNSignerClientParamsSchema.parse(params);
|
|
26
33
|
super({
|
|
27
34
|
stamper: _NativeTEKStamper.default,
|
|
28
35
|
rootOrgId: rootOrgId ?? "24c1acf5-810f-41e0-a503-d5d13fa8e830",
|
|
29
36
|
connection
|
|
30
37
|
});
|
|
38
|
+
this.oauthCallbackUrl = oauthCallbackUrl;
|
|
31
39
|
}
|
|
32
40
|
async submitOtpCode(args) {
|
|
33
41
|
this.eventEmitter.emit("authenticating", {
|
|
@@ -78,11 +86,11 @@ class RNSignerClient extends _signer.BaseSignerClient {
|
|
|
78
86
|
return response;
|
|
79
87
|
}
|
|
80
88
|
async completeAuthWithBundle(params) {
|
|
81
|
-
if (
|
|
89
|
+
if (!this.validAuthenticatingTypes.includes(params.authenticatingType)) {
|
|
82
90
|
throw new Error("Unsupported authenticating type");
|
|
83
91
|
}
|
|
84
92
|
this.eventEmitter.emit("authenticating", {
|
|
85
|
-
type:
|
|
93
|
+
type: params.authenticatingType
|
|
86
94
|
});
|
|
87
95
|
await this.stamper.init();
|
|
88
96
|
const result = await this.stamper.injectCredentialBundle(params.bundle);
|
|
@@ -93,11 +101,55 @@ class RNSignerClient extends _signer.BaseSignerClient {
|
|
|
93
101
|
this.eventEmitter.emit(params.connectedEventName, user, params.bundle);
|
|
94
102
|
return user;
|
|
95
103
|
}
|
|
96
|
-
oauthWithRedirect
|
|
97
|
-
|
|
98
|
-
|
|
104
|
+
oauthWithRedirect = async args => {
|
|
105
|
+
// Ensure the In-App Browser required for authentication is available
|
|
106
|
+
if (!(await _reactNativeInappbrowserReborn.InAppBrowser.isAvailable())) {
|
|
107
|
+
throw new _errors.InAppBrowserUnavailableError();
|
|
108
|
+
}
|
|
109
|
+
this.eventEmitter.emit("authenticating", {
|
|
110
|
+
type: "oauth"
|
|
111
|
+
});
|
|
112
|
+
const oauthParams = args;
|
|
113
|
+
const turnkeyPublicKey = await this.stamper.init();
|
|
114
|
+
const oauthCallbackUrl = this.oauthCallbackUrl;
|
|
115
|
+
const oauthConfig = await this.getOauthConfig();
|
|
116
|
+
const providerUrl = await this.getOauthProviderUrl({
|
|
117
|
+
oauthParams,
|
|
118
|
+
turnkeyPublicKey,
|
|
119
|
+
oauthCallbackUrl,
|
|
120
|
+
oauthConfig,
|
|
121
|
+
usesRelativeUrl: false
|
|
122
|
+
});
|
|
123
|
+
const redirectUrl = args.redirectUrl;
|
|
124
|
+
const res = await _reactNativeInappbrowserReborn.InAppBrowser.openAuth(providerUrl, redirectUrl);
|
|
125
|
+
if (res.type !== "success" || !res.url) {
|
|
126
|
+
throw new _signer.OauthFailedError("An error occured completing your request");
|
|
127
|
+
}
|
|
128
|
+
const authResult = (0, _parseUrlParams.parseSearchParams)(res.url);
|
|
129
|
+
const bundle = authResult["alchemy-bundle"] ?? "";
|
|
130
|
+
const orgId = authResult["alchemy-org-id"] ?? "";
|
|
131
|
+
const idToken = authResult["alchemy-id-token"] ?? "";
|
|
132
|
+
const isSignup = authResult["alchemy-is-signup"];
|
|
133
|
+
const error = authResult["alchemy-error"];
|
|
134
|
+
if (bundle && orgId && idToken) {
|
|
135
|
+
const user = await this.completeAuthWithBundle({
|
|
136
|
+
bundle,
|
|
137
|
+
orgId,
|
|
138
|
+
connectedEventName: "connectedOauth",
|
|
139
|
+
idToken,
|
|
140
|
+
authenticatingType: "oauth"
|
|
141
|
+
});
|
|
142
|
+
if (isSignup) {
|
|
143
|
+
this.eventEmitter.emit("newUserSignup");
|
|
144
|
+
}
|
|
145
|
+
return user;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Throw the Alchemy error if available, otherwise throw a generic error.
|
|
149
|
+
throw new _signer.OauthFailedError(error ?? "An error occured completing your request");
|
|
150
|
+
};
|
|
99
151
|
oauthWithPopup(_args) {
|
|
100
|
-
throw new Error("Method not implemented
|
|
152
|
+
throw new Error("Method not implemented");
|
|
101
153
|
}
|
|
102
154
|
async disconnect() {
|
|
103
155
|
this.user = undefined;
|
|
@@ -110,12 +162,16 @@ class RNSignerClient extends _signer.BaseSignerClient {
|
|
|
110
162
|
lookupUserWithPasskey(_user) {
|
|
111
163
|
throw new Error("Method not implemented.");
|
|
112
164
|
}
|
|
113
|
-
getOauthConfig() {
|
|
114
|
-
throw new Error("Method not implemented.");
|
|
115
|
-
}
|
|
116
165
|
getWebAuthnAttestation(_options, _userDetails) {
|
|
117
166
|
throw new Error("Method not implemented.");
|
|
118
167
|
}
|
|
168
|
+
getOauthConfig = async () => {
|
|
169
|
+
const publicKey = await this.stamper.init();
|
|
170
|
+
const nonce = this.getOauthNonce(publicKey);
|
|
171
|
+
return this.request("/v1/prepare-oauth", {
|
|
172
|
+
nonce
|
|
173
|
+
});
|
|
174
|
+
};
|
|
119
175
|
}
|
|
120
176
|
exports.RNSignerClient = RNSignerClient;
|
|
121
177
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["require","_signer","_NativeTEKStamper","_interopRequireDefault","_zod","e","__esModule","default","RNSignerClientParamsSchema","exports","z","object","connection","custom","rootOrgId","string","optional","RNSignerClient","BaseSignerClient","stamper","NativeTEKStamper","constructor","params","parse","submitOtpCode","args","eventEmitter","emit","type","publicKey","init","credentialBundle","request","targetPublicKey","bundle","createAccount","Error","email","expirationSeconds","response","emailMode","redirectParams","toString","initEmailAuth","completeAuthWithBundle","authenticatingType","result","injectCredentialBundle","user","whoami","orgId","idToken","connectedEventName","oauthWithRedirect","
|
|
1
|
+
{"version":3,"names":["require","_signer","_NativeTEKStamper","_interopRequireDefault","_zod","_reactNativeInappbrowserReborn","_parseUrlParams","_errors","e","__esModule","default","RNSignerClientParamsSchema","exports","z","object","connection","custom","rootOrgId","string","optional","oauthCallbackUrl","RNSignerClient","BaseSignerClient","stamper","NativeTEKStamper","validAuthenticatingTypes","constructor","params","parse","submitOtpCode","args","eventEmitter","emit","type","publicKey","init","credentialBundle","request","targetPublicKey","bundle","createAccount","Error","email","expirationSeconds","response","emailMode","redirectParams","toString","initEmailAuth","completeAuthWithBundle","includes","authenticatingType","result","injectCredentialBundle","user","whoami","orgId","idToken","connectedEventName","oauthWithRedirect","InAppBrowser","isAvailable","InAppBrowserUnavailableError","oauthParams","turnkeyPublicKey","oauthConfig","getOauthConfig","providerUrl","getOauthProviderUrl","usesRelativeUrl","redirectUrl","res","openAuth","url","OauthFailedError","authResult","parseSearchParams","isSignup","error","oauthWithPopup","_args","disconnect","undefined","clear","exportWallet","_params","lookupUserWithPasskey","_user","getWebAuthnAttestation","_options","_userDetails","nonce","getOauthNonce"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.InAppBrowserUnavailableError = void 0;
|
|
7
|
+
var _core = require("@aa-sdk/core");
|
|
8
|
+
class InAppBrowserUnavailableError extends _core.BaseError {
|
|
9
|
+
name = "InAppBrowserUnavailableError";
|
|
10
|
+
constructor() {
|
|
11
|
+
super("In-App Browser is not available. Please authenticate with a different method.");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.InAppBrowserUnavailableError = InAppBrowserUnavailableError;
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_core","require","InAppBrowserUnavailableError","BaseError","name","constructor","exports"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEO,MAAMC,4BAA4B,SAASC,eAAS,CAAC;EACjDC,IAAI,GAAG,8BAA8B;EAC9CC,WAAWA,CAAA,EAAG;IACZ,KAAK,CACH,+EACF,CAAC;EACH;AACF;AAACC,OAAA,CAAAJ,4BAAA,GAAAA,4BAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_signer","require"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"names":["_signer","require"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA","ignoreList":[]}
|
package/lib/commonjs/signer.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.RNAlchemySigner = RNAlchemySigner;
|
|
7
|
+
exports.RNAlchemySignerSingleton = void 0;
|
|
7
8
|
var _zod = require("zod");
|
|
8
9
|
var _signer = require("@account-kit/signer");
|
|
9
10
|
var _client = require("./client.js");
|
|
@@ -44,6 +45,7 @@ class RNAlchemySignerSingleton extends _signer.BaseAlchemySigner {
|
|
|
44
45
|
return this.instance;
|
|
45
46
|
}
|
|
46
47
|
}
|
|
48
|
+
exports.RNAlchemySignerSingleton = RNAlchemySignerSingleton;
|
|
47
49
|
function RNAlchemySigner(params) {
|
|
48
50
|
const instance = RNAlchemySignerSingleton.getInstance(params);
|
|
49
51
|
return instance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_zod","require","_signer","_client","RNAlchemySignerParamsSchema","z","object","client","custom","or","RNSignerClientParamsSchema","extend","sessionConfig","SessionManagerParamsSchema","omit","storage","optional","RNAlchemySignerSingleton","BaseAlchemySigner","constructor","params","instance","params_","parse","RNSignerClient","getInstance","RNAlchemySigner"],"sourceRoot":"../../src","sources":["signer.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_zod","require","_signer","_client","RNAlchemySignerParamsSchema","z","object","client","custom","or","RNSignerClientParamsSchema","extend","sessionConfig","SessionManagerParamsSchema","omit","storage","optional","RNAlchemySignerSingleton","BaseAlchemySigner","constructor","params","instance","params_","parse","RNSignerClient","getInstance","exports","RNAlchemySigner"],"sourceRoot":"../../src","sources":["signer.ts"],"mappings":";;;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAKA,IAAAE,OAAA,GAAAF,OAAA;AADA;;AAGA,MAAMG,2BAA2B,GAAGC,MAAC,CAClCC,MAAM,CAAC;EACNC,MAAM,EAAEF,MAAC,CAACG,MAAM,CAAiB,CAAC,CAACC,EAAE,CAACC,kCAA0B;AAClE,CAAC,CAAC,CACDC,MAAM,CAAC;EACNC,aAAa,EAAEC,kCAA0B,CAACC,IAAI,CAAC;IAC7CP,MAAM,EAAE,IAAI;IACZQ,OAAO,EAAE;EACX,CAAC,CAAC,CAACC,QAAQ,CAAC;AACd,CAAC,CAAC;AAIG,MAAMC,wBAAwB,SAASC,yBAAiB,CAAiB;EAGtEC,WAAWA,CAACC,MAA6B,EAAE;IACjD,IAAI,CAAC,CAACH,wBAAwB,CAACI,QAAQ,EAAE;MACvC,OAAOJ,wBAAwB,CAACI,QAAQ;IAC1C;IAEA,MAAM;MAAET,aAAa;MAAE,GAAGU;IAAQ,CAAC,GACjClB,2BAA2B,CAACmB,KAAK,CAACH,MAAM,CAAC;IAE3C,IAAIb,MAAsB;IAE1B,IAAI,YAAY,IAAIe,OAAO,CAACf,MAAM,EAAE;MAClCA,MAAM,GAAG,IAAIiB,sBAAc,CAACF,OAAO,CAACf,MAAM,CAAC;IAC7C,CAAC,MAAM;MACLA,MAAM,GAAGe,OAAO,CAACf,MAAM;IACzB;IAEA,KAAK,CAAC;MACJA,MAAM;MACNK;IACF,CAAC,CAAC;EACJ;EAEA,OAAca,WAAWA,CAACL,MAA6B,EAAE;IACvD,IAAI,CAAC,IAAI,CAACC,QAAQ,EAAE;MAClB,IAAI,CAACA,QAAQ,GAAG,IAAIJ,wBAAwB,CAACG,MAAM,CAAC;IACtD;IACA,OAAO,IAAI,CAACC,QAAQ;EACtB;AACF;AAACK,OAAA,CAAAT,wBAAA,GAAAA,wBAAA;AAEM,SAASU,eAAeA,CAACP,MAA6B,EAAE;EAC7D,MAAMC,QAAQ,GAAGJ,wBAAwB,CAACQ,WAAW,CAACL,MAAM,CAAC;EAE7D,OAAOC,QAAQ;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.base64UrlEncode = void 0;
|
|
7
|
+
var _buffer = require("buffer");
|
|
8
|
+
const base64UrlEncode = challenge => {
|
|
9
|
+
return _buffer.Buffer.from(challenge).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
10
|
+
};
|
|
11
|
+
exports.base64UrlEncode = base64UrlEncode;
|
|
12
|
+
//# sourceMappingURL=base64UrlEncode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_buffer","require","base64UrlEncode","challenge","Buffer","from","toString","replace","exports"],"sourceRoot":"../../../src","sources":["utils/base64UrlEncode.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEO,MAAMC,eAAe,GAC1BC,SAAwC,IAC7B;EACX,OAAOC,cAAM,CAACC,IAAI,CAACF,SAAS,CAAC,CAC1BG,QAAQ,CAAC,QAAQ,CAAC,CAClBC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACtB,CAAC;AAACC,OAAA,CAAAN,eAAA,GAAAA,eAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_buffer","require","global","Buffer"],"sourceRoot":"../../../src","sources":["utils/buffer-polyfill.ts"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAI,CAACC,MAAM,CAACC,MAAM,EAAE;EAClBD,MAAM,CAACC,MAAM,GAAGA,cAAM;AACxB","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.parseSearchParams = void 0;
|
|
7
|
+
const parseSearchParams = url => {
|
|
8
|
+
const regex = /[?&]([^=#]+)=([^&#]*)/g;
|
|
9
|
+
let params = {};
|
|
10
|
+
let match;
|
|
11
|
+
while (match = regex.exec(url)) {
|
|
12
|
+
if (match[1] !== undefined && match[2] !== undefined) {
|
|
13
|
+
params[match[1]] = match[2];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return params;
|
|
17
|
+
};
|
|
18
|
+
exports.parseSearchParams = parseSearchParams;
|
|
19
|
+
//# sourceMappingURL=parseUrlParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["parseSearchParams","url","regex","params","match","exec","undefined","exports"],"sourceRoot":"../../../src","sources":["utils/parseUrlParams.ts"],"mappings":";;;;;;AAAO,MAAMA,iBAAiB,GAAIC,GAAW,IAAK;EAChD,MAAMC,KAAK,GAAG,wBAAwB;EAEtC,IAAIC,MAA8B,GAAG,CAAC,CAAC;EACvC,IAAIC,KAA6B;EAEjC,OAAQA,KAAK,GAAGF,KAAK,CAACG,IAAI,CAACJ,GAAG,CAAC,EAAG;IAChC,IAAIG,KAAK,CAAC,CAAC,CAAC,KAAKE,SAAS,IAAIF,KAAK,CAAC,CAAC,CAAC,KAAKE,SAAS,EAAE;MACpDH,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC;IAC7B;EACF;EAEA,OAAOD,MAAM;AACf,CAAC;AAACI,OAAA,CAAAP,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
package/lib/module/client.js
CHANGED
|
@@ -2,26 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
/* eslint-disable import/extensions */
|
|
4
4
|
import "./utils/mmkv-localstorage-polyfill.js";
|
|
5
|
-
import
|
|
5
|
+
import "./utils/buffer-polyfill.js";
|
|
6
|
+
import { BaseSignerClient, OauthFailedError } from "@account-kit/signer";
|
|
6
7
|
import NativeTEKStamper from "./NativeTEKStamper.js";
|
|
7
8
|
import { z } from "zod";
|
|
9
|
+
import { InAppBrowser } from "react-native-inappbrowser-reborn";
|
|
10
|
+
import { parseSearchParams } from "./utils/parseUrlParams.js";
|
|
11
|
+
import { InAppBrowserUnavailableError } from "./errors.js";
|
|
8
12
|
export const RNSignerClientParamsSchema = z.object({
|
|
9
13
|
connection: z.custom(),
|
|
10
|
-
rootOrgId: z.string().optional()
|
|
14
|
+
rootOrgId: z.string().optional(),
|
|
15
|
+
oauthCallbackUrl: z.string().optional().default("https://signer.alchemy.com/callback")
|
|
11
16
|
});
|
|
12
17
|
// TODO: need to emit events
|
|
13
18
|
export class RNSignerClient extends BaseSignerClient {
|
|
14
19
|
stamper = NativeTEKStamper;
|
|
20
|
+
validAuthenticatingTypes = ["email", "otp", "oauth"];
|
|
15
21
|
constructor(params) {
|
|
16
22
|
const {
|
|
17
23
|
connection,
|
|
18
|
-
rootOrgId
|
|
24
|
+
rootOrgId,
|
|
25
|
+
oauthCallbackUrl
|
|
19
26
|
} = RNSignerClientParamsSchema.parse(params);
|
|
20
27
|
super({
|
|
21
28
|
stamper: NativeTEKStamper,
|
|
22
29
|
rootOrgId: rootOrgId ?? "24c1acf5-810f-41e0-a503-d5d13fa8e830",
|
|
23
30
|
connection
|
|
24
31
|
});
|
|
32
|
+
this.oauthCallbackUrl = oauthCallbackUrl;
|
|
25
33
|
}
|
|
26
34
|
async submitOtpCode(args) {
|
|
27
35
|
this.eventEmitter.emit("authenticating", {
|
|
@@ -72,11 +80,11 @@ export class RNSignerClient extends BaseSignerClient {
|
|
|
72
80
|
return response;
|
|
73
81
|
}
|
|
74
82
|
async completeAuthWithBundle(params) {
|
|
75
|
-
if (
|
|
83
|
+
if (!this.validAuthenticatingTypes.includes(params.authenticatingType)) {
|
|
76
84
|
throw new Error("Unsupported authenticating type");
|
|
77
85
|
}
|
|
78
86
|
this.eventEmitter.emit("authenticating", {
|
|
79
|
-
type:
|
|
87
|
+
type: params.authenticatingType
|
|
80
88
|
});
|
|
81
89
|
await this.stamper.init();
|
|
82
90
|
const result = await this.stamper.injectCredentialBundle(params.bundle);
|
|
@@ -87,11 +95,55 @@ export class RNSignerClient extends BaseSignerClient {
|
|
|
87
95
|
this.eventEmitter.emit(params.connectedEventName, user, params.bundle);
|
|
88
96
|
return user;
|
|
89
97
|
}
|
|
90
|
-
oauthWithRedirect
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
oauthWithRedirect = async args => {
|
|
99
|
+
// Ensure the In-App Browser required for authentication is available
|
|
100
|
+
if (!(await InAppBrowser.isAvailable())) {
|
|
101
|
+
throw new InAppBrowserUnavailableError();
|
|
102
|
+
}
|
|
103
|
+
this.eventEmitter.emit("authenticating", {
|
|
104
|
+
type: "oauth"
|
|
105
|
+
});
|
|
106
|
+
const oauthParams = args;
|
|
107
|
+
const turnkeyPublicKey = await this.stamper.init();
|
|
108
|
+
const oauthCallbackUrl = this.oauthCallbackUrl;
|
|
109
|
+
const oauthConfig = await this.getOauthConfig();
|
|
110
|
+
const providerUrl = await this.getOauthProviderUrl({
|
|
111
|
+
oauthParams,
|
|
112
|
+
turnkeyPublicKey,
|
|
113
|
+
oauthCallbackUrl,
|
|
114
|
+
oauthConfig,
|
|
115
|
+
usesRelativeUrl: false
|
|
116
|
+
});
|
|
117
|
+
const redirectUrl = args.redirectUrl;
|
|
118
|
+
const res = await InAppBrowser.openAuth(providerUrl, redirectUrl);
|
|
119
|
+
if (res.type !== "success" || !res.url) {
|
|
120
|
+
throw new OauthFailedError("An error occured completing your request");
|
|
121
|
+
}
|
|
122
|
+
const authResult = parseSearchParams(res.url);
|
|
123
|
+
const bundle = authResult["alchemy-bundle"] ?? "";
|
|
124
|
+
const orgId = authResult["alchemy-org-id"] ?? "";
|
|
125
|
+
const idToken = authResult["alchemy-id-token"] ?? "";
|
|
126
|
+
const isSignup = authResult["alchemy-is-signup"];
|
|
127
|
+
const error = authResult["alchemy-error"];
|
|
128
|
+
if (bundle && orgId && idToken) {
|
|
129
|
+
const user = await this.completeAuthWithBundle({
|
|
130
|
+
bundle,
|
|
131
|
+
orgId,
|
|
132
|
+
connectedEventName: "connectedOauth",
|
|
133
|
+
idToken,
|
|
134
|
+
authenticatingType: "oauth"
|
|
135
|
+
});
|
|
136
|
+
if (isSignup) {
|
|
137
|
+
this.eventEmitter.emit("newUserSignup");
|
|
138
|
+
}
|
|
139
|
+
return user;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Throw the Alchemy error if available, otherwise throw a generic error.
|
|
143
|
+
throw new OauthFailedError(error ?? "An error occured completing your request");
|
|
144
|
+
};
|
|
93
145
|
oauthWithPopup(_args) {
|
|
94
|
-
throw new Error("Method not implemented
|
|
146
|
+
throw new Error("Method not implemented");
|
|
95
147
|
}
|
|
96
148
|
async disconnect() {
|
|
97
149
|
this.user = undefined;
|
|
@@ -104,11 +156,15 @@ export class RNSignerClient extends BaseSignerClient {
|
|
|
104
156
|
lookupUserWithPasskey(_user) {
|
|
105
157
|
throw new Error("Method not implemented.");
|
|
106
158
|
}
|
|
107
|
-
getOauthConfig() {
|
|
108
|
-
throw new Error("Method not implemented.");
|
|
109
|
-
}
|
|
110
159
|
getWebAuthnAttestation(_options, _userDetails) {
|
|
111
160
|
throw new Error("Method not implemented.");
|
|
112
161
|
}
|
|
162
|
+
getOauthConfig = async () => {
|
|
163
|
+
const publicKey = await this.stamper.init();
|
|
164
|
+
const nonce = this.getOauthNonce(publicKey);
|
|
165
|
+
return this.request("/v1/prepare-oauth", {
|
|
166
|
+
nonce
|
|
167
|
+
});
|
|
168
|
+
};
|
|
113
169
|
}
|
|
114
170
|
//# sourceMappingURL=client.js.map
|
package/lib/module/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseSignerClient","NativeTEKStamper","z","RNSignerClientParamsSchema","object","connection","custom","rootOrgId","string","optional","RNSignerClient","stamper","constructor","params","parse","submitOtpCode","args","eventEmitter","emit","type","publicKey","init","credentialBundle","request","targetPublicKey","bundle","createAccount","Error","email","expirationSeconds","response","emailMode","redirectParams","toString","initEmailAuth","completeAuthWithBundle","authenticatingType","result","injectCredentialBundle","user","whoami","orgId","idToken","connectedEventName","oauthWithRedirect","
|
|
1
|
+
{"version":3,"names":["BaseSignerClient","OauthFailedError","NativeTEKStamper","z","InAppBrowser","parseSearchParams","InAppBrowserUnavailableError","RNSignerClientParamsSchema","object","connection","custom","rootOrgId","string","optional","oauthCallbackUrl","default","RNSignerClient","stamper","validAuthenticatingTypes","constructor","params","parse","submitOtpCode","args","eventEmitter","emit","type","publicKey","init","credentialBundle","request","targetPublicKey","bundle","createAccount","Error","email","expirationSeconds","response","emailMode","redirectParams","toString","initEmailAuth","completeAuthWithBundle","includes","authenticatingType","result","injectCredentialBundle","user","whoami","orgId","idToken","connectedEventName","oauthWithRedirect","isAvailable","oauthParams","turnkeyPublicKey","oauthConfig","getOauthConfig","providerUrl","getOauthProviderUrl","usesRelativeUrl","redirectUrl","res","openAuth","url","authResult","isSignup","error","oauthWithPopup","_args","disconnect","undefined","clear","exportWallet","_params","lookupUserWithPasskey","_user","getWebAuthnAttestation","_options","_userDetails","nonce","getOauthNonce"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { BaseError } from "@aa-sdk/core";
|
|
4
|
+
export class InAppBrowserUnavailableError extends BaseError {
|
|
5
|
+
name = "InAppBrowserUnavailableError";
|
|
6
|
+
constructor() {
|
|
7
|
+
super("In-App Browser is not available. Please authenticate with a different method.");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BaseError","InAppBrowserUnavailableError","name","constructor"],"sourceRoot":"../../src","sources":["errors.ts"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,cAAc;AAExC,OAAO,MAAMC,4BAA4B,SAASD,SAAS,CAAC;EACjDE,IAAI,GAAG,8BAA8B;EAC9CC,WAAWA,CAAA,EAAG;IACZ,KAAK,CACH,+EACF,CAAC;EACH;AACF","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RNAlchemySigner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA
|
|
1
|
+
{"version":3,"names":["RNAlchemySigner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,eAAe,QAAkC,aAAa","ignoreList":[]}
|
package/lib/module/signer.js
CHANGED
|
@@ -12,7 +12,7 @@ const RNAlchemySignerParamsSchema = z.object({
|
|
|
12
12
|
storage: true
|
|
13
13
|
}).optional()
|
|
14
14
|
});
|
|
15
|
-
class RNAlchemySignerSingleton extends BaseAlchemySigner {
|
|
15
|
+
export class RNAlchemySignerSingleton extends BaseAlchemySigner {
|
|
16
16
|
constructor(params) {
|
|
17
17
|
if (!!RNAlchemySignerSingleton.instance) {
|
|
18
18
|
return RNAlchemySignerSingleton.instance;
|
package/lib/module/signer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["z","BaseAlchemySigner","SessionManagerParamsSchema","RNSignerClient","RNSignerClientParamsSchema","RNAlchemySignerParamsSchema","object","client","custom","or","extend","sessionConfig","omit","storage","optional","RNAlchemySignerSingleton","constructor","params","instance","params_","parse","getInstance","RNAlchemySigner"],"sourceRoot":"../../src","sources":["signer.ts"],"mappings":";;AAAA,SAASA,CAAC,QAAQ,KAAK;AACvB,SACEC,iBAAiB,EACjBC,0BAA0B,QACrB,qBAAqB;AAC5B;AACA,SAASC,cAAc,EAAEC,0BAA0B,QAAQ,aAAU;AAErE,MAAMC,2BAA2B,GAAGL,CAAC,CAClCM,MAAM,CAAC;EACNC,MAAM,EAAEP,CAAC,CAACQ,MAAM,CAAiB,CAAC,CAACC,EAAE,CAACL,0BAA0B;AAClE,CAAC,CAAC,CACDM,MAAM,CAAC;EACNC,aAAa,EAAET,0BAA0B,CAACU,IAAI,CAAC;IAC7CL,MAAM,EAAE,IAAI;IACZM,OAAO,EAAE;EACX,CAAC,CAAC,CAACC,QAAQ,CAAC;AACd,CAAC,CAAC;AAIJ,MAAMC,wBAAwB,SAASd,iBAAiB,CAAiB;
|
|
1
|
+
{"version":3,"names":["z","BaseAlchemySigner","SessionManagerParamsSchema","RNSignerClient","RNSignerClientParamsSchema","RNAlchemySignerParamsSchema","object","client","custom","or","extend","sessionConfig","omit","storage","optional","RNAlchemySignerSingleton","constructor","params","instance","params_","parse","getInstance","RNAlchemySigner"],"sourceRoot":"../../src","sources":["signer.ts"],"mappings":";;AAAA,SAASA,CAAC,QAAQ,KAAK;AACvB,SACEC,iBAAiB,EACjBC,0BAA0B,QACrB,qBAAqB;AAC5B;AACA,SAASC,cAAc,EAAEC,0BAA0B,QAAQ,aAAU;AAErE,MAAMC,2BAA2B,GAAGL,CAAC,CAClCM,MAAM,CAAC;EACNC,MAAM,EAAEP,CAAC,CAACQ,MAAM,CAAiB,CAAC,CAACC,EAAE,CAACL,0BAA0B;AAClE,CAAC,CAAC,CACDM,MAAM,CAAC;EACNC,aAAa,EAAET,0BAA0B,CAACU,IAAI,CAAC;IAC7CL,MAAM,EAAE,IAAI;IACZM,OAAO,EAAE;EACX,CAAC,CAAC,CAACC,QAAQ,CAAC;AACd,CAAC,CAAC;AAIJ,OAAO,MAAMC,wBAAwB,SAASd,iBAAiB,CAAiB;EAGtEe,WAAWA,CAACC,MAA6B,EAAE;IACjD,IAAI,CAAC,CAACF,wBAAwB,CAACG,QAAQ,EAAE;MACvC,OAAOH,wBAAwB,CAACG,QAAQ;IAC1C;IAEA,MAAM;MAAEP,aAAa;MAAE,GAAGQ;IAAQ,CAAC,GACjCd,2BAA2B,CAACe,KAAK,CAACH,MAAM,CAAC;IAE3C,IAAIV,MAAsB;IAE1B,IAAI,YAAY,IAAIY,OAAO,CAACZ,MAAM,EAAE;MAClCA,MAAM,GAAG,IAAIJ,cAAc,CAACgB,OAAO,CAACZ,MAAM,CAAC;IAC7C,CAAC,MAAM;MACLA,MAAM,GAAGY,OAAO,CAACZ,MAAM;IACzB;IAEA,KAAK,CAAC;MACJA,MAAM;MACNI;IACF,CAAC,CAAC;EACJ;EAEA,OAAcU,WAAWA,CAACJ,MAA6B,EAAE;IACvD,IAAI,CAAC,IAAI,CAACC,QAAQ,EAAE;MAClB,IAAI,CAACA,QAAQ,GAAG,IAAIH,wBAAwB,CAACE,MAAM,CAAC;IACtD;IACA,OAAO,IAAI,CAACC,QAAQ;EACtB;AACF;AAEA,OAAO,SAASI,eAAeA,CAACL,MAA6B,EAAE;EAC7D,MAAMC,QAAQ,GAAGH,wBAAwB,CAACM,WAAW,CAACJ,MAAM,CAAC;EAE7D,OAAOC,QAAQ;AACjB","ignoreList":[]}
|