@oxy.so/core 1.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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +221 -0
- package/dist/cjs/.tsbuildinfo +1 -0
- package/dist/cjs/HttpService.js +1270 -0
- package/dist/cjs/OxyServices.base.js +390 -0
- package/dist/cjs/OxyServices.errors.js +95 -0
- package/dist/cjs/OxyServices.js +72 -0
- package/dist/cjs/boot/sessionColdBoot.js +395 -0
- package/dist/cjs/constants/version.js +16 -0
- package/dist/cjs/crypto/aead.js +79 -0
- package/dist/cjs/crypto/ecdh.js +35 -0
- package/dist/cjs/crypto/identityMarker.js +255 -0
- package/dist/cjs/crypto/kdf.js +39 -0
- package/dist/cjs/crypto/keyManager.js +2234 -0
- package/dist/cjs/crypto/polyfill.js +131 -0
- package/dist/cjs/crypto/recoveryPhrase.js +242 -0
- package/dist/cjs/crypto/signatureService.js +273 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
- package/dist/cjs/i18n/accountRoleLabels.js +27 -0
- package/dist/cjs/i18n/index.js +90 -0
- package/dist/cjs/i18n/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
- package/dist/cjs/i18n/trustTierLabels.js +19 -0
- package/dist/cjs/index.js +498 -0
- package/dist/cjs/inference/OxyInferenceClient.js +544 -0
- package/dist/cjs/logger/index.js +149 -0
- package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
- package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
- package/dist/cjs/mixins/OxyServices.appData.js +108 -0
- package/dist/cjs/mixins/OxyServices.assets.js +764 -0
- package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
- package/dist/cjs/mixins/OxyServices.chains.js +73 -0
- package/dist/cjs/mixins/OxyServices.civic.js +611 -0
- package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
- package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
- package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
- package/dist/cjs/mixins/OxyServices.devices.js +116 -0
- package/dist/cjs/mixins/OxyServices.features.js +335 -0
- package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
- package/dist/cjs/mixins/OxyServices.identity.js +461 -0
- package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
- package/dist/cjs/mixins/OxyServices.inference.js +59 -0
- package/dist/cjs/mixins/OxyServices.language.js +125 -0
- package/dist/cjs/mixins/OxyServices.links.js +72 -0
- package/dist/cjs/mixins/OxyServices.location.js +43 -0
- package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
- package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
- package/dist/cjs/mixins/OxyServices.payment.js +158 -0
- package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
- package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
- package/dist/cjs/mixins/OxyServices.security.js +89 -0
- package/dist/cjs/mixins/OxyServices.store.js +266 -0
- package/dist/cjs/mixins/OxyServices.topics.js +137 -0
- package/dist/cjs/mixins/OxyServices.user.js +902 -0
- package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
- package/dist/cjs/mixins/index.js +135 -0
- package/dist/cjs/mixins/mixinHelpers.js +53 -0
- package/dist/cjs/models/Topic.js +16 -0
- package/dist/cjs/models/interfaces.js +20 -0
- package/dist/cjs/models/session.js +2 -0
- package/dist/cjs/server/auth.js +167 -0
- package/dist/cjs/server/capabilityTicket.js +192 -0
- package/dist/cjs/server/cors.js +225 -0
- package/dist/cjs/server/index.js +97 -0
- package/dist/cjs/server/rateLimit.js +207 -0
- package/dist/cjs/server/safeFetch.js +458 -0
- package/dist/cjs/server/securityHeaders.js +377 -0
- package/dist/cjs/server/userInvalidation.js +156 -0
- package/dist/cjs/server/verifySecret.js +50 -0
- package/dist/cjs/session/SessionClient.js +865 -0
- package/dist/cjs/session/accountDelegationAccess.js +48 -0
- package/dist/cjs/session/accountDialogController.js +1131 -0
- package/dist/cjs/session/accountSwitchTargets.js +81 -0
- package/dist/cjs/session/authStateStore.js +404 -0
- package/dist/cjs/session/createSessionClient.js +32 -0
- package/dist/cjs/session/deviceDirectory.js +143 -0
- package/dist/cjs/session/deviceSwitcherRows.js +76 -0
- package/dist/cjs/session/identityPin.js +256 -0
- package/dist/cjs/session/identitySession.js +135 -0
- package/dist/cjs/session/projectSessionState.js +121 -0
- package/dist/cjs/session/refresh.js +398 -0
- package/dist/cjs/session/sessionClientHost.js +34 -0
- package/dist/cjs/session/sharedDeviceCredential.js +247 -0
- package/dist/cjs/session/socketLoader.js +55 -0
- package/dist/cjs/shared/utils/colorUtils.js +153 -0
- package/dist/cjs/shared/utils/errorUtils.js +183 -0
- package/dist/cjs/shared/utils/index.js +49 -0
- package/dist/cjs/shared/utils/networkUtils.js +183 -0
- package/dist/cjs/shared/utils/themeUtils.js +106 -0
- package/dist/cjs/utils/accountCacheSweep.js +80 -0
- package/dist/cjs/utils/accountUtils.js +140 -0
- package/dist/cjs/utils/activityId.js +6 -0
- package/dist/cjs/utils/apiUtils.js +91 -0
- package/dist/cjs/utils/asyncUtils.js +222 -0
- package/dist/cjs/utils/authHelpers.js +120 -0
- package/dist/cjs/utils/authWebUrl.js +19 -0
- package/dist/cjs/utils/avatarUtils.js +29 -0
- package/dist/cjs/utils/cache.js +235 -0
- package/dist/cjs/utils/cacheKey.js +85 -0
- package/dist/cjs/utils/coldBoot.js +122 -0
- package/dist/cjs/utils/commonsApproval.js +31 -0
- package/dist/cjs/utils/commonsDelivery.js +59 -0
- package/dist/cjs/utils/deviceManager.js +174 -0
- package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
- package/dist/cjs/utils/edgeRegion.js +6 -0
- package/dist/cjs/utils/errorUtils.js +243 -0
- package/dist/cjs/utils/identityCacheSweep.js +97 -0
- package/dist/cjs/utils/languageUtils.js +224 -0
- package/dist/cjs/utils/oauthPkce.js +311 -0
- package/dist/cjs/utils/officialOrigins.js +64 -0
- package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
- package/dist/cjs/utils/platform.js +119 -0
- package/dist/cjs/utils/profileLinks.js +63 -0
- package/dist/cjs/utils/redactUrl.js +29 -0
- package/dist/cjs/utils/registrableApex.js +45 -0
- package/dist/cjs/utils/requestUtils.js +209 -0
- package/dist/cjs/utils/sessionUtils.js +181 -0
- package/dist/cjs/utils/textNormalization.js +158 -0
- package/dist/cjs/utils/userHandle.js +37 -0
- package/dist/cjs/utils/userIdentity.js +50 -0
- package/dist/cjs/utils/validationUtils.js +370 -0
- package/dist/cjs/utils/webauthnOrigin.js +51 -0
- package/dist/esm/.tsbuildinfo +1 -0
- package/dist/esm/HttpService.js +1266 -0
- package/dist/esm/OxyServices.base.js +386 -0
- package/dist/esm/OxyServices.errors.js +88 -0
- package/dist/esm/OxyServices.js +66 -0
- package/dist/esm/boot/sessionColdBoot.js +392 -0
- package/dist/esm/constants/version.js +13 -0
- package/dist/esm/crypto/aead.js +74 -0
- package/dist/esm/crypto/ecdh.js +32 -0
- package/dist/esm/crypto/identityMarker.js +248 -0
- package/dist/esm/crypto/kdf.js +36 -0
- package/dist/esm/crypto/keyManager.js +2227 -0
- package/dist/esm/crypto/polyfill.js +129 -0
- package/dist/esm/crypto/recoveryPhrase.js +238 -0
- package/dist/esm/crypto/signatureService.js +269 -0
- package/dist/esm/i18n/accountCategoryLabels.js +37 -0
- package/dist/esm/i18n/accountRoleLabels.js +20 -0
- package/dist/esm/i18n/index.js +83 -0
- package/dist/esm/i18n/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
- package/dist/esm/i18n/trustTierLabels.js +12 -0
- package/dist/esm/index.js +254 -0
- package/dist/esm/inference/OxyInferenceClient.js +538 -0
- package/dist/esm/logger/index.js +140 -0
- package/dist/esm/mixins/OxyServices.accounts.js +543 -0
- package/dist/esm/mixins/OxyServices.analytics.js +46 -0
- package/dist/esm/mixins/OxyServices.appData.js +103 -0
- package/dist/esm/mixins/OxyServices.assets.js +761 -0
- package/dist/esm/mixins/OxyServices.auth.js +1247 -0
- package/dist/esm/mixins/OxyServices.chains.js +70 -0
- package/dist/esm/mixins/OxyServices.civic.js +605 -0
- package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
- package/dist/esm/mixins/OxyServices.contacts.js +47 -0
- package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
- package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
- package/dist/esm/mixins/OxyServices.devices.js +113 -0
- package/dist/esm/mixins/OxyServices.features.js +332 -0
- package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
- package/dist/esm/mixins/OxyServices.identity.js +457 -0
- package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
- package/dist/esm/mixins/OxyServices.inference.js +56 -0
- package/dist/esm/mixins/OxyServices.language.js +122 -0
- package/dist/esm/mixins/OxyServices.links.js +69 -0
- package/dist/esm/mixins/OxyServices.location.js +40 -0
- package/dist/esm/mixins/OxyServices.nodes.js +172 -0
- package/dist/esm/mixins/OxyServices.notifications.js +60 -0
- package/dist/esm/mixins/OxyServices.payment.js +155 -0
- package/dist/esm/mixins/OxyServices.privacy.js +196 -0
- package/dist/esm/mixins/OxyServices.reputation.js +286 -0
- package/dist/esm/mixins/OxyServices.security.js +86 -0
- package/dist/esm/mixins/OxyServices.store.js +263 -0
- package/dist/esm/mixins/OxyServices.topics.js +134 -0
- package/dist/esm/mixins/OxyServices.user.js +899 -0
- package/dist/esm/mixins/OxyServices.utility.js +1095 -0
- package/dist/esm/mixins/index.js +132 -0
- package/dist/esm/mixins/mixinHelpers.js +48 -0
- package/dist/esm/models/Topic.js +13 -0
- package/dist/esm/models/interfaces.js +17 -0
- package/dist/esm/models/session.js +1 -0
- package/dist/esm/server/auth.js +154 -0
- package/dist/esm/server/capabilityTicket.js +183 -0
- package/dist/esm/server/cors.js +220 -0
- package/dist/esm/server/index.js +47 -0
- package/dist/esm/server/rateLimit.js +201 -0
- package/dist/esm/server/safeFetch.js +447 -0
- package/dist/esm/server/securityHeaders.js +364 -0
- package/dist/esm/server/userInvalidation.js +152 -0
- package/dist/esm/server/verifySecret.js +47 -0
- package/dist/esm/session/SessionClient.js +861 -0
- package/dist/esm/session/accountDelegationAccess.js +45 -0
- package/dist/esm/session/accountDialogController.js +1126 -0
- package/dist/esm/session/accountSwitchTargets.js +77 -0
- package/dist/esm/session/authStateStore.js +398 -0
- package/dist/esm/session/createSessionClient.js +29 -0
- package/dist/esm/session/deviceDirectory.js +135 -0
- package/dist/esm/session/deviceSwitcherRows.js +72 -0
- package/dist/esm/session/identityPin.js +249 -0
- package/dist/esm/session/identitySession.js +131 -0
- package/dist/esm/session/projectSessionState.js +114 -0
- package/dist/esm/session/refresh.js +390 -0
- package/dist/esm/session/sessionClientHost.js +31 -0
- package/dist/esm/session/sharedDeviceCredential.js +239 -0
- package/dist/esm/session/socketLoader.js +19 -0
- package/dist/esm/shared/utils/colorUtils.js +143 -0
- package/dist/esm/shared/utils/errorUtils.js +170 -0
- package/dist/esm/shared/utils/index.js +15 -0
- package/dist/esm/shared/utils/networkUtils.js +173 -0
- package/dist/esm/shared/utils/themeUtils.js +98 -0
- package/dist/esm/utils/accountCacheSweep.js +75 -0
- package/dist/esm/utils/accountUtils.js +131 -0
- package/dist/esm/utils/activityId.js +2 -0
- package/dist/esm/utils/apiUtils.js +84 -0
- package/dist/esm/utils/asyncUtils.js +207 -0
- package/dist/esm/utils/authHelpers.js +111 -0
- package/dist/esm/utils/authWebUrl.js +16 -0
- package/dist/esm/utils/avatarUtils.js +26 -0
- package/dist/esm/utils/cache.js +227 -0
- package/dist/esm/utils/cacheKey.js +80 -0
- package/dist/esm/utils/coldBoot.js +119 -0
- package/dist/esm/utils/commonsApproval.js +27 -0
- package/dist/esm/utils/commonsDelivery.js +54 -0
- package/dist/esm/utils/deviceManager.js +170 -0
- package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
- package/dist/esm/utils/edgeRegion.js +2 -0
- package/dist/esm/utils/errorUtils.js +232 -0
- package/dist/esm/utils/identityCacheSweep.js +92 -0
- package/dist/esm/utils/languageUtils.js +212 -0
- package/dist/esm/utils/oauthPkce.js +297 -0
- package/dist/esm/utils/officialOrigins.js +59 -0
- package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
- package/dist/esm/utils/platform.js +110 -0
- package/dist/esm/utils/profileLinks.js +60 -0
- package/dist/esm/utils/redactUrl.js +26 -0
- package/dist/esm/utils/registrableApex.js +42 -0
- package/dist/esm/utils/requestUtils.js +203 -0
- package/dist/esm/utils/sessionUtils.js +171 -0
- package/dist/esm/utils/textNormalization.js +154 -0
- package/dist/esm/utils/userHandle.js +33 -0
- package/dist/esm/utils/userIdentity.js +45 -0
- package/dist/esm/utils/validationUtils.js +350 -0
- package/dist/esm/utils/webauthnOrigin.js +48 -0
- package/dist/types/.tsbuildinfo +1 -0
- package/dist/types/HttpService.d.ts +413 -0
- package/dist/types/OxyServices.base.d.ts +187 -0
- package/dist/types/OxyServices.d.ts +139 -0
- package/dist/types/OxyServices.errors.d.ts +84 -0
- package/dist/types/boot/sessionColdBoot.d.ts +140 -0
- package/dist/types/constants/version.d.ts +13 -0
- package/dist/types/crypto/aead.d.ts +56 -0
- package/dist/types/crypto/ecdh.d.ts +29 -0
- package/dist/types/crypto/identityMarker.d.ts +94 -0
- package/dist/types/crypto/kdf.d.ts +25 -0
- package/dist/types/crypto/keyManager.d.ts +582 -0
- package/dist/types/crypto/polyfill.d.ts +25 -0
- package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
- package/dist/types/crypto/signatureService.d.ts +136 -0
- package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
- package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
- package/dist/types/i18n/index.d.ts +3 -0
- package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
- package/dist/types/i18n/trustTierLabels.d.ts +9 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
- package/dist/types/logger/index.d.ts +104 -0
- package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
- package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
- package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
- package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
- package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
- package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
- package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
- package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
- package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
- package/dist/types/mixins/OxyServices.features.d.ts +250 -0
- package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
- package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
- package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
- package/dist/types/mixins/OxyServices.language.d.ts +87 -0
- package/dist/types/mixins/OxyServices.links.d.ts +104 -0
- package/dist/types/mixins/OxyServices.location.d.ts +70 -0
- package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
- package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
- package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
- package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
- package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
- package/dist/types/mixins/OxyServices.security.d.ts +84 -0
- package/dist/types/mixins/OxyServices.store.d.ts +334 -0
- package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
- package/dist/types/mixins/OxyServices.user.d.ts +558 -0
- package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
- package/dist/types/mixins/index.d.ts +87 -0
- package/dist/types/mixins/mixinHelpers.d.ts +31 -0
- package/dist/types/models/Topic.d.ts +42 -0
- package/dist/types/models/interfaces.d.ts +675 -0
- package/dist/types/models/session.d.ts +51 -0
- package/dist/types/server/auth.d.ts +130 -0
- package/dist/types/server/capabilityTicket.d.ts +41 -0
- package/dist/types/server/cors.d.ts +98 -0
- package/dist/types/server/index.d.ts +35 -0
- package/dist/types/server/rateLimit.d.ts +40 -0
- package/dist/types/server/safeFetch.d.ts +137 -0
- package/dist/types/server/securityHeaders.d.ts +221 -0
- package/dist/types/server/userInvalidation.d.ts +114 -0
- package/dist/types/server/verifySecret.d.ts +29 -0
- package/dist/types/session/SessionClient.d.ts +418 -0
- package/dist/types/session/accountDelegationAccess.d.ts +40 -0
- package/dist/types/session/accountDialogController.d.ts +648 -0
- package/dist/types/session/accountSwitchTargets.d.ts +70 -0
- package/dist/types/session/authStateStore.d.ts +153 -0
- package/dist/types/session/createSessionClient.d.ts +30 -0
- package/dist/types/session/deviceDirectory.d.ts +182 -0
- package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
- package/dist/types/session/identityPin.d.ts +87 -0
- package/dist/types/session/identitySession.d.ts +105 -0
- package/dist/types/session/projectSessionState.d.ts +74 -0
- package/dist/types/session/refresh.d.ts +179 -0
- package/dist/types/session/sessionClientHost.d.ts +18 -0
- package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
- package/dist/types/session/socketLoader.d.ts +11 -0
- package/dist/types/shared/utils/colorUtils.d.ts +104 -0
- package/dist/types/shared/utils/errorUtils.d.ts +97 -0
- package/dist/types/shared/utils/index.d.ts +13 -0
- package/dist/types/shared/utils/networkUtils.d.ts +139 -0
- package/dist/types/shared/utils/themeUtils.d.ts +90 -0
- package/dist/types/utils/accountCacheSweep.d.ts +75 -0
- package/dist/types/utils/accountUtils.d.ts +100 -0
- package/dist/types/utils/activityId.d.ts +2 -0
- package/dist/types/utils/apiUtils.d.ts +95 -0
- package/dist/types/utils/asyncUtils.d.ts +62 -0
- package/dist/types/utils/authHelpers.d.ts +58 -0
- package/dist/types/utils/authWebUrl.d.ts +16 -0
- package/dist/types/utils/avatarUtils.d.ts +16 -0
- package/dist/types/utils/cache.d.ts +130 -0
- package/dist/types/utils/cacheKey.d.ts +66 -0
- package/dist/types/utils/coldBoot.d.ts +131 -0
- package/dist/types/utils/commonsApproval.d.ts +13 -0
- package/dist/types/utils/commonsDelivery.d.ts +105 -0
- package/dist/types/utils/deviceManager.d.ts +65 -0
- package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
- package/dist/types/utils/edgeRegion.d.ts +2 -0
- package/dist/types/utils/errorUtils.d.ts +125 -0
- package/dist/types/utils/identityCacheSweep.d.ts +80 -0
- package/dist/types/utils/languageUtils.d.ts +100 -0
- package/dist/types/utils/oauthPkce.d.ts +157 -0
- package/dist/types/utils/officialOrigins.d.ts +13 -0
- package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
- package/dist/types/utils/platform.d.ts +49 -0
- package/dist/types/utils/profileLinks.d.ts +44 -0
- package/dist/types/utils/redactUrl.d.ts +17 -0
- package/dist/types/utils/registrableApex.d.ts +27 -0
- package/dist/types/utils/requestUtils.d.ts +123 -0
- package/dist/types/utils/sessionUtils.d.ts +54 -0
- package/dist/types/utils/textNormalization.d.ts +103 -0
- package/dist/types/utils/userHandle.d.ts +26 -0
- package/dist/types/utils/userIdentity.d.ts +21 -0
- package/dist/types/utils/validationUtils.d.ts +268 -0
- package/dist/types/utils/webauthnOrigin.d.ts +32 -0
- package/package.json +168 -0
- package/src/HttpService.ts +1553 -0
- package/src/OxyServices.base.ts +478 -0
- package/src/OxyServices.errors.ts +122 -0
- package/src/OxyServices.ts +172 -0
- package/src/__tests__/authSocket.test.ts +96 -0
- package/src/__tests__/httpServiceActivityId.test.ts +49 -0
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
- package/src/__tests__/httpServiceCache.test.ts +318 -0
- package/src/__tests__/httpServiceCsrf.test.ts +235 -0
- package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
- package/src/__tests__/inSessionRefresh.test.ts +260 -0
- package/src/__tests__/linkedClient.test.ts +370 -0
- package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
- package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
- package/src/__tests__/userIdentity.test.ts +143 -0
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
- package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
- package/src/boot/sessionColdBoot.ts +529 -0
- package/src/constants/version.ts +15 -0
- package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
- package/src/crypto/__tests__/identityMocks.ts +125 -0
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
- package/src/crypto/__tests__/keyManager.test.ts +329 -0
- package/src/crypto/__tests__/polyfill.test.ts +109 -0
- package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
- package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
- package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
- package/src/crypto/__tests__/signedRecord.test.ts +230 -0
- package/src/crypto/aead.ts +97 -0
- package/src/crypto/ecdh.ts +37 -0
- package/src/crypto/identityMarker.ts +291 -0
- package/src/crypto/kdf.ts +43 -0
- package/src/crypto/keyManager.ts +2607 -0
- package/src/crypto/polyfill.ts +143 -0
- package/src/crypto/recoveryPhrase.ts +337 -0
- package/src/crypto/signatureService.ts +350 -0
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
- package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
- package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
- package/src/i18n/accountCategoryLabels.ts +44 -0
- package/src/i18n/accountRoleLabels.ts +26 -0
- package/src/i18n/index.ts +88 -0
- package/src/i18n/locales/ar-SA.json +282 -0
- package/src/i18n/locales/ca-ES.json +282 -0
- package/src/i18n/locales/de-DE.json +282 -0
- package/src/i18n/locales/en-US.json +2161 -0
- package/src/i18n/locales/es-ES.json +2161 -0
- package/src/i18n/locales/fr-FR.json +282 -0
- package/src/i18n/locales/it-IT.json +282 -0
- package/src/i18n/locales/ja-JP.json +282 -0
- package/src/i18n/locales/ko-KR.json +282 -0
- package/src/i18n/locales/pt-PT.json +282 -0
- package/src/i18n/locales/zh-CN.json +282 -0
- package/src/i18n/reputationCategoryLabels.ts +20 -0
- package/src/i18n/trustTierLabels.ts +18 -0
- package/src/index.ts +881 -0
- package/src/inference/OxyInferenceClient.ts +888 -0
- package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
- package/src/logger/__tests__/logger.test.ts +207 -0
- package/src/logger/index.ts +217 -0
- package/src/mixins/OxyServices.accounts.ts +1330 -0
- package/src/mixins/OxyServices.analytics.ts +53 -0
- package/src/mixins/OxyServices.appData.ts +158 -0
- package/src/mixins/OxyServices.assets.ts +861 -0
- package/src/mixins/OxyServices.auth.ts +1858 -0
- package/src/mixins/OxyServices.chains.ts +134 -0
- package/src/mixins/OxyServices.civic.ts +945 -0
- package/src/mixins/OxyServices.connectedApps.ts +174 -0
- package/src/mixins/OxyServices.contacts.ts +73 -0
- package/src/mixins/OxyServices.deviceBoot.ts +210 -0
- package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
- package/src/mixins/OxyServices.devices.ts +120 -0
- package/src/mixins/OxyServices.features.ts +454 -0
- package/src/mixins/OxyServices.followGraph.ts +293 -0
- package/src/mixins/OxyServices.identity.ts +705 -0
- package/src/mixins/OxyServices.identityBackup.ts +250 -0
- package/src/mixins/OxyServices.inference.ts +57 -0
- package/src/mixins/OxyServices.language.ts +144 -0
- package/src/mixins/OxyServices.links.ts +107 -0
- package/src/mixins/OxyServices.location.ts +46 -0
- package/src/mixins/OxyServices.nodes.ts +337 -0
- package/src/mixins/OxyServices.notifications.ts +142 -0
- package/src/mixins/OxyServices.payment.ts +163 -0
- package/src/mixins/OxyServices.privacy.ts +219 -0
- package/src/mixins/OxyServices.reputation.ts +436 -0
- package/src/mixins/OxyServices.security.ts +110 -0
- package/src/mixins/OxyServices.store.ts +585 -0
- package/src/mixins/OxyServices.topics.ts +169 -0
- package/src/mixins/OxyServices.user.ts +1137 -0
- package/src/mixins/OxyServices.utility.ts +1370 -0
- package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
- package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
- package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
- package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
- package/src/mixins/__tests__/accounts.test.ts +727 -0
- package/src/mixins/__tests__/appData.test.ts +203 -0
- package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
- package/src/mixins/__tests__/assetUpload.test.ts +191 -0
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
- package/src/mixins/__tests__/chains.test.ts +113 -0
- package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
- package/src/mixins/__tests__/connectedApps.test.ts +123 -0
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
- package/src/mixins/__tests__/followGraph.test.ts +147 -0
- package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
- package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
- package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
- package/src/mixins/__tests__/identityBackup.test.ts +315 -0
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
- package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
- package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
- package/src/mixins/__tests__/reputation.test.ts +522 -0
- package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
- package/src/mixins/__tests__/store.test.ts +304 -0
- package/src/mixins/__tests__/topics.test.ts +156 -0
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
- package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
- package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
- package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
- package/src/mixins/index.ts +201 -0
- package/src/mixins/mixinHelpers.ts +69 -0
- package/src/models/Topic.ts +46 -0
- package/src/models/interfaces.ts +786 -0
- package/src/models/session.ts +55 -0
- package/src/server/__tests__/auth.test.ts +78 -0
- package/src/server/__tests__/capabilityTicket.test.ts +111 -0
- package/src/server/__tests__/cors.socket.test.ts +225 -0
- package/src/server/__tests__/cors.test.ts +158 -0
- package/src/server/__tests__/rateLimit.test.ts +257 -0
- package/src/server/__tests__/safeFetch.test.ts +232 -0
- package/src/server/__tests__/securityHeaders.test.ts +348 -0
- package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
- package/src/server/__tests__/userInvalidation.test.ts +203 -0
- package/src/server/__tests__/verifySecret.test.ts +40 -0
- package/src/server/auth.ts +271 -0
- package/src/server/capabilityTicket.ts +258 -0
- package/src/server/cors.ts +277 -0
- package/src/server/index.ts +136 -0
- package/src/server/rateLimit.ts +313 -0
- package/src/server/safeFetch.ts +586 -0
- package/src/server/securityHeaders.ts +467 -0
- package/src/server/userInvalidation.ts +199 -0
- package/src/server/verifySecret.ts +52 -0
- package/src/session/SessionClient.ts +1001 -0
- package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
- package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
- package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
- package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
- package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
- package/src/session/__tests__/SessionClient.state.test.ts +78 -0
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
- package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
- package/src/session/__tests__/accountDialogController.test.ts +1969 -0
- package/src/session/__tests__/accountDialogShape.test.ts +118 -0
- package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
- package/src/session/__tests__/authStateStore.test.ts +451 -0
- package/src/session/__tests__/deviceDirectory.test.ts +422 -0
- package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
- package/src/session/__tests__/identityPin.test.ts +131 -0
- package/src/session/__tests__/identitySession.test.ts +194 -0
- package/src/session/__tests__/projectSessionState.test.ts +105 -0
- package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
- package/src/session/__tests__/refresh.test.ts +443 -0
- package/src/session/__tests__/sessionIntegration.test.ts +209 -0
- package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
- package/src/session/accountDelegationAccess.ts +72 -0
- package/src/session/accountDialogController.ts +1494 -0
- package/src/session/accountSwitchTargets.ts +93 -0
- package/src/session/authStateStore.ts +502 -0
- package/src/session/createSessionClient.ts +39 -0
- package/src/session/deviceDirectory.ts +269 -0
- package/src/session/deviceSwitcherRows.ts +145 -0
- package/src/session/identityPin.ts +310 -0
- package/src/session/identitySession.ts +206 -0
- package/src/session/projectSessionState.ts +137 -0
- package/src/session/refresh.ts +517 -0
- package/src/session/sessionClientHost.ts +39 -0
- package/src/session/sharedDeviceCredential.ts +349 -0
- package/src/session/socketLoader.ts +30 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/types/buffer.d.ts +97 -0
- package/src/types/expo-crypto.d.ts +16 -0
- package/src/types/expo-secure-store.d.ts +17 -0
- package/src/utils/__tests__/accountUtils.test.ts +151 -0
- package/src/utils/__tests__/activityId.test.ts +45 -0
- package/src/utils/__tests__/asyncUtils.test.ts +187 -0
- package/src/utils/__tests__/authWebUrl.test.ts +15 -0
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/coldBoot.test.ts +496 -0
- package/src/utils/__tests__/commonsApproval.test.ts +60 -0
- package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
- package/src/utils/__tests__/languageUtils.test.ts +219 -0
- package/src/utils/__tests__/oauthPkce.test.ts +272 -0
- package/src/utils/__tests__/officialOrigins.test.ts +31 -0
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
- package/src/utils/__tests__/profileLinks.test.ts +180 -0
- package/src/utils/__tests__/redactUrl.test.ts +33 -0
- package/src/utils/__tests__/registrableApex.test.ts +62 -0
- package/src/utils/__tests__/textNormalization.test.ts +205 -0
- package/src/utils/__tests__/validationUtils.test.ts +703 -0
- package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
- package/src/utils/accountCacheSweep.ts +93 -0
- package/src/utils/accountUtils.ts +194 -0
- package/src/utils/activityId.ts +2 -0
- package/src/utils/apiUtils.ts +137 -0
- package/src/utils/asyncUtils.ts +280 -0
- package/src/utils/authHelpers.ts +148 -0
- package/src/utils/authWebUrl.ts +17 -0
- package/src/utils/avatarUtils.ts +39 -0
- package/src/utils/cache.ts +273 -0
- package/src/utils/cacheKey.ts +93 -0
- package/src/utils/coldBoot.ts +218 -0
- package/src/utils/commonsApproval.ts +39 -0
- package/src/utils/commonsDelivery.ts +132 -0
- package/src/utils/deviceManager.ts +203 -0
- package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
- package/src/utils/edgeRegion.ts +2 -0
- package/src/utils/errorUtils.ts +352 -0
- package/src/utils/identityCacheSweep.ts +104 -0
- package/src/utils/languageUtils.ts +256 -0
- package/src/utils/oauthPkce.ts +392 -0
- package/src/utils/officialOrigins.ts +62 -0
- package/src/utils/oxyServiceEnvironment.ts +17 -0
- package/src/utils/platform.ts +139 -0
- package/src/utils/profileLinks.ts +91 -0
- package/src/utils/redactUrl.ts +28 -0
- package/src/utils/registrableApex.ts +41 -0
- package/src/utils/requestUtils.ts +237 -0
- package/src/utils/sessionUtils.ts +206 -0
- package/src/utils/textNormalization.ts +162 -0
- package/src/utils/userHandle.ts +49 -0
- package/src/utils/userIdentity.ts +60 -0
- package/src/utils/validationUtils.ts +390 -0
- package/src/utils/webauthnOrigin.ts +52 -0
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Manager - ECDSA secp256k1 Key Generation and Storage
|
|
3
|
+
*
|
|
4
|
+
* Handles secure generation, storage, and retrieval of cryptographic keys.
|
|
5
|
+
* Private keys are stored securely using expo-secure-store and never leave the device.
|
|
6
|
+
*/
|
|
7
|
+
import { type IdentityMarker } from './identityMarker';
|
|
8
|
+
/**
|
|
9
|
+
* Thrown when an identity-mutating operation (createIdentity / importKeyPair)
|
|
10
|
+
* is invoked while a valid identity already exists on the device.
|
|
11
|
+
*
|
|
12
|
+
* The local private key IS the user's identity — overwriting it without
|
|
13
|
+
* explicit consent permanently loses access to their account (unless
|
|
14
|
+
* they previously saved their recovery phrase). This error forces callers
|
|
15
|
+
* to make an explicit, audited decision instead of silently clobbering.
|
|
16
|
+
*/
|
|
17
|
+
export declare class IdentityAlreadyExistsError extends Error {
|
|
18
|
+
readonly name = "IdentityAlreadyExistsError";
|
|
19
|
+
readonly existingPublicKey: string;
|
|
20
|
+
constructor(existingPublicKey: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Thrown when a freshly written identity cannot be read back, parsed, or
|
|
24
|
+
* round-tripped through sign/verify. Indicates a storage failure or
|
|
25
|
+
* corruption that would otherwise silently leave the user with an
|
|
26
|
+
* unusable account.
|
|
27
|
+
*/
|
|
28
|
+
export declare class IdentityPersistError extends Error {
|
|
29
|
+
readonly cause?: unknown | undefined;
|
|
30
|
+
readonly name = "IdentityPersistError";
|
|
31
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Thrown when identity storage cannot be read/written right now — the keychain
|
|
35
|
+
* is locked, the module failed to load, or a read threw — as opposed to the
|
|
36
|
+
* identity being genuinely absent.
|
|
37
|
+
*
|
|
38
|
+
* This is the crux of the corruption-vs-fresh-install fix: a storage THROW must
|
|
39
|
+
* NEVER be flattened into "no identity" (the old behavior, which let onboarding
|
|
40
|
+
* treat a momentarily-locked keystore as a blank device). Callers that used to
|
|
41
|
+
* tolerate a `false`/`null` from `hasIdentity()`/`getPublicKey()` on error must
|
|
42
|
+
* now treat this typed error as "cannot determine" — retry, surface a locked
|
|
43
|
+
* state, or abort a destructive path — never as "safe to create/overwrite".
|
|
44
|
+
*/
|
|
45
|
+
export declare class IdentityUnavailableError extends Error {
|
|
46
|
+
readonly cause?: unknown | undefined;
|
|
47
|
+
readonly name = "IdentityUnavailableError";
|
|
48
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Authoritative tri-state (plus `unavailable`) verdict on the on-device
|
|
52
|
+
* identity, from {@link KeyManager.getIdentityStatus}.
|
|
53
|
+
*
|
|
54
|
+
* - `present` — a healthy, round-tripping key pair exists.
|
|
55
|
+
* - `absent` — storage read succeeded and returned nothing, AND no marker
|
|
56
|
+
* records a prior identity → a genuine fresh device. The ONLY
|
|
57
|
+
* state that may route to create/onboarding.
|
|
58
|
+
* - `lost` — storage read succeeded but the keys are empty/unreadable while
|
|
59
|
+
* the independent {@link IdentityMarker} records that an identity
|
|
60
|
+
* DID exist here → corruption/keystore death. Route to recovery,
|
|
61
|
+
* NEVER to create.
|
|
62
|
+
* - `unavailable` — a storage read THREW (keychain locked, module load failure).
|
|
63
|
+
* Transient by assumption; NEVER cached; callers retry.
|
|
64
|
+
*/
|
|
65
|
+
export type IdentityStatus = {
|
|
66
|
+
state: 'present';
|
|
67
|
+
publicKey: string;
|
|
68
|
+
} | {
|
|
69
|
+
state: 'absent';
|
|
70
|
+
} | {
|
|
71
|
+
state: 'lost';
|
|
72
|
+
marker: IdentityMarker;
|
|
73
|
+
} | {
|
|
74
|
+
state: 'unavailable';
|
|
75
|
+
cause: unknown;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Result of {@link KeyManager.attemptIdentityRecovery}. On success it reports
|
|
79
|
+
* which independent, `key_v1`-surviving source restored the identity. On failure
|
|
80
|
+
* `reason` distinguishes "wasn't lost", "no surviving source", "a source held a
|
|
81
|
+
* DIFFERENT account" (never silently switched), and "storage unavailable".
|
|
82
|
+
*/
|
|
83
|
+
export type IdentityRecoveryResult = {
|
|
84
|
+
recovered: true;
|
|
85
|
+
source: 'backup' | 'shared';
|
|
86
|
+
publicKey: string;
|
|
87
|
+
} | {
|
|
88
|
+
recovered: false;
|
|
89
|
+
reason: 'not-lost' | 'no-sources' | 'mismatch' | 'unavailable';
|
|
90
|
+
};
|
|
91
|
+
export interface KeyPair {
|
|
92
|
+
publicKey: string;
|
|
93
|
+
privateKey: string;
|
|
94
|
+
}
|
|
95
|
+
export declare class KeyManager {
|
|
96
|
+
private static cachedPublicKey;
|
|
97
|
+
private static cachedHasIdentity;
|
|
98
|
+
private static cachedSharedPublicKey;
|
|
99
|
+
private static cachedHasSharedIdentity;
|
|
100
|
+
/**
|
|
101
|
+
* Distinguishes "public key genuinely absent (a successful empty read, safe to
|
|
102
|
+
* cache)" from "never resolved / storage threw (must NOT be cached)". A `null`
|
|
103
|
+
* {@link cachedPublicKey} alone is ambiguous — this flag makes the genuine
|
|
104
|
+
* absence cacheable WITHOUT ever caching a null produced by a thrown read.
|
|
105
|
+
*/
|
|
106
|
+
private static cachedPublicKeyResolved;
|
|
107
|
+
/** Listeners notified synchronously whenever the identity verdict may have changed. */
|
|
108
|
+
private static readonly identityChangeListeners;
|
|
109
|
+
/**
|
|
110
|
+
* Memoized one-run-per-process slot migration. `slotMigrationResult` caches a
|
|
111
|
+
* STABLE outcome (`v2`/`legacy`); a `deferred` outcome is intentionally not
|
|
112
|
+
* cached (the in-flight promise is cleared) so a later call retries once the
|
|
113
|
+
* keychain unlocks.
|
|
114
|
+
*/
|
|
115
|
+
private static slotMigrationPromise;
|
|
116
|
+
private static slotMigrationResult;
|
|
117
|
+
/**
|
|
118
|
+
* Invalidate cached identity state
|
|
119
|
+
* Called internally when identity is created/deleted/imported
|
|
120
|
+
*/
|
|
121
|
+
private static invalidateCache;
|
|
122
|
+
/**
|
|
123
|
+
* Subscribe to identity-verdict changes (create / import / delete / restore /
|
|
124
|
+
* cache invalidation). Fires synchronously; the returned function unsubscribes.
|
|
125
|
+
* Consumed via `useOxyEvent`-style hooks in commons to invalidate the routing
|
|
126
|
+
* queries the instant the identity state moves, without polling.
|
|
127
|
+
*/
|
|
128
|
+
static subscribeIdentityChanged(listener: () => void): () => void;
|
|
129
|
+
/** Synchronous fan-out with per-listener isolation (one throwing listener never blocks the rest). */
|
|
130
|
+
private static notifyIdentityChanged;
|
|
131
|
+
/** Build `getItemAsync`/`deleteItemAsync` options for a given keychain service (read/delete). */
|
|
132
|
+
private static _slotOpts;
|
|
133
|
+
/** Build private-key write options (device-only accessibility) for a given keychain service. */
|
|
134
|
+
private static _privateWriteOpts;
|
|
135
|
+
/** True only when both keys are present, well-formed, AND the public derives from the private. */
|
|
136
|
+
private static _isHealthyPair;
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the AsyncStorage-backed KV store for the advisory migration flag, or
|
|
139
|
+
* `null` off-RN / when unavailable. Independent of the keychain, so the flag
|
|
140
|
+
* cannot be taken down by the keystore event this whole subsystem defends
|
|
141
|
+
* against.
|
|
142
|
+
*/
|
|
143
|
+
private static _advisoryStorage;
|
|
144
|
+
private static _readSlotsMigratedFlag;
|
|
145
|
+
private static _setSlotsMigratedFlag;
|
|
146
|
+
/**
|
|
147
|
+
* Ensure the identity has been migrated onto the isolated v2 slots (or that we
|
|
148
|
+
* know we must read legacy this session). Memoized so concurrent callers share
|
|
149
|
+
* ONE run; a `deferred` (read-threw) outcome is not cached so a later call
|
|
150
|
+
* retries after the keychain unlocks. Every identity-slot accessor awaits this
|
|
151
|
+
* before touching storage.
|
|
152
|
+
*/
|
|
153
|
+
private static _ensureIdentitySlotsMigrated;
|
|
154
|
+
/**
|
|
155
|
+
* One-shot slot migration state machine. All reads are DIRECT and a thrown
|
|
156
|
+
* read defers everything (zero writes/deletes) so a locked keychain is never
|
|
157
|
+
* mistaken for an empty one. INVARIANT: at every instant ≥1 readable copy of a
|
|
158
|
+
* previously-existing identity remains — legacy is deleted ONLY after the v2
|
|
159
|
+
* copy is verified re-readable in its new (non-aliasable) location.
|
|
160
|
+
*/
|
|
161
|
+
private static _runSlotMigration;
|
|
162
|
+
/**
|
|
163
|
+
* Seed the v2 backup slot during migration. Prefers a healthy legacy backup;
|
|
164
|
+
* otherwise mirrors the (already-verified) v2 primary material so a v2 backup
|
|
165
|
+
* always exists on an independent keychain key. Best-effort — a failure just
|
|
166
|
+
* defers backup population to the next {@link _persistIdentityAtomic}.
|
|
167
|
+
*/
|
|
168
|
+
private static _migrateBackupSlotToV2;
|
|
169
|
+
/** Best-effort single delete under an optional keychain service. Cleanup only — never surfaces. */
|
|
170
|
+
private static _bestEffortDelete;
|
|
171
|
+
private static _bestEffortDeleteV2Primary;
|
|
172
|
+
private static _bestEffortDeleteLegacyPrimaryAndBackup;
|
|
173
|
+
private static _bestEffortDeleteBackupsAllGenerations;
|
|
174
|
+
/**
|
|
175
|
+
* Clear the cross-app shared identity slot (force-delete only) so a deleted
|
|
176
|
+
* identity cannot be resurrected via the recovery ladder's shared rung.
|
|
177
|
+
* Best-effort — the shared slot is a redundant convenience copy.
|
|
178
|
+
*/
|
|
179
|
+
private static _clearSharedSlot;
|
|
180
|
+
/**
|
|
181
|
+
* Invalidate cached shared identity state
|
|
182
|
+
* Called internally when shared identity is created/deleted/imported
|
|
183
|
+
*/
|
|
184
|
+
private static invalidateSharedCache;
|
|
185
|
+
/**
|
|
186
|
+
* Lowercase and pad to canonical 64-hex-char form.
|
|
187
|
+
*
|
|
188
|
+
* Tolerates legacy leading-zero-stripped keys and externally imported
|
|
189
|
+
* uppercase hex. Every derivation path canonicalizes first so storage
|
|
190
|
+
* representation cannot change the resulting identity.
|
|
191
|
+
*
|
|
192
|
+
* Private (used only inside KeyManager) — public consumers should not need
|
|
193
|
+
* to think about hex representation.
|
|
194
|
+
*/
|
|
195
|
+
private static canonicalPrivateKey;
|
|
196
|
+
/**
|
|
197
|
+
* Generate a new ECDSA secp256k1 key pair
|
|
198
|
+
* Returns the keys in hexadecimal format
|
|
199
|
+
*/
|
|
200
|
+
static generateKeyPairSync(): KeyPair;
|
|
201
|
+
/**
|
|
202
|
+
* Generate a new key pair using secure random bytes
|
|
203
|
+
*/
|
|
204
|
+
static generateKeyPair(): Promise<KeyPair>;
|
|
205
|
+
/**
|
|
206
|
+
* Create a shared identity accessible across all Oxy apps
|
|
207
|
+
*
|
|
208
|
+
* iOS: Stores in shared keychain group (requires entitlement configuration)
|
|
209
|
+
* Android: Stores in Account Manager (requires sharedUserId in manifest)
|
|
210
|
+
*
|
|
211
|
+
* This enables true cross-app SSO - when user signs in to one Oxy app,
|
|
212
|
+
* they're automatically signed in to all other Oxy apps.
|
|
213
|
+
*
|
|
214
|
+
* @returns Public key of the shared identity
|
|
215
|
+
* @throws Error if not on native platform or if sharing is not configured
|
|
216
|
+
*/
|
|
217
|
+
static createSharedIdentity(): Promise<string>;
|
|
218
|
+
/**
|
|
219
|
+
* Get the shared public key (accessible across all Oxy apps)
|
|
220
|
+
*
|
|
221
|
+
* @returns Shared public key or null if no shared identity exists
|
|
222
|
+
*/
|
|
223
|
+
static getSharedPublicKey(): Promise<string | null>;
|
|
224
|
+
/**
|
|
225
|
+
* Get the shared private key (for signing operations)
|
|
226
|
+
*
|
|
227
|
+
* WARNING: Only use this for signing operations within the app.
|
|
228
|
+
* The private key should NEVER be transmitted or exposed.
|
|
229
|
+
*
|
|
230
|
+
* @returns Shared private key or null if no shared identity exists
|
|
231
|
+
*/
|
|
232
|
+
static getSharedPrivateKey(): Promise<string | null>;
|
|
233
|
+
/**
|
|
234
|
+
* Check if a shared identity exists (accessible across all Oxy apps)
|
|
235
|
+
*
|
|
236
|
+
* @returns True if shared identity exists, false otherwise
|
|
237
|
+
*/
|
|
238
|
+
static hasSharedIdentity(): Promise<boolean>;
|
|
239
|
+
/**
|
|
240
|
+
* Import an existing key pair as shared identity
|
|
241
|
+
*
|
|
242
|
+
* This is used when:
|
|
243
|
+
* 1. User signs in to a new Oxy app for the first time
|
|
244
|
+
* 2. User has existing identity on another Oxy app
|
|
245
|
+
* 3. We want to sync the identity across apps
|
|
246
|
+
*
|
|
247
|
+
* @param privateKey - Private key in hex format
|
|
248
|
+
* @returns Public key
|
|
249
|
+
*/
|
|
250
|
+
static importSharedIdentity(privateKey: string): Promise<string>;
|
|
251
|
+
/**
|
|
252
|
+
* Store session information in shared storage
|
|
253
|
+
*
|
|
254
|
+
* This allows all Oxy apps to access the same session without
|
|
255
|
+
* re-authenticating. When user signs in to one app, all apps
|
|
256
|
+
* get the session automatically.
|
|
257
|
+
*
|
|
258
|
+
* @param sessionId - Session ID from authentication
|
|
259
|
+
* @param accessToken - Access token for API calls
|
|
260
|
+
*/
|
|
261
|
+
static storeSharedSession(sessionId: string, accessToken: string): Promise<void>;
|
|
262
|
+
/**
|
|
263
|
+
* Get shared session information
|
|
264
|
+
*
|
|
265
|
+
* This allows any Oxy app to check if user is already signed in
|
|
266
|
+
* via another Oxy app. Enables instant cross-app SSO.
|
|
267
|
+
*
|
|
268
|
+
* @returns Session data or null if no shared session exists
|
|
269
|
+
*/
|
|
270
|
+
static getSharedSession(): Promise<{
|
|
271
|
+
sessionId: string;
|
|
272
|
+
accessToken: string;
|
|
273
|
+
} | null>;
|
|
274
|
+
/**
|
|
275
|
+
* Clear shared session (on logout)
|
|
276
|
+
*
|
|
277
|
+
* This signs out the user from ALL Oxy apps simultaneously.
|
|
278
|
+
* Call this when user explicitly logs out.
|
|
279
|
+
*/
|
|
280
|
+
static clearSharedSession(): Promise<void>;
|
|
281
|
+
/**
|
|
282
|
+
* Migrate local identity to shared identity
|
|
283
|
+
*
|
|
284
|
+
* Call this when upgrading existing apps to use shared identities.
|
|
285
|
+
* Copies the device-specific identity to shared storage so it can
|
|
286
|
+
* be accessed by other Oxy apps.
|
|
287
|
+
*
|
|
288
|
+
* @returns True if migration was successful, false if no local identity exists
|
|
289
|
+
*/
|
|
290
|
+
static migrateToSharedIdentity(): Promise<boolean>;
|
|
291
|
+
/**
|
|
292
|
+
* Atomically persist a key pair to secure storage with verification + backup.
|
|
293
|
+
*
|
|
294
|
+
* INVARIANT (the reason this method exists): at no instant during the write
|
|
295
|
+
* may the device be left holding ZERO recoverable copies of a healthy
|
|
296
|
+
* identity. This matters most on the OVERWRITE / account-switch path: if we
|
|
297
|
+
* are replacing identity A with B and the write fails halfway, we MUST end
|
|
298
|
+
* up back on A — never on a half-written B, and never on nothing.
|
|
299
|
+
*
|
|
300
|
+
* Algorithm (recoverability-preserving):
|
|
301
|
+
* 0. Snapshot the existing primary (privA, pubA) so we can roll back to
|
|
302
|
+
* EXACTLY what was there.
|
|
303
|
+
* 1. Write the new primary: public first, then private.
|
|
304
|
+
* 2. Read back + sign/verify the new primary.
|
|
305
|
+
* 3. ONLY after the new primary is proven durable, refresh the backup to
|
|
306
|
+
* the new key. The backup is NEVER touched before this point, so any
|
|
307
|
+
* prior identity's backup remains intact and `restoreIdentityFromBackup`
|
|
308
|
+
* can always recover it.
|
|
309
|
+
* 4. On ANY failure in steps 1–2, restore the snapshotted primary verbatim
|
|
310
|
+
* (or delete it if there was none), then surface the error.
|
|
311
|
+
*
|
|
312
|
+
* Earlier versions wrote the *incoming* key to the backup FIRST, which
|
|
313
|
+
* destroyed the previous identity's backup, and rolled back by blindly
|
|
314
|
+
* deleting the primary — so a failed overwrite silently switched the user
|
|
315
|
+
* to (or lost them into) the half-written new identity. That is fixed here.
|
|
316
|
+
*
|
|
317
|
+
* @internal
|
|
318
|
+
*/
|
|
319
|
+
private static _persistIdentityAtomic;
|
|
320
|
+
/**
|
|
321
|
+
* Write/refresh the identity marker after a successful persist. A same-identity
|
|
322
|
+
* re-persist (e.g. backup refresh, idempotent re-import) preserves `createdAt`
|
|
323
|
+
* and the `onboardingComplete` milestone by only updating `origin`; a NEW or
|
|
324
|
+
* switched identity writes a fresh marker. Best-effort — never throws.
|
|
325
|
+
*
|
|
326
|
+
* @internal
|
|
327
|
+
*/
|
|
328
|
+
private static _syncMarkerAfterPersist;
|
|
329
|
+
/**
|
|
330
|
+
* Restore the backup slot to a previously-snapshotted state. Best-effort so
|
|
331
|
+
* the original persistence error remains the one surfaced to the caller.
|
|
332
|
+
*
|
|
333
|
+
* @internal
|
|
334
|
+
*/
|
|
335
|
+
private static _rollbackBackup;
|
|
336
|
+
/**
|
|
337
|
+
* Restore the primary slot to a previously-snapshotted (privA, pubA) pair,
|
|
338
|
+
* or delete it entirely if there was no prior identity. Best-effort: every
|
|
339
|
+
* step is wrapped so a rollback failure never masks the original error the
|
|
340
|
+
* caller is about to throw. Invalidates the in-memory cache so the next read
|
|
341
|
+
* reflects whatever actually landed on disk.
|
|
342
|
+
*
|
|
343
|
+
* @internal
|
|
344
|
+
*/
|
|
345
|
+
private static _rollbackPrimary;
|
|
346
|
+
/**
|
|
347
|
+
* Generate and securely store a new key pair on the device.
|
|
348
|
+
*
|
|
349
|
+
* Refuses to overwrite an existing identity unless `options.overwrite === true`.
|
|
350
|
+
* Returns the public key. The private key never leaves secure storage.
|
|
351
|
+
*
|
|
352
|
+
* @throws IdentityAlreadyExistsError if an identity already exists and overwrite is not set
|
|
353
|
+
* @throws IdentityPersistError if the key cannot be durably written
|
|
354
|
+
*/
|
|
355
|
+
static createIdentity(options?: {
|
|
356
|
+
overwrite?: boolean;
|
|
357
|
+
}): Promise<string>;
|
|
358
|
+
/**
|
|
359
|
+
* Read the primary key pair DIRECTLY from storage, bypassing the in-memory
|
|
360
|
+
* cache (which a prior transient failure could have poisoned). Awaits slot
|
|
361
|
+
* migration first. Throws {@link IdentityUnavailableError} if storage is
|
|
362
|
+
* deferred/locked or a read throws — so overwrite guards never write blind.
|
|
363
|
+
*
|
|
364
|
+
* @internal
|
|
365
|
+
*/
|
|
366
|
+
private static _readPrimaryDirect;
|
|
367
|
+
/**
|
|
368
|
+
* Import an existing key pair (e.g., from recovery phrase).
|
|
369
|
+
*
|
|
370
|
+
* Refuses to overwrite an existing identity unless `options.overwrite === true`.
|
|
371
|
+
*
|
|
372
|
+
* @throws IdentityAlreadyExistsError if an identity already exists and overwrite is not set
|
|
373
|
+
* @throws IdentityPersistError if the key cannot be durably written
|
|
374
|
+
*/
|
|
375
|
+
static importKeyPair(privateKey: string, options?: {
|
|
376
|
+
overwrite?: boolean;
|
|
377
|
+
}): Promise<string>;
|
|
378
|
+
/**
|
|
379
|
+
* Get the stored private key
|
|
380
|
+
* WARNING: Only use this for signing operations within the app
|
|
381
|
+
*
|
|
382
|
+
* Preserves the "return null on any storage failure" contract signing paths
|
|
383
|
+
* rely on (a locked keychain simply means "cannot sign now"); unlike
|
|
384
|
+
* {@link getPublicKey}, it does NOT throw {@link IdentityUnavailableError}.
|
|
385
|
+
*/
|
|
386
|
+
static getPrivateKey(): Promise<string | null>;
|
|
387
|
+
/**
|
|
388
|
+
* Get the stored public key (cached for performance).
|
|
389
|
+
*
|
|
390
|
+
* Returns the public key, or `null` when a read SUCCEEDS and finds none.
|
|
391
|
+
* THROWS {@link IdentityUnavailableError} when storage is unreadable (keychain
|
|
392
|
+
* locked / module load failure) — a thrown read is NEVER flattened to `null`
|
|
393
|
+
* and NEVER cached, so a poisoned "no identity" verdict can no longer stick.
|
|
394
|
+
*/
|
|
395
|
+
static getPublicKey(): Promise<string | null>;
|
|
396
|
+
/**
|
|
397
|
+
* Persist the recovery mnemonic (the 12-word phrase) into its dedicated,
|
|
398
|
+
* device-only keychain slot so the user can re-reveal it from Settings after
|
|
399
|
+
* onboarding.
|
|
400
|
+
*
|
|
401
|
+
* Called best-effort at identity creation/import, where the phrase is already
|
|
402
|
+
* in memory: a failure to persist it must NEVER fail the identity itself, so
|
|
403
|
+
* callers deliberately swallow the thrown error (logging it). Storage errors
|
|
404
|
+
* throw {@link IdentityUnavailableError} — same "cannot determine" semantics as
|
|
405
|
+
* the other getters — so a caller MAY observe/log the failure.
|
|
406
|
+
*
|
|
407
|
+
* The mnemonic is stored ONLY here — never in the marker, `getIdentityStatus`,
|
|
408
|
+
* logs, or any exported bundle.
|
|
409
|
+
*/
|
|
410
|
+
static storeRecoveryMnemonic(mnemonic: string): Promise<void>;
|
|
411
|
+
/**
|
|
412
|
+
* Read the stored recovery mnemonic for re-reveal in Settings.
|
|
413
|
+
*
|
|
414
|
+
* Returns the phrase, or `null` when a read SUCCEEDS and finds none — the
|
|
415
|
+
* expected result for any identity created/imported before this feature
|
|
416
|
+
* existed, since the phrase was never captured for those. THROWS
|
|
417
|
+
* {@link IdentityUnavailableError} when storage is unreadable (keychain locked
|
|
418
|
+
* / module load failure), matching {@link getPublicKey}'s contract — a thrown
|
|
419
|
+
* read is never flattened to `null`, so a caller distinguishes "phrase was
|
|
420
|
+
* never stored" from "keychain temporarily locked, retry".
|
|
421
|
+
*/
|
|
422
|
+
static getRecoveryMnemonic(): Promise<string | null>;
|
|
423
|
+
/**
|
|
424
|
+
* Delete the stored recovery mnemonic. Best-effort: a delete failure is logged
|
|
425
|
+
* and swallowed, never thrown — it runs inside the identity-deletion path where
|
|
426
|
+
* an unreadable keychain must not abort the wider teardown.
|
|
427
|
+
*/
|
|
428
|
+
static deleteRecoveryMnemonic(): Promise<void>;
|
|
429
|
+
/**
|
|
430
|
+
* Check if a complete, parseable identity exists on this device.
|
|
431
|
+
*
|
|
432
|
+
* Returns `true` only when BOTH the private and public keys are present,
|
|
433
|
+
* both are well-formed, AND the public key derives from the private key.
|
|
434
|
+
* A partially-written or corrupted identity (read succeeded, bytes empty/bad)
|
|
435
|
+
* returns `false` so that downstream code can resume the create / restore flow.
|
|
436
|
+
* THROWS {@link IdentityUnavailableError} when storage is unreadable — a locked
|
|
437
|
+
* keychain must never be mistaken for "no identity" (the old behavior that let
|
|
438
|
+
* onboarding treat a transient lock as a blank device).
|
|
439
|
+
*
|
|
440
|
+
* Note: this does NOT perform the full sign/verify roundtrip — call
|
|
441
|
+
* `verifyIdentityIntegrity()` for that.
|
|
442
|
+
*/
|
|
443
|
+
static hasIdentity(): Promise<boolean>;
|
|
444
|
+
/**
|
|
445
|
+
* Authoritative identity verdict — the corruption-vs-fresh-install
|
|
446
|
+
* disambiguator that routing (commons) keys off of.
|
|
447
|
+
*
|
|
448
|
+
* - Healthy pair → `present` (and the marker is backfilled if missing or
|
|
449
|
+
* pointing at a different key, `origin: 'backfill'`).
|
|
450
|
+
* - Read succeeded but no healthy pair, WITH a marker → `lost` (keystore death
|
|
451
|
+
* / corruption; route to recovery, NEVER to create).
|
|
452
|
+
* - Read succeeded, no pair, NO marker → `absent` (a genuine fresh device; the
|
|
453
|
+
* only state that may route to onboarding/create).
|
|
454
|
+
* - A read THREW → `unavailable` (keychain locked); this verdict is NEVER
|
|
455
|
+
* cached, so a later call re-reads.
|
|
456
|
+
*
|
|
457
|
+
* @param opts.bypassCache When true, never reads OR writes the in-memory cache
|
|
458
|
+
* — a pure, fresh storage verdict for the auto-create interlock preflight.
|
|
459
|
+
*/
|
|
460
|
+
static getIdentityStatus(opts?: {
|
|
461
|
+
bypassCache?: boolean;
|
|
462
|
+
}): Promise<IdentityStatus>;
|
|
463
|
+
/**
|
|
464
|
+
* Delete the stored identity (both keys)
|
|
465
|
+
* Use with EXTREME caution - this is irreversible without a recovery phrase
|
|
466
|
+
* This should ONLY be called when explicitly requested by the user
|
|
467
|
+
* @param skipBackup - If true, skip backup before deletion (default: false)
|
|
468
|
+
* @param force - If true, skip confirmation checks (default: false)
|
|
469
|
+
* @param userConfirmed - If true, user has explicitly confirmed deletion (default: false)
|
|
470
|
+
*/
|
|
471
|
+
static deleteIdentity(skipBackup?: boolean, force?: boolean, userConfirmed?: boolean): Promise<void>;
|
|
472
|
+
/**
|
|
473
|
+
* Backup identity to SecureStore (separate backup storage)
|
|
474
|
+
* This provides a recovery mechanism if primary storage fails
|
|
475
|
+
*/
|
|
476
|
+
static backupIdentity(): Promise<boolean>;
|
|
477
|
+
/**
|
|
478
|
+
* Verify identity integrity — checks keys are valid, accessible, derive
|
|
479
|
+
* consistently, AND can sign + verify a probe message.
|
|
480
|
+
*
|
|
481
|
+
* Returns true only when the full sign/verify roundtrip succeeds. Use
|
|
482
|
+
* this on app start to detect silent corruption before the user finds
|
|
483
|
+
* out by failing to sign in.
|
|
484
|
+
*/
|
|
485
|
+
static verifyIdentityIntegrity(): Promise<boolean>;
|
|
486
|
+
/**
|
|
487
|
+
* Restore identity from backup if primary storage is genuinely missing or
|
|
488
|
+
* corrupt.
|
|
489
|
+
*
|
|
490
|
+
* SAFETY (three independent guards against silently switching accounts):
|
|
491
|
+
* 1. If the primary passes a full sign/verify probe, do nothing.
|
|
492
|
+
* 2. If the primary keys CANNOT BE READ (storage threw — e.g. a transient
|
|
493
|
+
* keychain lock during a background launch), do nothing. We must NOT
|
|
494
|
+
* treat "couldn't read" as "corrupted" and restore a possibly-stale
|
|
495
|
+
* backup over an identity that is actually fine but momentarily
|
|
496
|
+
* inaccessible.
|
|
497
|
+
* 3. If a primary private/public key IS present but does not match the
|
|
498
|
+
* backup, the backup may belong to a different identity — refuse, so we
|
|
499
|
+
* never silently switch the user to another account.
|
|
500
|
+
*
|
|
501
|
+
* Only when the primary is provably absent (read succeeded, returned
|
|
502
|
+
* null/empty) or provably corrupt (read succeeded, bytes malformed AND no
|
|
503
|
+
* conflicting key material is present) do we rebuild it from the backup.
|
|
504
|
+
*/
|
|
505
|
+
static restoreIdentityFromBackup(): Promise<boolean>;
|
|
506
|
+
/**
|
|
507
|
+
* Recovery ladder — restore a `lost` identity from an independent,
|
|
508
|
+
* `key_v1`-surviving source WITHOUT the user re-entering their recovery phrase.
|
|
509
|
+
*
|
|
510
|
+
* Gated on {@link getIdentityStatus} being `lost` (marker present, keys empty):
|
|
511
|
+
* - `present` / `absent` → `not-lost` (nothing to recover / nothing lost)
|
|
512
|
+
* - `unavailable` → `unavailable` (keychain locked; retry later)
|
|
513
|
+
*
|
|
514
|
+
* Rungs, tried in order, each fully validated (well-formed + derive-match +
|
|
515
|
+
* `publicKey === marker.publicKey`, so a source holding a DIFFERENT account is
|
|
516
|
+
* SKIPPED, never restored):
|
|
517
|
+
* 1. the v2 backup slot (independent keychain key from the primary), then
|
|
518
|
+
* 2. the cross-app shared slot (Android bridge `getShared` / iOS keychain
|
|
519
|
+
* group) — the copy that survives a primary+backup `key_v1` death.
|
|
520
|
+
*
|
|
521
|
+
* On success it re-persists via {@link _persistIdentityAtomic} (origin
|
|
522
|
+
* `'restore'`) and invalidates the cache so routing re-reads `present`. When no
|
|
523
|
+
* rung matches, the UI proceeds to recovery-phrase entry.
|
|
524
|
+
*/
|
|
525
|
+
static attemptIdentityRecovery(): Promise<IdentityRecoveryResult>;
|
|
526
|
+
/** Read the active-layout backup slot as a healthy candidate, or null. @internal */
|
|
527
|
+
private static _readBackupCandidate;
|
|
528
|
+
/** Read the cross-app shared slot as a healthy candidate, or null. @internal */
|
|
529
|
+
private static _readSharedCandidate;
|
|
530
|
+
/** Persist a validated recovery candidate + refresh caches/subscribers. @internal */
|
|
531
|
+
private static _commitRecovery;
|
|
532
|
+
/**
|
|
533
|
+
* Derive public key from a private key (without storing)
|
|
534
|
+
*/
|
|
535
|
+
static derivePublicKey(privateKey: string): string;
|
|
536
|
+
/**
|
|
537
|
+
* Normalize a public key to uncompressed, lowercased hex. Used when building
|
|
538
|
+
* signed rotation payloads so legacy compressed/cased encodings still verify.
|
|
539
|
+
*/
|
|
540
|
+
static canonicalPublicKey(publicKey: string): string;
|
|
541
|
+
/**
|
|
542
|
+
* Validate that a string is a valid public key
|
|
543
|
+
*
|
|
544
|
+
* Returns false on parse errors (invalid input is the expected fail mode here).
|
|
545
|
+
* Errors are logged at debug level so they're available when troubleshooting
|
|
546
|
+
* but don't pollute production logs.
|
|
547
|
+
*/
|
|
548
|
+
static isValidPublicKey(publicKey: string): boolean;
|
|
549
|
+
/**
|
|
550
|
+
* Validate that a string is a valid private key.
|
|
551
|
+
*
|
|
552
|
+
* secp256k1 private keys are 256-bit, so 64 hex chars. We require strict
|
|
553
|
+
* hex-only input so malformed text can never be coerced into a scalar.
|
|
554
|
+
*/
|
|
555
|
+
static isValidPrivateKey(privateKey: string): boolean;
|
|
556
|
+
/**
|
|
557
|
+
* Derive a 32-byte, domain-separated seed from the on-device Oxy identity
|
|
558
|
+
* private key via HKDF-SHA256, WITHOUT ever exposing the raw private key.
|
|
559
|
+
*
|
|
560
|
+
* The domain separation is carried by `info` (e.g. `"oxypay/faircoin/v1"`),
|
|
561
|
+
* so distinct apps/purposes get independent seeds from the same identity.
|
|
562
|
+
* The output is HKDF keying material, never the private key itself — a
|
|
563
|
+
* consumer (e.g. Oxy Pay's FairCoin HD wallet) can feed it straight into
|
|
564
|
+
* `HDKey.fromMasterSeed` and never touches the identity key.
|
|
565
|
+
*
|
|
566
|
+
* Key source (native only): prefers the shared ecosystem identity written to
|
|
567
|
+
* `group.so.oxy.shared` (what a Relying Party like Oxy Pay reads), then falls
|
|
568
|
+
* back to this device's primary identity (Commons/Accounts). Both reproduce
|
|
569
|
+
* from the user's Oxy recovery phrase, so the derived seed is recoverable.
|
|
570
|
+
*
|
|
571
|
+
* @param info Context/domain-binding label (distinct labels → independent seeds).
|
|
572
|
+
* @returns 32 bytes of derived keying material, or `null` on web / when no
|
|
573
|
+
* identity key is available on this device.
|
|
574
|
+
*/
|
|
575
|
+
static deriveScopedSeed(info: string): Promise<Uint8Array | null>;
|
|
576
|
+
/**
|
|
577
|
+
* Get a shortened version of the public key for display
|
|
578
|
+
* Format: first 8 chars...last 8 chars
|
|
579
|
+
*/
|
|
580
|
+
static shortenPublicKey(publicKey: string): string;
|
|
581
|
+
}
|
|
582
|
+
export default KeyManager;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crypto Polyfills
|
|
3
|
+
*
|
|
4
|
+
* Ensures Buffer and crypto.getRandomValues are available
|
|
5
|
+
* across all platforms (Node.js, Browser, React Native).
|
|
6
|
+
*
|
|
7
|
+
* Guard order when installing a `getRandomValues` shim (see bottom of file and
|
|
8
|
+
* {@link cryptoPolyfill}):
|
|
9
|
+
*
|
|
10
|
+
* 1. A REAL `globalThis.crypto.getRandomValues` — used as-is (browser, Node
|
|
11
|
+
* >= 20, modern Hermes). The shim below is only installed when the host is
|
|
12
|
+
* missing it, so this branch is the install-time gate.
|
|
13
|
+
* 2. Node — backed by the built-in `node:crypto` module (`webcrypto`, else
|
|
14
|
+
* `randomFillSync`). This is what a Node runtime WITHOUT a global WebCrypto
|
|
15
|
+
* (Node 18 script entrypoints, some embedded hosts) falls back to.
|
|
16
|
+
* 3. React Native — `expo-crypto.getRandomBytes` (statically imported via the
|
|
17
|
+
* per-platform `platform/crypto` module in `@oxy.so/protocol`).
|
|
18
|
+
*
|
|
19
|
+
* Historically step (2) delegated to `@oxy.so/protocol`'s RN-only
|
|
20
|
+
* `getRandomBytesRN`, which THROWS on Node — so any Node host lacking a global
|
|
21
|
+
* WebCrypto crashed here instead of getting randomness. It is now a proper
|
|
22
|
+
* Node-backed implementation.
|
|
23
|
+
*/
|
|
24
|
+
import { Buffer } from 'buffer';
|
|
25
|
+
export { Buffer };
|