@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,143 @@
|
|
|
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
|
+
|
|
25
|
+
import { Buffer } from 'buffer';
|
|
26
|
+
import { getRandomBytesRN, isNodeJS } from '@oxy.so/protocol';
|
|
27
|
+
|
|
28
|
+
const getGlobalObject = (): typeof globalThis => {
|
|
29
|
+
if (typeof globalThis !== 'undefined') return globalThis;
|
|
30
|
+
if (typeof global !== 'undefined') return global;
|
|
31
|
+
if (typeof window !== 'undefined') return window as unknown as typeof globalThis;
|
|
32
|
+
if (typeof self !== 'undefined') return self as unknown as typeof globalThis;
|
|
33
|
+
return {} as typeof globalThis;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const globalObject = getGlobalObject();
|
|
37
|
+
|
|
38
|
+
// Make Buffer available globally for libraries that depend on it
|
|
39
|
+
if (!globalObject.Buffer) {
|
|
40
|
+
(globalObject as unknown as { Buffer: typeof Buffer }).Buffer = Buffer;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type CryptoLike = {
|
|
44
|
+
getRandomValues: <T extends ArrayBufferView>(array: T) => T;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** Minimal structural shape of the parts of `node:crypto` this polyfill uses. */
|
|
48
|
+
interface NodeCryptoLike {
|
|
49
|
+
webcrypto?: {
|
|
50
|
+
getRandomValues?: <T extends ArrayBufferView>(array: T) => T;
|
|
51
|
+
};
|
|
52
|
+
randomFillSync?: <T extends ArrayBufferView>(buffer: T) => T;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Lazily-resolved `node:crypto` module, cached after the first attempt.
|
|
57
|
+
* `undefined` = not tried yet; `null` = tried and unavailable (non-Node host).
|
|
58
|
+
*/
|
|
59
|
+
let cachedNodeCrypto: NodeCryptoLike | null | undefined;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Synchronously load `node:crypto` on a Node runtime, or `null` elsewhere.
|
|
63
|
+
*
|
|
64
|
+
* Uses a guarded, Node-only `require`. Every runtime that actually reaches this
|
|
65
|
+
* branch has a working CommonJS `require`: `@oxy.so/core` publishes no
|
|
66
|
+
* `"type": "module"`, so Node loads it as CommonJS and the `require` free
|
|
67
|
+
* variable is present. Browsers never reach here (they own `globalThis.crypto`,
|
|
68
|
+
* so this polyfill is never installed) and React Native takes the
|
|
69
|
+
* `getRandomBytesRN` branch — so the `node:crypto` reference is dead code in
|
|
70
|
+
* those bundles, and Expo's Metro resolver shims `node:*` builtins, keeping
|
|
71
|
+
* web/native bundles green.
|
|
72
|
+
*/
|
|
73
|
+
function loadNodeCryptoSync(): NodeCryptoLike | null {
|
|
74
|
+
if (cachedNodeCrypto !== undefined) {
|
|
75
|
+
return cachedNodeCrypto;
|
|
76
|
+
}
|
|
77
|
+
if (typeof require !== 'function') {
|
|
78
|
+
cachedNodeCrypto = null;
|
|
79
|
+
return cachedNodeCrypto;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
cachedNodeCrypto = require('node:crypto') as NodeCryptoLike;
|
|
83
|
+
} catch {
|
|
84
|
+
// No Node crypto (unexpected on a real Node host) — degrade to the next
|
|
85
|
+
// mechanism rather than crash.
|
|
86
|
+
cachedNodeCrypto = null;
|
|
87
|
+
}
|
|
88
|
+
return cachedNodeCrypto;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Fill `array` with cryptographically-secure random bytes from `node:crypto`.
|
|
93
|
+
* Prefers `webcrypto.getRandomValues`; falls back to `randomFillSync`. Returns
|
|
94
|
+
* `false` when Node crypto is unavailable so the caller can try the next
|
|
95
|
+
* mechanism.
|
|
96
|
+
*/
|
|
97
|
+
function fillFromNodeCrypto(array: ArrayBufferView): boolean {
|
|
98
|
+
const nodeCrypto = loadNodeCryptoSync();
|
|
99
|
+
if (!nodeCrypto) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
const webcrypto = nodeCrypto.webcrypto;
|
|
103
|
+
if (webcrypto && typeof webcrypto.getRandomValues === 'function') {
|
|
104
|
+
try {
|
|
105
|
+
webcrypto.getRandomValues(array);
|
|
106
|
+
return true;
|
|
107
|
+
} catch {
|
|
108
|
+
// `webcrypto.getRandomValues` rejects non-integer views (Float*Array,
|
|
109
|
+
// DataView); fall through to `randomFillSync`, which accepts any view.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (typeof nodeCrypto.randomFillSync === 'function') {
|
|
113
|
+
nodeCrypto.randomFillSync(array);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const cryptoPolyfill: CryptoLike = {
|
|
120
|
+
getRandomValues<T extends ArrayBufferView>(array: T): T {
|
|
121
|
+
// Node: back the CSPRNG with `node:crypto`. This is the path that matters on
|
|
122
|
+
// Node runtimes shipping WITHOUT a global WebCrypto — where delegating to
|
|
123
|
+
// the RN-only expo-crypto stub would throw.
|
|
124
|
+
if (isNodeJS() && fillFromNodeCrypto(array)) {
|
|
125
|
+
return array;
|
|
126
|
+
}
|
|
127
|
+
// React Native (and any non-Node host without WebCrypto): synchronous
|
|
128
|
+
// expo-crypto via @oxy.so/protocol's RN `platform/crypto` variant.
|
|
129
|
+
const bytes = getRandomBytesRN(array.byteLength);
|
|
130
|
+
const uint8View = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
|
|
131
|
+
uint8View.set(bytes);
|
|
132
|
+
return array;
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Only polyfill if crypto or crypto.getRandomValues is not available
|
|
137
|
+
if (typeof globalObject.crypto === 'undefined') {
|
|
138
|
+
(globalObject as unknown as { crypto: CryptoLike }).crypto = cryptoPolyfill;
|
|
139
|
+
} else if (typeof globalObject.crypto.getRandomValues !== 'function') {
|
|
140
|
+
(globalObject.crypto as CryptoLike).getRandomValues = cryptoPolyfill.getRandomValues;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export { Buffer };
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery Phrase Service - BIP39 Mnemonic Generation
|
|
3
|
+
*
|
|
4
|
+
* Handles generation and restoration of recovery phrases (mnemonic seeds)
|
|
5
|
+
* for backing up and restoring user identities.
|
|
6
|
+
*
|
|
7
|
+
* Note: This module requires the polyfill to be loaded first (done via crypto/index.ts)
|
|
8
|
+
*
|
|
9
|
+
* Oxy recovery phrases are English-only, so the English wordlist is imported by
|
|
10
|
+
* its own subpath. Never reach for a package that exposes its wordlists through
|
|
11
|
+
* a barrel: `bip39`'s `_wordlists` hard-requires all ten languages, which put
|
|
12
|
+
* ~265 KB of unreachable wordlists into the initial chunk of every consuming
|
|
13
|
+
* app. Adding another language means one more subpath import, ideally lazy.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { generateMnemonic, mnemonicToSeed, validateMnemonic } from '@scure/bip39';
|
|
17
|
+
import { wordlist } from '@scure/bip39/wordlists/english';
|
|
18
|
+
import { KeyManager } from './keyManager';
|
|
19
|
+
import { hkdfSha256 } from './kdf';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Convert Uint8Array or array-like to hexadecimal string
|
|
23
|
+
* Works in both Node.js and React Native without depending on Buffer
|
|
24
|
+
*/
|
|
25
|
+
function toHex(data: Uint8Array | ArrayLike<number>): string {
|
|
26
|
+
// Convert to array of numbers if needed
|
|
27
|
+
const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
28
|
+
return Array.from(bytes)
|
|
29
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
30
|
+
.join('');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** UTF-8 encode an ASCII label to bytes (for HKDF salt/info). */
|
|
34
|
+
function utf8(label: string): Uint8Array {
|
|
35
|
+
return new TextEncoder().encode(label);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* HKDF context tag for the encrypted-backup key schedule (b3 Feature 1). Used as
|
|
40
|
+
* the HKDF `salt`; distinct from any other Oxy key-derivation salt so the backup
|
|
41
|
+
* key schedule is independent. Versioned so a future scheme change is a new tag.
|
|
42
|
+
*/
|
|
43
|
+
export const BACKUP_KDF_SALT = 'oxy-identity-backup-v1';
|
|
44
|
+
/** HKDF `info` label that derives the symmetric AEAD key from the seed. */
|
|
45
|
+
export const BACKUP_KDF_ENCRYPTION_INFO = 'oxy-backup-encryption-key';
|
|
46
|
+
/** HKDF `info` label that derives the (server-hashed) backup locator from the seed. */
|
|
47
|
+
export const BACKUP_KDF_LOOKUP_INFO = 'oxy-backup-lookup-id';
|
|
48
|
+
/** Byte length of both the derived backup key and the derived lookup id (256-bit). */
|
|
49
|
+
export const BACKUP_MATERIAL_LENGTH = 32;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The two pieces of key material derived from a recovery phrase for the
|
|
53
|
+
* encrypted off-device backup, kept strictly separate by HKDF domain separation.
|
|
54
|
+
*/
|
|
55
|
+
export interface BackupMaterial {
|
|
56
|
+
/**
|
|
57
|
+
* The 32-byte symmetric key handed to `encryptAead`/`decryptAead`. NEVER
|
|
58
|
+
* leaves the device — the server sees only ciphertext produced with it.
|
|
59
|
+
*/
|
|
60
|
+
backupKey: Uint8Array;
|
|
61
|
+
/**
|
|
62
|
+
* The 256-bit backup locator, hex. Sent to the server, which stores ONLY
|
|
63
|
+
* `sha256(lookupId)` — so possession of this value (which itself requires the
|
|
64
|
+
* full seed to compute) is what locates a backup, and the server can never
|
|
65
|
+
* recompute it from what it stores.
|
|
66
|
+
*/
|
|
67
|
+
lookupId: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface RecoveryPhraseResult {
|
|
71
|
+
phrase: string;
|
|
72
|
+
words: string[];
|
|
73
|
+
publicKey: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A freshly-derived identity that has NOT been persisted to secure storage.
|
|
78
|
+
*
|
|
79
|
+
* Unlike {@link RecoveryPhraseResult} this also exposes the `privateKey`, because
|
|
80
|
+
* the caller must be able to sign with (or later persist) the material itself —
|
|
81
|
+
* the whole point of a "pending" identity is that nothing is committed until an
|
|
82
|
+
* external step (e.g. a server-confirmed key rotation) succeeds.
|
|
83
|
+
*/
|
|
84
|
+
export interface PendingIdentityResult {
|
|
85
|
+
phrase: string;
|
|
86
|
+
words: string[];
|
|
87
|
+
privateKey: string;
|
|
88
|
+
publicKey: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface GenerateIdentityOptions {
|
|
92
|
+
/**
|
|
93
|
+
* Pass `true` to allow overwriting an existing on-device identity.
|
|
94
|
+
*
|
|
95
|
+
* Defaults to `false`. When false, this method throws
|
|
96
|
+
* `IdentityAlreadyExistsError` if a complete identity already exists,
|
|
97
|
+
* preventing accidental account loss. UI flows MUST only set this to
|
|
98
|
+
* `true` after explicitly confirming the user has saved their previous
|
|
99
|
+
* recovery phrase (or has otherwise been warned).
|
|
100
|
+
*/
|
|
101
|
+
overwrite?: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export class RecoveryPhraseService {
|
|
105
|
+
/**
|
|
106
|
+
* Generate a new identity with a recovery phrase.
|
|
107
|
+
* The mnemonic phrase MUST be shown to the user exactly once after this
|
|
108
|
+
* call resolves — if it is lost, the account becomes unrecoverable.
|
|
109
|
+
*
|
|
110
|
+
* Refuses to overwrite an existing identity unless `options.overwrite === true`.
|
|
111
|
+
*
|
|
112
|
+
* @throws IdentityAlreadyExistsError if an identity already exists and overwrite is not set
|
|
113
|
+
*/
|
|
114
|
+
static async generateIdentityWithRecovery(
|
|
115
|
+
options?: GenerateIdentityOptions,
|
|
116
|
+
): Promise<RecoveryPhraseResult> {
|
|
117
|
+
// Generate 128-bit entropy for 12-word mnemonic
|
|
118
|
+
const mnemonic = generateMnemonic(wordlist, 128);
|
|
119
|
+
|
|
120
|
+
// Derive private key from mnemonic
|
|
121
|
+
// Using the seed directly as the private key (simplified approach)
|
|
122
|
+
const seed = await mnemonicToSeed(mnemonic);
|
|
123
|
+
|
|
124
|
+
// Use first 32 bytes of seed as private key
|
|
125
|
+
const privateKeyHex = toHex(seed.subarray(0, 32));
|
|
126
|
+
|
|
127
|
+
// Import the derived key pair. KeyManager.importKeyPair will refuse to
|
|
128
|
+
// clobber an existing identity unless overwrite is explicitly requested.
|
|
129
|
+
const publicKey = await KeyManager.importKeyPair(privateKeyHex, {
|
|
130
|
+
overwrite: options?.overwrite === true,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
phrase: mnemonic,
|
|
135
|
+
words: mnemonic.split(' '),
|
|
136
|
+
publicKey,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Generate a 24-word recovery phrase for higher security.
|
|
142
|
+
*
|
|
143
|
+
* Same overwrite-protection semantics as `generateIdentityWithRecovery`.
|
|
144
|
+
*/
|
|
145
|
+
static async generateIdentityWithRecovery24(
|
|
146
|
+
options?: GenerateIdentityOptions,
|
|
147
|
+
): Promise<RecoveryPhraseResult> {
|
|
148
|
+
// Generate 256-bit entropy for 24-word mnemonic
|
|
149
|
+
const mnemonic = generateMnemonic(wordlist, 256);
|
|
150
|
+
|
|
151
|
+
const seed = await mnemonicToSeed(mnemonic);
|
|
152
|
+
const privateKeyHex = toHex(seed.subarray(0, 32));
|
|
153
|
+
const publicKey = await KeyManager.importKeyPair(privateKeyHex, {
|
|
154
|
+
overwrite: options?.overwrite === true,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
phrase: mnemonic,
|
|
159
|
+
words: mnemonic.split(' '),
|
|
160
|
+
publicKey,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Derive a brand-new identity + recovery phrase WITHOUT persisting anything.
|
|
166
|
+
*
|
|
167
|
+
* Pure: same derivation as {@link generateIdentityWithRecovery} (128-bit
|
|
168
|
+
* mnemonic → seed → first 32 bytes as the secp256k1 private key) but it stops
|
|
169
|
+
* BEFORE `KeyManager.importKeyPair`, so no on-device identity is touched. The
|
|
170
|
+
* caller decides if/when to commit the material (e.g. only after a server
|
|
171
|
+
* confirms a key rotation). Works on web too — it never reads or writes secure
|
|
172
|
+
* storage.
|
|
173
|
+
*
|
|
174
|
+
* The 12-word `phrase` MUST be shown to the user before the identity is
|
|
175
|
+
* committed anywhere — if it is lost the account becomes unrecoverable.
|
|
176
|
+
*/
|
|
177
|
+
static async derivePendingIdentity(): Promise<PendingIdentityResult> {
|
|
178
|
+
const mnemonic = generateMnemonic(wordlist, 128);
|
|
179
|
+
const seed = await mnemonicToSeed(mnemonic);
|
|
180
|
+
const privateKey = toHex(seed.subarray(0, 32));
|
|
181
|
+
const publicKey = KeyManager.derivePublicKey(privateKey);
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
phrase: mnemonic,
|
|
185
|
+
words: mnemonic.split(' '),
|
|
186
|
+
privateKey,
|
|
187
|
+
publicKey,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Derive the private key from a recovery phrase WITHOUT storing it.
|
|
193
|
+
*
|
|
194
|
+
* The private-key counterpart of {@link derivePublicKeyFromPhrase}. Used to
|
|
195
|
+
* re-derive a key in memory (e.g. to sign a rotation proof with the current
|
|
196
|
+
* key when the device has no SecureStore copy). Never persists — the returned
|
|
197
|
+
* material lives only in the caller's memory.
|
|
198
|
+
*/
|
|
199
|
+
static async derivePrivateKeyFromPhrase(phrase: string): Promise<string> {
|
|
200
|
+
const normalizedPhrase = phrase.trim().toLowerCase();
|
|
201
|
+
|
|
202
|
+
if (!validateMnemonic(normalizedPhrase, wordlist)) {
|
|
203
|
+
throw new Error('Invalid recovery phrase');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const seed = await mnemonicToSeed(normalizedPhrase);
|
|
207
|
+
return toHex(seed.subarray(0, 32));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Derive the encrypted-backup key material from a recovery phrase (b3 Feature
|
|
212
|
+
* 1). PURE and additive — it does NOT touch the frozen phrase→privateKey
|
|
213
|
+
* derivation ({@link derivePrivateKeyFromPhrase} slices the first 32 seed
|
|
214
|
+
* bytes) and never reads or writes secure storage.
|
|
215
|
+
*
|
|
216
|
+
* Both outputs are derived from the FULL 64-byte BIP-39 seed via HKDF-SHA256
|
|
217
|
+
* with domain-separated `info` labels, so the domain separation is real: a
|
|
218
|
+
* device compromise that leaks only the raw 32-byte private key can compute
|
|
219
|
+
* NEITHER the backup key nor the lookup id (both need the whole seed). Locating
|
|
220
|
+
* AND decrypting a backup therefore requires the recovery phrase.
|
|
221
|
+
*
|
|
222
|
+
* @param phrase - The BIP-39 recovery phrase (validated + normalized here).
|
|
223
|
+
* @returns `{ backupKey, lookupId }` — the AEAD key (kept local) and the hex
|
|
224
|
+
* locator (uploaded; server stores only its hash).
|
|
225
|
+
* @throws if the phrase is not a valid BIP-39 mnemonic.
|
|
226
|
+
*/
|
|
227
|
+
static async deriveBackupMaterial(phrase: string): Promise<BackupMaterial> {
|
|
228
|
+
const normalizedPhrase = phrase.trim().toLowerCase();
|
|
229
|
+
|
|
230
|
+
if (!validateMnemonic(normalizedPhrase, wordlist)) {
|
|
231
|
+
throw new Error('Invalid recovery phrase. Please check the words and try again.');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const seed = await mnemonicToSeed(normalizedPhrase);
|
|
235
|
+
const salt = utf8(BACKUP_KDF_SALT);
|
|
236
|
+
const backupKey = hkdfSha256(seed, salt, utf8(BACKUP_KDF_ENCRYPTION_INFO), BACKUP_MATERIAL_LENGTH);
|
|
237
|
+
const lookupId = toHex(hkdfSha256(seed, salt, utf8(BACKUP_KDF_LOOKUP_INFO), BACKUP_MATERIAL_LENGTH));
|
|
238
|
+
|
|
239
|
+
return { backupKey, lookupId };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Restore an identity from a recovery phrase.
|
|
244
|
+
*
|
|
245
|
+
* Refuses to overwrite a DIFFERENT existing identity unless
|
|
246
|
+
* `options.overwrite === true`. Re-importing the same phrase that
|
|
247
|
+
* matches the current identity is always allowed (it's a no-op refresh
|
|
248
|
+
* of the backup record).
|
|
249
|
+
*/
|
|
250
|
+
static async restoreFromPhrase(
|
|
251
|
+
phrase: string,
|
|
252
|
+
options?: GenerateIdentityOptions,
|
|
253
|
+
): Promise<string> {
|
|
254
|
+
// Normalize and validate the phrase
|
|
255
|
+
const normalizedPhrase = phrase.trim().toLowerCase();
|
|
256
|
+
|
|
257
|
+
if (!validateMnemonic(normalizedPhrase, wordlist)) {
|
|
258
|
+
throw new Error('Invalid recovery phrase. Please check the words and try again.');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Derive the same private key from the mnemonic
|
|
262
|
+
const seed = await mnemonicToSeed(normalizedPhrase);
|
|
263
|
+
const privateKeyHex = toHex(seed.subarray(0, 32));
|
|
264
|
+
|
|
265
|
+
// Import and store the key pair
|
|
266
|
+
const publicKey = await KeyManager.importKeyPair(privateKeyHex, {
|
|
267
|
+
overwrite: options?.overwrite === true,
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
return publicKey;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Validate a recovery phrase without importing it
|
|
275
|
+
*/
|
|
276
|
+
static validatePhrase(phrase: string): boolean {
|
|
277
|
+
const normalizedPhrase = phrase.trim().toLowerCase();
|
|
278
|
+
return validateMnemonic(normalizedPhrase, wordlist);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Get the word list for autocomplete/validation
|
|
283
|
+
*/
|
|
284
|
+
static getWordList(): string[] {
|
|
285
|
+
return wordlist;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Check if a word is valid in the BIP39 word list
|
|
290
|
+
*/
|
|
291
|
+
static isValidWord(word: string): boolean {
|
|
292
|
+
return wordlist.includes(word.toLowerCase());
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Get suggestions for a partial word
|
|
297
|
+
*/
|
|
298
|
+
static getSuggestions(partial: string, limit = 5): string[] {
|
|
299
|
+
const lowerPartial = partial.toLowerCase();
|
|
300
|
+
return wordlist.filter((word: string) => word.startsWith(lowerPartial)).slice(0, limit);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Derive the public key from a phrase without storing
|
|
305
|
+
* Useful for verification before importing
|
|
306
|
+
*/
|
|
307
|
+
static async derivePublicKeyFromPhrase(phrase: string): Promise<string> {
|
|
308
|
+
const normalizedPhrase = phrase.trim().toLowerCase();
|
|
309
|
+
|
|
310
|
+
if (!validateMnemonic(normalizedPhrase, wordlist)) {
|
|
311
|
+
throw new Error('Invalid recovery phrase');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const seed = await mnemonicToSeed(normalizedPhrase);
|
|
315
|
+
const privateKeyHex = toHex(seed.subarray(0, 32));
|
|
316
|
+
|
|
317
|
+
return KeyManager.derivePublicKey(privateKeyHex);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Convert a phrase to its word array
|
|
322
|
+
*/
|
|
323
|
+
static phraseToWords(phrase: string): string[] {
|
|
324
|
+
return phrase.trim().toLowerCase().split(/\s+/);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Convert a word array to a phrase string
|
|
329
|
+
*/
|
|
330
|
+
static wordsToPhrase(words: string[]): string {
|
|
331
|
+
return words.map(w => w.toLowerCase().trim()).join(' ');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export default RecoveryPhraseService;
|
|
336
|
+
|
|
337
|
+
|