@oxy.so/core 1.18.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/cjs/HttpService.js +159 -111
- package/dist/cjs/OxyServices.errors.js +48 -1
- package/dist/cjs/OxyServices.js +263 -60
- package/dist/cjs/api/accounts.js +231 -0
- package/dist/cjs/api/agency.js +102 -0
- package/dist/cjs/api/appData.js +45 -0
- package/dist/cjs/api/apps.js +197 -0
- package/dist/cjs/api/assets.js +329 -0
- package/dist/cjs/api/auth.js +900 -0
- package/dist/cjs/api/billing.js +44 -0
- package/dist/cjs/api/civic.js +289 -0
- package/dist/cjs/api/contacts.js +16 -0
- package/dist/cjs/api/devices.js +351 -0
- package/dist/cjs/api/follows.js +240 -0
- package/dist/cjs/api/identity.js +569 -0
- package/dist/cjs/api/linkedAccounts.js +48 -0
- package/dist/cjs/api/nodes.js +75 -0
- package/dist/cjs/api/notifications.js +75 -0
- package/dist/cjs/api/privacy.js +105 -0
- package/dist/cjs/api/reputation.js +74 -0
- package/dist/cjs/api/session.js +177 -0
- package/dist/cjs/api/store.js +199 -0
- package/dist/cjs/api/topics.js +66 -0
- package/dist/cjs/api/users.js +309 -0
- package/dist/cjs/boot/sessionColdBoot.js +4 -4
- package/dist/cjs/civic/index.js +16 -0
- package/dist/cjs/civic/payloads.js +156 -0
- package/dist/cjs/client/context.js +2 -0
- package/dist/cjs/crypto/identityLink.js +5 -5
- package/dist/cjs/crypto/index.js +44 -0
- package/dist/cjs/crypto/internal.js +37 -0
- package/dist/cjs/crypto/keyManager.js +2 -2
- package/dist/cjs/crypto/polyfill.js +9 -80
- package/dist/cjs/crypto/recoveryPhrase.js +1 -0
- package/dist/cjs/crypto/registrationPow.js +1 -1
- package/dist/cjs/crypto/signatureService.js +1 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
- package/dist/cjs/i18n/accountRoleLabels.js +7 -7
- package/dist/cjs/i18n/index.js +130 -52
- package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
- package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
- package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
- package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
- package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
- package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
- package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
- package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
- package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
- package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
- package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
- package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
- package/dist/cjs/i18n/trustTierLabels.js +2 -2
- package/dist/cjs/index.js +55 -263
- package/dist/cjs/inference/index.js +21 -0
- package/dist/cjs/server/OxyServer.js +521 -0
- package/dist/cjs/server/auth.js +2 -2
- package/dist/cjs/server/index.js +23 -6
- package/dist/cjs/server/middleware.js +1154 -0
- package/dist/cjs/server/namespaces.js +214 -0
- package/dist/cjs/server/rateLimit.js +2 -2
- package/dist/cjs/server/requesterAssertion.js +5 -5
- package/dist/cjs/server/securityHeaders.js +3 -3
- package/dist/cjs/server/traffic.js +7 -6
- package/dist/cjs/server/trafficNodeHttp.js +9 -3
- package/dist/cjs/server/userInvalidation.js +5 -5
- package/dist/cjs/session/accountDialogController.js +23 -23
- package/dist/cjs/session/authStateStore.js +2 -2
- package/dist/cjs/session/identitySession.js +3 -3
- package/dist/cjs/session/index.js +131 -0
- package/dist/cjs/session/refresh.js +37 -30
- package/dist/cjs/session/sessionClientHost.js +5 -5
- package/dist/cjs/session/sharedDeviceCredential.js +3 -2
- package/dist/cjs/shared/utils/networkUtils.js +2 -2
- package/dist/cjs/utils/accountCacheSweep.js +11 -15
- package/dist/cjs/utils/asyncUtils.js +22 -163
- package/dist/cjs/utils/authHelpers.js +2 -2
- package/dist/cjs/utils/authWebUrl.js +3 -4
- package/dist/cjs/utils/avatarUtils.js +2 -2
- package/dist/cjs/utils/cache.js +32 -2
- package/dist/cjs/utils/cacheKey.js +5 -10
- package/dist/cjs/utils/deviceManager.js +17 -16
- package/dist/cjs/utils/edgeRegion.js +2 -3
- package/dist/cjs/utils/identityCacheSweep.js +6 -10
- package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
- package/dist/cjs/utils/requestUtils.js +40 -33
- package/dist/cjs/utils/sessionUtils.js +0 -2
- package/dist/cjs/utils/tokenClaims.js +34 -0
- package/dist/esm/HttpService.js +160 -112
- package/dist/esm/OxyServices.errors.js +45 -0
- package/dist/esm/OxyServices.js +262 -57
- package/dist/esm/api/accounts.js +218 -0
- package/dist/esm/api/agency.js +95 -0
- package/dist/esm/api/appData.js +40 -0
- package/dist/esm/api/apps.js +191 -0
- package/dist/esm/api/assets.js +324 -0
- package/dist/esm/api/auth.js +858 -0
- package/dist/esm/api/billing.js +40 -0
- package/dist/esm/api/civic.js +250 -0
- package/dist/esm/api/contacts.js +12 -0
- package/dist/esm/api/devices.js +346 -0
- package/dist/esm/api/follows.js +236 -0
- package/dist/esm/api/identity.js +527 -0
- package/dist/esm/api/linkedAccounts.js +44 -0
- package/dist/esm/api/nodes.js +71 -0
- package/dist/esm/api/notifications.js +71 -0
- package/dist/esm/api/privacy.js +101 -0
- package/dist/esm/api/reputation.js +70 -0
- package/dist/esm/api/session.js +173 -0
- package/dist/esm/api/store.js +192 -0
- package/dist/esm/api/topics.js +62 -0
- package/dist/esm/api/users.js +272 -0
- package/dist/esm/boot/sessionColdBoot.js +4 -4
- package/dist/esm/civic/index.js +10 -0
- package/dist/esm/civic/payloads.js +118 -0
- package/dist/esm/client/context.js +1 -0
- package/dist/esm/crypto/identityLink.js +5 -5
- package/dist/esm/crypto/index.js +24 -0
- package/dist/esm/crypto/internal.js +19 -0
- package/dist/esm/crypto/keyManager.js +2 -2
- package/dist/esm/crypto/polyfill.js +10 -81
- package/dist/esm/crypto/recoveryPhrase.js +1 -0
- package/dist/esm/crypto/registrationPow.js +1 -1
- package/dist/esm/crypto/signatureService.js +1 -0
- package/dist/esm/i18n/accountCategoryLabels.js +2 -2
- package/dist/esm/i18n/accountRoleLabels.js +1 -1
- package/dist/esm/i18n/index.js +93 -52
- package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
- package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
- package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
- package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
- package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
- package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
- package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
- package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
- package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
- package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
- package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
- package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
- package/dist/esm/i18n/trustTierLabels.js +1 -1
- package/dist/esm/index.js +30 -166
- package/dist/esm/inference/index.js +13 -0
- package/dist/esm/server/OxyServer.js +516 -0
- package/dist/esm/server/auth.js +2 -2
- package/dist/esm/server/index.js +10 -5
- package/dist/esm/server/middleware.js +1147 -0
- package/dist/esm/server/namespaces.js +206 -0
- package/dist/esm/server/rateLimit.js +2 -2
- package/dist/esm/server/requesterAssertion.js +5 -5
- package/dist/esm/server/securityHeaders.js +3 -3
- package/dist/esm/server/traffic.js +7 -6
- package/dist/esm/server/trafficNodeHttp.js +9 -3
- package/dist/esm/server/userInvalidation.js +5 -5
- package/dist/esm/session/accountDialogController.js +23 -23
- package/dist/esm/session/authStateStore.js +2 -2
- package/dist/esm/session/identitySession.js +3 -3
- package/dist/esm/session/index.js +82 -0
- package/dist/esm/session/refresh.js +37 -30
- package/dist/esm/session/sessionClientHost.js +5 -5
- package/dist/esm/session/sharedDeviceCredential.js +3 -2
- package/dist/esm/shared/utils/networkUtils.js +2 -2
- package/dist/esm/utils/accountCacheSweep.js +11 -15
- package/dist/esm/utils/asyncUtils.js +22 -151
- package/dist/esm/utils/authHelpers.js +2 -2
- package/dist/esm/utils/authWebUrl.js +3 -4
- package/dist/esm/utils/avatarUtils.js +2 -2
- package/dist/esm/utils/cache.js +32 -2
- package/dist/esm/utils/cacheKey.js +5 -10
- package/dist/esm/utils/deviceManager.js +17 -16
- package/dist/esm/utils/edgeRegion.js +1 -2
- package/dist/esm/utils/identityCacheSweep.js +6 -10
- package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
- package/dist/esm/utils/requestUtils.js +40 -33
- package/dist/esm/utils/sessionUtils.js +0 -2
- package/dist/esm/utils/tokenClaims.js +31 -0
- package/dist/types/HttpService.d.ts +26 -9
- package/dist/types/OxyServices.d.ts +160 -131
- package/dist/types/OxyServices.errors.d.ts +42 -0
- package/dist/types/api/accounts.d.ts +415 -0
- package/dist/types/api/agency.d.ts +135 -0
- package/dist/types/api/appData.d.ts +27 -0
- package/dist/types/api/apps.d.ts +433 -0
- package/dist/types/api/assets.d.ts +174 -0
- package/dist/types/api/auth.d.ts +766 -0
- package/dist/types/api/billing.d.ts +113 -0
- package/dist/types/api/civic.d.ts +203 -0
- package/dist/types/api/contacts.d.ts +31 -0
- package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
- package/dist/types/api/follows.d.ts +236 -0
- package/dist/types/api/identity.d.ts +275 -0
- package/dist/types/api/linkedAccounts.d.ts +48 -0
- package/dist/types/api/nodes.d.ts +102 -0
- package/dist/types/api/notifications.d.ts +77 -0
- package/dist/types/api/privacy.d.ts +43 -0
- package/dist/types/api/reputation.d.ts +50 -0
- package/dist/types/api/session.d.ts +85 -0
- package/dist/types/api/store.d.ts +278 -0
- package/dist/types/api/topics.d.ts +34 -0
- package/dist/types/api/users.d.ts +134 -0
- package/dist/types/boot/sessionColdBoot.d.ts +1 -1
- package/dist/types/civic/index.d.ts +10 -0
- package/dist/types/civic/payloads.d.ts +83 -0
- package/dist/types/client/context.d.ts +33 -0
- package/dist/types/crypto/identityLink.d.ts +5 -5
- package/dist/types/crypto/index.d.ts +24 -0
- package/dist/types/crypto/internal.d.ts +19 -0
- package/dist/types/crypto/polyfill.d.ts +6 -9
- package/dist/types/crypto/registrationPow.d.ts +1 -1
- package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
- package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
- package/dist/types/i18n/index.d.ts +20 -1
- package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
- package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
- package/dist/types/i18n/locales/de-DE.d.ts +386 -0
- package/dist/types/i18n/locales/en-US.d.ts +2034 -0
- package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
- package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
- package/dist/types/i18n/locales/it-IT.d.ts +386 -0
- package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
- package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
- package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
- package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
- package/dist/types/index.d.ts +46 -95
- package/dist/types/inference/index.d.ts +22 -0
- package/dist/types/models/interfaces.d.ts +1 -22
- package/dist/types/server/OxyServer.d.ts +183 -0
- package/dist/types/server/auth.d.ts +10 -7
- package/dist/types/server/index.d.ts +10 -4
- package/dist/types/server/middleware.d.ts +291 -0
- package/dist/types/server/namespaces.d.ts +98 -0
- package/dist/types/server/rateLimit.d.ts +7 -5
- package/dist/types/server/requesterAssertion.d.ts +14 -11
- package/dist/types/server/securityHeaders.d.ts +4 -5
- package/dist/types/server/userInvalidation.d.ts +10 -8
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/accountDialogController.d.ts +8 -8
- package/dist/types/session/accountSwitchTargets.d.ts +1 -1
- package/dist/types/session/authStateStore.d.ts +7 -6
- package/dist/types/session/index.d.ts +40 -0
- package/dist/types/utils/accountCacheSweep.d.ts +7 -10
- package/dist/types/utils/apiUtils.d.ts +3 -3
- package/dist/types/utils/asyncUtils.d.ts +11 -58
- package/dist/types/utils/authWebUrl.d.ts +3 -4
- package/dist/types/utils/avatarUtils.d.ts +5 -6
- package/dist/types/utils/cache.d.ts +11 -3
- package/dist/types/utils/commonsApproval.d.ts +1 -1
- package/dist/types/utils/edgeRegion.d.ts +1 -2
- package/dist/types/utils/identityCacheSweep.d.ts +6 -4
- package/dist/types/utils/oauthPkce.d.ts +2 -2
- package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
- package/dist/types/utils/requestUtils.d.ts +18 -14
- package/dist/types/utils/tokenClaims.d.ts +9 -0
- package/package.json +68 -7
- package/src/HttpService.ts +166 -131
- package/src/OxyServices.errors.ts +73 -0
- package/src/OxyServices.ts +289 -164
- package/src/api/accounts.ts +579 -0
- package/src/api/agency.ts +277 -0
- package/src/api/appData.ts +63 -0
- package/src/api/apps.ts +596 -0
- package/src/api/assets.ts +416 -0
- package/src/api/auth.ts +1457 -0
- package/src/api/billing.ts +144 -0
- package/src/api/civic.ts +428 -0
- package/src/api/contacts.ts +41 -0
- package/src/api/devices.ts +438 -0
- package/src/api/follows.ts +414 -0
- package/src/api/identity.ts +727 -0
- package/src/api/linkedAccounts.ts +78 -0
- package/src/api/nodes.ts +169 -0
- package/src/api/notifications.ts +135 -0
- package/src/api/privacy.ts +120 -0
- package/src/api/reputation.ts +134 -0
- package/src/api/session.ts +210 -0
- package/src/api/store.ts +435 -0
- package/src/api/topics.ts +83 -0
- package/src/api/users.ts +357 -0
- package/src/boot/sessionColdBoot.ts +4 -4
- package/src/civic/index.ts +12 -0
- package/src/civic/payloads.ts +175 -0
- package/src/client/context.ts +34 -0
- package/src/crypto/identityLink.ts +5 -5
- package/src/crypto/index.ts +39 -0
- package/src/crypto/internal.ts +20 -0
- package/src/crypto/keyManager.ts +2 -2
- package/src/crypto/polyfill.ts +9 -89
- package/src/crypto/recoveryPhrase.ts +1 -0
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +1 -0
- package/src/i18n/accountCategoryLabels.ts +2 -2
- package/src/i18n/accountRoleLabels.ts +2 -2
- package/src/i18n/index.ts +105 -54
- package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
- package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
- package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
- package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
- package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
- package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
- package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
- package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
- package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
- package/src/i18n/reputationCategoryLabels.ts +1 -1
- package/src/i18n/trustTierLabels.ts +1 -1
- package/src/index.ts +170 -501
- package/src/inference/index.ts +48 -0
- package/src/models/interfaces.ts +1 -22
- package/src/server/OxyServer.ts +637 -0
- package/src/server/auth.ts +12 -8
- package/src/server/index.ts +28 -5
- package/src/server/middleware.ts +1520 -0
- package/src/server/namespaces.ts +257 -0
- package/src/server/rateLimit.ts +10 -9
- package/src/server/requesterAssertion.ts +13 -10
- package/src/server/securityHeaders.ts +7 -8
- package/src/server/traffic.ts +6 -6
- package/src/server/trafficNodeHttp.ts +7 -3
- package/src/server/userInvalidation.ts +9 -9
- package/src/session/accountDelegationAccess.ts +1 -1
- package/src/session/accountDialogController.ts +24 -24
- package/src/session/accountSwitchTargets.ts +1 -1
- package/src/session/authStateStore.ts +9 -8
- package/src/session/identitySession.ts +3 -3
- package/src/session/index.ts +210 -0
- package/src/session/refresh.ts +36 -30
- package/src/session/sessionClientHost.ts +5 -5
- package/src/session/sharedDeviceCredential.ts +3 -2
- package/src/shared/utils/networkUtils.ts +2 -2
- package/src/utils/accountCacheSweep.ts +11 -15
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +38 -235
- package/src/utils/authHelpers.ts +2 -2
- package/src/utils/authWebUrl.ts +3 -4
- package/src/utils/avatarUtils.ts +4 -7
- package/src/utils/cache.ts +36 -5
- package/src/utils/cacheKey.ts +5 -9
- package/src/utils/commonsApproval.ts +1 -1
- package/src/utils/deviceManager.ts +17 -16
- package/src/utils/edgeRegion.ts +1 -2
- package/src/utils/identityCacheSweep.ts +7 -12
- package/src/utils/oauthPkce.ts +2 -2
- package/src/utils/oxyServiceEnvironment.ts +3 -7
- package/src/utils/requestUtils.ts +48 -44
- package/src/utils/sessionUtils.ts +0 -2
- package/src/utils/tokenClaims.ts +38 -0
- package/dist/cjs/.tsbuildinfo +0 -1
- package/dist/cjs/OxyServices.base.js +0 -392
- package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
- package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
- package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
- package/dist/cjs/mixins/OxyServices.agency.js +0 -154
- package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
- package/dist/cjs/mixins/OxyServices.appData.js +0 -108
- package/dist/cjs/mixins/OxyServices.assets.js +0 -854
- package/dist/cjs/mixins/OxyServices.auth.js +0 -1495
- package/dist/cjs/mixins/OxyServices.chains.js +0 -73
- package/dist/cjs/mixins/OxyServices.civic.js +0 -611
- package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
- package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
- package/dist/cjs/mixins/OxyServices.devices.js +0 -116
- package/dist/cjs/mixins/OxyServices.features.js +0 -335
- package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
- package/dist/cjs/mixins/OxyServices.identity.js +0 -562
- package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
- package/dist/cjs/mixins/OxyServices.inference.js +0 -59
- package/dist/cjs/mixins/OxyServices.language.js +0 -125
- package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
- package/dist/cjs/mixins/OxyServices.location.js +0 -43
- package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
- package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
- package/dist/cjs/mixins/OxyServices.payment.js +0 -158
- package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
- package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
- package/dist/cjs/mixins/OxyServices.security.js +0 -89
- package/dist/cjs/mixins/OxyServices.store.js +0 -266
- package/dist/cjs/mixins/OxyServices.topics.js +0 -137
- package/dist/cjs/mixins/OxyServices.user.js +0 -954
- package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
- package/dist/cjs/mixins/index.js +0 -136
- package/dist/cjs/mixins/mixinHelpers.js +0 -53
- package/dist/cjs/utils/webauthnOrigin.js +0 -51
- package/dist/esm/.tsbuildinfo +0 -1
- package/dist/esm/OxyServices.base.js +0 -388
- package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
- package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
- package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
- package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
- package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
- package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/esm/mixins/OxyServices.accounts.js +0 -543
- package/dist/esm/mixins/OxyServices.agency.js +0 -151
- package/dist/esm/mixins/OxyServices.analytics.js +0 -46
- package/dist/esm/mixins/OxyServices.appData.js +0 -103
- package/dist/esm/mixins/OxyServices.assets.js +0 -851
- package/dist/esm/mixins/OxyServices.auth.js +0 -1455
- package/dist/esm/mixins/OxyServices.chains.js +0 -70
- package/dist/esm/mixins/OxyServices.civic.js +0 -605
- package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
- package/dist/esm/mixins/OxyServices.contacts.js +0 -47
- package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
- package/dist/esm/mixins/OxyServices.devices.js +0 -113
- package/dist/esm/mixins/OxyServices.features.js +0 -332
- package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
- package/dist/esm/mixins/OxyServices.identity.js +0 -558
- package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
- package/dist/esm/mixins/OxyServices.inference.js +0 -56
- package/dist/esm/mixins/OxyServices.language.js +0 -122
- package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
- package/dist/esm/mixins/OxyServices.location.js +0 -40
- package/dist/esm/mixins/OxyServices.nodes.js +0 -172
- package/dist/esm/mixins/OxyServices.notifications.js +0 -60
- package/dist/esm/mixins/OxyServices.payment.js +0 -155
- package/dist/esm/mixins/OxyServices.privacy.js +0 -196
- package/dist/esm/mixins/OxyServices.reputation.js +0 -286
- package/dist/esm/mixins/OxyServices.security.js +0 -86
- package/dist/esm/mixins/OxyServices.store.js +0 -263
- package/dist/esm/mixins/OxyServices.topics.js +0 -134
- package/dist/esm/mixins/OxyServices.user.js +0 -951
- package/dist/esm/mixins/OxyServices.utility.js +0 -1397
- package/dist/esm/mixins/index.js +0 -133
- package/dist/esm/mixins/mixinHelpers.js +0 -48
- package/dist/esm/utils/webauthnOrigin.js +0 -48
- package/dist/types/.tsbuildinfo +0 -1
- package/dist/types/OxyServices.base.d.ts +0 -189
- package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
- package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
- package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
- package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
- package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
- package/dist/types/mixins/OxyServices.auth.d.ts +0 -998
- package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
- package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
- package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
- package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
- package/dist/types/mixins/OxyServices.features.d.ts +0 -250
- package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
- package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
- package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
- package/dist/types/mixins/OxyServices.language.d.ts +0 -87
- package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
- package/dist/types/mixins/OxyServices.location.d.ts +0 -70
- package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
- package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
- package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
- package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
- package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
- package/dist/types/mixins/OxyServices.security.d.ts +0 -84
- package/dist/types/mixins/OxyServices.store.d.ts +0 -334
- package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
- package/dist/types/mixins/OxyServices.user.d.ts +0 -600
- package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
- package/dist/types/mixins/index.d.ts +0 -87
- package/dist/types/mixins/mixinHelpers.d.ts +0 -31
- package/dist/types/utils/webauthnOrigin.d.ts +0 -32
- package/src/OxyServices.base.ts +0 -480
- package/src/__tests__/authSocket.test.ts +0 -96
- package/src/__tests__/fixEsmImports.test.ts +0 -132
- package/src/__tests__/httpServiceAbort.test.ts +0 -308
- package/src/__tests__/httpServiceActivityId.test.ts +0 -49
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
- package/src/__tests__/httpServiceCache.test.ts +0 -318
- package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
- package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
- package/src/__tests__/httpServiceWrites.test.ts +0 -175
- package/src/__tests__/inSessionRefresh.test.ts +0 -313
- package/src/__tests__/linkedClient.test.ts +0 -363
- package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
- package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
- package/src/__tests__/publicInterfaceParity.test.ts +0 -75
- package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
- package/src/__tests__/serviceIdentityWhenAnonymous.test.ts +0 -159
- package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
- package/src/__tests__/userIdentity.test.ts +0 -143
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
- package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
- package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
- package/src/crypto/__tests__/identityLink.test.ts +0 -18
- package/src/crypto/__tests__/identityMocks.ts +0 -125
- package/src/crypto/__tests__/identityProof.test.ts +0 -81
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
- package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
- package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
- package/src/crypto/__tests__/keyManager.test.ts +0 -329
- package/src/crypto/__tests__/polyfill.test.ts +0 -109
- package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
- package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
- package/src/crypto/__tests__/registrationPow.test.ts +0 -61
- package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
- package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
- package/src/crypto/__tests__/signedRecord.test.ts +0 -230
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
- package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
- package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
- package/src/i18n/locales/de-DE.json +0 -306
- package/src/i18n/locales/es-ES.json +0 -2127
- package/src/i18n/locales/ja-JP.json +0 -306
- package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
- package/src/logger/__tests__/logger.test.ts +0 -207
- package/src/mixins/OxyServices.accounts.ts +0 -1330
- package/src/mixins/OxyServices.agency.ts +0 -353
- package/src/mixins/OxyServices.analytics.ts +0 -53
- package/src/mixins/OxyServices.appData.ts +0 -158
- package/src/mixins/OxyServices.assets.ts +0 -964
- package/src/mixins/OxyServices.auth.ts +0 -2083
- package/src/mixins/OxyServices.chains.ts +0 -134
- package/src/mixins/OxyServices.civic.ts +0 -945
- package/src/mixins/OxyServices.connectedApps.ts +0 -212
- package/src/mixins/OxyServices.contacts.ts +0 -73
- package/src/mixins/OxyServices.devices.ts +0 -120
- package/src/mixins/OxyServices.features.ts +0 -454
- package/src/mixins/OxyServices.followGraph.ts +0 -293
- package/src/mixins/OxyServices.identity.ts +0 -787
- package/src/mixins/OxyServices.identityBackup.ts +0 -250
- package/src/mixins/OxyServices.inference.ts +0 -57
- package/src/mixins/OxyServices.language.ts +0 -144
- package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
- package/src/mixins/OxyServices.location.ts +0 -46
- package/src/mixins/OxyServices.nodes.ts +0 -337
- package/src/mixins/OxyServices.notifications.ts +0 -142
- package/src/mixins/OxyServices.payment.ts +0 -163
- package/src/mixins/OxyServices.privacy.ts +0 -219
- package/src/mixins/OxyServices.reputation.ts +0 -436
- package/src/mixins/OxyServices.security.ts +0 -110
- package/src/mixins/OxyServices.store.ts +0 -585
- package/src/mixins/OxyServices.topics.ts +0 -169
- package/src/mixins/OxyServices.user.ts +0 -1208
- package/src/mixins/OxyServices.utility.ts +0 -1803
- package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
- package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
- package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
- package/src/mixins/__tests__/accountEvents.test.ts +0 -158
- package/src/mixins/__tests__/accounts.test.ts +0 -727
- package/src/mixins/__tests__/agency.test.ts +0 -120
- package/src/mixins/__tests__/appData.test.ts +0 -203
- package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
- package/src/mixins/__tests__/assetUpload.test.ts +0 -191
- package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
- package/src/mixins/__tests__/chains.test.ts +0 -113
- package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
- package/src/mixins/__tests__/connectedApps.test.ts +0 -146
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
- package/src/mixins/__tests__/followGraph.test.ts +0 -147
- package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
- package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
- package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
- package/src/mixins/__tests__/identityBackup.test.ts +0 -315
- package/src/mixins/__tests__/identityLink.test.ts +0 -89
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
- package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
- package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
- package/src/mixins/__tests__/notifications.read.test.ts +0 -82
- package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
- package/src/mixins/__tests__/reputation.test.ts +0 -522
- package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
- package/src/mixins/__tests__/store.test.ts +0 -304
- package/src/mixins/__tests__/topics.test.ts +0 -155
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
- package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
- package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
- package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
- package/src/mixins/index.ts +0 -203
- package/src/mixins/mixinHelpers.ts +0 -69
- package/src/server/__tests__/auth.test.ts +0 -78
- package/src/server/__tests__/capabilityTicket.test.ts +0 -111
- package/src/server/__tests__/cors.socket.test.ts +0 -225
- package/src/server/__tests__/cors.test.ts +0 -158
- package/src/server/__tests__/rateLimit.test.ts +0 -257
- package/src/server/__tests__/requesterAssertion.test.ts +0 -359
- package/src/server/__tests__/safeFetch.test.ts +0 -232
- package/src/server/__tests__/securityHeaders.test.ts +0 -387
- package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
- package/src/server/__tests__/traffic.test.ts +0 -180
- package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
- package/src/server/__tests__/userInvalidation.test.ts +0 -203
- package/src/server/__tests__/verifySecret.test.ts +0 -40
- package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
- package/src/server/__tests__/workloadIdentity.test.ts +0 -128
- package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
- package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
- package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
- package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
- package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
- package/src/session/__tests__/SessionClient.state.test.ts +0 -78
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
- package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
- package/src/session/__tests__/accountDialogController.test.ts +0 -2502
- package/src/session/__tests__/accountDialogShape.test.ts +0 -120
- package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
- package/src/session/__tests__/authStateStore.test.ts +0 -451
- package/src/session/__tests__/deviceDirectory.test.ts +0 -422
- package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
- package/src/session/__tests__/identityPin.test.ts +0 -131
- package/src/session/__tests__/identitySession.test.ts +0 -194
- package/src/session/__tests__/projectSessionState.test.ts +0 -105
- package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
- package/src/session/__tests__/refresh.test.ts +0 -606
- package/src/session/__tests__/sessionIntegration.test.ts +0 -209
- package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
- package/src/utils/__tests__/accountUtils.test.ts +0 -151
- package/src/utils/__tests__/activityId.test.ts +0 -45
- package/src/utils/__tests__/asyncUtils.test.ts +0 -279
- package/src/utils/__tests__/authWebUrl.test.ts +0 -15
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
- package/src/utils/__tests__/coldBoot.test.ts +0 -496
- package/src/utils/__tests__/commonsApproval.test.ts +0 -60
- package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
- package/src/utils/__tests__/languageUtils.test.ts +0 -244
- package/src/utils/__tests__/oauthPkce.test.ts +0 -303
- package/src/utils/__tests__/officialOrigins.test.ts +0 -31
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
- package/src/utils/__tests__/profileLinks.test.ts +0 -180
- package/src/utils/__tests__/redactUrl.test.ts +0 -33
- package/src/utils/__tests__/registrableApex.test.ts +0 -62
- package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
- package/src/utils/__tests__/textNormalization.test.ts +0 -205
- package/src/utils/__tests__/validationUtils.test.ts +0 -703
- package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
- package/src/utils/webauthnOrigin.ts +0 -52
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for KeyManager atomic-write & backup-restore safety under FLAKY storage.
|
|
3
|
-
*
|
|
4
|
-
* These pin the "never leave the device with zero recoverable copies of a
|
|
5
|
-
* healthy identity" invariant. Each scenario corresponds to a real
|
|
6
|
-
* account-loss / account-switch bug that a half-failed SecureStore write could
|
|
7
|
-
* otherwise cause:
|
|
8
|
-
*
|
|
9
|
-
* 1. A failed OVERWRITE must roll the primary back to the ORIGINAL identity
|
|
10
|
-
* and must keep a recoverable backup of it — never switch to the
|
|
11
|
-
* half-written new identity.
|
|
12
|
-
* 2. A transient read failure must not cause restoreIdentityFromBackup() to
|
|
13
|
-
* clobber a healthy-but-momentarily-locked primary with a stale backup.
|
|
14
|
-
* 3. restoreIdentityFromBackup() must refuse when the backup identifies a
|
|
15
|
-
* different account than a private key still present in the primary slot.
|
|
16
|
-
* 4. A first-time create still writes a backup (no regression).
|
|
17
|
-
*
|
|
18
|
-
* The identity now lives in the isolated v2 slots (primary service `oxy_identity`,
|
|
19
|
-
* backup service `oxy_identity_backup`), so assertions read/write via the
|
|
20
|
-
* service-scoped mock helpers.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { setPlatformOS } from '../../utils/platform';
|
|
24
|
-
|
|
25
|
-
jest.mock(
|
|
26
|
-
'expo-secure-store',
|
|
27
|
-
() => {
|
|
28
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
29
|
-
const { createSecureStoreMock } = require('./identityMocks');
|
|
30
|
-
return createSecureStoreMock();
|
|
31
|
-
},
|
|
32
|
-
{ virtual: true },
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
jest.mock(
|
|
36
|
-
'expo-crypto',
|
|
37
|
-
() => ({
|
|
38
|
-
__esModule: true,
|
|
39
|
-
getRandomBytes: (length: number) => {
|
|
40
|
-
const out = new Uint8Array(length);
|
|
41
|
-
for (let i = 0; i < length; i++) out[i] = (Math.random() * 256) & 0xff;
|
|
42
|
-
return out;
|
|
43
|
-
},
|
|
44
|
-
digestStringAsync: async () => '0'.repeat(64),
|
|
45
|
-
CryptoDigestAlgorithm: { SHA256: 'SHA-256' },
|
|
46
|
-
}),
|
|
47
|
-
{ virtual: true },
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
jest.mock('@oxy.so/protocol', () => {
|
|
51
|
-
const actual = jest.requireActual('@oxy.so/protocol');
|
|
52
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
53
|
-
const { createAsyncStorageMock } = require('./identityMocks');
|
|
54
|
-
const asyncStorage = createAsyncStorageMock();
|
|
55
|
-
return {
|
|
56
|
-
__esModule: true,
|
|
57
|
-
...actual,
|
|
58
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
59
|
-
loadExpoCrypto: async () => require('expo-crypto'),
|
|
60
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
61
|
-
loadSecureStore: async () => require('expo-secure-store'),
|
|
62
|
-
loadAsyncStorage: async () => ({ default: asyncStorage }),
|
|
63
|
-
loadSharedIdentityBridge: async () => null,
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
65
|
-
loadNodeCrypto: async () => require('crypto'),
|
|
66
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
67
|
-
getRandomBytesRN: (n: number) => require('expo-crypto').getRandomBytes(n),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// v2 slot key names + keychain services (must match keyManager.ts).
|
|
72
|
-
const PRIMARY_SVC = 'oxy_identity';
|
|
73
|
-
const BACKUP_SVC = 'oxy_identity_backup';
|
|
74
|
-
const V2_PRIV = 'oxy_identity_private_key_v2';
|
|
75
|
-
const V2_PUB = 'oxy_identity_public_key_v2';
|
|
76
|
-
const V2_BPRIV = 'oxy_identity_backup_private_key_v2';
|
|
77
|
-
const V2_BPUB = 'oxy_identity_backup_public_key_v2';
|
|
78
|
-
|
|
79
|
-
interface SecureStoreTestHandle {
|
|
80
|
-
__resetStore__: () => void;
|
|
81
|
-
__getRaw__: (key: string, service?: string) => string | null;
|
|
82
|
-
__setRaw__: (key: string, value: string, service?: string) => void;
|
|
83
|
-
__deleteRaw__: (key: string, service?: string) => void;
|
|
84
|
-
__failPlan__: { failKey?: string; failOp?: 'set' | 'get'; failTimes?: number; failService?: string };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
describe('KeyManager atomicity & recoverability under flaky storage', () => {
|
|
88
|
-
let KeyManager: typeof import('../keyManager').KeyManager;
|
|
89
|
-
|
|
90
|
-
const resetCaches = () => {
|
|
91
|
-
const km = KeyManager as unknown as {
|
|
92
|
-
cachedPublicKey: unknown;
|
|
93
|
-
cachedHasIdentity: unknown;
|
|
94
|
-
cachedPublicKeyResolved: unknown;
|
|
95
|
-
};
|
|
96
|
-
km.cachedPublicKey = null;
|
|
97
|
-
km.cachedHasIdentity = null;
|
|
98
|
-
km.cachedPublicKeyResolved = false;
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
beforeAll(() => {
|
|
102
|
-
setPlatformOS('ios');
|
|
103
|
-
(globalThis as unknown as { navigator: unknown }).navigator = { product: 'ReactNative' };
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
beforeEach(async () => {
|
|
107
|
-
jest.resetModules();
|
|
108
|
-
setPlatformOS('ios');
|
|
109
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
110
|
-
ss.__resetStore__();
|
|
111
|
-
const km = await import('../keyManager');
|
|
112
|
-
KeyManager = km.KeyManager;
|
|
113
|
-
resetCaches();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('a failed OVERWRITE leaves the ORIGINAL identity intact and recoverable (no silent switch)', async () => {
|
|
117
|
-
const originalPublic = await KeyManager.createIdentity();
|
|
118
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
119
|
-
const originalPriv = ss.__getRaw__(V2_PRIV, PRIMARY_SVC);
|
|
120
|
-
resetCaches();
|
|
121
|
-
|
|
122
|
-
// The new primary private write fails mid-overwrite.
|
|
123
|
-
ss.__failPlan__.failOp = 'set';
|
|
124
|
-
ss.__failPlan__.failKey = V2_PRIV;
|
|
125
|
-
ss.__failPlan__.failService = PRIMARY_SVC;
|
|
126
|
-
await expect(KeyManager.createIdentity({ overwrite: true })).rejects.toBeDefined();
|
|
127
|
-
|
|
128
|
-
// Recover from the simulated fault.
|
|
129
|
-
ss.__failPlan__.failKey = undefined;
|
|
130
|
-
ss.__failPlan__.failOp = undefined;
|
|
131
|
-
ss.__failPlan__.failService = undefined;
|
|
132
|
-
resetCaches();
|
|
133
|
-
|
|
134
|
-
// Primary must still be the original identity (rolled back).
|
|
135
|
-
expect(await KeyManager.hasIdentity()).toBe(true);
|
|
136
|
-
expect(await KeyManager.getPublicKey()).toBe(originalPublic);
|
|
137
|
-
expect(ss.__getRaw__(V2_PRIV, PRIMARY_SVC)).toBe(originalPriv);
|
|
138
|
-
|
|
139
|
-
// And the backup must still hold the ORIGINAL identity, never the new one.
|
|
140
|
-
expect(ss.__getRaw__(V2_BPRIV, BACKUP_SVC)).toBe(originalPriv);
|
|
141
|
-
expect(ss.__getRaw__(V2_BPUB, BACKUP_SVC)).toBe(originalPublic);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it('a failed final backup refresh rejects and rolls back instead of succeeding with a stale backup', async () => {
|
|
145
|
-
const originalPublic = await KeyManager.createIdentity();
|
|
146
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
147
|
-
const originalPriv = ss.__getRaw__(V2_PRIV, PRIMARY_SVC);
|
|
148
|
-
resetCaches();
|
|
149
|
-
|
|
150
|
-
// Let the new primary write and verify, then fail exactly once while
|
|
151
|
-
// refreshing the backup to the new identity. This used to return success
|
|
152
|
-
// with primary=B and backup=A, enabling a later absent-primary restore to
|
|
153
|
-
// silently switch back to A.
|
|
154
|
-
ss.__failPlan__.failOp = 'set';
|
|
155
|
-
ss.__failPlan__.failKey = V2_BPUB;
|
|
156
|
-
ss.__failPlan__.failService = BACKUP_SVC;
|
|
157
|
-
ss.__failPlan__.failTimes = 1;
|
|
158
|
-
await expect(KeyManager.createIdentity({ overwrite: true })).rejects.toBeDefined();
|
|
159
|
-
|
|
160
|
-
resetCaches();
|
|
161
|
-
|
|
162
|
-
// The operation failed atomically: primary and backup both still identify
|
|
163
|
-
// the original account, so callers cannot observe success with a stale
|
|
164
|
-
// cross-account backup.
|
|
165
|
-
expect(await KeyManager.hasIdentity()).toBe(true);
|
|
166
|
-
expect(await KeyManager.getPublicKey()).toBe(originalPublic);
|
|
167
|
-
expect(ss.__getRaw__(V2_PRIV, PRIMARY_SVC)).toBe(originalPriv);
|
|
168
|
-
expect(ss.__getRaw__(V2_PUB, PRIMARY_SVC)).toBe(originalPublic);
|
|
169
|
-
expect(ss.__getRaw__(V2_BPRIV, BACKUP_SVC)).toBe(originalPriv);
|
|
170
|
-
expect(ss.__getRaw__(V2_BPUB, BACKUP_SVC)).toBe(originalPublic);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('restoreIdentityFromBackup does NOT clobber a healthy primary that is only transiently unreadable', async () => {
|
|
174
|
-
const original = await KeyManager.createIdentity();
|
|
175
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
176
|
-
|
|
177
|
-
// Put a DIFFERENT identity in the backup slot (simulates a stale backup
|
|
178
|
-
// from a previous account that a failed backup-refresh left behind).
|
|
179
|
-
const other = await KeyManager.generateKeyPair();
|
|
180
|
-
ss.__setRaw__(V2_BPRIV, other.privateKey, BACKUP_SVC);
|
|
181
|
-
ss.__setRaw__(V2_BPUB, other.publicKey, BACKUP_SVC);
|
|
182
|
-
resetCaches();
|
|
183
|
-
|
|
184
|
-
// Make the primary PRIVATE read throw (transient keychain lock).
|
|
185
|
-
ss.__failPlan__.failOp = 'get';
|
|
186
|
-
ss.__failPlan__.failKey = V2_PRIV;
|
|
187
|
-
ss.__failPlan__.failService = PRIMARY_SVC;
|
|
188
|
-
|
|
189
|
-
const restored = await KeyManager.restoreIdentityFromBackup();
|
|
190
|
-
expect(restored).toBe(false); // refused — transient read must not trigger a restore
|
|
191
|
-
|
|
192
|
-
// Clear the fault; the original primary must be intact and unchanged.
|
|
193
|
-
ss.__failPlan__.failKey = undefined;
|
|
194
|
-
ss.__failPlan__.failOp = undefined;
|
|
195
|
-
ss.__failPlan__.failService = undefined;
|
|
196
|
-
resetCaches();
|
|
197
|
-
expect(await KeyManager.getPublicKey()).toBe(original);
|
|
198
|
-
expect(ss.__getRaw__(V2_PUB, PRIMARY_SVC)).toBe(original);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('restoreIdentityFromBackup refuses when a present primary private key identifies a different account than the backup', async () => {
|
|
202
|
-
// Primary holds identity A (valid). Corrupt ONLY the public key so the
|
|
203
|
-
// primary fails its consistency check but the private key still derives a
|
|
204
|
-
// real, different identity than the backup.
|
|
205
|
-
const a = await KeyManager.createIdentity();
|
|
206
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
207
|
-
|
|
208
|
-
// Backup holds a DIFFERENT identity B.
|
|
209
|
-
const b = await KeyManager.generateKeyPair();
|
|
210
|
-
ss.__setRaw__(V2_BPRIV, b.privateKey, BACKUP_SVC);
|
|
211
|
-
ss.__setRaw__(V2_BPUB, b.publicKey, BACKUP_SVC);
|
|
212
|
-
// Corrupt A's stored public key (private key A still present & valid).
|
|
213
|
-
ss.__setRaw__(V2_PUB, `04${'e'.repeat(128)}`, PRIMARY_SVC);
|
|
214
|
-
resetCaches();
|
|
215
|
-
|
|
216
|
-
const restored = await KeyManager.restoreIdentityFromBackup();
|
|
217
|
-
expect(restored).toBe(false);
|
|
218
|
-
// Must NOT have switched the primary to B.
|
|
219
|
-
expect(ss.__getRaw__(V2_PUB, PRIMARY_SVC)).not.toBe(b.publicKey);
|
|
220
|
-
expect(ss.__getRaw__(V2_PRIV, PRIMARY_SVC)).not.toBe(b.privateKey);
|
|
221
|
-
// The original A private key is still in place (untouched).
|
|
222
|
-
expect(KeyManager.derivePublicKey(ss.__getRaw__(V2_PRIV, PRIMARY_SVC) as string)).toBe(a);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
it('a failed primary write during the post-rotation importKeyPair leaves the OLD key recoverable from backup', async () => {
|
|
226
|
-
// b3 key rotation: the server has already swapped to the NEW key; the device
|
|
227
|
-
// now commits it via importKeyPair({overwrite:true}). If that write fails
|
|
228
|
-
// mid-overwrite, the OLD key MUST remain intact and recoverable — never a
|
|
229
|
-
// half-written new identity that can't be decrypted or backed up.
|
|
230
|
-
const oldPublic = await KeyManager.createIdentity();
|
|
231
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
232
|
-
const oldPriv = ss.__getRaw__(V2_PRIV, PRIMARY_SVC);
|
|
233
|
-
resetCaches();
|
|
234
|
-
|
|
235
|
-
// The NEW rotated key material (generateKeyPair does NOT persist).
|
|
236
|
-
const rotated = await KeyManager.generateKeyPair();
|
|
237
|
-
|
|
238
|
-
// The new primary private write fails mid-commit.
|
|
239
|
-
ss.__failPlan__.failOp = 'set';
|
|
240
|
-
ss.__failPlan__.failKey = V2_PRIV;
|
|
241
|
-
ss.__failPlan__.failService = PRIMARY_SVC;
|
|
242
|
-
await expect(KeyManager.importKeyPair(rotated.privateKey, { overwrite: true })).rejects.toBeDefined();
|
|
243
|
-
|
|
244
|
-
// Recover from the simulated fault.
|
|
245
|
-
ss.__failPlan__.failKey = undefined;
|
|
246
|
-
ss.__failPlan__.failOp = undefined;
|
|
247
|
-
ss.__failPlan__.failService = undefined;
|
|
248
|
-
resetCaches();
|
|
249
|
-
|
|
250
|
-
// Primary is STILL the old identity (rolled back — never the new one).
|
|
251
|
-
expect(await KeyManager.hasIdentity()).toBe(true);
|
|
252
|
-
expect(await KeyManager.getPublicKey()).toBe(oldPublic);
|
|
253
|
-
expect(ss.__getRaw__(V2_PRIV, PRIMARY_SVC)).toBe(oldPriv);
|
|
254
|
-
// And the backup still holds the OLD identity, so the user can recover it.
|
|
255
|
-
expect(ss.__getRaw__(V2_BPRIV, BACKUP_SVC)).toBe(oldPriv);
|
|
256
|
-
expect(ss.__getRaw__(V2_BPUB, BACKUP_SVC)).toBe(oldPublic);
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
it('restores a provably-absent primary from a valid backup', async () => {
|
|
260
|
-
const original = await KeyManager.createIdentity();
|
|
261
|
-
const ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
262
|
-
// Wipe the primary entirely (backup remains).
|
|
263
|
-
ss.__deleteRaw__(V2_PRIV, PRIMARY_SVC);
|
|
264
|
-
ss.__deleteRaw__(V2_PUB, PRIMARY_SVC);
|
|
265
|
-
resetCaches();
|
|
266
|
-
|
|
267
|
-
const restored = await KeyManager.restoreIdentityFromBackup();
|
|
268
|
-
expect(restored).toBe(true);
|
|
269
|
-
expect(await KeyManager.getPublicKey()).toBe(original);
|
|
270
|
-
expect(await KeyManager.verifyIdentityIntegrity()).toBe(true);
|
|
271
|
-
});
|
|
272
|
-
});
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache-poisoning safety: a thrown read must never be cached as "no identity",
|
|
3
|
-
* and the create/import overwrite guards must read storage DIRECTLY (+ the
|
|
4
|
-
* marker), never a stale/poisoned cache — so a transient failure can never let
|
|
5
|
-
* onboarding silently overwrite a real identity.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { setPlatformOS } from '../../utils/platform';
|
|
9
|
-
|
|
10
|
-
jest.mock(
|
|
11
|
-
'expo-secure-store',
|
|
12
|
-
() => {
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
14
|
-
const { createSecureStoreMock } = require('./identityMocks');
|
|
15
|
-
return createSecureStoreMock();
|
|
16
|
-
},
|
|
17
|
-
{ virtual: true },
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
jest.mock(
|
|
21
|
-
'expo-crypto',
|
|
22
|
-
() => ({
|
|
23
|
-
__esModule: true,
|
|
24
|
-
getRandomBytes: (length: number) => {
|
|
25
|
-
const out = new Uint8Array(length);
|
|
26
|
-
for (let i = 0; i < length; i++) out[i] = (Math.random() * 256) & 0xff;
|
|
27
|
-
return out;
|
|
28
|
-
},
|
|
29
|
-
digestStringAsync: async () => '0'.repeat(64),
|
|
30
|
-
CryptoDigestAlgorithm: { SHA256: 'SHA-256' },
|
|
31
|
-
}),
|
|
32
|
-
{ virtual: true },
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
jest.mock('@oxy.so/protocol', () => {
|
|
36
|
-
const actual = jest.requireActual('@oxy.so/protocol');
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
38
|
-
const { createAsyncStorageMock } = require('./identityMocks');
|
|
39
|
-
const asyncStorage = createAsyncStorageMock();
|
|
40
|
-
return {
|
|
41
|
-
__esModule: true,
|
|
42
|
-
...actual,
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
-
loadExpoCrypto: async () => require('expo-crypto'),
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
46
|
-
loadSecureStore: async () => require('expo-secure-store'),
|
|
47
|
-
loadAsyncStorage: async () => ({ default: asyncStorage }),
|
|
48
|
-
loadSharedIdentityBridge: async () => null,
|
|
49
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
50
|
-
loadNodeCrypto: async () => require('crypto'),
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
52
|
-
getRandomBytesRN: (n: number) => require('expo-crypto').getRandomBytes(n),
|
|
53
|
-
};
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const PRIMARY_SVC = 'oxy_identity';
|
|
57
|
-
const V2_PRIV = 'oxy_identity_private_key_v2';
|
|
58
|
-
const V2_PUB = 'oxy_identity_public_key_v2';
|
|
59
|
-
|
|
60
|
-
interface SecureStoreTestHandle {
|
|
61
|
-
__resetStore__: () => void;
|
|
62
|
-
__getRaw__: (key: string, service?: string) => string | null;
|
|
63
|
-
__simulateKeystoreDeath__: (service: string) => void;
|
|
64
|
-
__failPlan__: { failKey?: string; failOp?: 'set' | 'get'; failTimes?: number; failService?: string };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
describe('KeyManager cache-poisoning safety', () => {
|
|
68
|
-
let KeyManager: typeof import('../keyManager').KeyManager;
|
|
69
|
-
let IdentityAlreadyExistsError: typeof import('../keyManager').IdentityAlreadyExistsError;
|
|
70
|
-
let ss: SecureStoreTestHandle;
|
|
71
|
-
|
|
72
|
-
const km = () =>
|
|
73
|
-
KeyManager as unknown as {
|
|
74
|
-
cachedPublicKey: unknown;
|
|
75
|
-
cachedHasIdentity: unknown;
|
|
76
|
-
cachedPublicKeyResolved: unknown;
|
|
77
|
-
};
|
|
78
|
-
const resetCaches = () => {
|
|
79
|
-
km().cachedPublicKey = null;
|
|
80
|
-
km().cachedHasIdentity = null;
|
|
81
|
-
km().cachedPublicKeyResolved = false;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
beforeAll(() => {
|
|
85
|
-
setPlatformOS('ios');
|
|
86
|
-
(globalThis as unknown as { navigator: unknown }).navigator = { product: 'ReactNative' };
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
beforeEach(async () => {
|
|
90
|
-
jest.resetModules();
|
|
91
|
-
setPlatformOS('ios');
|
|
92
|
-
ss = (await import('expo-secure-store' as string)) as unknown as SecureStoreTestHandle;
|
|
93
|
-
ss.__resetStore__();
|
|
94
|
-
const mod = await import('../keyManager');
|
|
95
|
-
KeyManager = mod.KeyManager;
|
|
96
|
-
IdentityAlreadyExistsError = mod.IdentityAlreadyExistsError;
|
|
97
|
-
resetCaches();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('getPublicKey does NOT cache null when the read throws (a later read still succeeds)', async () => {
|
|
101
|
-
const pub = await KeyManager.createIdentity();
|
|
102
|
-
resetCaches();
|
|
103
|
-
|
|
104
|
-
ss.__failPlan__.failOp = 'get';
|
|
105
|
-
ss.__failPlan__.failKey = V2_PUB;
|
|
106
|
-
ss.__failPlan__.failService = PRIMARY_SVC;
|
|
107
|
-
await expect(KeyManager.getPublicKey()).rejects.toMatchObject({ name: 'IdentityUnavailableError' });
|
|
108
|
-
|
|
109
|
-
// Cache must NOT hold a null verdict — clearing the fault returns the key.
|
|
110
|
-
ss.__failPlan__.failKey = undefined;
|
|
111
|
-
ss.__failPlan__.failOp = undefined;
|
|
112
|
-
ss.__failPlan__.failService = undefined;
|
|
113
|
-
expect(await KeyManager.getPublicKey()).toBe(pub.toLowerCase());
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('getPublicKey caches a genuine-absent (successful empty) read as null', async () => {
|
|
117
|
-
// Fresh device: read succeeds empty → null, cacheable.
|
|
118
|
-
expect(await KeyManager.getPublicKey()).toBeNull();
|
|
119
|
-
// The resolved-null flag is set (distinct from a thrown read).
|
|
120
|
-
expect(km().cachedPublicKeyResolved).toBe(true);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('createIdentity overwrite guard refuses over a POISONED cache (direct read finds the identity)', async () => {
|
|
124
|
-
await KeyManager.createIdentity();
|
|
125
|
-
// Poison the read cache as if a prior transient failure had "resolved null".
|
|
126
|
-
resetCaches();
|
|
127
|
-
km().cachedPublicKeyResolved = true; // getPublicKey would now claim "no identity"
|
|
128
|
-
|
|
129
|
-
await expect(KeyManager.createIdentity()).rejects.toBeInstanceOf(IdentityAlreadyExistsError);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('createIdentity overwrite guard refuses (IdentityUnavailableError) when storage throws — never writes blind', async () => {
|
|
133
|
-
const pub = await KeyManager.createIdentity();
|
|
134
|
-
resetCaches();
|
|
135
|
-
ss.__failPlan__.failOp = 'get';
|
|
136
|
-
ss.__failPlan__.failKey = V2_PRIV;
|
|
137
|
-
ss.__failPlan__.failService = PRIMARY_SVC;
|
|
138
|
-
|
|
139
|
-
await expect(KeyManager.createIdentity()).rejects.toMatchObject({ name: 'IdentityUnavailableError' });
|
|
140
|
-
|
|
141
|
-
// The identity was untouched (no blind overwrite).
|
|
142
|
-
ss.__failPlan__.failKey = undefined;
|
|
143
|
-
ss.__failPlan__.failOp = undefined;
|
|
144
|
-
ss.__failPlan__.failService = undefined;
|
|
145
|
-
resetCaches();
|
|
146
|
-
expect(await KeyManager.getPublicKey()).toBe(pub.toLowerCase());
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('createIdentity refuses over a LOST identity (marker present, keys gone) — routes to recovery, not create', async () => {
|
|
150
|
-
await KeyManager.createIdentity();
|
|
151
|
-
ss.__simulateKeystoreDeath__(PRIMARY_SVC);
|
|
152
|
-
resetCaches();
|
|
153
|
-
|
|
154
|
-
// Even with keys gone, the marker records an identity → refuse a blind create.
|
|
155
|
-
await expect(KeyManager.createIdentity()).rejects.toBeInstanceOf(IdentityAlreadyExistsError);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('importKeyPair refuses a DIFFERENT key in the lost state, but ALLOWS re-importing the same (recovery)', async () => {
|
|
159
|
-
const pub = await KeyManager.createIdentity();
|
|
160
|
-
const originalPriv = await KeyManager.getPrivateKey();
|
|
161
|
-
if (!originalPriv) throw new Error('expected private key');
|
|
162
|
-
ss.__simulateKeystoreDeath__(PRIMARY_SVC);
|
|
163
|
-
resetCaches();
|
|
164
|
-
|
|
165
|
-
// A different key over a lost identity → refuse.
|
|
166
|
-
const otherPriv = (await KeyManager.generateKeyPair()).privateKey;
|
|
167
|
-
await expect(KeyManager.importKeyPair(otherPriv)).rejects.toBeInstanceOf(IdentityAlreadyExistsError);
|
|
168
|
-
|
|
169
|
-
// The SAME key (recovery-by-phrase into the lost state) → allowed.
|
|
170
|
-
resetCaches();
|
|
171
|
-
const restored = await KeyManager.importKeyPair(originalPriv);
|
|
172
|
-
expect(restored).toBe(pub.toLowerCase());
|
|
173
|
-
expect(await KeyManager.getPublicKey()).toBe(pub.toLowerCase());
|
|
174
|
-
});
|
|
175
|
-
});
|