@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,395 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSessionColdBoot = runSessionColdBoot;
|
|
4
|
+
/**
|
|
5
|
+
* Device-first session cold boot for every consumer.
|
|
6
|
+
*
|
|
7
|
+
* On a fresh page load / app launch this resolves the device's session in a
|
|
8
|
+
* deterministic order, built on the pure `runColdBoot` primitive. It NEVER
|
|
9
|
+
* redirects to a login page: an unresolved boot ends in a signed-out state that
|
|
10
|
+
* the app renders with a "Sign in with Oxy" button.
|
|
11
|
+
*
|
|
12
|
+
* Ordered steps (first to yield a session wins):
|
|
13
|
+
* 1. `warm-token-plant` (web + native) — the fastest path: when the persisted
|
|
14
|
+
* store still holds a warm access token that is valid for more than the
|
|
15
|
+
* refresh lead window, plant it and yield the session with NO network
|
|
16
|
+
* round-trip. The background scheduler rotates it shortly after.
|
|
17
|
+
* 2. `device-secret-mint` (web + native) — the zero-cookie transport: when the
|
|
18
|
+
* origin persisted a `deviceId` + `deviceSecret`, mint a short access token
|
|
19
|
+
* with a single bearer-less POST to `/session/device/token` (no cookie, no
|
|
20
|
+
* navigation) and rotate the secret in-use.
|
|
21
|
+
* 3. `shared-device-adopt` (native, ACCOUNT mode) — this app has no credential
|
|
22
|
+
* of its own but a sibling official app already put one in the shared native
|
|
23
|
+
* slot: adopt it and mint. This is how a newly installed official app joins
|
|
24
|
+
* the device's existing session WITHOUT another QR and without ever touching
|
|
25
|
+
* the Commons private key.
|
|
26
|
+
* 4. `shared-key-signin` (native, ACCOUNT mode) — the legacy lane: re-mint by
|
|
27
|
+
* signing with the shared-keychain IDENTITY key. Retained as a recovery /
|
|
28
|
+
* compatibility path for devices whose apps have not yet published a shared
|
|
29
|
+
* device credential — OR `identity-key-signin` (IDENTITY mode) — re-mint
|
|
30
|
+
* from THIS device's primary identity key.
|
|
31
|
+
* 5. Signed out.
|
|
32
|
+
*
|
|
33
|
+
* Two session modes (see {@link RunSessionColdBootOptions.sessionMode}):
|
|
34
|
+
* - `account` (default) — the device's ACTIVE account owns the session. Every
|
|
35
|
+
* Oxy app but the identity vault boots this way; behaviour is unchanged.
|
|
36
|
+
* - `identity` — the owner of the local PRIMARY identity key owns the session,
|
|
37
|
+
* permanently, regardless of which account the device is switched to. Each
|
|
38
|
+
* step above is bound to the persisted identity pin, and the shared-keychain
|
|
39
|
+
* lane is replaced by the primary-key one (the shared slot is a CROSS-APP
|
|
40
|
+
* slot that may hold a different identity).
|
|
41
|
+
*
|
|
42
|
+
* ESM-safe (no `require()`); no react/react-native/expo imports.
|
|
43
|
+
*/
|
|
44
|
+
const coldBoot_1 = require("../utils/coldBoot");
|
|
45
|
+
const platform_1 = require("../utils/platform");
|
|
46
|
+
const logger_1 = require("../logger");
|
|
47
|
+
const cacheKey_1 = require("../utils/cacheKey");
|
|
48
|
+
const refresh_1 = require("../session/refresh");
|
|
49
|
+
const identitySession_1 = require("../session/identitySession");
|
|
50
|
+
const sharedDeviceCredential_1 = require("../session/sharedDeviceCredential");
|
|
51
|
+
/**
|
|
52
|
+
* Run the device-first cold boot. Resolves to the `runColdBoot` outcome and, as
|
|
53
|
+
* a side effect, invokes `onSession` (winning session, token already planted) or
|
|
54
|
+
* `onSignedOut` (no session).
|
|
55
|
+
*/
|
|
56
|
+
async function runSessionColdBoot(opts) {
|
|
57
|
+
const { oxy, store } = opts;
|
|
58
|
+
const isNative = opts.platform?.isNative ?? (0, platform_1.isNative)();
|
|
59
|
+
// Non-null ONLY in identity mode; every `!== null` test below therefore reads
|
|
60
|
+
// as "is this boot identity-bound?" while also narrowing the binding.
|
|
61
|
+
const identityBinding = opts.sessionMode === 'identity' ? opts.identity ?? null : null;
|
|
62
|
+
if (opts.sessionMode === 'identity' && identityBinding === null) {
|
|
63
|
+
logger_1.logger.error('runSessionColdBoot: sessionMode "identity" requires an `identity` binding — refusing to run any lane (an identity-bound client must never adopt the device active account)', undefined, { component: 'sessionColdBoot', method: 'runSessionColdBoot' });
|
|
64
|
+
await opts.onSignedOut?.('error');
|
|
65
|
+
return { kind: 'unauthenticated' };
|
|
66
|
+
}
|
|
67
|
+
// Best-effort connectivity gate for the NETWORK steps only. A missing hint or
|
|
68
|
+
// any non-`true` verdict means "assume online" — never falsely skip a real
|
|
69
|
+
// sign-in on an ambiguous probe.
|
|
70
|
+
const isOffline = () => opts.isOffline?.() ?? false;
|
|
71
|
+
// Boot-local (not module-level) so it cannot leak across boots or break under
|
|
72
|
+
// bundler re-evaluation.
|
|
73
|
+
let signedOutReason = 'no_session';
|
|
74
|
+
// Boot-local memo for the identity pin. Resolved lazily INSIDE a step so the
|
|
75
|
+
// (local, but storage-backed) read is covered by `overallDeadlineMs`, and
|
|
76
|
+
// resolved at most once per boot so two steps cannot disagree. Always `null`
|
|
77
|
+
// in account mode.
|
|
78
|
+
let pinResolved = false;
|
|
79
|
+
let cachedPin = null;
|
|
80
|
+
const getIdentityPin = async () => {
|
|
81
|
+
if (identityBinding === null) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
if (!pinResolved) {
|
|
85
|
+
cachedPin = await (0, identitySession_1.resolveIdentityPin)(identityBinding);
|
|
86
|
+
pinResolved = true;
|
|
87
|
+
}
|
|
88
|
+
return cachedPin;
|
|
89
|
+
};
|
|
90
|
+
const steps = [];
|
|
91
|
+
// 1. warm-token-plant (web + native) — the fastest path. When the persisted
|
|
92
|
+
// store already holds a still-valid warm access token (its expiry more than
|
|
93
|
+
// the refresh lead window away) plus its owning session identity, plant it
|
|
94
|
+
// and yield the session IMMEDIATELY, skipping the blocking mint round-trip on
|
|
95
|
+
// first paint. The token is used AS-IS: this step NEVER mints, rotates, or
|
|
96
|
+
// persists anything. The proactive `startTokenRefreshScheduler` + the
|
|
97
|
+
// request-time preflight (both wired in the services provider) rotate it in
|
|
98
|
+
// the background; a revoked token self-heals via the 401 -> re-mint -> clear
|
|
99
|
+
// path. This exposure is sanctioned by `authStateStore.ts` (~L30-36): the
|
|
100
|
+
// warm token is short-lived and adds nothing over the already-persisted
|
|
101
|
+
// `deviceSecret`.
|
|
102
|
+
steps.push({
|
|
103
|
+
id: 'warm-token-plant',
|
|
104
|
+
run: async () => {
|
|
105
|
+
const persisted = await store.load();
|
|
106
|
+
if (!persisted?.accessToken || !persisted.sessionId || !persisted.userId || !persisted.expiresAt) {
|
|
107
|
+
return { kind: 'skip' };
|
|
108
|
+
}
|
|
109
|
+
// Guard a malformed `expiresAt` (Date.parse -> NaN): treat as not-valid and
|
|
110
|
+
// fall through to the mint lane. A token still inside the refresh lead
|
|
111
|
+
// window (or already expired) is likewise skipped — let the mint lane get a
|
|
112
|
+
// fresh one rather than plant a token about to expire.
|
|
113
|
+
const expiresAtMs = new Date(persisted.expiresAt).getTime();
|
|
114
|
+
if (!Number.isFinite(expiresAtMs) || expiresAtMs <= Date.now() + refresh_1.TOKEN_REFRESH_LEAD_MS) {
|
|
115
|
+
return { kind: 'skip' };
|
|
116
|
+
}
|
|
117
|
+
if (identityBinding !== null) {
|
|
118
|
+
// Identity-bound: a persisted token is only acceptable when it belongs to
|
|
119
|
+
// the PINNED account. Both the token's own claim (`computeIdentityTag`,
|
|
120
|
+
// the same derivation `SessionClient.applyState` uses) and the owning
|
|
121
|
+
// session identity must match — a token planted for another account by an
|
|
122
|
+
// earlier account-mode write is exactly the durable drift this gate stops.
|
|
123
|
+
const pin = await getIdentityPin();
|
|
124
|
+
if (pin === null ||
|
|
125
|
+
persisted.userId !== pin.accountId ||
|
|
126
|
+
(0, cacheKey_1.computeIdentityTag)(persisted.accessToken) !== pin.accountId) {
|
|
127
|
+
return { kind: 'skip' };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
oxy.setTokens(persisted.accessToken);
|
|
131
|
+
return {
|
|
132
|
+
kind: 'session',
|
|
133
|
+
session: {
|
|
134
|
+
sessionId: persisted.sessionId,
|
|
135
|
+
userId: persisted.userId,
|
|
136
|
+
accessToken: persisted.accessToken,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
// 2. device-secret-mint (web + native) — the zero-cookie fast path. When the
|
|
142
|
+
// origin persisted a deviceId + deviceSecret, mint a short access token with
|
|
143
|
+
// a single bearer-less POST (no cookie, no navigation). The mint itself runs
|
|
144
|
+
// through `refreshDeviceSecretArm`, which acquires the client's PROCESS-WIDE
|
|
145
|
+
// single-flight, persists `nextDeviceSecret` BEFORE planting the token, and
|
|
146
|
+
// returns a classified outcome — so concurrent mint lanes share one in-flight
|
|
147
|
+
// request and the durable store always converges on the server's credential.
|
|
148
|
+
steps.push({
|
|
149
|
+
id: 'device-secret-mint',
|
|
150
|
+
// Network step — skip entirely when the caller reports the device offline so
|
|
151
|
+
// a doomed mint cannot burn the overall deadline before routing settles.
|
|
152
|
+
enabled: () => !isOffline(),
|
|
153
|
+
run: async () => {
|
|
154
|
+
const pin = await getIdentityPin();
|
|
155
|
+
if (identityBinding !== null && pin === null) {
|
|
156
|
+
// Identity-bound with no verified pin (never written, or cleared because
|
|
157
|
+
// the local key changed/vanished). An UNPINNED mint would adopt whichever
|
|
158
|
+
// account the device is currently switched to — the exact drift this mode
|
|
159
|
+
// exists to prevent. Fall through to `identity-key-signin`, which
|
|
160
|
+
// re-derives the account from the local key and rewrites the pin.
|
|
161
|
+
return { kind: 'skip' };
|
|
162
|
+
}
|
|
163
|
+
const result = await (0, refresh_1.refreshDeviceSecretArm)({ oxy, store, pin });
|
|
164
|
+
switch (result.status) {
|
|
165
|
+
case 'ok':
|
|
166
|
+
// The arm persisted nextDeviceSecret and planted the token.
|
|
167
|
+
return {
|
|
168
|
+
kind: 'session',
|
|
169
|
+
session: {
|
|
170
|
+
sessionId: result.sessionId,
|
|
171
|
+
userId: result.userId,
|
|
172
|
+
accessToken: result.token,
|
|
173
|
+
state: result.state,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
case 'invalid-secret': {
|
|
177
|
+
// Stale/diverged secret — drop it so the mint lane stops firing. On
|
|
178
|
+
// native the shared-key step below can still recover; on web this ends
|
|
179
|
+
// signed out. Setting it undefined drops the key on the store's JSON
|
|
180
|
+
// serialization, and the mint guard treats undefined as absent.
|
|
181
|
+
const persisted = await store.load();
|
|
182
|
+
if (persisted) {
|
|
183
|
+
await store.save({ ...persisted, deviceSecret: undefined });
|
|
184
|
+
}
|
|
185
|
+
return { kind: 'skip' };
|
|
186
|
+
}
|
|
187
|
+
case 'no-session':
|
|
188
|
+
// Device known, no live session — authoritative signed-out. Keep the
|
|
189
|
+
// secret (the device may sign in again).
|
|
190
|
+
signedOutReason = 'no_session';
|
|
191
|
+
return { kind: 'skip' };
|
|
192
|
+
case 'persist-failed':
|
|
193
|
+
// The mint rotated the secret but it could not be durably persisted —
|
|
194
|
+
// refuse to advertise a session that will not survive a reload. Keep
|
|
195
|
+
// the secret; a later boot/attempt re-mints once storage recovers.
|
|
196
|
+
logger_1.logger.error('device-secret mint rotated the secret but it could not be durably persisted — not planting', undefined, { component: 'sessionColdBoot', method: 'device-secret-mint' });
|
|
197
|
+
return { kind: 'skip' };
|
|
198
|
+
case 'account-not-on-device':
|
|
199
|
+
// Pinned mint rejected: the pinned account is no longer a live account
|
|
200
|
+
// of this device session. The secret is healthy — keep it untouched and
|
|
201
|
+
// let `identity-key-signin` re-establish from the local key.
|
|
202
|
+
logger_1.logger.debug('pinned device-secret mint rejected (account_not_on_device) — keeping secret, re-establishing from the identity key', { component: 'sessionColdBoot', method: 'device-secret-mint' });
|
|
203
|
+
return { kind: 'skip' };
|
|
204
|
+
case 'transient':
|
|
205
|
+
// Network / 5xx: keep the secret; a later attempt can succeed.
|
|
206
|
+
logger_1.logger.debug('device-secret mint failed (transient) — keeping secret', { component: 'sessionColdBoot', method: 'device-secret-mint' });
|
|
207
|
+
return { kind: 'skip' };
|
|
208
|
+
case 'no-secret':
|
|
209
|
+
return { kind: 'skip' };
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
if (identityBinding !== null) {
|
|
214
|
+
// 3-identity. identity-key-signin — re-mint from THIS device's PRIMARY
|
|
215
|
+
// identity key (`getPublicKey` → challenge → sign → verify). It REPLACES
|
|
216
|
+
// `shared-key-signin`, which reads the CROSS-APP shared keychain slot and
|
|
217
|
+
// may therefore hold a different identity than the device's primary — the
|
|
218
|
+
// one thing an identity-bound client must never adopt. The server resolves
|
|
219
|
+
// the account from the verified signer, so the winning session is
|
|
220
|
+
// identity-authoritative and the pin is (re)written from it.
|
|
221
|
+
//
|
|
222
|
+
// Online-gated like every network step; `{ retry: false }` keeps the two
|
|
223
|
+
// round-trips single attempts (the refresh scheduler / 401 lane own later
|
|
224
|
+
// retries) so this step cannot multiply boot latency. On web
|
|
225
|
+
// `KeyManager.getPublicKey()` resolves to `null`, so it skips.
|
|
226
|
+
steps.push({
|
|
227
|
+
id: 'identity-key-signin',
|
|
228
|
+
enabled: () => !isOffline(),
|
|
229
|
+
run: async () => {
|
|
230
|
+
const established = await (0, identitySession_1.establishIdentitySession)({
|
|
231
|
+
oxy,
|
|
232
|
+
store,
|
|
233
|
+
binding: identityBinding,
|
|
234
|
+
requestOptions: { retry: false },
|
|
235
|
+
});
|
|
236
|
+
const accessToken = established?.session.accessToken;
|
|
237
|
+
if (!established || !accessToken) {
|
|
238
|
+
return { kind: 'skip' };
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
kind: 'session',
|
|
242
|
+
session: {
|
|
243
|
+
sessionId: established.session.sessionId,
|
|
244
|
+
userId: established.session.user.id,
|
|
245
|
+
accessToken,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else if (opts.sharedDeviceCredential) {
|
|
252
|
+
// 3. shared-device-adopt (native, ACCOUNT mode) — join the device's existing
|
|
253
|
+
// session through the shared native credential slot.
|
|
254
|
+
//
|
|
255
|
+
// This is the lane that separates identity from session transport. What it
|
|
256
|
+
// reads is an ordinary, individually revocable `deviceId` + `deviceSecret`
|
|
257
|
+
// put there by a sibling official app — never the Commons private key. It
|
|
258
|
+
// is what lets a freshly installed official app land signed in with no QR,
|
|
259
|
+
// and it is why an ordinary app never needs identity-key access at all.
|
|
260
|
+
//
|
|
261
|
+
// `decideSharedDeviceJoin` gates it: an app that already holds its own
|
|
262
|
+
// credential is never moved, and an UNREADABLE slot is never mistaken for
|
|
263
|
+
// an empty one. The lane therefore cannot sign anyone out, in either
|
|
264
|
+
// upgrade order.
|
|
265
|
+
const sharedSlot = opts.sharedDeviceCredential;
|
|
266
|
+
steps.push({
|
|
267
|
+
id: 'shared-device-adopt',
|
|
268
|
+
// The adoption itself is local, but it is only worth committing alongside
|
|
269
|
+
// a mint that proves the credential — so the whole lane is online-gated
|
|
270
|
+
// like every other network step.
|
|
271
|
+
enabled: () => isNative && !isOffline(),
|
|
272
|
+
run: async () => {
|
|
273
|
+
const before = await store.load();
|
|
274
|
+
const decision = (0, sharedDeviceCredential_1.decideSharedDeviceJoin)(before, await sharedSlot.read());
|
|
275
|
+
if (decision.action === 'skip') {
|
|
276
|
+
logger_1.logger.debug(`shared device credential not adopted (${decision.reason})`, { component: 'sessionColdBoot', method: 'shared-device-adopt' });
|
|
277
|
+
return { kind: 'skip' };
|
|
278
|
+
}
|
|
279
|
+
// Restore the store to exactly what it held before this lane touched it.
|
|
280
|
+
// A credential we adopted and could not prove must not be left behind for
|
|
281
|
+
// the next boot's mint lane to keep retrying.
|
|
282
|
+
const revert = async () => {
|
|
283
|
+
if (before) {
|
|
284
|
+
await store.save(before);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
await store.clear();
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const adopted = {
|
|
291
|
+
// The mint fills both in from the device's live state; carrying the
|
|
292
|
+
// previous session's ids into a different device session would be a
|
|
293
|
+
// lie for however long the mint takes.
|
|
294
|
+
sessionId: '',
|
|
295
|
+
userId: '',
|
|
296
|
+
deviceId: decision.credential.deviceId,
|
|
297
|
+
deviceSecret: decision.credential.deviceSecret,
|
|
298
|
+
};
|
|
299
|
+
if (!(await store.save(adopted))) {
|
|
300
|
+
logger_1.logger.error('adopted the shared device credential but it could not be durably persisted — reverting', undefined, { component: 'sessionColdBoot', method: 'shared-device-adopt' });
|
|
301
|
+
await revert();
|
|
302
|
+
return { kind: 'skip' };
|
|
303
|
+
}
|
|
304
|
+
const result = await (0, refresh_1.refreshDeviceSecretArm)({ oxy, store, pin: null });
|
|
305
|
+
if (result.status === 'ok') {
|
|
306
|
+
return {
|
|
307
|
+
kind: 'session',
|
|
308
|
+
session: {
|
|
309
|
+
sessionId: result.sessionId,
|
|
310
|
+
userId: result.userId,
|
|
311
|
+
accessToken: result.token,
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
if (result.status === 'invalid-secret') {
|
|
316
|
+
// The one place we hold POSITIVE proof that the exact bytes in the
|
|
317
|
+
// shared slot are dead — the server rejected them by name. Clearing it
|
|
318
|
+
// signs nobody out (a credential the server does not recognise cannot
|
|
319
|
+
// be minting for anyone) and it is what stops a dead credential from
|
|
320
|
+
// blocking every future install: a stale slot owned by a different
|
|
321
|
+
// `deviceId` is otherwise never overwritten, by design.
|
|
322
|
+
await sharedSlot.clear();
|
|
323
|
+
}
|
|
324
|
+
else if (result.status === 'no-session') {
|
|
325
|
+
signedOutReason = 'no_session';
|
|
326
|
+
}
|
|
327
|
+
await revert();
|
|
328
|
+
return { kind: 'skip' };
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
if (identityBinding === null) {
|
|
333
|
+
// 4. shared-key-signin (native) — the RECOVERY / COMPATIBILITY lane: sign a
|
|
334
|
+
// challenge with the shared-keychain IDENTITY key to re-mint a session.
|
|
335
|
+
//
|
|
336
|
+
// It runs LAST on purpose. Using the self-custody key to obtain an ordinary
|
|
337
|
+
// session is the over-sharing #937 sets out to end, so it is now reachable
|
|
338
|
+
// only on a device where no sibling app has published a shared device
|
|
339
|
+
// credential yet — an install that predates this lane, or one where the
|
|
340
|
+
// shared slot is unreadable. Its own `store.save` below feeds the shared
|
|
341
|
+
// slot through the mirroring store, so the FIRST boot that takes this lane
|
|
342
|
+
// is also the last one that needs to: every later app joins by credential.
|
|
343
|
+
//
|
|
344
|
+
// Native AND online: it is a network step (challenge + verify round-trips),
|
|
345
|
+
// so it is gated by the same offline hint as the mint lane. `{ retry: false }`
|
|
346
|
+
// keeps the two round-trips as single attempts — the refresh scheduler /
|
|
347
|
+
// 401 lane own later retries — so this step cannot multiply boot latency.
|
|
348
|
+
steps.push({
|
|
349
|
+
id: 'shared-key-signin',
|
|
350
|
+
enabled: () => isNative && !isOffline(),
|
|
351
|
+
run: async () => {
|
|
352
|
+
const session = await oxy.signInWithSharedIdentity({ requestOptions: { retry: false } });
|
|
353
|
+
if (!session?.accessToken) {
|
|
354
|
+
return { kind: 'skip' };
|
|
355
|
+
}
|
|
356
|
+
// `verifyChallenge` mints a rotating deviceSecret; persist it so the next
|
|
357
|
+
// boot can use the faster device-secret-mint lane (sockets + tab-focus
|
|
358
|
+
// re-mint depend on the credential being in the store).
|
|
359
|
+
if (session.deviceId && session.deviceSecret) {
|
|
360
|
+
await store.save({
|
|
361
|
+
sessionId: session.sessionId,
|
|
362
|
+
userId: session.user.id,
|
|
363
|
+
deviceId: session.deviceId,
|
|
364
|
+
deviceSecret: session.deviceSecret,
|
|
365
|
+
accessToken: session.accessToken,
|
|
366
|
+
expiresAt: session.expiresAt,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
kind: 'session',
|
|
371
|
+
session: {
|
|
372
|
+
sessionId: session.sessionId,
|
|
373
|
+
userId: session.user.id,
|
|
374
|
+
accessToken: session.accessToken,
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
const outcome = await (0, coldBoot_1.runColdBoot)({
|
|
381
|
+
steps,
|
|
382
|
+
overallDeadlineMs: opts.overallDeadlineMs,
|
|
383
|
+
onStepDeadline: opts.onStepDeadline,
|
|
384
|
+
onStepError: (id, error) => {
|
|
385
|
+
signedOutReason = 'error';
|
|
386
|
+
opts.onStepError?.(id, error);
|
|
387
|
+
},
|
|
388
|
+
});
|
|
389
|
+
if (outcome.kind === 'session') {
|
|
390
|
+
await opts.onSession?.({ ...outcome.session, via: outcome.via });
|
|
391
|
+
return outcome;
|
|
392
|
+
}
|
|
393
|
+
await opts.onSignedOut?.(signedOutReason);
|
|
394
|
+
return outcome;
|
|
395
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Package version and metadata constants
|
|
4
|
+
* This file is auto-generated to avoid runtime dependency on package.json
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.description = exports.version = exports.name = exports.packageInfo = void 0;
|
|
8
|
+
exports.packageInfo = {
|
|
9
|
+
name: "@oxy.so/services",
|
|
10
|
+
version: "5.2.1",
|
|
11
|
+
description: "Reusable OxyHQ module to handle authentication, user management, reputation system (Oxy Trust) and more 🚀",
|
|
12
|
+
main: "lib/commonjs/node/index.js",
|
|
13
|
+
module: "lib/module/node/index.js",
|
|
14
|
+
types: "lib/typescript/node/index.d.ts"
|
|
15
|
+
};
|
|
16
|
+
exports.name = exports.packageInfo.name, exports.version = exports.packageInfo.version, exports.description = exports.packageInfo.description;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authenticated Encryption with Associated Data (XChaCha20-Poly1305)
|
|
4
|
+
*
|
|
5
|
+
* Pure-JS/TS AEAD via `@noble/ciphers` — identical behaviour on web, Node, and
|
|
6
|
+
* React Native with zero WebCrypto / native-module dependency. This replaces
|
|
7
|
+
* the `crypto.subtle`-based path (unreliable on React Native) for the Commons
|
|
8
|
+
* encrypted backup and device-to-device transfer flows.
|
|
9
|
+
*
|
|
10
|
+
* XChaCha20-Poly1305 is chosen over AES-GCM specifically for its 24-byte
|
|
11
|
+
* (192-bit) random nonce: the nonce space is large enough that random nonces
|
|
12
|
+
* never collide in practice, so callers do not need to maintain a per-key
|
|
13
|
+
* counter. The 16-byte Poly1305 tag is appended to the ciphertext by the
|
|
14
|
+
* underlying library and validated on decrypt.
|
|
15
|
+
*
|
|
16
|
+
* The optional Associated Data (AAD) is authenticated but NOT encrypted: it
|
|
17
|
+
* binds the ciphertext to its context (e.g. a backup version, a device id, a
|
|
18
|
+
* DID). Decryption fails if the key, nonce, ciphertext, OR aad differ from
|
|
19
|
+
* those used at encryption time.
|
|
20
|
+
*
|
|
21
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.AEAD_NONCE_LENGTH = exports.AEAD_KEY_LENGTH = void 0;
|
|
25
|
+
exports.encryptAead = encryptAead;
|
|
26
|
+
exports.decryptAead = decryptAead;
|
|
27
|
+
// Loading the polyfill guarantees `globalThis.crypto.getRandomValues` exists on
|
|
28
|
+
// every platform (native crypto on web/Node; expo-crypto-backed shim on RN).
|
|
29
|
+
require("./polyfill");
|
|
30
|
+
const chacha_1 = require("@noble/ciphers/chacha");
|
|
31
|
+
/** Key length for XChaCha20-Poly1305, in bytes (256-bit). */
|
|
32
|
+
exports.AEAD_KEY_LENGTH = 32;
|
|
33
|
+
/** Nonce length for XChaCha20-Poly1305, in bytes (192-bit). */
|
|
34
|
+
exports.AEAD_NONCE_LENGTH = 24;
|
|
35
|
+
function assertKey(key) {
|
|
36
|
+
if (key.length !== exports.AEAD_KEY_LENGTH) {
|
|
37
|
+
throw new Error(`AEAD key must be ${exports.AEAD_KEY_LENGTH} bytes, got ${key.length}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Generate a fresh 24-byte random nonce via the platform CSPRNG. */
|
|
41
|
+
function randomNonce() {
|
|
42
|
+
const nonce = new Uint8Array(exports.AEAD_NONCE_LENGTH);
|
|
43
|
+
globalThis.crypto.getRandomValues(nonce);
|
|
44
|
+
return nonce;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Encrypt `plaintext` under `key` with a fresh random nonce, authenticating the
|
|
48
|
+
* optional `aad`.
|
|
49
|
+
*
|
|
50
|
+
* @param key 32-byte symmetric key (e.g. from `hkdfSha256`).
|
|
51
|
+
* @param plaintext Bytes to encrypt.
|
|
52
|
+
* @param aad Optional associated data authenticated but not encrypted.
|
|
53
|
+
* @returns `{ nonce, ciphertext }` — both are required to decrypt.
|
|
54
|
+
*/
|
|
55
|
+
function encryptAead(key, plaintext, aad) {
|
|
56
|
+
assertKey(key);
|
|
57
|
+
const nonce = randomNonce();
|
|
58
|
+
const ciphertext = (0, chacha_1.xchacha20poly1305)(key, nonce, aad).encrypt(plaintext);
|
|
59
|
+
return { nonce, ciphertext };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Decrypt and authenticate `ciphertext` produced by {@link encryptAead}.
|
|
63
|
+
*
|
|
64
|
+
* Throws if the key, nonce, ciphertext, or aad differ from those used at
|
|
65
|
+
* encryption time (tamper detection), or if the tag is invalid.
|
|
66
|
+
*
|
|
67
|
+
* @param key 32-byte symmetric key.
|
|
68
|
+
* @param nonce The 24-byte nonce returned by `encryptAead`.
|
|
69
|
+
* @param ciphertext Ciphertext with the appended Poly1305 tag.
|
|
70
|
+
* @param aad The same associated data supplied at encryption time.
|
|
71
|
+
* @returns The recovered plaintext bytes.
|
|
72
|
+
*/
|
|
73
|
+
function decryptAead(key, nonce, ciphertext, aad) {
|
|
74
|
+
assertKey(key);
|
|
75
|
+
if (nonce.length !== exports.AEAD_NONCE_LENGTH) {
|
|
76
|
+
throw new Error(`AEAD nonce must be ${exports.AEAD_NONCE_LENGTH} bytes, got ${nonce.length}`);
|
|
77
|
+
}
|
|
78
|
+
return (0, chacha_1.xchacha20poly1305)(key, nonce, aad).decrypt(ciphertext);
|
|
79
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ECDH shared-secret derivation (secp256k1)
|
|
4
|
+
*
|
|
5
|
+
* Derives a raw 32-byte ECDH shared secret from a local private key and a
|
|
6
|
+
* remote public key, using the shared `@oxy.so/protocol` secp256k1 primitive.
|
|
7
|
+
* This is the key-exchange
|
|
8
|
+
* step for the Commons device-to-device transfer flow: each side computes the
|
|
9
|
+
* same shared secret, which is then run through `hkdfSha256` to derive the
|
|
10
|
+
* symmetric key handed to `encryptAead` / `decryptAead`.
|
|
11
|
+
*
|
|
12
|
+
* The returned value is the raw x-coordinate of the ECDH point, big-endian,
|
|
13
|
+
* zero-padded to 32 bytes. It is NOT itself a symmetric key — always pass it
|
|
14
|
+
* through a KDF (HKDF) with a context-binding `info` before use.
|
|
15
|
+
*
|
|
16
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.deriveSharedSecret = deriveSharedSecret;
|
|
20
|
+
const secp256k1_1 = require("@oxy.so/protocol/secp256k1");
|
|
21
|
+
/**
|
|
22
|
+
* Compute the ECDH shared secret between a local private key and a remote
|
|
23
|
+
* public key on secp256k1.
|
|
24
|
+
*
|
|
25
|
+
* Symmetric by construction:
|
|
26
|
+
* `deriveSharedSecret(privA, pubB) === deriveSharedSecret(privB, pubA)`.
|
|
27
|
+
*
|
|
28
|
+
* @param privateKeyHex Local private key, hex (up to 64 chars; canonicalized).
|
|
29
|
+
* @param otherPublicKeyHex Remote public key, hex — compressed (`02`/`03` + 32
|
|
30
|
+
* bytes) or uncompressed (`04` + 64 bytes).
|
|
31
|
+
* @returns The 32-byte big-endian shared secret.
|
|
32
|
+
*/
|
|
33
|
+
function deriveSharedSecret(privateKeyHex, otherPublicKeyHex) {
|
|
34
|
+
return (0, secp256k1_1.deriveSecp256k1SharedSecret)(privateKeyHex, otherPublicKeyHex);
|
|
35
|
+
}
|