@dynamic-labs-sdk/client 0.24.1 → 0.25.1
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/build.gradle +71 -0
- package/android/src/main/java/xyz/dynamic/client/DynamicClientPackage.kt +42 -0
- package/android/src/main/java/xyz/dynamic/client/keychain/KeyStoreKeyManager.kt +147 -0
- package/android/src/main/java/xyz/dynamic/client/keychain/KeychainModule.kt +85 -0
- package/android/src/main/java/xyz/dynamic/client/manifest/ReactNativeManifestModule.kt +25 -0
- package/dist/InvalidParamError-BDHw6nr1.native.esm.js +1178 -0
- package/dist/InvalidParamError-BDHw6nr1.native.esm.js.map +1 -0
- package/dist/{InvalidParamError-9IR2C0up.cjs.js → InvalidParamError-BqDEZ6er.cjs.js} +5 -5
- package/dist/InvalidParamError-BqDEZ6er.cjs.js.map +1 -0
- package/dist/{InvalidParamError-Bq5zAFj4.esm.js → InvalidParamError-DcN56mC-.esm.js} +4 -4
- package/dist/InvalidParamError-DcN56mC-.esm.js.map +1 -0
- package/dist/NotWaasWalletAccountError-B_TYSgak.native.esm.js +50 -0
- package/dist/NotWaasWalletAccountError-B_TYSgak.native.esm.js.map +1 -0
- package/dist/{NotWaasWalletAccountError-CIJRq-EG.esm.js → NotWaasWalletAccountError-CQ7CMol4.esm.js} +3 -3
- package/dist/{NotWaasWalletAccountError-CIJRq-EG.esm.js.map → NotWaasWalletAccountError-CQ7CMol4.esm.js.map} +1 -1
- package/dist/{NotWaasWalletAccountError-DpRIY6Pd.cjs.js → NotWaasWalletAccountError-ftYfHk_N.cjs.js} +3 -3
- package/dist/{NotWaasWalletAccountError-DpRIY6Pd.cjs.js.map → NotWaasWalletAccountError-ftYfHk_N.cjs.js.map} +1 -1
- package/dist/client/core/createCore/createCore.d.ts.map +1 -1
- package/dist/client/core/types/DynamicCore.d.ts +4 -0
- package/dist/client/core/types/DynamicCore.d.ts.map +1 -1
- package/dist/client/types/DynamicClientConfig.d.ts +10 -0
- package/dist/client/types/DynamicClientConfig.d.ts.map +1 -1
- package/dist/core.cjs.js +36 -6
- package/dist/core.cjs.js.map +1 -1
- package/dist/core.esm.js +34 -6
- package/dist/core.esm.js.map +1 -1
- package/dist/core.native.esm.js +417 -0
- package/dist/core.native.esm.js.map +1 -0
- package/dist/errors/APIError/APIError.d.ts.map +1 -1
- package/dist/errors/InvalidParamError.d.ts.map +1 -1
- package/dist/errors/InvalidStorageValue.d.ts.map +1 -1
- package/dist/errors/InvalidWalletProviderKeyError.d.ts.map +1 -1
- package/dist/errors/MethodNotImplementedError.d.ts.map +1 -1
- package/dist/errors/MissingSocialUrlParamError.d.ts.map +1 -1
- package/dist/errors/NativeModuleNotLinkedError.d.ts +9 -0
- package/dist/errors/NativeModuleNotLinkedError.d.ts.map +1 -0
- package/dist/errors/NoSmartWalletAccountSignerFoundError.d.ts.map +1 -1
- package/dist/errors/ReactNativeOnlyError.d.ts +9 -0
- package/dist/errors/ReactNativeOnlyError.d.ts.map +1 -0
- package/dist/errors/UnavailableInServerSideError.d.ts.map +1 -1
- package/dist/errors/ValueMustBeDefinedError.d.ts.map +1 -1
- package/dist/errors/WalletAccountAlreadyVerifiedError.d.ts.map +1 -1
- package/dist/exports/core.d.ts +8 -2
- package/dist/exports/core.d.ts.map +1 -1
- package/dist/exports/index.d.ts +4 -4
- package/dist/exports/index.d.ts.map +1 -1
- package/dist/getNetworkProviderFromNetworkId-BRWuk0I8.native.esm.js +1557 -0
- package/dist/getNetworkProviderFromNetworkId-BRWuk0I8.native.esm.js.map +1 -0
- package/dist/{getNetworkProviderFromNetworkId-C4aba1hS.esm.js → getNetworkProviderFromNetworkId-COHxfpo-.esm.js} +275 -48
- package/dist/getNetworkProviderFromNetworkId-COHxfpo-.esm.js.map +1 -0
- package/dist/{getNetworkProviderFromNetworkId-COxYamJy.cjs.js → getNetworkProviderFromNetworkId-ClfETwqS.cjs.js} +304 -53
- package/dist/getNetworkProviderFromNetworkId-ClfETwqS.cjs.js.map +1 -0
- package/dist/{getSignedSessionId-_vjv5TNw.esm.js → getSignedSessionId-B6ry-rvs.esm.js} +3 -3
- package/dist/{getSignedSessionId-_vjv5TNw.esm.js.map → getSignedSessionId-B6ry-rvs.esm.js.map} +1 -1
- package/dist/{getSignedSessionId-D7uV3dw0.cjs.js → getSignedSessionId-Bkw9TATj.cjs.js} +3 -3
- package/dist/{getSignedSessionId-D7uV3dw0.cjs.js.map → getSignedSessionId-Bkw9TATj.cjs.js.map} +1 -1
- package/dist/getSignedSessionId-C58DvQAd.native.esm.js +67 -0
- package/dist/getSignedSessionId-C58DvQAd.native.esm.js.map +1 -0
- package/dist/{getVerifiedCredentialForWalletAccount-Df_wN20i.cjs.js → getVerifiedCredentialForWalletAccount-DEiU9FZG.cjs.js} +11 -10
- package/dist/getVerifiedCredentialForWalletAccount-DEiU9FZG.cjs.js.map +1 -0
- package/dist/{getVerifiedCredentialForWalletAccount-Y-aJ2rY7.esm.js → getVerifiedCredentialForWalletAccount-DP4VQBly.esm.js} +10 -9
- package/dist/getVerifiedCredentialForWalletAccount-DP4VQBly.esm.js.map +1 -0
- package/dist/getVerifiedCredentialForWalletAccount-d_bHvLLE.native.esm.js +784 -0
- package/dist/getVerifiedCredentialForWalletAccount-d_bHvLLE.native.esm.js.map +1 -0
- package/dist/index.cjs.js +143 -320
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +139 -316
- package/dist/index.esm.js.map +1 -1
- package/dist/index.native.esm.js +6799 -0
- package/dist/index.native.esm.js.map +1 -0
- package/dist/isMfaRequiredForAction-Cjbuyen3.native.esm.js +89 -0
- package/dist/isMfaRequiredForAction-Cjbuyen3.native.esm.js.map +1 -0
- package/dist/{isMfaRequiredForAction-Cc6jkbY5.esm.js → isMfaRequiredForAction-D8GPFYzv.esm.js} +2 -2
- package/dist/{isMfaRequiredForAction-Cc6jkbY5.esm.js.map → isMfaRequiredForAction-D8GPFYzv.esm.js.map} +1 -1
- package/dist/{isMfaRequiredForAction-cfGmMd_g.cjs.js → isMfaRequiredForAction-mZub0YwI.cjs.js} +2 -2
- package/dist/{isMfaRequiredForAction-cfGmMd_g.cjs.js.map → isMfaRequiredForAction-mZub0YwI.cjs.js.map} +1 -1
- package/dist/modules/auth/decodeJwt/decodeJwt.d.ts.map +1 -1
- package/dist/modules/auth/externalAuth/requestExternalAuthElevatedToken/requestExternalAuthElevatedToken.d.ts.map +1 -1
- package/dist/modules/auth/externalAuth/signInWithExternalJwt/signInWithExternalJwt.d.ts +0 -1
- package/dist/modules/auth/externalAuth/signInWithExternalJwt/signInWithExternalJwt.d.ts.map +1 -1
- package/dist/modules/auth/extractSessionId/extractSessionId.d.ts.map +1 -1
- package/dist/modules/auth/initializeAuth/initializeAuth.d.ts +1 -1
- package/dist/modules/auth/initializeAuth/setLongTimeout/setLongTimeout.d.ts +8 -2
- package/dist/modules/auth/initializeAuth/setLongTimeout/setLongTimeout.d.ts.map +1 -1
- package/dist/modules/auth/logout/logout.d.ts +1 -1
- package/dist/modules/auth/logout/logout.d.ts.map +1 -1
- package/dist/modules/auth/logoutReason.d.ts +4 -7
- package/dist/modules/auth/logoutReason.d.ts.map +1 -1
- package/dist/modules/auth/logoutWithReason/index.d.ts +2 -0
- package/dist/modules/auth/logoutWithReason/index.d.ts.map +1 -0
- package/dist/modules/auth/logoutWithReason/logoutWithReason.d.ts +24 -0
- package/dist/modules/auth/logoutWithReason/logoutWithReason.d.ts.map +1 -0
- package/dist/modules/auth/social/oauth/authenticateWithSocial/buildOAuthUrl/addOAuthUrlParams/addOAuthUrlParams.d.ts +7 -4
- package/dist/modules/auth/social/oauth/authenticateWithSocial/buildOAuthUrl/addOAuthUrlParams/addOAuthUrlParams.d.ts.map +1 -1
- package/dist/modules/auth/social/oauth/authenticateWithSocial/buildOAuthUrl/buildOAuthUrl.d.ts.map +1 -1
- package/dist/modules/auth/social/removeDynamicOauthParamsFromUrl/removeDynamicOauthParamsFromUrl.d.ts.map +1 -1
- package/dist/modules/auth/updateAuthFromVerifyResponse/elevatedAccessTokens/normalizeScopes/normalizeScopes.d.ts.map +1 -1
- package/dist/modules/auth/updateAuthFromVerifyResponse/elevatedAccessTokens/parseElevatedAccessToken/parseElevatedAccessToken.d.ts +6 -4
- package/dist/modules/auth/updateAuthFromVerifyResponse/elevatedAccessTokens/parseElevatedAccessToken/parseElevatedAccessToken.d.ts.map +1 -1
- package/dist/modules/auth/updateAuthFromVerifyResponse/updateAuthFromVerifyResponse.d.ts.map +1 -1
- package/dist/modules/checkout/attachCheckoutTransactionSource/attachCheckoutTransactionSource.d.ts +34 -6
- package/dist/modules/checkout/attachCheckoutTransactionSource/attachCheckoutTransactionSource.d.ts.map +1 -1
- package/dist/modules/checkout/broadcastCheckoutTransaction/broadcastCheckoutTransaction.d.ts +11 -3
- package/dist/modules/checkout/broadcastCheckoutTransaction/broadcastCheckoutTransaction.d.ts.map +1 -1
- package/dist/modules/checkout/checkout.types.d.ts +1 -0
- package/dist/modules/checkout/checkout.types.d.ts.map +1 -1
- package/dist/modules/checkout/trackCheckoutTransaction/trackCheckoutTransaction.d.ts +7 -3
- package/dist/modules/checkout/trackCheckoutTransaction/trackCheckoutTransaction.d.ts.map +1 -1
- package/dist/modules/checkout/utils/createCheckoutSessionTokenStorageKey/createCheckoutSessionTokenStorageKey.d.ts.map +1 -1
- package/dist/modules/checkout/utils/subscribeToCheckoutTransaction/subscribeToCheckoutTransaction.d.ts.map +1 -1
- package/dist/modules/initializeClient/initializeClient.d.ts.map +1 -1
- package/dist/modules/instrumentation/setInstrumentationEnabled/setInstrumentationEnabled.d.ts +6 -2
- package/dist/modules/instrumentation/setInstrumentationEnabled/setInstrumentationEnabled.d.ts.map +1 -1
- package/dist/modules/keychainMigration/migrateSessionKeyToKeychain/KeyMigrationError.d.ts.map +1 -1
- package/dist/modules/legacyWalletBook/getWalletConnectCatalog/shouldFilterWallet/shouldFilterWallet.d.ts +9 -5
- package/dist/modules/legacyWalletBook/getWalletConnectCatalog/shouldFilterWallet/shouldFilterWallet.d.ts.map +1 -1
- package/dist/modules/otp/sendEmailOTP/sendEmailOTP.d.ts +0 -1
- package/dist/modules/otp/sendEmailOTP/sendEmailOTP.d.ts.map +1 -1
- package/dist/modules/otp/sendSmsOTP/sendSmsOTP.d.ts +0 -1
- package/dist/modules/otp/sendSmsOTP/sendSmsOTP.d.ts.map +1 -1
- package/dist/modules/storageSync/schema.d.ts.map +1 -1
- package/dist/modules/user/deleteUser/deleteUser.d.ts +1 -1
- package/dist/modules/user/updateUser/updateUser.d.ts +0 -1
- package/dist/modules/user/updateUser/updateUser.d.ts.map +1 -1
- package/dist/modules/waas/createWaasClient/createWaasClient.d.ts.map +1 -1
- package/dist/modules/waas/createWaasProvider/createWaasProvider.d.ts.map +1 -1
- package/dist/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.d.ts.map +1 -1
- package/dist/modules/wallets/networks/createBaseNetworkProvider/createBaseNetworkProvider.d.ts.map +1 -1
- package/dist/modules/wallets/networks/getSdkChainFromApiChainName/getSdkChainFromApiChainName.d.ts.map +1 -1
- package/dist/modules/wallets/utils/assertWalletProviderMethodDefined/assertWalletProviderMethodDefined.d.ts.map +1 -1
- package/dist/modules/wallets/utils/getAllProvidersFromWindow/getAllProvidersFromWindow.d.ts.map +1 -1
- package/dist/modules/wallets/utils/getInjectedProviderFromWindow/getInjectedProviderFromWindow.d.ts.map +1 -1
- package/dist/modules/wallets/utils/isSameAddress/isSameAddress.d.ts +9 -1
- package/dist/modules/wallets/utils/isSameAddress/isSameAddress.d.ts.map +1 -1
- package/dist/modules/wallets/utils/normalizeAddress/normalizeAddress.d.ts +7 -1
- package/dist/modules/wallets/utils/normalizeAddress/normalizeAddress.d.ts.map +1 -1
- package/dist/modules/wallets/verifyWalletAccountForSignInOrTransfer/verifyWalletAccountForSignInOrTransfer.d.ts.map +1 -1
- package/dist/modules/wallets/walletProvider/splitWalletProviderKey/splitWalletProviderKey.d.ts.map +1 -1
- package/dist/services/instrumentation/createInstrumentation/createInstrumentation.d.ts.map +1 -1
- package/dist/services/instrumentation/instrumentFunction/extractParams/extractParams.d.ts.map +1 -1
- package/dist/services/keychain/createKeychainService/ImportKeyNotSupportedError.d.ts +5 -0
- package/dist/services/keychain/createKeychainService/ImportKeyNotSupportedError.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/KeyNotFoundError.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/createKeychainService.d.ts +4 -0
- package/dist/services/keychain/createKeychainService/createKeychainService.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/createKeychainService.types.d.ts +11 -0
- package/dist/services/keychain/createKeychainService/createKeychainService.types.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/index.d.ts +2 -0
- package/dist/services/keychain/createKeychainService/index.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/constants.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/deleteIndexedDBItem.d.ts +9 -0
- package/dist/services/keychain/createKeychainService/utils/deleteIndexedDBItem.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/getIndexedDBItem.d.ts +10 -0
- package/dist/services/keychain/createKeychainService/utils/getIndexedDBItem.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/openDatabase.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/setIndexedDBItem.d.ts +10 -0
- package/dist/services/keychain/createKeychainService/utils/setIndexedDBItem.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/withDatabase/index.d.ts.map +1 -0
- package/dist/services/keychain/createKeychainService/utils/withDatabase/withDatabase.d.ts.map +1 -0
- package/dist/services/keychain/index.d.ts +1 -1
- package/dist/services/keychain/index.d.ts.map +1 -1
- package/dist/services/logger/createLogger/createLogger.d.ts.map +1 -1
- package/dist/services/nativeManifest/getReactNativeManifest/getReactNativeManifest.d.ts +11 -0
- package/dist/services/nativeManifest/getReactNativeManifest/getReactNativeManifest.d.ts.map +1 -0
- package/dist/services/nativeManifest/getReactNativeManifest/index.d.ts +2 -0
- package/dist/services/nativeManifest/getReactNativeManifest/index.d.ts.map +1 -0
- package/dist/services/nativeManifest/nativeManifest.types.d.ts +14 -0
- package/dist/services/nativeManifest/nativeManifest.types.d.ts.map +1 -0
- package/dist/services/realtime/createRealtimeService/createRealtimeService.d.ts.map +1 -1
- package/dist/services/realtime/realtime.types.d.ts +1 -0
- package/dist/services/realtime/realtime.types.d.ts.map +1 -1
- package/dist/services/runtimeServices/createRuntimeServiceAccessKey/createRuntimeServiceAccessKey.d.ts.map +1 -1
- package/dist/services/runtimeServices/createRuntimeServices/createRuntimeServices.d.ts.map +1 -1
- package/dist/services/storage/createLocalStorageAdapter/createLocalStorageAdapter.d.ts +2 -2
- package/dist/services/storage/createStorage/createStorage.d.ts +4 -2
- package/dist/services/storage/createStorage/createStorage.d.ts.map +1 -1
- package/dist/services/storage/createStorage/formatForStorage/isValidDateISOString/isValidDateISOString.d.ts.map +1 -1
- package/dist/services/storage/createStorageKeySchema/createStorageKeySchema.d.ts +2 -1
- package/dist/services/storage/createStorageKeySchema/createStorageKeySchema.d.ts.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/storage.types.d.ts +27 -3
- package/dist/services/storage/storage.types.d.ts.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/utils/assertDefined/assertDefined.d.ts.map +1 -1
- package/dist/utils/base64UrlDecode/base64UrlDecode.d.ts.map +1 -1
- package/dist/utils/base64urlFromBytes/base64urlFromBytes.d.ts +8 -0
- package/dist/utils/base64urlFromBytes/base64urlFromBytes.d.ts.map +1 -0
- package/dist/utils/base64urlFromBytes/index.d.ts +2 -0
- package/dist/utils/base64urlFromBytes/index.d.ts.map +1 -0
- package/dist/utils/bytesFromBase64url/bytesFromBase64url.d.ts +8 -0
- package/dist/utils/bytesFromBase64url/bytesFromBase64url.d.ts.map +1 -0
- package/dist/utils/bytesFromBase64url/index.d.ts +2 -0
- package/dist/utils/bytesFromBase64url/index.d.ts.map +1 -0
- package/dist/utils/derToP1363/InvalidDERSignatureError.d.ts +5 -0
- package/dist/utils/derToP1363/InvalidDERSignatureError.d.ts.map +1 -0
- package/dist/utils/derToP1363/derToP1363.d.ts +8 -0
- package/dist/utils/derToP1363/derToP1363.d.ts.map +1 -0
- package/dist/utils/derToP1363/index.d.ts +2 -0
- package/dist/utils/derToP1363/index.d.ts.map +1 -0
- package/dist/utils/digestSHA256/digestSHA256.d.ts.map +1 -1
- package/dist/utils/getChainFromVerifiedCredentialChain/getChainFromVerifiedCredentialChain.d.ts.map +1 -1
- package/dist/utils/isEqualShallow/isEqualShallow.d.ts.map +1 -1
- package/dist/utils/isErrorWithCode/isErrorWithCode.d.ts.map +1 -1
- package/dist/utils/isMobile/isMobile.d.ts.map +1 -1
- package/dist/utils/observable/createObservableState/createObservableState.d.ts.map +1 -1
- package/dist/utils/observable/subscribeWithSelector/subscribeWithSelector.d.ts.map +1 -1
- package/dist/utils/randomString/randomString.d.ts +1 -1
- package/dist/utils/randomString/randomString.d.ts.map +1 -1
- package/dist/utils/retryOnFail/InvalidRetryOnFailCallError.d.ts.map +1 -1
- package/dist/utils/setCookie/setCookie.d.ts.map +1 -1
- package/dist/waas.cjs.js +4 -4
- package/dist/waas.esm.js +3 -3
- package/dist/waas.native.esm.js +506 -0
- package/dist/waas.native.esm.js.map +1 -0
- package/dist/waasCore.cjs.js +7 -5
- package/dist/waasCore.cjs.js.map +1 -1
- package/dist/waasCore.esm.js +6 -4
- package/dist/waasCore.esm.js.map +1 -1
- package/dist/waasCore.native.esm.js +253 -0
- package/dist/waasCore.native.esm.js.map +1 -0
- package/dynamic-labs-sdk-client.podspec +27 -0
- package/ios/Keychain.h +4 -0
- package/ios/Keychain.mm +101 -0
- package/ios/ReactNativeManifest.h +4 -0
- package/ios/ReactNativeManifest.mm +45 -0
- package/ios/ReactNativeManifestImpl.swift +20 -0
- package/ios/SecureEnclaveKeyManager.swift +180 -0
- package/package.json +40 -6
- package/react-native.config.cjs +14 -0
- package/dist/InvalidParamError-9IR2C0up.cjs.js.map +0 -1
- package/dist/InvalidParamError-Bq5zAFj4.esm.js.map +0 -1
- package/dist/getNetworkProviderFromNetworkId-C4aba1hS.esm.js.map +0 -1
- package/dist/getNetworkProviderFromNetworkId-COxYamJy.cjs.js.map +0 -1
- package/dist/getVerifiedCredentialForWalletAccount-Df_wN20i.cjs.js.map +0 -1
- package/dist/getVerifiedCredentialForWalletAccount-Y-aJ2rY7.esm.js.map +0 -1
- package/dist/modules/auth/handleSessionExpiration/handleSessionExpiration.d.ts +0 -11
- package/dist/modules/auth/handleSessionExpiration/handleSessionExpiration.d.ts.map +0 -1
- package/dist/modules/auth/handleSessionExpiration/index.d.ts +0 -2
- package/dist/modules/auth/handleSessionExpiration/index.d.ts.map +0 -1
- package/dist/modules/auth/performLogout/index.d.ts +0 -2
- package/dist/modules/auth/performLogout/index.d.ts.map +0 -1
- package/dist/modules/auth/performLogout/performLogout.d.ts +0 -12
- package/dist/modules/auth/performLogout/performLogout.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/KeyNotFoundError.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.d.ts +0 -8
- package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.types.d.ts +0 -6
- package/dist/services/keychain/createIndexedDBKeychainService/createIndexedDBKeychainService.types.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/index.d.ts +0 -2
- package/dist/services/keychain/createIndexedDBKeychainService/index.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/constants.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/deleteIndexedDBItem.d.ts +0 -3
- package/dist/services/keychain/createIndexedDBKeychainService/utils/deleteIndexedDBItem.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/getIndexedDBItem.d.ts +0 -4
- package/dist/services/keychain/createIndexedDBKeychainService/utils/getIndexedDBItem.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/openDatabase.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/setIndexedDBItem.d.ts +0 -4
- package/dist/services/keychain/createIndexedDBKeychainService/utils/setIndexedDBItem.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/withDatabase/index.d.ts.map +0 -1
- package/dist/services/keychain/createIndexedDBKeychainService/utils/withDatabase/withDatabase.d.ts.map +0 -1
- /package/dist/services/keychain/{createIndexedDBKeychainService → createKeychainService}/KeyNotFoundError.d.ts +0 -0
- /package/dist/services/keychain/{createIndexedDBKeychainService → createKeychainService}/utils/constants.d.ts +0 -0
- /package/dist/services/keychain/{createIndexedDBKeychainService → createKeychainService}/utils/openDatabase.d.ts +0 -0
- /package/dist/services/keychain/{createIndexedDBKeychainService → createKeychainService}/utils/withDatabase/index.d.ts +0 -0
- /package/dist/services/keychain/{createIndexedDBKeychainService → createKeychainService}/utils/withDatabase/withDatabase.d.ts +0 -0
|
@@ -0,0 +1,1557 @@
|
|
|
1
|
+
import { F as getDefaultClient, M as CLIENT_SDK_NAME, O as isCookieEnabled, R as BaseError, c as CHAINS_INFO_MAP, k as assertDefined, u as __createApiClient_wrapped, w as instrumentFunction, z as getCore } from "./InvalidParamError-BDHw6nr1.native.esm.js";
|
|
2
|
+
import { A as setCookie, _ as __createRuntimeServiceAccessKey_wrapped, d as checkAndRaiseWalletAccountsChangedEvent, k as emitEvent, m as __getWalletProviderFromWalletAccount_wrapped, p as DYNAMIC_AUTH_COOKIE_NAME, x as normalizeWalletNameWithChain, y as __getWalletAccounts_wrapped } from "./getVerifiedCredentialForWalletAccount-d_bHvLLE.native.esm.js";
|
|
3
|
+
import { AuthModeEnum } from "@dynamic-labs/sdk-api-core";
|
|
4
|
+
import * as z from "zod/mini";
|
|
5
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
6
|
+
import { getGenericPassword, resetGenericPassword, setGenericPassword } from "react-native-keychain";
|
|
7
|
+
import { Buffer as Buffer$1 } from "buffer";
|
|
8
|
+
import EventEmitter, { EventEmitter as EventEmitter$1 } from "eventemitter3";
|
|
9
|
+
import { TurboModuleRegistry } from "react-native";
|
|
10
|
+
|
|
11
|
+
//#region src/utils/isEqualShallow/isEqualShallow.ts
|
|
12
|
+
/**
|
|
13
|
+
* Shallow compare two objects.
|
|
14
|
+
*
|
|
15
|
+
* Source: https://github.com/pmndrs/zustand/blob/main/src/vanilla/shallow.ts
|
|
16
|
+
* @not-instrumented
|
|
17
|
+
*/
|
|
18
|
+
const isEqualShallow = (objA, objB) => {
|
|
19
|
+
if (Object.is(objA, objB)) return true;
|
|
20
|
+
if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) return objA === objB;
|
|
21
|
+
if (objA instanceof Map && objB instanceof Map) {
|
|
22
|
+
if (objA.size !== objB.size) return false;
|
|
23
|
+
for (const [key, value] of objA) if (!Object.is(value, objB.get(key))) return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (objA instanceof Set && objB instanceof Set) {
|
|
27
|
+
if (objA.size !== objB.size) return false;
|
|
28
|
+
for (const value of objA) if (!objB.has(value)) return false;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const keysA = Object.keys(objA);
|
|
32
|
+
if (keysA.length !== Object.keys(objB).length) return false;
|
|
33
|
+
for (const keyA of keysA) if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) return false;
|
|
34
|
+
if (objA.constructor !== objB.constructor) return false;
|
|
35
|
+
return true;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/utils/observable/subscribeWithSelector/subscribeWithSelector.ts
|
|
40
|
+
/**
|
|
41
|
+
* Allows subscribing to a slice of the state.
|
|
42
|
+
* The slice is a computation of the states.
|
|
43
|
+
*
|
|
44
|
+
* The callback will only be called when the slice has changed.
|
|
45
|
+
* Change is determined by shallow comparison.
|
|
46
|
+
*
|
|
47
|
+
* Returns a function to unsubscribe the callback.
|
|
48
|
+
* @instrumented
|
|
49
|
+
*/
|
|
50
|
+
const subscribeWithSelector = (observable, selector) => (callback) => {
|
|
51
|
+
let lastSlice = selector(observable.get());
|
|
52
|
+
return observable.subscribe((value) => {
|
|
53
|
+
const nextSlice = selector(value);
|
|
54
|
+
if (isEqualShallow(nextSlice, lastSlice)) return;
|
|
55
|
+
lastSlice = nextSlice;
|
|
56
|
+
callback(nextSlice);
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
const __subscribeWithSelector_impl = subscribeWithSelector;
|
|
60
|
+
const __subscribeWithSelector_wrapped = instrumentFunction({
|
|
61
|
+
fn: __subscribeWithSelector_impl,
|
|
62
|
+
functionName: "subscribeWithSelector",
|
|
63
|
+
getCore: () => {
|
|
64
|
+
try {
|
|
65
|
+
return getCore(getDefaultClient());
|
|
66
|
+
} catch {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/utils/retryOnFail/InvalidRetryOnFailCallError.ts
|
|
74
|
+
/**
|
|
75
|
+
* This error is thrown when the `retryOnFail` function is called with an invalid
|
|
76
|
+
* number of retries (i.e. less than 0).
|
|
77
|
+
*/
|
|
78
|
+
var InvalidRetryOnFailCallError = class extends BaseError {
|
|
79
|
+
constructor(maxRetries) {
|
|
80
|
+
super({
|
|
81
|
+
cause: null,
|
|
82
|
+
code: "invalid_retry_on_fail_call_error",
|
|
83
|
+
docsUrl: null,
|
|
84
|
+
name: "InvalidRetryOnFailCallError",
|
|
85
|
+
shortMessage: `Invalid retries parameter for retryOnFail call: ${maxRetries}`
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/utils/retryOnFail/retryOnFail.ts
|
|
92
|
+
/** @not-instrumented */
|
|
93
|
+
const retryOnFail = async ({ delay = 0, fn, maxRetries }) => {
|
|
94
|
+
for (let retry = 0; retry <= maxRetries; retry++) try {
|
|
95
|
+
return await fn();
|
|
96
|
+
} catch (error) {
|
|
97
|
+
if (retry >= maxRetries) throw error;
|
|
98
|
+
if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Reaching this point should never happen and this
|
|
102
|
+
* error is thrown to help us debug the issue.
|
|
103
|
+
*/
|
|
104
|
+
throw new InvalidRetryOnFailCallError(maxRetries);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/modules/auth/isSignedIn/isSignedIn.ts
|
|
109
|
+
/**
|
|
110
|
+
* Checks if the user is currently signed in to the Dynamic client.
|
|
111
|
+
*
|
|
112
|
+
* The client is considered to be in a signed in state if a user has
|
|
113
|
+
* authenticated or if the client has at least one wallet connected.
|
|
114
|
+
*
|
|
115
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
116
|
+
* @returns True if the user is signed in, false otherwise.
|
|
117
|
+
* @not-instrumented
|
|
118
|
+
*/
|
|
119
|
+
const isSignedIn = (client = getDefaultClient()) => Boolean(client.user || __getWalletAccounts_wrapped(client).length > 0);
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/services/storage/createLocalStorageAdapter/createLocalStorageAdapter.native.ts
|
|
123
|
+
const NAMESPACE = "dynamic";
|
|
124
|
+
const namespaceKey = (key) => `${NAMESPACE}:${key}`;
|
|
125
|
+
/**
|
|
126
|
+
* Creates a localStorage adapter for React Native.
|
|
127
|
+
* Routes operations based on the `storageTier` option:
|
|
128
|
+
* - `'default'`: uses AsyncStorage
|
|
129
|
+
* - `'secure'`: uses react-native-keychain
|
|
130
|
+
* @instrumented
|
|
131
|
+
*/
|
|
132
|
+
const createLocalStorageAdapter = () => {
|
|
133
|
+
return {
|
|
134
|
+
getItem: async (key, options) => {
|
|
135
|
+
if (options.storageTier === "secure") {
|
|
136
|
+
const result = await getGenericPassword({ service: key });
|
|
137
|
+
if (!result) return null;
|
|
138
|
+
return result.password;
|
|
139
|
+
} else return AsyncStorage.getItem(namespaceKey(key));
|
|
140
|
+
},
|
|
141
|
+
removeItem: async (key, options) => {
|
|
142
|
+
if (options.storageTier === "secure") await resetGenericPassword({ service: key });
|
|
143
|
+
else await AsyncStorage.removeItem(namespaceKey(key));
|
|
144
|
+
},
|
|
145
|
+
setItem: async (key, value, options) => {
|
|
146
|
+
if (options.storageTier === "secure") await setGenericPassword(key, value, { service: key });
|
|
147
|
+
else await AsyncStorage.setItem(namespaceKey(key), value);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const __createLocalStorageAdapter_impl = createLocalStorageAdapter;
|
|
152
|
+
const __createLocalStorageAdapter_wrapped = instrumentFunction({
|
|
153
|
+
fn: __createLocalStorageAdapter_impl,
|
|
154
|
+
functionName: "createLocalStorageAdapter",
|
|
155
|
+
getCore: () => {
|
|
156
|
+
try {
|
|
157
|
+
return getCore(getDefaultClient());
|
|
158
|
+
} catch {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/errors/InvalidStorageSet.ts
|
|
166
|
+
var InvalidStorageSet = class extends BaseError {
|
|
167
|
+
constructor({ key, value }) {
|
|
168
|
+
super({
|
|
169
|
+
cause: null,
|
|
170
|
+
code: "invalid_storage_set",
|
|
171
|
+
docsUrl: null,
|
|
172
|
+
metaMessages: [`key: ${key}`, value],
|
|
173
|
+
name: "InvalidStorageSet",
|
|
174
|
+
shortMessage: "Tried to store a value that does not match the schema"
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/services/storage/createStorage/formatForStorage/isValidDateISOString/isValidDateISOString.ts
|
|
181
|
+
/**
|
|
182
|
+
* Returns whether the given string is a valid ISO date string.
|
|
183
|
+
*
|
|
184
|
+
* Does not support timezone offsets.
|
|
185
|
+
* @not-instrumented
|
|
186
|
+
*/
|
|
187
|
+
const isValidDateISOString = (value) => {
|
|
188
|
+
const date = new Date(value);
|
|
189
|
+
return !isNaN(date.getTime()) && date.toISOString() === value;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/services/storage/createStorage/formatForStorage/storageFormat.ts
|
|
194
|
+
const DATE_PREFIX = "__DATE__";
|
|
195
|
+
/** @not-instrumented */
|
|
196
|
+
const formatForStorage = (value) => {
|
|
197
|
+
const item = { value };
|
|
198
|
+
return JSON.stringify(item, (_, entry) => {
|
|
199
|
+
if (isValidDateISOString(entry)) return `${DATE_PREFIX}${entry}`;
|
|
200
|
+
return entry;
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
/** @not-instrumented */
|
|
204
|
+
const parseFromStorage = (value) => {
|
|
205
|
+
try {
|
|
206
|
+
return JSON.parse(value, (_, entry) => {
|
|
207
|
+
if (typeof entry === "string" && entry.startsWith(DATE_PREFIX)) return new Date(entry.slice(8));
|
|
208
|
+
return entry;
|
|
209
|
+
});
|
|
210
|
+
} catch (error) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
//#endregion
|
|
216
|
+
//#region src/services/storage/createStorage/createStorage.ts
|
|
217
|
+
/**
|
|
218
|
+
* Creates a Storage service to interact with storage adapter.
|
|
219
|
+
* Reads the `storageTier` from each key's config and passes it
|
|
220
|
+
* to the adapter on every operation, defaulting to `'default'`.
|
|
221
|
+
* @instrumented
|
|
222
|
+
*/
|
|
223
|
+
const createStorage = ({ prefix = "", storageAdapter }) => {
|
|
224
|
+
const getPrefixedKey = (key) => prefix ? `${prefix}_${key}` : key;
|
|
225
|
+
const getAdapterOptions = (storageTier) => ({ storageTier: storageTier ?? "default" });
|
|
226
|
+
return {
|
|
227
|
+
getItem: async (storageKeySchema) => {
|
|
228
|
+
const prefixedKey = getPrefixedKey(storageKeySchema.key);
|
|
229
|
+
const options = getAdapterOptions(storageKeySchema.config?.storageTier);
|
|
230
|
+
const rawItem = await storageAdapter.getItem(prefixedKey, options);
|
|
231
|
+
const parsedItem = rawItem ? parseFromStorage(rawItem) : null;
|
|
232
|
+
/**
|
|
233
|
+
* The item saved to localStorage may be malformed.
|
|
234
|
+
* In this case, we remove it and return null.
|
|
235
|
+
*/
|
|
236
|
+
if (parsedItem !== null) {
|
|
237
|
+
const parsed = storageKeySchema.schema.safeParse(parsedItem.value);
|
|
238
|
+
if (parsed.success) return parsed.data;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* The item saved to localStorage may be malformed.
|
|
242
|
+
* In this case, we remove it and return null.
|
|
243
|
+
*/
|
|
244
|
+
await storageAdapter.removeItem(prefixedKey, options);
|
|
245
|
+
return null;
|
|
246
|
+
},
|
|
247
|
+
removeItem: async (storageKeySchema) => {
|
|
248
|
+
await storageAdapter.removeItem(getPrefixedKey(storageKeySchema.key), getAdapterOptions(storageKeySchema.config?.storageTier));
|
|
249
|
+
},
|
|
250
|
+
setItem: async (storageKeySchema, value) => {
|
|
251
|
+
const parsed = storageKeySchema.schema.safeParse(value);
|
|
252
|
+
if (!parsed.success) throw new InvalidStorageSet({
|
|
253
|
+
key: storageKeySchema.key,
|
|
254
|
+
value: JSON.stringify(value)
|
|
255
|
+
});
|
|
256
|
+
const item = formatForStorage(parsed.data);
|
|
257
|
+
await storageAdapter.setItem(getPrefixedKey(storageKeySchema.key), item, getAdapterOptions(storageKeySchema.config?.storageTier));
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
const __createStorage_impl = createStorage;
|
|
262
|
+
const __createStorage_wrapped = instrumentFunction({
|
|
263
|
+
fn: __createStorage_impl,
|
|
264
|
+
functionName: "createStorage",
|
|
265
|
+
getCore: () => {
|
|
266
|
+
try {
|
|
267
|
+
return getCore(getDefaultClient());
|
|
268
|
+
} catch {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
//#endregion
|
|
275
|
+
//#region src/services/storage/createStorageKeySchema/createStorageKeySchema.ts
|
|
276
|
+
/** @instrumented */
|
|
277
|
+
const createStorageKeySchema = (params) => {
|
|
278
|
+
return params;
|
|
279
|
+
};
|
|
280
|
+
const __createStorageKeySchema_impl = createStorageKeySchema;
|
|
281
|
+
const __createStorageKeySchema_wrapped = instrumentFunction({
|
|
282
|
+
fn: __createStorageKeySchema_impl,
|
|
283
|
+
functionName: "createStorageKeySchema",
|
|
284
|
+
getCore: () => {
|
|
285
|
+
try {
|
|
286
|
+
return getCore(getDefaultClient());
|
|
287
|
+
} catch {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
//#endregion
|
|
294
|
+
//#region src/modules/projectSettings/fetchProjectSettings/projectSettingsExpirationScheme.ts
|
|
295
|
+
/**
|
|
296
|
+
* The schema to track the expiration time of the project settings.
|
|
297
|
+
*/
|
|
298
|
+
const projectSettingsExpirationStorageKeySchema = __createStorageKeySchema_wrapped({
|
|
299
|
+
key: "projectSettingsExpiration",
|
|
300
|
+
schema: z.number()
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
//#endregion
|
|
304
|
+
//#region src/modules/projectSettings/fetchProjectSettings/fetchProjectSettings.ts
|
|
305
|
+
/**
|
|
306
|
+
* Expiration time of the project settings in milliseconds.
|
|
307
|
+
*/
|
|
308
|
+
const PROJECT_SETTINGS_EXPIRATION_TIME = 1e3 * 60 * 5;
|
|
309
|
+
/**
|
|
310
|
+
* Fetches and updates the project settings from the API.
|
|
311
|
+
*
|
|
312
|
+
* This function retrieves the latest project configuration settings
|
|
313
|
+
* from Dynamic's servers, including authentication options, enabled chains,
|
|
314
|
+
* and security configurations. The settings are cached for performance.
|
|
315
|
+
*
|
|
316
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
317
|
+
* @returns A promise that resolves to the updated project settings.
|
|
318
|
+
* @instrumented
|
|
319
|
+
*/
|
|
320
|
+
const fetchProjectSettings = async (client = getDefaultClient()) => {
|
|
321
|
+
const core = getCore(client);
|
|
322
|
+
const currentExpiration = await core.storage.getItem(projectSettingsExpirationStorageKeySchema);
|
|
323
|
+
if (Boolean(client.projectSettings) && !(currentExpiration && currentExpiration < Date.now()) && isSignedIn(client)) return client.projectSettings;
|
|
324
|
+
const apiClient = __createApiClient_wrapped({}, client);
|
|
325
|
+
core.logger.debug("[fetchProjectSettings] Fetching project settings...");
|
|
326
|
+
const doFetch = async () => apiClient.getEnvironmentSettings({
|
|
327
|
+
environmentId: core.environmentId,
|
|
328
|
+
sdkVersion: `${CLIENT_SDK_NAME}/${core.version}`
|
|
329
|
+
}, { credentials: "omit" });
|
|
330
|
+
const projectSettings = await retryOnFail({
|
|
331
|
+
fn: doFetch,
|
|
332
|
+
maxRetries: 2
|
|
333
|
+
});
|
|
334
|
+
core.state.set({ projectSettings: projectSettings ?? null });
|
|
335
|
+
await core.storage.setItem(projectSettingsExpirationStorageKeySchema, Date.now() + PROJECT_SETTINGS_EXPIRATION_TIME);
|
|
336
|
+
return projectSettings;
|
|
337
|
+
};
|
|
338
|
+
const __fetchProjectSettings_impl = fetchProjectSettings;
|
|
339
|
+
const __fetchProjectSettings_wrapped = instrumentFunction({
|
|
340
|
+
fn: __fetchProjectSettings_impl,
|
|
341
|
+
functionName: "fetchProjectSettings",
|
|
342
|
+
getCore: () => {
|
|
343
|
+
try {
|
|
344
|
+
return getCore(getDefaultClient());
|
|
345
|
+
} catch {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
//#endregion
|
|
352
|
+
//#region src/modules/sessionKeys/generateSessionKeys/generateSessionKeys.ts
|
|
353
|
+
/** @instrumented */
|
|
354
|
+
const generateSessionKeys = async (client) => {
|
|
355
|
+
const core = getCore(client);
|
|
356
|
+
const publicKey = await core.keychain.generateKey("session");
|
|
357
|
+
core.state.set({ sessionKeys: publicKey });
|
|
358
|
+
return { publicKey };
|
|
359
|
+
};
|
|
360
|
+
const __generateSessionKeys_impl = generateSessionKeys;
|
|
361
|
+
const __generateSessionKeys_wrapped = instrumentFunction({
|
|
362
|
+
fn: __generateSessionKeys_impl,
|
|
363
|
+
functionName: "generateSessionKeys",
|
|
364
|
+
getCore: () => {
|
|
365
|
+
try {
|
|
366
|
+
return getCore(getDefaultClient());
|
|
367
|
+
} catch {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
//#endregion
|
|
374
|
+
//#region src/modules/wallets/utils/getAvailableWalletProvidersFromWalletAccounts/getAvailableWalletProvidersFromWalletAccounts.ts
|
|
375
|
+
/** @not-instrumented */
|
|
376
|
+
const getAvailableWalletProvidersFromWalletAccounts = (client) => {
|
|
377
|
+
const core = getCore(client);
|
|
378
|
+
const walletProvidersMap = /* @__PURE__ */ new Map();
|
|
379
|
+
__getWalletAccounts_wrapped(client).forEach((walletAccount) => {
|
|
380
|
+
if (walletProvidersMap.has(walletAccount.walletProviderKey)) return;
|
|
381
|
+
try {
|
|
382
|
+
const walletProvider = __getWalletProviderFromWalletAccount_wrapped({ walletAccount }, client);
|
|
383
|
+
walletProvidersMap.set(walletAccount.walletProviderKey, walletProvider);
|
|
384
|
+
} catch (error) {
|
|
385
|
+
core.logger.debug("Wallet provider not found for wallet account", {
|
|
386
|
+
error,
|
|
387
|
+
walletAccount: walletAccount.address
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
return Array.from(walletProvidersMap.values());
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
//#endregion
|
|
395
|
+
//#region src/modules/wallets/disconnectAndTerminateWalletProviders/disconnectAndTerminateWalletProviders.ts
|
|
396
|
+
/**
|
|
397
|
+
* Disconnect and terminate each wallet provider, if available.
|
|
398
|
+
* @not-instrumented
|
|
399
|
+
*/
|
|
400
|
+
const disconnectAndTerminateWalletProviders = async ({ reason }, client) => {
|
|
401
|
+
const core = getCore(client);
|
|
402
|
+
const walletProviders = getAvailableWalletProvidersFromWalletAccounts(client);
|
|
403
|
+
await Promise.all(walletProviders.map(async (walletProvider) => {
|
|
404
|
+
if (walletProvider.terminate) await walletProvider.terminate({ reason });
|
|
405
|
+
if (walletProvider.disconnect) try {
|
|
406
|
+
await walletProvider.disconnect();
|
|
407
|
+
} catch (err) {
|
|
408
|
+
core.logger.error(`Error disconnecting from wallet ${walletProvider.key}`, err);
|
|
409
|
+
}
|
|
410
|
+
}));
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
//#endregion
|
|
414
|
+
//#region src/modules/auth/logoutWithReason/logoutWithReason.ts
|
|
415
|
+
/**
|
|
416
|
+
* Logs the user out with an explicit reason.
|
|
417
|
+
*
|
|
418
|
+
* Revokes the session, clears auth state, terminates wallet providers, and
|
|
419
|
+
* emits the `logout` client event with the given reason. The reason is also
|
|
420
|
+
* captured as an argument on the function-instrumentation event, which is
|
|
421
|
+
* how Datadog distinguishes between different logout causes.
|
|
422
|
+
*
|
|
423
|
+
* Use this instead of the public `logout` when triggering a logout from
|
|
424
|
+
* internal or extension code — the caller owns the reason string, so the
|
|
425
|
+
* telemetry correctly attributes *why* the logout happened.
|
|
426
|
+
*
|
|
427
|
+
* @param params - The logout params.
|
|
428
|
+
* @param params.reason - Why the logout is being triggered. Extension authors
|
|
429
|
+
* needing a reason outside the SDK catalog can cast with `as LogoutReason`.
|
|
430
|
+
* @param client - The Dynamic client instance.
|
|
431
|
+
* @instrumented
|
|
432
|
+
*/
|
|
433
|
+
const logoutWithReason = async ({ reason }, client) => {
|
|
434
|
+
const core = getCore(client);
|
|
435
|
+
core.logger.debug("[logoutWithReason] Logging out...", { reason });
|
|
436
|
+
await disconnectAndTerminateWalletProviders({ reason }, client);
|
|
437
|
+
if (client.user !== null) {
|
|
438
|
+
const apiClient = __createApiClient_wrapped({}, client);
|
|
439
|
+
try {
|
|
440
|
+
await apiClient.revokeSession({ environmentId: core.environmentId });
|
|
441
|
+
} catch (error) {
|
|
442
|
+
core.logger.error("Failed to revoke session", error);
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* This deletes the auth cookie if it exists.
|
|
446
|
+
* If the cookie doesn't exist, this sets a new cookie that expires immediately.
|
|
447
|
+
*/
|
|
448
|
+
if (isCookieEnabled(client)) setCookie(`${DYNAMIC_AUTH_COOKIE_NAME}=; Max-Age=-99999999; path=/; SameSite=Lax`);
|
|
449
|
+
}
|
|
450
|
+
await core.keychain.removeKey("session");
|
|
451
|
+
core.state.set({
|
|
452
|
+
captchaToken: null,
|
|
453
|
+
elevatedAccessTokens: [],
|
|
454
|
+
legacyToken: null,
|
|
455
|
+
mfaToken: null,
|
|
456
|
+
sessionExpiresAt: null,
|
|
457
|
+
sessionKeys: null,
|
|
458
|
+
token: null,
|
|
459
|
+
unverifiedWalletAccounts: [],
|
|
460
|
+
user: null
|
|
461
|
+
});
|
|
462
|
+
emitEvent({
|
|
463
|
+
args: { reason },
|
|
464
|
+
event: "logout"
|
|
465
|
+
}, client);
|
|
466
|
+
__fetchProjectSettings_wrapped(client);
|
|
467
|
+
__generateSessionKeys_wrapped(client);
|
|
468
|
+
};
|
|
469
|
+
const __logoutWithReason_impl = logoutWithReason;
|
|
470
|
+
const __logoutWithReason_wrapped = instrumentFunction({
|
|
471
|
+
fn: __logoutWithReason_impl,
|
|
472
|
+
functionName: "logoutWithReason",
|
|
473
|
+
getCore: () => {
|
|
474
|
+
try {
|
|
475
|
+
return getCore(getDefaultClient());
|
|
476
|
+
} catch {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
//#endregion
|
|
483
|
+
//#region src/utils/getBuffer/getBuffer.ts
|
|
484
|
+
/** @not-instrumented */
|
|
485
|
+
const getBuffer = () => typeof Buffer !== "undefined" ? Buffer : Buffer$1;
|
|
486
|
+
|
|
487
|
+
//#endregion
|
|
488
|
+
//#region src/utils/isServerSideRendering/isServerSideRendering.ts
|
|
489
|
+
/**
|
|
490
|
+
* Indicates if the code is running in a server-side environment.
|
|
491
|
+
* @not-instrumented
|
|
492
|
+
*/
|
|
493
|
+
const isServerSideRendering = () => typeof window === "undefined";
|
|
494
|
+
|
|
495
|
+
//#endregion
|
|
496
|
+
//#region src/modules/initializeClient/consts.ts
|
|
497
|
+
const REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY = "refresh-user-state-from-cookie";
|
|
498
|
+
const INITIALIZE_STORAGE_SYNC_TRACKER_KEY = "initialize-storage-sync";
|
|
499
|
+
const FETCH_PROJECT_SETTINGS_TRACKER_KEY = "fetch-project-settings";
|
|
500
|
+
const GENERATE_SESSION_KEYS_TRACKER_KEY = "generate-session-keys";
|
|
501
|
+
const REFRESH_USER_STATE_FROM_VALID_TOKEN_TRACKER_KEY = "refresh-user-state-from-valid-token";
|
|
502
|
+
|
|
503
|
+
//#endregion
|
|
504
|
+
//#region src/utils/deferredPromise/createDeferredPromise.ts
|
|
505
|
+
/** @instrumented */
|
|
506
|
+
const createDeferredPromise = () => {
|
|
507
|
+
let resolve;
|
|
508
|
+
let reject;
|
|
509
|
+
return {
|
|
510
|
+
promise: new Promise((_resolve, _reject) => {
|
|
511
|
+
resolve = _resolve;
|
|
512
|
+
reject = _reject;
|
|
513
|
+
}),
|
|
514
|
+
reject: (reason) => reject?.(reason),
|
|
515
|
+
resolve: (value) => resolve?.(value)
|
|
516
|
+
};
|
|
517
|
+
};
|
|
518
|
+
const __createDeferredPromise_impl = createDeferredPromise;
|
|
519
|
+
const __createDeferredPromise_wrapped = instrumentFunction({
|
|
520
|
+
fn: __createDeferredPromise_impl,
|
|
521
|
+
functionName: "createDeferredPromise",
|
|
522
|
+
getCore: () => {
|
|
523
|
+
try {
|
|
524
|
+
return getCore(getDefaultClient());
|
|
525
|
+
} catch {
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
//#endregion
|
|
532
|
+
//#region src/errors/CannotTrackError.ts
|
|
533
|
+
var CannotTrackError = class extends BaseError {
|
|
534
|
+
constructor() {
|
|
535
|
+
super({
|
|
536
|
+
cause: null,
|
|
537
|
+
code: "cannot_track_error",
|
|
538
|
+
docsUrl: null,
|
|
539
|
+
name: "CannotTrackError",
|
|
540
|
+
shortMessage: "All track calls must be performed in the same node tick"
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
//#endregion
|
|
546
|
+
//#region src/services/crossTabBroadcast/crossTabBroadcast.schema.ts
|
|
547
|
+
/**
|
|
548
|
+
* Schema for validating cross-tab broadcast messages.
|
|
549
|
+
*/
|
|
550
|
+
const CrossTabBroadcastMessageSchema = z.object({
|
|
551
|
+
args: z.optional(z.unknown()),
|
|
552
|
+
event: z.string()
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
//#endregion
|
|
556
|
+
//#region src/services/crossTabBroadcast/createCrossTabBroadcast/createCrossTabBroadcast.ts
|
|
557
|
+
/**
|
|
558
|
+
* Creates a cross-tab broadcast service instance using the BroadcastChannel API.
|
|
559
|
+
*
|
|
560
|
+
* Enables communication between multiple tabs/windows of the same application.
|
|
561
|
+
* Messages are validated against the schema and invalid messages are silently ignored.
|
|
562
|
+
*
|
|
563
|
+
* In SSR or when BroadcastChannel is unavailable, returns a no-op implementation.
|
|
564
|
+
*
|
|
565
|
+
* @param params - Configuration parameters
|
|
566
|
+
* @param params.channelName - The name of the broadcast channel to use
|
|
567
|
+
* @returns A cross-tab broadcast service instance
|
|
568
|
+
* @instrumented
|
|
569
|
+
*/
|
|
570
|
+
const createCrossTabBroadcast = ({ channelName }) => {
|
|
571
|
+
if (isServerSideRendering() || typeof BroadcastChannel === "undefined") return {
|
|
572
|
+
off: () => {},
|
|
573
|
+
on: () => {},
|
|
574
|
+
send: () => {}
|
|
575
|
+
};
|
|
576
|
+
const channel = new BroadcastChannel(channelName);
|
|
577
|
+
const eventEmitter = new EventEmitter();
|
|
578
|
+
const handleMessage = (messageEvent) => {
|
|
579
|
+
const parsed = CrossTabBroadcastMessageSchema.safeParse(messageEvent.data);
|
|
580
|
+
if (!parsed.success) return;
|
|
581
|
+
const { args, event } = parsed.data;
|
|
582
|
+
eventEmitter.emit(event, args);
|
|
583
|
+
};
|
|
584
|
+
channel.addEventListener("message", handleMessage);
|
|
585
|
+
return {
|
|
586
|
+
off: (event, callback) => {
|
|
587
|
+
eventEmitter.off(event, callback);
|
|
588
|
+
},
|
|
589
|
+
on: (event, callback) => {
|
|
590
|
+
eventEmitter.on(event, callback);
|
|
591
|
+
},
|
|
592
|
+
send: ({ args, event }) => {
|
|
593
|
+
channel.postMessage({
|
|
594
|
+
args,
|
|
595
|
+
event
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
};
|
|
600
|
+
const __createCrossTabBroadcast_impl = createCrossTabBroadcast;
|
|
601
|
+
const __createCrossTabBroadcast_wrapped = instrumentFunction({
|
|
602
|
+
fn: __createCrossTabBroadcast_impl,
|
|
603
|
+
functionName: "createCrossTabBroadcast",
|
|
604
|
+
getCore: () => {
|
|
605
|
+
try {
|
|
606
|
+
return getCore(getDefaultClient());
|
|
607
|
+
} catch {
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
|
|
613
|
+
//#endregion
|
|
614
|
+
//#region src/services/logger/createLogger/createLogger.ts
|
|
615
|
+
/**
|
|
616
|
+
* Log levels and their corresponding numeric values
|
|
617
|
+
*/
|
|
618
|
+
const LOG_LEVELS = {
|
|
619
|
+
debug: 0,
|
|
620
|
+
error: 3,
|
|
621
|
+
info: 1,
|
|
622
|
+
warn: 2
|
|
623
|
+
};
|
|
624
|
+
const defaultConsole = console;
|
|
625
|
+
/**
|
|
626
|
+
* Creates a logger instance with configurable log level and event emission capabilities.
|
|
627
|
+
* @returns A logger instance with debug, info, warn, and error methods
|
|
628
|
+
* @not-instrumented
|
|
629
|
+
*/
|
|
630
|
+
const createLogger = (options = {}) => {
|
|
631
|
+
const eventEmitter = new EventEmitter$1();
|
|
632
|
+
const minLevel = options.level ?? "warn";
|
|
633
|
+
const shouldLog = (level) => {
|
|
634
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[minLevel];
|
|
635
|
+
};
|
|
636
|
+
const formatMessage = (level, message) => {
|
|
637
|
+
return `[${(/* @__PURE__ */ new Date()).toISOString()}] ${level.toUpperCase()}: ${message}`;
|
|
638
|
+
};
|
|
639
|
+
const log = (level, consoleMethod, message, ...args) => {
|
|
640
|
+
eventEmitter.emit("log", level, message, ...args);
|
|
641
|
+
if (!shouldLog(level)) return;
|
|
642
|
+
consoleMethod(formatMessage(level, message), ...args);
|
|
643
|
+
};
|
|
644
|
+
return {
|
|
645
|
+
debug: (message, ...args) => log("debug", defaultConsole.debug, message, ...args),
|
|
646
|
+
error: (message, ...args) => log("error", defaultConsole.error, message, ...args),
|
|
647
|
+
info: (message, ...args) => log("info", defaultConsole.info, message, ...args),
|
|
648
|
+
off: eventEmitter.off.bind(eventEmitter),
|
|
649
|
+
on: eventEmitter.on.bind(eventEmitter),
|
|
650
|
+
warn: (message, ...args) => log("warn", defaultConsole.warn, message, ...args)
|
|
651
|
+
};
|
|
652
|
+
};
|
|
653
|
+
const __createLogger_impl = createLogger;
|
|
654
|
+
const __createLogger_wrapped = instrumentFunction({
|
|
655
|
+
fn: __createLogger_impl,
|
|
656
|
+
functionName: "createLogger",
|
|
657
|
+
getCore: () => {
|
|
658
|
+
try {
|
|
659
|
+
return getCore(getDefaultClient());
|
|
660
|
+
} catch {
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
//#endregion
|
|
667
|
+
//#region src/errors/NativeModuleNotLinkedError.ts
|
|
668
|
+
var NativeModuleNotLinkedError = class extends BaseError {
|
|
669
|
+
constructor({ moduleName }) {
|
|
670
|
+
super({
|
|
671
|
+
cause: null,
|
|
672
|
+
code: "native_module_not_linked_error",
|
|
673
|
+
details: [
|
|
674
|
+
`The "${moduleName}" TurboModule is not registered with React Native.`,
|
|
675
|
+
"This usually means the native module was not autolinked into the host app,",
|
|
676
|
+
"or the app binary was not rebuilt after installing the SDK.",
|
|
677
|
+
"",
|
|
678
|
+
"To resolve:",
|
|
679
|
+
" 1. Ensure \"@dynamic-labs-sdk/client\" is a direct dependency of the app",
|
|
680
|
+
" and reinstall (e.g. `pnpm install`).",
|
|
681
|
+
" 2. Rebuild the native app:",
|
|
682
|
+
" iOS: `cd ios && pod install && cd .. && npx react-native run-ios`",
|
|
683
|
+
" Android: `npx react-native run-android`",
|
|
684
|
+
" Expo: `npx expo prebuild --clean` then run the app.",
|
|
685
|
+
" 3. Confirm autolinking sees the package:",
|
|
686
|
+
" `npx expo-modules-autolinking react-native-config --json`"
|
|
687
|
+
].join("\n"),
|
|
688
|
+
docsUrl: null,
|
|
689
|
+
name: "NativeModuleNotLinkedError",
|
|
690
|
+
shortMessage: `Native TurboModule "${moduleName}" is not linked.`
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
//#endregion
|
|
696
|
+
//#region src/turboModules/NativeKeychain.ts
|
|
697
|
+
var NativeKeychain_default = TurboModuleRegistry.getEnforcing("Keychain");
|
|
698
|
+
|
|
699
|
+
//#endregion
|
|
700
|
+
//#region src/utils/base64urlFromBytes/base64urlFromBytes.ts
|
|
701
|
+
/**
|
|
702
|
+
* Encodes a Uint8Array to a base64url string (RFC 4648 S5, no padding).
|
|
703
|
+
* Used to encode binary data before sending to native modules over the bridge.
|
|
704
|
+
*
|
|
705
|
+
* @not-instrumented
|
|
706
|
+
*/
|
|
707
|
+
const base64urlFromBytes = (bytes) => btoa(String.fromCodePoint(...bytes)).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
|
708
|
+
|
|
709
|
+
//#endregion
|
|
710
|
+
//#region src/utils/bufferToHex/bufferToHex.ts
|
|
711
|
+
/**
|
|
712
|
+
* Converts an ArrayBuffer or Uint8Array to a hex-encoded string
|
|
713
|
+
* @not-instrumented
|
|
714
|
+
*/
|
|
715
|
+
const bufferToHex = (buffer) => [...buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
716
|
+
|
|
717
|
+
//#endregion
|
|
718
|
+
//#region src/utils/bytesFromBase64url/bytesFromBase64url.ts
|
|
719
|
+
/**
|
|
720
|
+
* Decodes a base64url-encoded string (RFC 4648 S5, no padding) to a Uint8Array.
|
|
721
|
+
* Used to decode binary data received from native modules over the bridge.
|
|
722
|
+
*
|
|
723
|
+
* @not-instrumented
|
|
724
|
+
*/
|
|
725
|
+
const bytesFromBase64url = (s) => {
|
|
726
|
+
const base64 = s.replaceAll("-", "+").replaceAll("_", "/");
|
|
727
|
+
return Uint8Array.from(atob(base64), (c) => c.codePointAt(0) ?? 0);
|
|
728
|
+
};
|
|
729
|
+
|
|
730
|
+
//#endregion
|
|
731
|
+
//#region src/utils/compressRawPublicKey/compressRawPublicKey.ts
|
|
732
|
+
/**
|
|
733
|
+
* Accepts a public key array buffer, and returns a buffer with the compressed version of the public key
|
|
734
|
+
* @not-instrumented
|
|
735
|
+
*/
|
|
736
|
+
const compressRawPublicKey = (rawPublicKey) => {
|
|
737
|
+
const rawPublicKeyBytes = new Uint8Array(rawPublicKey);
|
|
738
|
+
const len = rawPublicKeyBytes.byteLength;
|
|
739
|
+
const compressedBytes = rawPublicKeyBytes.slice(0, 1 + len >>> 1);
|
|
740
|
+
compressedBytes[0] = 2 | rawPublicKeyBytes[len - 1] & 1;
|
|
741
|
+
return compressedBytes.buffer;
|
|
742
|
+
};
|
|
743
|
+
|
|
744
|
+
//#endregion
|
|
745
|
+
//#region src/utils/derToP1363/InvalidDERSignatureError.ts
|
|
746
|
+
var InvalidDERSignatureError = class extends BaseError {
|
|
747
|
+
constructor(message) {
|
|
748
|
+
super({
|
|
749
|
+
cause: null,
|
|
750
|
+
code: "invalid_der_signature_error",
|
|
751
|
+
docsUrl: null,
|
|
752
|
+
name: "InvalidDERSignatureError",
|
|
753
|
+
shortMessage: message
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
|
|
758
|
+
//#endregion
|
|
759
|
+
//#region src/utils/derToP1363/derToP1363.ts
|
|
760
|
+
/**
|
|
761
|
+
* Converts a DER/X9.62 encoded ECDSA signature to IEEE P1363 format (r || s).
|
|
762
|
+
* Native secure enclaves produce DER-encoded signatures; the server expects P1363.
|
|
763
|
+
*
|
|
764
|
+
* @not-instrumented
|
|
765
|
+
*/
|
|
766
|
+
const derToP1363 = (der) => {
|
|
767
|
+
if (der.length < 8 || der[0] !== 48) throw new InvalidDERSignatureError("Invalid DER signature format");
|
|
768
|
+
let offset = 2;
|
|
769
|
+
if (offset >= der.length || der[offset] !== 2) throw new InvalidDERSignatureError("Invalid DER signature: missing r INTEGER tag");
|
|
770
|
+
offset += 1;
|
|
771
|
+
if (offset >= der.length) throw new InvalidDERSignatureError("Invalid DER signature: missing r length");
|
|
772
|
+
const rLen = der[offset];
|
|
773
|
+
offset += 1;
|
|
774
|
+
if (offset + rLen > der.length) throw new InvalidDERSignatureError("Invalid DER signature: r bytes out of bounds");
|
|
775
|
+
let rBytes = der.slice(offset, offset + rLen);
|
|
776
|
+
offset += rLen;
|
|
777
|
+
if (offset >= der.length || der[offset] !== 2) throw new InvalidDERSignatureError("Invalid DER signature: missing s INTEGER tag");
|
|
778
|
+
offset += 1;
|
|
779
|
+
if (offset >= der.length) throw new InvalidDERSignatureError("Invalid DER signature: missing s length");
|
|
780
|
+
const sLen = der[offset];
|
|
781
|
+
offset += 1;
|
|
782
|
+
if (offset + sLen > der.length) throw new InvalidDERSignatureError("Invalid DER signature: s bytes out of bounds");
|
|
783
|
+
let sBytes = der.slice(offset, offset + sLen);
|
|
784
|
+
if (rBytes.length === 33 && rBytes[0] === 0) rBytes = rBytes.slice(1);
|
|
785
|
+
if (sBytes.length === 33 && sBytes[0] === 0) sBytes = sBytes.slice(1);
|
|
786
|
+
const result = new Uint8Array(64);
|
|
787
|
+
result.set(rBytes, 32 - rBytes.length);
|
|
788
|
+
result.set(sBytes, 64 - sBytes.length);
|
|
789
|
+
return result;
|
|
790
|
+
};
|
|
791
|
+
|
|
792
|
+
//#endregion
|
|
793
|
+
//#region src/services/keychain/createKeychainService/ImportKeyNotSupportedError.ts
|
|
794
|
+
var ImportKeyNotSupportedError = class extends BaseError {
|
|
795
|
+
constructor() {
|
|
796
|
+
super({
|
|
797
|
+
cause: null,
|
|
798
|
+
code: "import_key_not_supported_error",
|
|
799
|
+
details: "Hardware-backed keystores cannot import external private keys.",
|
|
800
|
+
docsUrl: null,
|
|
801
|
+
name: "ImportKeyNotSupportedError",
|
|
802
|
+
shortMessage: "importKey is not supported on React Native."
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
};
|
|
806
|
+
|
|
807
|
+
//#endregion
|
|
808
|
+
//#region src/services/keychain/createKeychainService/KeyNotFoundError.ts
|
|
809
|
+
var KeyNotFoundError = class extends BaseError {
|
|
810
|
+
constructor(keyName) {
|
|
811
|
+
super({
|
|
812
|
+
cause: null,
|
|
813
|
+
code: "key_not_found",
|
|
814
|
+
docsUrl: null,
|
|
815
|
+
name: "KeyNotFoundError",
|
|
816
|
+
shortMessage: `Key "${keyName}" not found in keychain`
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
|
|
821
|
+
//#endregion
|
|
822
|
+
//#region src/services/keychain/createKeychainService/createKeychainService.native.ts
|
|
823
|
+
/**
|
|
824
|
+
* Creates a KeychainService backed by the platform's secure hardware
|
|
825
|
+
* (iOS Secure Enclave / Android KeyStore with StrongBox or TEE).
|
|
826
|
+
*
|
|
827
|
+
* Keys are generated and stored inside the secure hardware and never
|
|
828
|
+
* leave the device. The native module returns base64url-encoded data
|
|
829
|
+
* which this wrapper converts to the hex format the SDK expects.
|
|
830
|
+
*
|
|
831
|
+
* @throws NativeModuleNotLinkedError if the native Keychain TurboModule is not available.
|
|
832
|
+
*
|
|
833
|
+
* @instrumented
|
|
834
|
+
*/
|
|
835
|
+
const createKeychainService = () => {
|
|
836
|
+
if (NativeKeychain_default == null) throw new NativeModuleNotLinkedError({ moduleName: "Keychain" });
|
|
837
|
+
const nativeModule = NativeKeychain_default;
|
|
838
|
+
const generateKey = async (keyName) => {
|
|
839
|
+
return bufferToHex(compressRawPublicKey(bytesFromBase64url((await nativeModule.generateKeyPair(keyName)).publicKey).buffer));
|
|
840
|
+
};
|
|
841
|
+
/**
|
|
842
|
+
* Importing external private keys is not supported on hardware-backed
|
|
843
|
+
* keystores (Secure Enclave / Android KeyStore). Keys must be generated
|
|
844
|
+
* on-device via generateKey().
|
|
845
|
+
*/
|
|
846
|
+
const importKey = () => {
|
|
847
|
+
throw new ImportKeyNotSupportedError();
|
|
848
|
+
};
|
|
849
|
+
const getPublicKey = async (keyName) => {
|
|
850
|
+
const result = await nativeModule.getPublicKey(keyName);
|
|
851
|
+
if (result == null) return null;
|
|
852
|
+
return bufferToHex(compressRawPublicKey(bytesFromBase64url(result.publicKey).buffer));
|
|
853
|
+
};
|
|
854
|
+
const sign = async (keyName, message) => {
|
|
855
|
+
if (!await nativeModule.hasKey(keyName)) throw new KeyNotFoundError(keyName);
|
|
856
|
+
const base64urlPayload = base64urlFromBytes(new TextEncoder().encode(message));
|
|
857
|
+
return bufferToHex(derToP1363(bytesFromBase64url((await nativeModule.sign(keyName, base64urlPayload)).signature)));
|
|
858
|
+
};
|
|
859
|
+
const hasKey = async (keyName) => {
|
|
860
|
+
return nativeModule.hasKey(keyName);
|
|
861
|
+
};
|
|
862
|
+
const removeKey = async (keyName) => {
|
|
863
|
+
await nativeModule.deleteKey(keyName);
|
|
864
|
+
};
|
|
865
|
+
return {
|
|
866
|
+
generateKey,
|
|
867
|
+
getPublicKey,
|
|
868
|
+
hasKey,
|
|
869
|
+
importKey,
|
|
870
|
+
removeKey,
|
|
871
|
+
sign
|
|
872
|
+
};
|
|
873
|
+
};
|
|
874
|
+
|
|
875
|
+
//#endregion
|
|
876
|
+
//#region src/errors/InvalidRealtimePublishError.ts
|
|
877
|
+
var InvalidRealtimePublishError = class extends BaseError {
|
|
878
|
+
constructor({ channel }) {
|
|
879
|
+
super({
|
|
880
|
+
cause: null,
|
|
881
|
+
code: "invalid_realtime_publish",
|
|
882
|
+
docsUrl: null,
|
|
883
|
+
metaMessages: [`channel: ${channel}`],
|
|
884
|
+
name: "InvalidRealtimePublishError",
|
|
885
|
+
shortMessage: "Tried to publish data that does not match the channel schema"
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
};
|
|
889
|
+
|
|
890
|
+
//#endregion
|
|
891
|
+
//#region src/errors/RealtimeNotConnectedError.ts
|
|
892
|
+
var RealtimeNotConnectedError = class extends BaseError {
|
|
893
|
+
constructor() {
|
|
894
|
+
super({
|
|
895
|
+
cause: null,
|
|
896
|
+
code: "realtime_not_connected_error",
|
|
897
|
+
docsUrl: null,
|
|
898
|
+
name: "RealtimeNotConnectedError",
|
|
899
|
+
shortMessage: "Realtime service is not connected. Call connect() before subscribing or publishing."
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
};
|
|
903
|
+
|
|
904
|
+
//#endregion
|
|
905
|
+
//#region src/services/realtime/createRealtimeService/createRealtimeService.ts
|
|
906
|
+
const ABLY_STATE_TO_REALTIME_STATE = {
|
|
907
|
+
closed: "closed",
|
|
908
|
+
closing: "closing",
|
|
909
|
+
connected: "connected",
|
|
910
|
+
connecting: "connecting",
|
|
911
|
+
disconnected: "disconnected",
|
|
912
|
+
failed: "failed",
|
|
913
|
+
initialized: "idle",
|
|
914
|
+
suspended: "suspended"
|
|
915
|
+
};
|
|
916
|
+
const mapAblyState = (ablyState) => ABLY_STATE_TO_REALTIME_STATE[ablyState] ?? "idle";
|
|
917
|
+
/**
|
|
918
|
+
* Creates a realtime pub/sub service backed by Ably.
|
|
919
|
+
*
|
|
920
|
+
* The service starts idle. Call `connect({ client })` to establish
|
|
921
|
+
* a connection, passing the DynamicClient explicitly.
|
|
922
|
+
*
|
|
923
|
+
* SSR environments receive a no-op implementation.
|
|
924
|
+
* @instrumented
|
|
925
|
+
*/
|
|
926
|
+
const createRealtimeService = () => {
|
|
927
|
+
if (isServerSideRendering()) return {
|
|
928
|
+
connect: () => Promise.resolve(),
|
|
929
|
+
disconnect: () => {},
|
|
930
|
+
getConnectionState: () => "idle",
|
|
931
|
+
off: () => {},
|
|
932
|
+
on: () => {},
|
|
933
|
+
publish: () => Promise.resolve(),
|
|
934
|
+
subscribe: () => Promise.resolve(),
|
|
935
|
+
unsubscribe: () => {}
|
|
936
|
+
};
|
|
937
|
+
const eventEmitter = new EventEmitter();
|
|
938
|
+
const channels = /* @__PURE__ */ new Map();
|
|
939
|
+
const handlerMap = /* @__PURE__ */ new WeakMap();
|
|
940
|
+
let ablyClient;
|
|
941
|
+
let connectionState = "idle";
|
|
942
|
+
let isConnecting = false;
|
|
943
|
+
const setConnectionState = (state) => {
|
|
944
|
+
connectionState = state;
|
|
945
|
+
eventEmitter.emit("connectionStateChange", state);
|
|
946
|
+
};
|
|
947
|
+
const getOrCreateChannel = (channelName) => {
|
|
948
|
+
const existing = channels.get(channelName);
|
|
949
|
+
if (existing) return existing;
|
|
950
|
+
if (!ablyClient) throw new RealtimeNotConnectedError();
|
|
951
|
+
const channel = ablyClient.channels.get(channelName);
|
|
952
|
+
channels.set(channelName, channel);
|
|
953
|
+
return channel;
|
|
954
|
+
};
|
|
955
|
+
const connect = async ({ client, headers }) => {
|
|
956
|
+
if (isConnecting) return;
|
|
957
|
+
isConnecting = true;
|
|
958
|
+
try {
|
|
959
|
+
const core = getCore(client);
|
|
960
|
+
if (ablyClient) {
|
|
961
|
+
ablyClient.close();
|
|
962
|
+
channels.clear();
|
|
963
|
+
}
|
|
964
|
+
const { BaseRealtime: AblyBaseRealtime, FetchRequest, WebSocketTransport } = await import("ably/modular");
|
|
965
|
+
ablyClient = new AblyBaseRealtime({
|
|
966
|
+
authCallback: (_tokenParams, callback) => {
|
|
967
|
+
__createApiClient_wrapped({ headers }, client).getRealtimeAuthToken({ environmentId: core.environmentId }).then((response) => {
|
|
968
|
+
callback(null, response.token);
|
|
969
|
+
}).catch((err) => {
|
|
970
|
+
callback(err instanceof Error ? err.message : String(err), null);
|
|
971
|
+
});
|
|
972
|
+
},
|
|
973
|
+
autoConnect: false,
|
|
974
|
+
plugins: {
|
|
975
|
+
FetchRequest,
|
|
976
|
+
WebSocketTransport
|
|
977
|
+
}
|
|
978
|
+
});
|
|
979
|
+
ablyClient.connection.on((stateChange) => {
|
|
980
|
+
setConnectionState(mapAblyState(stateChange.current));
|
|
981
|
+
});
|
|
982
|
+
ablyClient.connect();
|
|
983
|
+
} finally {
|
|
984
|
+
isConnecting = false;
|
|
985
|
+
}
|
|
986
|
+
};
|
|
987
|
+
const disconnect = () => {
|
|
988
|
+
if (!ablyClient) return;
|
|
989
|
+
for (const channel of channels.values()) channel.detach().catch(() => {});
|
|
990
|
+
channels.clear();
|
|
991
|
+
ablyClient.close();
|
|
992
|
+
ablyClient = void 0;
|
|
993
|
+
};
|
|
994
|
+
const subscribe = async ({ channelSchema, callback }) => {
|
|
995
|
+
const channel = getOrCreateChannel(channelSchema.channel);
|
|
996
|
+
const handler = (message) => {
|
|
997
|
+
const parsed = channelSchema.schema.safeParse(message.data);
|
|
998
|
+
if (!parsed.success) return;
|
|
999
|
+
callback({ data: parsed.data });
|
|
1000
|
+
};
|
|
1001
|
+
handlerMap.set(callback, handler);
|
|
1002
|
+
await channel.subscribe(handler);
|
|
1003
|
+
};
|
|
1004
|
+
const unsubscribe = ({ channelSchema, callback }) => {
|
|
1005
|
+
const channel = channels.get(channelSchema.channel);
|
|
1006
|
+
if (!channel) return;
|
|
1007
|
+
const handler = handlerMap.get(callback);
|
|
1008
|
+
if (handler) {
|
|
1009
|
+
channel.unsubscribe(handler);
|
|
1010
|
+
handlerMap.delete(callback);
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
const publish = async ({ channelSchema, data }) => {
|
|
1014
|
+
const parsed = channelSchema.schema.safeParse(data);
|
|
1015
|
+
if (!parsed.success) throw new InvalidRealtimePublishError({ channel: channelSchema.channel });
|
|
1016
|
+
await getOrCreateChannel(channelSchema.channel).publish("message", parsed.data);
|
|
1017
|
+
};
|
|
1018
|
+
return {
|
|
1019
|
+
connect,
|
|
1020
|
+
disconnect,
|
|
1021
|
+
getConnectionState: () => connectionState,
|
|
1022
|
+
off: (event, callback) => {
|
|
1023
|
+
eventEmitter.off(event, callback);
|
|
1024
|
+
},
|
|
1025
|
+
on: (event, callback) => {
|
|
1026
|
+
eventEmitter.on(event, callback);
|
|
1027
|
+
},
|
|
1028
|
+
publish,
|
|
1029
|
+
subscribe,
|
|
1030
|
+
unsubscribe
|
|
1031
|
+
};
|
|
1032
|
+
};
|
|
1033
|
+
const __createRealtimeService_impl = createRealtimeService;
|
|
1034
|
+
const __createRealtimeService_wrapped = instrumentFunction({
|
|
1035
|
+
fn: __createRealtimeService_impl,
|
|
1036
|
+
functionName: "createRealtimeService",
|
|
1037
|
+
getCore: () => {
|
|
1038
|
+
try {
|
|
1039
|
+
return getCore(getDefaultClient());
|
|
1040
|
+
} catch {
|
|
1041
|
+
return;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
});
|
|
1045
|
+
|
|
1046
|
+
//#endregion
|
|
1047
|
+
//#region src/errors/NoNetworkProvidersError.ts
|
|
1048
|
+
var NoNetworkProvidersError = class extends BaseError {
|
|
1049
|
+
constructor() {
|
|
1050
|
+
super({
|
|
1051
|
+
cause: null,
|
|
1052
|
+
code: "no_network_providers",
|
|
1053
|
+
docsUrl: null,
|
|
1054
|
+
name: "NoNetworkProvidersError",
|
|
1055
|
+
shortMessage: "No networks were registered in the client"
|
|
1056
|
+
});
|
|
1057
|
+
}
|
|
1058
|
+
};
|
|
1059
|
+
|
|
1060
|
+
//#endregion
|
|
1061
|
+
//#region src/errors/WalletAlreadyLinkedToAnotherUserError.ts
|
|
1062
|
+
var WalletAlreadyLinkedToAnotherUserError = class extends BaseError {
|
|
1063
|
+
constructor({ cause }) {
|
|
1064
|
+
super({
|
|
1065
|
+
cause,
|
|
1066
|
+
code: "wallet_already_linked_to_another_user_error",
|
|
1067
|
+
docsUrl: null,
|
|
1068
|
+
name: "WalletAlreadyLinkedToAnotherUserError",
|
|
1069
|
+
shortMessage: "This wallet is already linked to another user"
|
|
1070
|
+
});
|
|
1071
|
+
}
|
|
1072
|
+
};
|
|
1073
|
+
|
|
1074
|
+
//#endregion
|
|
1075
|
+
//#region src/modules/captcha/isCaptchaRequired/isCaptchaRequired.ts
|
|
1076
|
+
/** @not-instrumented */
|
|
1077
|
+
const isCaptchaRequired = (client = getDefaultClient()) => {
|
|
1078
|
+
const projectSettings = client.projectSettings;
|
|
1079
|
+
assertDefined(projectSettings, "Project settings are not available");
|
|
1080
|
+
return projectSettings.security.hCaptcha?.enabled ?? false;
|
|
1081
|
+
};
|
|
1082
|
+
|
|
1083
|
+
//#endregion
|
|
1084
|
+
//#region src/modules/captcha/consumeCaptchaToken/consumeCaptchaToken.ts
|
|
1085
|
+
/**
|
|
1086
|
+
* Retrieves the current captcha token from the client state and sets it to null.
|
|
1087
|
+
* @instrumented
|
|
1088
|
+
*/
|
|
1089
|
+
const consumeCaptchaToken = (client) => {
|
|
1090
|
+
const core = getCore(client);
|
|
1091
|
+
const captchaToken = core.state.get().captchaToken;
|
|
1092
|
+
if (isCaptchaRequired(client)) assertDefined(captchaToken, "Captcha token is required");
|
|
1093
|
+
core.state.set({ captchaToken: null });
|
|
1094
|
+
return captchaToken ?? void 0;
|
|
1095
|
+
};
|
|
1096
|
+
const __consumeCaptchaToken_impl = consumeCaptchaToken;
|
|
1097
|
+
const __consumeCaptchaToken_wrapped = instrumentFunction({
|
|
1098
|
+
fn: __consumeCaptchaToken_impl,
|
|
1099
|
+
functionName: "consumeCaptchaToken",
|
|
1100
|
+
getCore: () => {
|
|
1101
|
+
try {
|
|
1102
|
+
return getCore(getDefaultClient());
|
|
1103
|
+
} catch {
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
});
|
|
1108
|
+
|
|
1109
|
+
//#endregion
|
|
1110
|
+
//#region src/modules/captcha/setCaptchaToken/setCaptchaToken.ts
|
|
1111
|
+
/**
|
|
1112
|
+
* Sets the given captcha token in the client state.
|
|
1113
|
+
*
|
|
1114
|
+
* @param params.captchaToken - The captcha token to set.
|
|
1115
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
1116
|
+
* @instrumented
|
|
1117
|
+
*/
|
|
1118
|
+
const setCaptchaToken = ({ captchaToken }, client = getDefaultClient()) => {
|
|
1119
|
+
getCore(client).state.set({ captchaToken });
|
|
1120
|
+
};
|
|
1121
|
+
const __setCaptchaToken_impl = setCaptchaToken;
|
|
1122
|
+
const __setCaptchaToken_wrapped = instrumentFunction({
|
|
1123
|
+
fn: __setCaptchaToken_impl,
|
|
1124
|
+
functionName: "setCaptchaToken",
|
|
1125
|
+
getCore: () => {
|
|
1126
|
+
try {
|
|
1127
|
+
return getCore(getDefaultClient());
|
|
1128
|
+
} catch {
|
|
1129
|
+
return;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1134
|
+
//#endregion
|
|
1135
|
+
//#region src/services/realtime/createRealtimeChannelSchema/createRealtimeChannelSchema.ts
|
|
1136
|
+
/**
|
|
1137
|
+
* Defines a typed schema for a realtime channel — analogous to `createStorageKeySchema`
|
|
1138
|
+
* for storage. Pairs a channel name with a Zod schema that validates the shape of
|
|
1139
|
+
* messages sent and received on that channel. Pass the result to the realtime service's
|
|
1140
|
+
* `subscribe` / `unsubscribe` / `publish` methods to get end-to-end type safety.
|
|
1141
|
+
* @instrumented
|
|
1142
|
+
*/
|
|
1143
|
+
const createRealtimeChannelSchema = (params) => params;
|
|
1144
|
+
const __createRealtimeChannelSchema_impl = createRealtimeChannelSchema;
|
|
1145
|
+
const __createRealtimeChannelSchema_wrapped = instrumentFunction({
|
|
1146
|
+
fn: __createRealtimeChannelSchema_impl,
|
|
1147
|
+
functionName: "createRealtimeChannelSchema",
|
|
1148
|
+
getCore: () => {
|
|
1149
|
+
try {
|
|
1150
|
+
return getCore(getDefaultClient());
|
|
1151
|
+
} catch {
|
|
1152
|
+
return;
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
});
|
|
1156
|
+
|
|
1157
|
+
//#endregion
|
|
1158
|
+
//#region src/modules/extension/hasExtension/hasExtension.ts
|
|
1159
|
+
/**
|
|
1160
|
+
* Checks if a specific extension has been applied to the Dynamic client.
|
|
1161
|
+
*
|
|
1162
|
+
* Extensions add optional features to the Dynamic SDK,
|
|
1163
|
+
* such as EVM, Solana, or other chain support.
|
|
1164
|
+
*
|
|
1165
|
+
* @param params.extensionKey - The unique key identifying the extension to check for.
|
|
1166
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
1167
|
+
* @returns True if the extension is applied, false otherwise.
|
|
1168
|
+
* @not-instrumented
|
|
1169
|
+
*/
|
|
1170
|
+
const hasExtension = ({ extensionKey }, client = getDefaultClient()) => {
|
|
1171
|
+
return getCore(client).extensions.has(extensionKey);
|
|
1172
|
+
};
|
|
1173
|
+
|
|
1174
|
+
//#endregion
|
|
1175
|
+
//#region src/modules/auth/createVisit/createVisit.ts
|
|
1176
|
+
/** @instrumented */
|
|
1177
|
+
const createVisit = async ({ walletAccount, authMode = AuthModeEnum.Only }, client) => {
|
|
1178
|
+
const core = getCore(client);
|
|
1179
|
+
const apiClient = __createApiClient_wrapped({}, client);
|
|
1180
|
+
const walletProvider = __getWalletProviderFromWalletAccount_wrapped({ walletAccount }, client);
|
|
1181
|
+
try {
|
|
1182
|
+
const walletName = normalizeWalletNameWithChain({
|
|
1183
|
+
chain: walletProvider.chain,
|
|
1184
|
+
displayName: walletProvider.metadata.displayName
|
|
1185
|
+
});
|
|
1186
|
+
const connectRequest = {
|
|
1187
|
+
address: walletAccount.address,
|
|
1188
|
+
authMode,
|
|
1189
|
+
chain: walletProvider.chain,
|
|
1190
|
+
provider: walletProvider.walletProviderType,
|
|
1191
|
+
walletName
|
|
1192
|
+
};
|
|
1193
|
+
await apiClient.createVisit({
|
|
1194
|
+
connectRequest,
|
|
1195
|
+
environmentId: core.environmentId
|
|
1196
|
+
});
|
|
1197
|
+
} catch (error) {
|
|
1198
|
+
core.logger.error("Error creating visit", { error });
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1201
|
+
const __createVisit_impl = createVisit;
|
|
1202
|
+
const __createVisit_wrapped = instrumentFunction({
|
|
1203
|
+
fn: __createVisit_impl,
|
|
1204
|
+
functionName: "createVisit",
|
|
1205
|
+
getCore: () => {
|
|
1206
|
+
try {
|
|
1207
|
+
return getCore(getDefaultClient());
|
|
1208
|
+
} catch {
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
});
|
|
1213
|
+
|
|
1214
|
+
//#endregion
|
|
1215
|
+
//#region src/modules/wallets/unverifiedWalletAccounts/setUnverifiedWalletAccounts/setUnverifiedWalletAccounts.ts
|
|
1216
|
+
/**
|
|
1217
|
+
* Updates the unverified wallet account in the client state.
|
|
1218
|
+
* This will add new wallet accounts and override those with matching ids,
|
|
1219
|
+
* but will leave other preexisting wallet accounts unchanged.
|
|
1220
|
+
* @instrumented
|
|
1221
|
+
*/
|
|
1222
|
+
const setUnverifiedWalletAccounts = ({ unverifiedWalletAccountsToUpdate }, client) => {
|
|
1223
|
+
if (unverifiedWalletAccountsToUpdate.length === 0) return;
|
|
1224
|
+
const core = getCore(client);
|
|
1225
|
+
const unverifiedWalletAccountsToUpdateIds = unverifiedWalletAccountsToUpdate.map(({ id }) => id);
|
|
1226
|
+
const filteredUnverifiedWalletAccounts = core.state.get().unverifiedWalletAccounts.filter((unverifiedWalletAccount) => !unverifiedWalletAccountsToUpdateIds.includes(unverifiedWalletAccount.id));
|
|
1227
|
+
core.state.set({ unverifiedWalletAccounts: [...filteredUnverifiedWalletAccounts, ...unverifiedWalletAccountsToUpdate] });
|
|
1228
|
+
};
|
|
1229
|
+
const __setUnverifiedWalletAccounts_impl = setUnverifiedWalletAccounts;
|
|
1230
|
+
const __setUnverifiedWalletAccounts_wrapped = instrumentFunction({
|
|
1231
|
+
fn: __setUnverifiedWalletAccounts_impl,
|
|
1232
|
+
functionName: "setUnverifiedWalletAccounts",
|
|
1233
|
+
getCore: () => {
|
|
1234
|
+
try {
|
|
1235
|
+
return getCore(getDefaultClient());
|
|
1236
|
+
} catch {
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
});
|
|
1241
|
+
|
|
1242
|
+
//#endregion
|
|
1243
|
+
//#region src/modules/wallets/utils/formatSignInMessage/formatSignInMessage.ts
|
|
1244
|
+
/**
|
|
1245
|
+
* Formats a sign in message to prove ownership of an address.
|
|
1246
|
+
* @not-instrumented
|
|
1247
|
+
*/
|
|
1248
|
+
const formatSignInMessage = async ({ domain, blockchainName, address, uri, chainId, nonce, issuedAt, requestId, statement, resources }) => {
|
|
1249
|
+
const prefix = [`${domain} wants you to sign in with your ${blockchainName} account:`, address].join("\n");
|
|
1250
|
+
const prefixWithStatementGap = statement ? "\n\n" : "\n";
|
|
1251
|
+
const prefixWithStatement = `${[prefix, statement].join(prefixWithStatementGap)}\n`;
|
|
1252
|
+
const suffixFields = [];
|
|
1253
|
+
suffixFields.push(`URI: ${uri}`);
|
|
1254
|
+
suffixFields.push("Version: 1");
|
|
1255
|
+
if (chainId) suffixFields.push(`Chain ID: ${chainId}`);
|
|
1256
|
+
suffixFields.push(`Nonce: ${nonce}`);
|
|
1257
|
+
if (issuedAt) suffixFields.push(`Issued At: ${issuedAt}`);
|
|
1258
|
+
if (requestId) suffixFields.push(`Request ID: ${requestId}`);
|
|
1259
|
+
if (resources?.length) suffixFields.push(`Resources:${resources.map((resource) => "\n- " + resource).join()}`);
|
|
1260
|
+
return [prefixWithStatement, suffixFields.join("\n")].join("\n");
|
|
1261
|
+
};
|
|
1262
|
+
|
|
1263
|
+
//#endregion
|
|
1264
|
+
//#region src/modules/wallets/utils/getSignInMessage/createSignInMessageStatement/createSignInMessageStatement.ts
|
|
1265
|
+
/** @instrumented */
|
|
1266
|
+
const createSignInMessageStatement = (client) => {
|
|
1267
|
+
const appName = getCore(client).metadata?.name ?? client.projectSettings?.general.displayName;
|
|
1268
|
+
return `Welcome to ${appName}. Signing is the only way we can truly know that you are the owner of the wallet you are connecting. Signing is a safe, gas-less transaction that does not in any way give ${appName} permission to perform any transactions with your wallet.`;
|
|
1269
|
+
};
|
|
1270
|
+
const __createSignInMessageStatement_impl = createSignInMessageStatement;
|
|
1271
|
+
const __createSignInMessageStatement_wrapped = instrumentFunction({
|
|
1272
|
+
fn: __createSignInMessageStatement_impl,
|
|
1273
|
+
functionName: "createSignInMessageStatement",
|
|
1274
|
+
getCore: () => {
|
|
1275
|
+
try {
|
|
1276
|
+
return getCore(getDefaultClient());
|
|
1277
|
+
} catch {
|
|
1278
|
+
return;
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
});
|
|
1282
|
+
|
|
1283
|
+
//#endregion
|
|
1284
|
+
//#region src/modules/wallets/unverifiedWalletAccounts/removeUnverifiedWalletAccount/removeUnverifiedWalletAccount.ts
|
|
1285
|
+
/**
|
|
1286
|
+
* Removes an unverified wallet account from the client's state.
|
|
1287
|
+
* @instrumented
|
|
1288
|
+
*/
|
|
1289
|
+
const removeUnverifiedWalletAccount = ({ unverifiedWalletAccount }, client) => {
|
|
1290
|
+
const core = getCore(client);
|
|
1291
|
+
const previousState = core.state.get();
|
|
1292
|
+
const { unverifiedWalletAccounts } = core.state.get();
|
|
1293
|
+
const filteredUnverifiedWalletAccounts = unverifiedWalletAccounts.filter((account) => account.id !== unverifiedWalletAccount.id);
|
|
1294
|
+
core.state.set({ unverifiedWalletAccounts: filteredUnverifiedWalletAccounts });
|
|
1295
|
+
/**
|
|
1296
|
+
* We check before raising because the wallet account we are removing might still
|
|
1297
|
+
* be present in wallet accounts due to having been moved to verified credentials.
|
|
1298
|
+
*/
|
|
1299
|
+
checkAndRaiseWalletAccountsChangedEvent({ previousState }, client);
|
|
1300
|
+
};
|
|
1301
|
+
const __removeUnverifiedWalletAccount_impl = removeUnverifiedWalletAccount;
|
|
1302
|
+
const __removeUnverifiedWalletAccount_wrapped = instrumentFunction({
|
|
1303
|
+
fn: __removeUnverifiedWalletAccount_impl,
|
|
1304
|
+
functionName: "removeUnverifiedWalletAccount",
|
|
1305
|
+
getCore: () => {
|
|
1306
|
+
try {
|
|
1307
|
+
return getCore(getDefaultClient());
|
|
1308
|
+
} catch {
|
|
1309
|
+
return;
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
});
|
|
1313
|
+
|
|
1314
|
+
//#endregion
|
|
1315
|
+
//#region src/utils/isError/isError.ts
|
|
1316
|
+
/**
|
|
1317
|
+
* Check if the given value is an Error object
|
|
1318
|
+
* @not-instrumented
|
|
1319
|
+
*/
|
|
1320
|
+
const isError = (error) => error instanceof Error;
|
|
1321
|
+
|
|
1322
|
+
//#endregion
|
|
1323
|
+
//#region src/utils/isErrorWithCode/isErrorWithCode.ts
|
|
1324
|
+
/**
|
|
1325
|
+
* Check if the given value is an Error object with a specific code
|
|
1326
|
+
* @not-instrumented
|
|
1327
|
+
*/
|
|
1328
|
+
const isErrorWithCode = (error, code) => {
|
|
1329
|
+
if (!isError(error)) return false;
|
|
1330
|
+
return "code" in error && error.code === code;
|
|
1331
|
+
};
|
|
1332
|
+
|
|
1333
|
+
//#endregion
|
|
1334
|
+
//#region src/modules/wallets/verifyMessageSignatureOwnership/verifyMessageSignatureOwnership.ts
|
|
1335
|
+
/**
|
|
1336
|
+
* Verifies a signed message by calling either the verifyLink, verifyTransfer or verify API function,
|
|
1337
|
+
* depending on whether the user is signing in, linking or transferring a wallet.
|
|
1338
|
+
*
|
|
1339
|
+
* Does NOT call updateAuthFromVerifyResponse, it should be called from the return of this function.
|
|
1340
|
+
* @instrumented
|
|
1341
|
+
*/
|
|
1342
|
+
const verifyMessageSignatureOwnership = async ({ messageToSign, walletAddress, addressesWithTypes, signature, chain, isTransfer = false, walletDisplayName, walletProviderType, networkId, requestedScopes }, client) => {
|
|
1343
|
+
const core = getCore(client);
|
|
1344
|
+
const apiClient = __createApiClient_wrapped({}, client);
|
|
1345
|
+
const walletName = normalizeWalletNameWithChain({
|
|
1346
|
+
chain,
|
|
1347
|
+
displayName: walletDisplayName
|
|
1348
|
+
});
|
|
1349
|
+
let verifyApiFunction;
|
|
1350
|
+
if (!client.user) verifyApiFunction = apiClient.walletsSignin.bind(apiClient);
|
|
1351
|
+
else if (isTransfer) verifyApiFunction = apiClient.verifyTransfer.bind(apiClient);
|
|
1352
|
+
else if (client.user && requestedScopes) verifyApiFunction = apiClient.walletsVerify.bind(apiClient);
|
|
1353
|
+
else verifyApiFunction = apiClient.verifyLink.bind(apiClient);
|
|
1354
|
+
try {
|
|
1355
|
+
return await verifyApiFunction({
|
|
1356
|
+
environmentId: core.environmentId,
|
|
1357
|
+
verifyRequest: {
|
|
1358
|
+
additionalWalletAddresses: addressesWithTypes?.map((address) => ({
|
|
1359
|
+
address: address.address,
|
|
1360
|
+
publicKey: address.publicKey,
|
|
1361
|
+
type: address.type
|
|
1362
|
+
})),
|
|
1363
|
+
captchaToken: __consumeCaptchaToken_wrapped(client),
|
|
1364
|
+
chain,
|
|
1365
|
+
messageToSign,
|
|
1366
|
+
network: networkId,
|
|
1367
|
+
publicWalletAddress: walletAddress,
|
|
1368
|
+
requestedScopes,
|
|
1369
|
+
signedMessage: signature,
|
|
1370
|
+
walletName,
|
|
1371
|
+
walletProvider: walletProviderType
|
|
1372
|
+
}
|
|
1373
|
+
});
|
|
1374
|
+
} catch (error) {
|
|
1375
|
+
core.logger.error("Failed to verify message signature ownership", error);
|
|
1376
|
+
if (isErrorWithCode(error, "reassign_wallet_confirm") || isErrorWithCode(error, "merge_accounts_confirmation")) throw new WalletAlreadyLinkedToAnotherUserError({ cause: error });
|
|
1377
|
+
throw error;
|
|
1378
|
+
}
|
|
1379
|
+
};
|
|
1380
|
+
const __verifyMessageSignatureOwnership_impl = verifyMessageSignatureOwnership;
|
|
1381
|
+
const __verifyMessageSignatureOwnership_wrapped = instrumentFunction({
|
|
1382
|
+
fn: __verifyMessageSignatureOwnership_impl,
|
|
1383
|
+
functionName: "verifyMessageSignatureOwnership",
|
|
1384
|
+
getCore: () => {
|
|
1385
|
+
try {
|
|
1386
|
+
return getCore(getDefaultClient());
|
|
1387
|
+
} catch {
|
|
1388
|
+
return;
|
|
1389
|
+
}
|
|
1390
|
+
}
|
|
1391
|
+
});
|
|
1392
|
+
|
|
1393
|
+
//#endregion
|
|
1394
|
+
//#region src/modules/wallets/walletProvider/walletProviderKeyMap/updateWalletProviderKeysForVerifiedCredentials/updateWalletProviderKeysForVerifiedCredentials.ts
|
|
1395
|
+
/** @instrumented */
|
|
1396
|
+
const updateWalletProviderKeysForVerifiedCredentials = ({ keysToUpdate }, client) => {
|
|
1397
|
+
const core = getCore(client);
|
|
1398
|
+
core.state.set({ walletProviderKeyMap: {
|
|
1399
|
+
...core.state.get().walletProviderKeyMap,
|
|
1400
|
+
...keysToUpdate
|
|
1401
|
+
} });
|
|
1402
|
+
};
|
|
1403
|
+
const __updateWalletProviderKeysForVerifiedCredentials_impl = updateWalletProviderKeysForVerifiedCredentials;
|
|
1404
|
+
const __updateWalletProviderKeysForVerifiedCredentials_wrapped = instrumentFunction({
|
|
1405
|
+
fn: __updateWalletProviderKeysForVerifiedCredentials_impl,
|
|
1406
|
+
functionName: "updateWalletProviderKeysForVerifiedCredentials",
|
|
1407
|
+
getCore: () => {
|
|
1408
|
+
try {
|
|
1409
|
+
return getCore(getDefaultClient());
|
|
1410
|
+
} catch {
|
|
1411
|
+
return;
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
});
|
|
1415
|
+
|
|
1416
|
+
//#endregion
|
|
1417
|
+
//#region src/modules/wallets/networks/getSdkChainFromApiChainName/getSdkChainFromApiChainName.ts
|
|
1418
|
+
/**
|
|
1419
|
+
* Maps the chain name from the API to the SDK chain name
|
|
1420
|
+
* @not-instrumented
|
|
1421
|
+
*/
|
|
1422
|
+
const getSdkChainFromApiChainName = (chainName) => {
|
|
1423
|
+
return Object.keys(CHAINS_INFO_MAP).find((chain) => CHAINS_INFO_MAP[chain].apiChainName === chainName) || null;
|
|
1424
|
+
};
|
|
1425
|
+
|
|
1426
|
+
//#endregion
|
|
1427
|
+
//#region src/modules/wallets/networks/getNetworksData/getNetworksData.ts
|
|
1428
|
+
/**
|
|
1429
|
+
* Retrieves all available network configurations from project settings.
|
|
1430
|
+
*
|
|
1431
|
+
* This function returns detailed configuration data for all networks enabled
|
|
1432
|
+
* in your Dynamic project, including RPC URLs, native currencies, and metadata.
|
|
1433
|
+
*
|
|
1434
|
+
* If a `transformers.networkData` callback was provided in the client configuration,
|
|
1435
|
+
* it will be applied to each network before returning the data. This allows you to
|
|
1436
|
+
* customize network properties (such as RPC URLs) in a centralized way.
|
|
1437
|
+
*
|
|
1438
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
1439
|
+
* @returns An array of network configuration data for all enabled networks.
|
|
1440
|
+
* @instrumented
|
|
1441
|
+
*/
|
|
1442
|
+
const getNetworksData = (client = getDefaultClient()) => {
|
|
1443
|
+
const { state, transformers } = getCore(client);
|
|
1444
|
+
const networkDataTransformer = transformers?.networkData ?? ((networkData) => networkData);
|
|
1445
|
+
const { projectSettings } = state.get();
|
|
1446
|
+
assertDefined(projectSettings, "projectSettings not found");
|
|
1447
|
+
const networks = projectSettings.networks;
|
|
1448
|
+
if (!networks) return [];
|
|
1449
|
+
return networks.map((network) => {
|
|
1450
|
+
if (!network.chainName) return [];
|
|
1451
|
+
const chain = getSdkChainFromApiChainName(network.chainName);
|
|
1452
|
+
if (!network?.networks?.length || !chain) return [];
|
|
1453
|
+
return network.networks.map((networkConfiguration) => {
|
|
1454
|
+
return networkDataTransformer({
|
|
1455
|
+
blockExplorerUrls: networkConfiguration.blockExplorerUrls,
|
|
1456
|
+
chain,
|
|
1457
|
+
cluster: networkConfiguration.cluster,
|
|
1458
|
+
displayName: networkConfiguration.vanityName || networkConfiguration.name,
|
|
1459
|
+
genesisHash: networkConfiguration.genesisHash,
|
|
1460
|
+
iconUrl: networkConfiguration.iconUrls[0],
|
|
1461
|
+
name: networkConfiguration.name,
|
|
1462
|
+
nativeCurrency: {
|
|
1463
|
+
decimals: networkConfiguration.nativeCurrency.decimals,
|
|
1464
|
+
iconUrl: networkConfiguration.nativeCurrency.iconUrl,
|
|
1465
|
+
name: networkConfiguration.nativeCurrency.name,
|
|
1466
|
+
symbol: networkConfiguration.nativeCurrency.symbol
|
|
1467
|
+
},
|
|
1468
|
+
networkId: networkConfiguration.networkId,
|
|
1469
|
+
rpcUrls: { http: [...networkConfiguration.privateCustomerRpcUrls ?? [], ...networkConfiguration.rpcUrls ?? []] },
|
|
1470
|
+
testnet: networkConfiguration.isTestnet ?? false
|
|
1471
|
+
});
|
|
1472
|
+
});
|
|
1473
|
+
}).flat();
|
|
1474
|
+
};
|
|
1475
|
+
const __getNetworksData_impl = getNetworksData;
|
|
1476
|
+
const __getNetworksData_wrapped = instrumentFunction({
|
|
1477
|
+
fn: __getNetworksData_impl,
|
|
1478
|
+
functionName: "getNetworksData",
|
|
1479
|
+
getCore: () => {
|
|
1480
|
+
try {
|
|
1481
|
+
return getCore(getDefaultClient());
|
|
1482
|
+
} catch {
|
|
1483
|
+
return;
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
});
|
|
1487
|
+
|
|
1488
|
+
//#endregion
|
|
1489
|
+
//#region src/modules/wallets/networks/networkProviderBuilderRegistry/createNetworkProviderBuilderRegistry/createNetworkProviderBuilderRegistry.ts
|
|
1490
|
+
/** @not-instrumented */
|
|
1491
|
+
const createNetworkProviderBuilderRegistry = () => {
|
|
1492
|
+
const registry = /* @__PURE__ */ new Map();
|
|
1493
|
+
return {
|
|
1494
|
+
get: () => registry,
|
|
1495
|
+
register: (networkProviderBuilder) => {
|
|
1496
|
+
registry.set(networkProviderBuilder.chain, networkProviderBuilder);
|
|
1497
|
+
}
|
|
1498
|
+
};
|
|
1499
|
+
};
|
|
1500
|
+
|
|
1501
|
+
//#endregion
|
|
1502
|
+
//#region src/modules/wallets/networks/networkProviderBuilderRegistry/getNetworkProviderBuilderRegistry/getNetworkProviderBuilderRegistry.ts
|
|
1503
|
+
const getNetworkProviderBuilderRegistry = __createRuntimeServiceAccessKey_wrapped("networkProviderBuilderRegistry", createNetworkProviderBuilderRegistry);
|
|
1504
|
+
|
|
1505
|
+
//#endregion
|
|
1506
|
+
//#region src/modules/wallets/networks/getNetworkProviders/getNetworkProviders.ts
|
|
1507
|
+
/**
|
|
1508
|
+
* Retrieves all registered network providers for enabled chains.
|
|
1509
|
+
* @instrumented
|
|
1510
|
+
*/
|
|
1511
|
+
const getNetworkProviders = (client) => {
|
|
1512
|
+
const networkProviderBuilderRegistry = getNetworkProviderBuilderRegistry(client);
|
|
1513
|
+
const registeredNetworkProviderBuilders = Array.from(networkProviderBuilderRegistry.get().values());
|
|
1514
|
+
const networksData = __getNetworksData_wrapped(client);
|
|
1515
|
+
return registeredNetworkProviderBuilders.map(({ builder, chain }) => {
|
|
1516
|
+
return networksData.filter((networkData) => networkData.chain === chain).map(builder);
|
|
1517
|
+
}).flat();
|
|
1518
|
+
};
|
|
1519
|
+
const __getNetworkProviders_impl = getNetworkProviders;
|
|
1520
|
+
const __getNetworkProviders_wrapped = instrumentFunction({
|
|
1521
|
+
fn: __getNetworkProviders_impl,
|
|
1522
|
+
functionName: "getNetworkProviders",
|
|
1523
|
+
getCore: () => {
|
|
1524
|
+
try {
|
|
1525
|
+
return getCore(getDefaultClient());
|
|
1526
|
+
} catch {
|
|
1527
|
+
return;
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
});
|
|
1531
|
+
|
|
1532
|
+
//#endregion
|
|
1533
|
+
//#region src/modules/wallets/networks/getNetworkProviderFromNetworkId/getNetworkProviderFromNetworkId.ts
|
|
1534
|
+
/** @instrumented */
|
|
1535
|
+
const getNetworkProviderFromNetworkId = ({ networkId, chain }, client) => {
|
|
1536
|
+
const networkProviders = __getNetworkProviders_wrapped(client);
|
|
1537
|
+
if (networkProviders.length === 0) throw new NoNetworkProvidersError();
|
|
1538
|
+
const networkProvider = networkProviders.find((networkProvider$1) => networkProvider$1.networkId === networkId && networkProvider$1.chain === chain);
|
|
1539
|
+
assertDefined(networkProvider, `No network provider found for chain ${chain} with network id ${networkId}`);
|
|
1540
|
+
return networkProvider;
|
|
1541
|
+
};
|
|
1542
|
+
const __getNetworkProviderFromNetworkId_impl = getNetworkProviderFromNetworkId;
|
|
1543
|
+
const __getNetworkProviderFromNetworkId_wrapped = instrumentFunction({
|
|
1544
|
+
fn: __getNetworkProviderFromNetworkId_impl,
|
|
1545
|
+
functionName: "getNetworkProviderFromNetworkId",
|
|
1546
|
+
getCore: () => {
|
|
1547
|
+
try {
|
|
1548
|
+
return getCore(getDefaultClient());
|
|
1549
|
+
} catch {
|
|
1550
|
+
return;
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
});
|
|
1554
|
+
|
|
1555
|
+
//#endregion
|
|
1556
|
+
export { REFRESH_USER_STATE_FROM_COOKIE_TRACKER_KEY as A, __createLocalStorageAdapter_wrapped as B, __createCrossTabBroadcast_wrapped as C, FETCH_PROJECT_SETTINGS_TRACKER_KEY as D, __createDeferredPromise_wrapped as E, __generateSessionKeys_wrapped as F, retryOnFail as H, __fetchProjectSettings_wrapped as I, __createStorageKeySchema_wrapped as L, isServerSideRendering as M, getBuffer as N, GENERATE_SESSION_KEYS_TRACKER_KEY as O, __logoutWithReason_wrapped as P, __createStorage_wrapped as R, __createLogger_wrapped as S, CannotTrackError as T, __subscribeWithSelector_wrapped as U, isSignedIn as V, isEqualShallow as W, WalletAlreadyLinkedToAnotherUserError as _, __updateWalletProviderKeysForVerifiedCredentials_wrapped as a, createKeychainService as b, __createSignInMessageStatement_wrapped as c, __createVisit_wrapped as d, hasExtension as f, isCaptchaRequired as g, __consumeCaptchaToken_wrapped as h, __getNetworksData_wrapped as i, REFRESH_USER_STATE_FROM_VALID_TOKEN_TRACKER_KEY as j, INITIALIZE_STORAGE_SYNC_TRACKER_KEY as k, formatSignInMessage as l, __setCaptchaToken_wrapped as m, __getNetworkProviders_wrapped as n, __verifyMessageSignatureOwnership_wrapped as o, __createRealtimeChannelSchema_wrapped as p, getNetworkProviderBuilderRegistry as r, __removeUnverifiedWalletAccount_wrapped as s, __getNetworkProviderFromNetworkId_wrapped as t, __setUnverifiedWalletAccounts_wrapped as u, NoNetworkProvidersError as v, CrossTabBroadcastMessageSchema as w, NativeModuleNotLinkedError as x, __createRealtimeService_wrapped as y, InvalidStorageSet as z };
|
|
1557
|
+
//# sourceMappingURL=getNetworkProviderFromNetworkId-BRWuk0I8.native.esm.js.map
|