@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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OxyServices - Unified client for Oxy API and Oxy Cloud
|
|
3
|
+
*
|
|
4
|
+
* # Usage Examples
|
|
5
|
+
*
|
|
6
|
+
* ## Browser (ESM/TypeScript)
|
|
7
|
+
*
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { OxyServices } from './core/OxyServices';
|
|
10
|
+
*
|
|
11
|
+
* const oxy = new OxyServices({
|
|
12
|
+
* baseURL: 'https://api.oxy.so',
|
|
13
|
+
* cloudURL: 'https://cloud.oxy.so',
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* // Authenticate and fetch user
|
|
17
|
+
* await oxy.setTokens('ACCESS_TOKEN');
|
|
18
|
+
* const user = await oxy.getCurrentUser();
|
|
19
|
+
*
|
|
20
|
+
* // Upload a file (browser File API)
|
|
21
|
+
* const fileInput = document.querySelector('input[type=file]');
|
|
22
|
+
* const file = fileInput.files[0];
|
|
23
|
+
* await oxy.uploadRawFile(file);
|
|
24
|
+
*
|
|
25
|
+
* // Get a file download URL for <img src>
|
|
26
|
+
* const url = oxy.getFileDownloadUrl('fileId', 'thumb');
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* ## Node.js (CommonJS/TypeScript)
|
|
30
|
+
*
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { OxyServices } from './core/OxyServices';
|
|
33
|
+
* import fs from 'fs';
|
|
34
|
+
*
|
|
35
|
+
* const oxy = new OxyServices({
|
|
36
|
+
* baseURL: 'https://api.oxy.so',
|
|
37
|
+
* cloudURL: 'https://cloud.oxy.so',
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Authenticate and fetch user
|
|
41
|
+
* await oxy.setTokens('ACCESS_TOKEN');
|
|
42
|
+
* const user = await oxy.getCurrentUser();
|
|
43
|
+
*
|
|
44
|
+
* // Upload a file (Node.js Buffer)
|
|
45
|
+
* const buffer = fs.readFileSync('myfile.png');
|
|
46
|
+
* const blob = new Blob([buffer]);
|
|
47
|
+
* await oxy.uploadRawFile(blob, { filename: 'myfile.png' });
|
|
48
|
+
*
|
|
49
|
+
* // Get a file download URL
|
|
50
|
+
* const url = oxy.getFileDownloadUrl('fileId');
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* ## Configuration
|
|
54
|
+
* - `baseURL`: Oxy API endpoint (e.g., https://api.oxy.so)
|
|
55
|
+
* - `cloudURL`: Oxy Cloud/CDN endpoint (e.g., https://cloud.oxy.so)
|
|
56
|
+
*
|
|
57
|
+
* See method JSDoc for more details and options.
|
|
58
|
+
*/
|
|
59
|
+
import { type LinkedHttpClient, type OxyConfig } from './OxyServices.base';
|
|
60
|
+
import { AssetUrlResolutionError, OxyAuthenticationError, OxyAuthenticationTimeoutError, ServiceAssetMetadataError } from './OxyServices.errors';
|
|
61
|
+
import { composeOxyServices } from './mixins';
|
|
62
|
+
/**
|
|
63
|
+
* OxyServices - Unified client library for interacting with the Oxy API
|
|
64
|
+
*
|
|
65
|
+
* This class provides all API functionality in one simple, easy-to-use interface.
|
|
66
|
+
*
|
|
67
|
+
* ## Architecture
|
|
68
|
+
* - **HttpService**: Unified HTTP service handling authentication, caching, deduplication, queuing, and retry
|
|
69
|
+
* - **OxyServices**: Provides high-level API methods
|
|
70
|
+
*
|
|
71
|
+
* ## Mixin Composition
|
|
72
|
+
* The class is composed using TypeScript mixins for better code organization:
|
|
73
|
+
* - **Base**: Core infrastructure (HTTP client, request management, error handling)
|
|
74
|
+
* - **Auth**: Authentication and session management
|
|
75
|
+
* - **User**: User profiles, follow, notifications
|
|
76
|
+
* - **Privacy**: Blocked and restricted users
|
|
77
|
+
* - **Language**: Language detection and metadata
|
|
78
|
+
* - **Payment**: Payment processing
|
|
79
|
+
* - **Reputation**: Reputation system (Oxy Trust)
|
|
80
|
+
* - **Assets**: File upload and asset management
|
|
81
|
+
* - **Accounts**: Unified account graph (tree, members, roles, bot credentials)
|
|
82
|
+
* and the applications owned within it (Application = OAuth client)
|
|
83
|
+
* - **Connected apps**: OAuth-consent surface (public app identity, grants)
|
|
84
|
+
* - **Location**: Location-based features
|
|
85
|
+
* - **Analytics**: Analytics tracking
|
|
86
|
+
* - **Devices**: Device management
|
|
87
|
+
* - **Utility**: Utility methods and Express middleware
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const oxy = new OxyServices({
|
|
92
|
+
* baseURL: 'https://api.oxy.so',
|
|
93
|
+
* cloudURL: 'https://cloud.oxy.so'
|
|
94
|
+
* });
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
declare const OxyServicesComposed: import("./mixins").ComposedOxyServicesConstructor;
|
|
98
|
+
export declare class OxyServices extends OxyServicesComposed {
|
|
99
|
+
constructor(config: OxyConfig);
|
|
100
|
+
}
|
|
101
|
+
export interface OxyServices extends InstanceType<ReturnType<typeof composeOxyServices>> {
|
|
102
|
+
createLinkedClient(config: OxyConfig): LinkedHttpClient;
|
|
103
|
+
auth(options?: {
|
|
104
|
+
debug?: boolean;
|
|
105
|
+
onError?: (error: unknown) => unknown;
|
|
106
|
+
loadUser?: boolean;
|
|
107
|
+
optional?: boolean;
|
|
108
|
+
serviceTokenJwksUrl?: string;
|
|
109
|
+
jwtSecret?: string;
|
|
110
|
+
expectedIssuer?: string;
|
|
111
|
+
expectedAudience?: string;
|
|
112
|
+
}): (req: unknown, res: unknown, next: (err?: unknown) => void) => Promise<void>;
|
|
113
|
+
authSocket(options?: {
|
|
114
|
+
debug?: boolean;
|
|
115
|
+
}): (socket: unknown, next: (err?: Error) => void) => Promise<void>;
|
|
116
|
+
serviceAuth(options?: {
|
|
117
|
+
debug?: boolean;
|
|
118
|
+
serviceTokenJwksUrl?: string;
|
|
119
|
+
jwtSecret?: string;
|
|
120
|
+
expectedIssuer?: string;
|
|
121
|
+
expectedAudience?: string;
|
|
122
|
+
}): (req: unknown, res: unknown, next: (err?: unknown) => void) => Promise<void>;
|
|
123
|
+
requireScope(scope: string): (req: unknown, res: unknown, next: (err?: unknown) => void) => void;
|
|
124
|
+
assetUpdateVisibility(fileId: string, visibility: 'private' | 'public' | 'unlisted'): Promise<unknown>;
|
|
125
|
+
}
|
|
126
|
+
export { AssetUrlResolutionError, OxyAuthenticationError, OxyAuthenticationTimeoutError, ServiceAssetMetadataError };
|
|
127
|
+
/**
|
|
128
|
+
* Default Oxy Cloud URL — used when no `cloudURL` is provided to OxyServices.
|
|
129
|
+
*/
|
|
130
|
+
export declare const OXY_CLOUD_URL = "https://cloud.oxy.so";
|
|
131
|
+
/**
|
|
132
|
+
* Export the default Oxy API URL (for documentation)
|
|
133
|
+
*/
|
|
134
|
+
export declare const OXY_API_URL: string;
|
|
135
|
+
/**
|
|
136
|
+
* Pre-configured client instance for easy import
|
|
137
|
+
* Uses OXY_API_URL as baseURL and OXY_CLOUD_URL as cloudURL
|
|
138
|
+
*/
|
|
139
|
+
export declare const oxyClient: OxyServices;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error types for better error handling
|
|
3
|
+
*/
|
|
4
|
+
export declare class OxyAuthenticationError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly status: number;
|
|
7
|
+
constructor(message: string, code?: string, status?: number);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when an asset's authorized download URL cannot be resolved.
|
|
11
|
+
*
|
|
12
|
+
* `getFileDownloadUrlAsync` asks the API for a URL that is valid for the
|
|
13
|
+
* CALLER and the asset's actual visibility. When that resolution fails there is
|
|
14
|
+
* no honest fallback: the public CDN origin only serves `public` assets, so
|
|
15
|
+
* handing back `https://cloud.oxy.so/<id>` for an unresolved asset produces a
|
|
16
|
+
* hard 404 at render time and hides the real failure from the caller. This
|
|
17
|
+
* error surfaces the failure instead.
|
|
18
|
+
*
|
|
19
|
+
* The message and fields deliberately carry only the asset id, the requested
|
|
20
|
+
* variant and the HTTP status — never the resolved URL, which embeds a scoped
|
|
21
|
+
* media token.
|
|
22
|
+
*
|
|
23
|
+
* ## `status` lets a caller decide whether a CDN fallback is safe
|
|
24
|
+
*
|
|
25
|
+
* Core itself never falls back to the public CDN builder, because it has no
|
|
26
|
+
* knowledge of the asset's visibility and that URL is a guaranteed 404 for a
|
|
27
|
+
* private asset. A CALLER that knows an asset is public MAY choose to fall back
|
|
28
|
+
* to `getFileDownloadUrl(id, variant)` — but only for a TRANSIENT failure, not
|
|
29
|
+
* a definitive denial:
|
|
30
|
+
* - `status` 401/403/404 → definitive: the asset is private/denied/missing.
|
|
31
|
+
* Never CDN-fall-back — it will 404.
|
|
32
|
+
* - `status` undefined (network error) or 5xx → transient: resolution itself
|
|
33
|
+
* failed. If the caller independently knows the asset is public, a CDN
|
|
34
|
+
* fallback is defensible best-effort.
|
|
35
|
+
*/
|
|
36
|
+
export declare class AssetUrlResolutionError extends Error {
|
|
37
|
+
readonly code = "ASSET_URL_UNRESOLVED";
|
|
38
|
+
readonly fileId: string;
|
|
39
|
+
readonly variant?: string;
|
|
40
|
+
readonly status?: number;
|
|
41
|
+
/**
|
|
42
|
+
* The underlying transport/API failure, when there was one. Declared on the
|
|
43
|
+
* class rather than relying on `Error.cause` because this package targets
|
|
44
|
+
* ES2020, where `cause` is not part of the `Error` type.
|
|
45
|
+
*/
|
|
46
|
+
readonly cause?: unknown;
|
|
47
|
+
constructor(fileId: string, variant: string | undefined, status: number | undefined, cause?: unknown);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Thrown when one or more chunks of `getServiceAssetMetadataByIds` could not be
|
|
51
|
+
* resolved.
|
|
52
|
+
*
|
|
53
|
+
* Exists because for this endpoint a FAILED request and an ABSENT asset produce
|
|
54
|
+
* the same observable result. The server legitimately omits unknown/deleted ids,
|
|
55
|
+
* so callers are documented to map the response by `id` and treat a missing
|
|
56
|
+
* entry as "no such asset" — which means a chunk that 429s, times out or 5xxs
|
|
57
|
+
* reads as authoritative absence unless it is raised.
|
|
58
|
+
*
|
|
59
|
+
* That was not hypothetical: a metadata backfill counted every throttled asset
|
|
60
|
+
* as needing no update and exited 0, and the MTN signed-record builder embedded
|
|
61
|
+
* media with no content hash into records that are immutable once signed. Both
|
|
62
|
+
* paths reported success and wrote nothing.
|
|
63
|
+
*
|
|
64
|
+
* `unresolvedIds` carries every id in a failed chunk — not the subset the server
|
|
65
|
+
* would have omitted anyway, which is unknowable when the request never landed.
|
|
66
|
+
* A caller that wants best-effort passes `{ partial: true }` and never sees this.
|
|
67
|
+
*/
|
|
68
|
+
export declare class ServiceAssetMetadataError extends Error {
|
|
69
|
+
readonly code = "SERVICE_ASSET_METADATA_UNRESOLVED";
|
|
70
|
+
/** Every id belonging to a chunk whose request failed. */
|
|
71
|
+
readonly unresolvedIds: string[];
|
|
72
|
+
/** HTTP statuses observed across the failed chunks (deduped, ascending). */
|
|
73
|
+
readonly statuses: number[];
|
|
74
|
+
/**
|
|
75
|
+
* The first underlying transport/API failure. Declared on the class rather
|
|
76
|
+
* than relying on `Error.cause` because this package targets ES2020, where
|
|
77
|
+
* `cause` is not part of the `Error` type.
|
|
78
|
+
*/
|
|
79
|
+
readonly cause?: unknown;
|
|
80
|
+
constructor(unresolvedIds: string[], statuses: number[], cause?: unknown);
|
|
81
|
+
}
|
|
82
|
+
export declare class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
|
|
83
|
+
constructor(operationName: string, timeoutMs: number);
|
|
84
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-first session cold boot for every consumer.
|
|
3
|
+
*
|
|
4
|
+
* On a fresh page load / app launch this resolves the device's session in a
|
|
5
|
+
* deterministic order, built on the pure `runColdBoot` primitive. It NEVER
|
|
6
|
+
* redirects to a login page: an unresolved boot ends in a signed-out state that
|
|
7
|
+
* the app renders with a "Sign in with Oxy" button.
|
|
8
|
+
*
|
|
9
|
+
* Ordered steps (first to yield a session wins):
|
|
10
|
+
* 1. `warm-token-plant` (web + native) — the fastest path: when the persisted
|
|
11
|
+
* store still holds a warm access token that is valid for more than the
|
|
12
|
+
* refresh lead window, plant it and yield the session with NO network
|
|
13
|
+
* round-trip. The background scheduler rotates it shortly after.
|
|
14
|
+
* 2. `device-secret-mint` (web + native) — the zero-cookie transport: when the
|
|
15
|
+
* origin persisted a `deviceId` + `deviceSecret`, mint a short access token
|
|
16
|
+
* with a single bearer-less POST to `/session/device/token` (no cookie, no
|
|
17
|
+
* navigation) and rotate the secret in-use.
|
|
18
|
+
* 3. `shared-device-adopt` (native, ACCOUNT mode) — this app has no credential
|
|
19
|
+
* of its own but a sibling official app already put one in the shared native
|
|
20
|
+
* slot: adopt it and mint. This is how a newly installed official app joins
|
|
21
|
+
* the device's existing session WITHOUT another QR and without ever touching
|
|
22
|
+
* the Commons private key.
|
|
23
|
+
* 4. `shared-key-signin` (native, ACCOUNT mode) — the legacy lane: re-mint by
|
|
24
|
+
* signing with the shared-keychain IDENTITY key. Retained as a recovery /
|
|
25
|
+
* compatibility path for devices whose apps have not yet published a shared
|
|
26
|
+
* device credential — OR `identity-key-signin` (IDENTITY mode) — re-mint
|
|
27
|
+
* from THIS device's primary identity key.
|
|
28
|
+
* 5. Signed out.
|
|
29
|
+
*
|
|
30
|
+
* Two session modes (see {@link RunSessionColdBootOptions.sessionMode}):
|
|
31
|
+
* - `account` (default) — the device's ACTIVE account owns the session. Every
|
|
32
|
+
* Oxy app but the identity vault boots this way; behaviour is unchanged.
|
|
33
|
+
* - `identity` — the owner of the local PRIMARY identity key owns the session,
|
|
34
|
+
* permanently, regardless of which account the device is switched to. Each
|
|
35
|
+
* step above is bound to the persisted identity pin, and the shared-keychain
|
|
36
|
+
* lane is replaced by the primary-key one (the shared slot is a CROSS-APP
|
|
37
|
+
* slot that may hold a different identity).
|
|
38
|
+
*
|
|
39
|
+
* ESM-safe (no `require()`); no react/react-native/expo imports.
|
|
40
|
+
*/
|
|
41
|
+
import { type ColdBootOutcome } from '../utils/coldBoot';
|
|
42
|
+
import { type IdentityBinding } from '../session/identitySession';
|
|
43
|
+
import { type SharedDeviceCredentialStore } from '../session/sharedDeviceCredential';
|
|
44
|
+
import type { OxyServices } from '../OxyServices';
|
|
45
|
+
import type { AuthStateStore } from '../session/authStateStore';
|
|
46
|
+
import type { DeviceSessionState } from '@oxy.so/contracts';
|
|
47
|
+
/**
|
|
48
|
+
* Who owns the session this boot resolves.
|
|
49
|
+
*
|
|
50
|
+
* - `account` — the device's active account (every ordinary Oxy app).
|
|
51
|
+
* - `identity` — the owner of the device's primary identity key (the identity
|
|
52
|
+
* vault). Requires {@link RunSessionColdBootOptions.identity}.
|
|
53
|
+
*/
|
|
54
|
+
export type SessionMode = 'account' | 'identity';
|
|
55
|
+
/** The winning session shape a cold-boot step reports. */
|
|
56
|
+
export interface DeviceBootSession {
|
|
57
|
+
sessionId: string;
|
|
58
|
+
userId: string;
|
|
59
|
+
accessToken: string;
|
|
60
|
+
/** Server state already returned by the mint; absent on warm-token restore. */
|
|
61
|
+
state?: DeviceSessionState;
|
|
62
|
+
}
|
|
63
|
+
/** Why a cold boot ended without a session. */
|
|
64
|
+
export type SignedOutReason = 'no_session' | 'error';
|
|
65
|
+
export interface RunSessionColdBootOptions {
|
|
66
|
+
oxy: OxyServices;
|
|
67
|
+
store: AuthStateStore;
|
|
68
|
+
/** Platform hints; default derived from `@oxy.so/core`'s platform detection. */
|
|
69
|
+
platform?: {
|
|
70
|
+
isWeb?: boolean;
|
|
71
|
+
isNative?: boolean;
|
|
72
|
+
};
|
|
73
|
+
/** Invoked with the winning session (token already planted). */
|
|
74
|
+
onSession?: (session: DeviceBootSession & {
|
|
75
|
+
via: string;
|
|
76
|
+
}) => void | Promise<void>;
|
|
77
|
+
/** Invoked when the boot ended signed out. */
|
|
78
|
+
onSignedOut?: (reason: SignedOutReason) => void | Promise<void>;
|
|
79
|
+
onStepError?: (id: string, error: unknown) => void;
|
|
80
|
+
/**
|
|
81
|
+
* HARD overall deadline (ms) for the whole ordered step chain, forwarded to
|
|
82
|
+
* {@link runColdBoot}. Defense-in-depth so a single non-settling network step
|
|
83
|
+
* (a black-hole network that neither connects nor rejects) can NEVER hang the
|
|
84
|
+
* boot — and therefore app routing — indefinitely. Inert on healthy loads
|
|
85
|
+
* (every step settles well under it); only trips on pathological networks.
|
|
86
|
+
* When omitted there is no overall deadline (unchanged behavior).
|
|
87
|
+
*/
|
|
88
|
+
overallDeadlineMs?: number;
|
|
89
|
+
/**
|
|
90
|
+
* Invoked once per step abandoned because {@link overallDeadlineMs} expired
|
|
91
|
+
* before it settled. Forwarded to {@link runColdBoot}. Must not throw.
|
|
92
|
+
*/
|
|
93
|
+
onStepDeadline?: (stepId: string) => void;
|
|
94
|
+
/**
|
|
95
|
+
* Best-effort connectivity hint. When it returns `true` the two NETWORK steps
|
|
96
|
+
* (`device-secret-mint`, `shared-key-signin`) are skipped — an offline device
|
|
97
|
+
* cannot mint, and attempting to would burn the whole deadline on a doomed
|
|
98
|
+
* request before routing settles. The pure-local `warm-token-plant` step is
|
|
99
|
+
* NEVER gated by this: an offline returning user with an unexpired persisted
|
|
100
|
+
* token must still boot authenticated. Only an EXPLICIT offline verdict should
|
|
101
|
+
* be returned; the caller resolves unknown/timeout to `false` (assume online)
|
|
102
|
+
* so a flaky probe can never falsely skip a real sign-in.
|
|
103
|
+
*/
|
|
104
|
+
isOffline?: () => boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Who owns the resolved session. Defaults to `'account'` — the device's active
|
|
107
|
+
* account — which is the behaviour every ordinary Oxy app has today and which
|
|
108
|
+
* this option leaves byte-for-byte unchanged.
|
|
109
|
+
*
|
|
110
|
+
* `'identity'` binds the boot to the owner of this device's PRIMARY identity
|
|
111
|
+
* key and REQUIRES {@link identity}. When it is missing the boot refuses to
|
|
112
|
+
* run any lane (an identity-bound client silently falling back to the device's
|
|
113
|
+
* active account is precisely the bug this mode exists to prevent) and
|
|
114
|
+
* resolves signed out.
|
|
115
|
+
*/
|
|
116
|
+
sessionMode?: SessionMode;
|
|
117
|
+
/**
|
|
118
|
+
* The identity binding (pin store + key/signature access) used by
|
|
119
|
+
* `sessionMode: 'identity'`. Ignored in `'account'` mode.
|
|
120
|
+
*/
|
|
121
|
+
identity?: IdentityBinding;
|
|
122
|
+
/**
|
|
123
|
+
* The cross-app native slot holding this device's shared DeviceSession
|
|
124
|
+
* credential, enabling the `shared-device-adopt` lane. Supplied by
|
|
125
|
+
* `@oxy.so/services` on native; absent on web, where each origin is its own
|
|
126
|
+
* device by design.
|
|
127
|
+
*
|
|
128
|
+
* IGNORED in `sessionMode: 'identity'`. The shared slot belongs to whichever
|
|
129
|
+
* principal signed in on this device; an identity-bound client must resolve
|
|
130
|
+
* its session from the local key alone, and adopting a device credential is
|
|
131
|
+
* exactly the drift that mode exists to prevent.
|
|
132
|
+
*/
|
|
133
|
+
sharedDeviceCredential?: SharedDeviceCredentialStore;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Run the device-first cold boot. Resolves to the `runColdBoot` outcome and, as
|
|
137
|
+
* a side effect, invokes `onSession` (winning session, token already planted) or
|
|
138
|
+
* `onSignedOut` (no session).
|
|
139
|
+
*/
|
|
140
|
+
export declare function runSessionColdBoot(opts: RunSessionColdBootOptions): Promise<ColdBootOutcome<DeviceBootSession>>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package version and metadata constants
|
|
3
|
+
* This file is auto-generated to avoid runtime dependency on package.json
|
|
4
|
+
*/
|
|
5
|
+
export declare const packageInfo: {
|
|
6
|
+
readonly name: "@oxy.so/services";
|
|
7
|
+
readonly version: "5.2.1";
|
|
8
|
+
readonly description: "Reusable OxyHQ module to handle authentication, user management, reputation system (Oxy Trust) and more 🚀";
|
|
9
|
+
readonly main: "lib/commonjs/node/index.js";
|
|
10
|
+
readonly module: "lib/module/node/index.js";
|
|
11
|
+
readonly types: "lib/typescript/node/index.d.ts";
|
|
12
|
+
};
|
|
13
|
+
export declare const name: "@oxy.so/services", version: "5.2.1", description: "Reusable OxyHQ module to handle authentication, user management, reputation system (Oxy Trust) and more 🚀";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated Encryption with Associated Data (XChaCha20-Poly1305)
|
|
3
|
+
*
|
|
4
|
+
* Pure-JS/TS AEAD via `@noble/ciphers` — identical behaviour on web, Node, and
|
|
5
|
+
* React Native with zero WebCrypto / native-module dependency. This replaces
|
|
6
|
+
* the `crypto.subtle`-based path (unreliable on React Native) for the Commons
|
|
7
|
+
* encrypted backup and device-to-device transfer flows.
|
|
8
|
+
*
|
|
9
|
+
* XChaCha20-Poly1305 is chosen over AES-GCM specifically for its 24-byte
|
|
10
|
+
* (192-bit) random nonce: the nonce space is large enough that random nonces
|
|
11
|
+
* never collide in practice, so callers do not need to maintain a per-key
|
|
12
|
+
* counter. The 16-byte Poly1305 tag is appended to the ciphertext by the
|
|
13
|
+
* underlying library and validated on decrypt.
|
|
14
|
+
*
|
|
15
|
+
* The optional Associated Data (AAD) is authenticated but NOT encrypted: it
|
|
16
|
+
* binds the ciphertext to its context (e.g. a backup version, a device id, a
|
|
17
|
+
* DID). Decryption fails if the key, nonce, ciphertext, OR aad differ from
|
|
18
|
+
* those used at encryption time.
|
|
19
|
+
*
|
|
20
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
21
|
+
*/
|
|
22
|
+
import './polyfill';
|
|
23
|
+
/** Key length for XChaCha20-Poly1305, in bytes (256-bit). */
|
|
24
|
+
export declare const AEAD_KEY_LENGTH = 32;
|
|
25
|
+
/** Nonce length for XChaCha20-Poly1305, in bytes (192-bit). */
|
|
26
|
+
export declare const AEAD_NONCE_LENGTH = 24;
|
|
27
|
+
/** Ciphertext (Poly1305 tag appended) plus the random nonce used to produce it. */
|
|
28
|
+
export interface AeadResult {
|
|
29
|
+
/** The 24-byte random nonce. Store/transmit alongside the ciphertext. */
|
|
30
|
+
nonce: Uint8Array;
|
|
31
|
+
/** Ciphertext with the 16-byte Poly1305 authentication tag appended. */
|
|
32
|
+
ciphertext: Uint8Array;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Encrypt `plaintext` under `key` with a fresh random nonce, authenticating the
|
|
36
|
+
* optional `aad`.
|
|
37
|
+
*
|
|
38
|
+
* @param key 32-byte symmetric key (e.g. from `hkdfSha256`).
|
|
39
|
+
* @param plaintext Bytes to encrypt.
|
|
40
|
+
* @param aad Optional associated data authenticated but not encrypted.
|
|
41
|
+
* @returns `{ nonce, ciphertext }` — both are required to decrypt.
|
|
42
|
+
*/
|
|
43
|
+
export declare function encryptAead(key: Uint8Array, plaintext: Uint8Array, aad?: Uint8Array): AeadResult;
|
|
44
|
+
/**
|
|
45
|
+
* Decrypt and authenticate `ciphertext` produced by {@link encryptAead}.
|
|
46
|
+
*
|
|
47
|
+
* Throws if the key, nonce, ciphertext, or aad differ from those used at
|
|
48
|
+
* encryption time (tamper detection), or if the tag is invalid.
|
|
49
|
+
*
|
|
50
|
+
* @param key 32-byte symmetric key.
|
|
51
|
+
* @param nonce The 24-byte nonce returned by `encryptAead`.
|
|
52
|
+
* @param ciphertext Ciphertext with the appended Poly1305 tag.
|
|
53
|
+
* @param aad The same associated data supplied at encryption time.
|
|
54
|
+
* @returns The recovered plaintext bytes.
|
|
55
|
+
*/
|
|
56
|
+
export declare function decryptAead(key: Uint8Array, nonce: Uint8Array, ciphertext: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ECDH shared-secret derivation (secp256k1)
|
|
3
|
+
*
|
|
4
|
+
* Derives a raw 32-byte ECDH shared secret from a local private key and a
|
|
5
|
+
* remote public key, using the shared `@oxy.so/protocol` secp256k1 primitive.
|
|
6
|
+
* This is the key-exchange
|
|
7
|
+
* step for the Commons device-to-device transfer flow: each side computes the
|
|
8
|
+
* same shared secret, which is then run through `hkdfSha256` to derive the
|
|
9
|
+
* symmetric key handed to `encryptAead` / `decryptAead`.
|
|
10
|
+
*
|
|
11
|
+
* The returned value is the raw x-coordinate of the ECDH point, big-endian,
|
|
12
|
+
* zero-padded to 32 bytes. It is NOT itself a symmetric key — always pass it
|
|
13
|
+
* through a KDF (HKDF) with a context-binding `info` before use.
|
|
14
|
+
*
|
|
15
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Compute the ECDH shared secret between a local private key and a remote
|
|
19
|
+
* public key on secp256k1.
|
|
20
|
+
*
|
|
21
|
+
* Symmetric by construction:
|
|
22
|
+
* `deriveSharedSecret(privA, pubB) === deriveSharedSecret(privB, pubA)`.
|
|
23
|
+
*
|
|
24
|
+
* @param privateKeyHex Local private key, hex (up to 64 chars; canonicalized).
|
|
25
|
+
* @param otherPublicKeyHex Remote public key, hex — compressed (`02`/`03` + 32
|
|
26
|
+
* bytes) or uncompressed (`04` + 64 bytes).
|
|
27
|
+
* @returns The 32-byte big-endian shared secret.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deriveSharedSecret(privateKeyHex: string, otherPublicKeyHex: string): Uint8Array;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity marker — a NON-secret, AndroidKeyStore-independent record that an
|
|
3
|
+
* identity exists (or existed) on this device.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS: the identity private/public keys live in expo-secure-store,
|
|
6
|
+
* whose Android backing (a single `key_v1` AndroidKeyStore key by default) can be
|
|
7
|
+
* invalidated by an OS/vendor keystore event. When that happens SDK 57's
|
|
8
|
+
* expo-secure-store DELETES the undecryptable ciphertext on the read path and
|
|
9
|
+
* returns `null` — indistinguishable, from the keys alone, from a genuinely
|
|
10
|
+
* fresh install. That ambiguity is what lets a real identity get silently
|
|
11
|
+
* replaced by the onboarding "create" flow.
|
|
12
|
+
*
|
|
13
|
+
* The marker breaks the tie. It is written to AsyncStorage (RN) / localStorage
|
|
14
|
+
* (web) — storage that is NOT protected by the identity's AndroidKeyStore key —
|
|
15
|
+
* so it SURVIVES a keystore death. `getIdentityStatus()` reads it: keys empty +
|
|
16
|
+
* marker present ⇒ `lost` (route to recovery, NEVER welcome/create); keys empty
|
|
17
|
+
* + no marker ⇒ `absent` (the only path to fresh onboarding).
|
|
18
|
+
*
|
|
19
|
+
* It holds only the PUBLIC key plus provenance metadata — never any secret — so
|
|
20
|
+
* persisting it in plain KV storage adds no exposure.
|
|
21
|
+
*
|
|
22
|
+
* Every operation fails OPEN (returns null / false / resolves): the marker is a
|
|
23
|
+
* best-effort disambiguation signal layered on top of the authoritative
|
|
24
|
+
* secure-store reads, never a gate that can itself lock the user out.
|
|
25
|
+
*
|
|
26
|
+
* ESM-safe (no `require()`); zero React/RN static imports — the RN AsyncStorage
|
|
27
|
+
* module is reached only through `@oxy.so/protocol`'s per-platform dynamic loader.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* AsyncStorage / localStorage key holding the serialized {@link IdentityMarker}.
|
|
31
|
+
* `.v1` lets a future shape change ship a `.v2` key without misreading a stale
|
|
32
|
+
* blob. Distinct from every `oxy_identity_*` secure-store key so it never
|
|
33
|
+
* collides with the keychain material it disambiguates.
|
|
34
|
+
*/
|
|
35
|
+
export declare const IDENTITY_MARKER_STORAGE_KEY = "oxy_identity_marker_v1";
|
|
36
|
+
/**
|
|
37
|
+
* A durable, non-secret record that an identity was provisioned on this device.
|
|
38
|
+
*
|
|
39
|
+
* `publicKey` is the identity's public key (NOT secret) — it lets recovery
|
|
40
|
+
* validate that whatever it restores is the SAME account this marker records,
|
|
41
|
+
* never a silent account switch. `origin` records how the identity came to be.
|
|
42
|
+
* `onboardingComplete` mirrors the onboarding milestone (Workstream 3.4) so a
|
|
43
|
+
* lost SecureStore milestone flag cannot re-route a real identity into the
|
|
44
|
+
* onboarding wizard.
|
|
45
|
+
*/
|
|
46
|
+
export interface IdentityMarker {
|
|
47
|
+
v: 1;
|
|
48
|
+
/** The identity's PUBLIC key — never secret. */
|
|
49
|
+
publicKey: string;
|
|
50
|
+
createdAt: number;
|
|
51
|
+
origin: 'create' | 'import' | 'restore' | 'backfill';
|
|
52
|
+
/** Milestone mirror: `true` once onboarding has completed for this identity. */
|
|
53
|
+
onboardingComplete?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/** Fields accepted when creating a marker; `createdAt` defaults to now. */
|
|
56
|
+
export interface WriteIdentityMarkerInput {
|
|
57
|
+
publicKey: string;
|
|
58
|
+
origin: IdentityMarker['origin'];
|
|
59
|
+
createdAt?: number;
|
|
60
|
+
onboardingComplete?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Read the identity marker. Fails OPEN: returns `null` on any storage error,
|
|
64
|
+
* missing entry, or malformed blob — the caller treats "no marker" as the safe
|
|
65
|
+
* default (fresh install), and the authoritative secure-store read decides the
|
|
66
|
+
* rest.
|
|
67
|
+
*/
|
|
68
|
+
export declare function readIdentityMarker(): Promise<IdentityMarker | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Write (create/replace) the marker. Returns `true` when it durably landed,
|
|
71
|
+
* `false` when storage was unavailable or the write threw. Callers treat a
|
|
72
|
+
* `false` as non-fatal — the marker is best-effort and a subsequent read
|
|
73
|
+
* re-backfills it from the healthy key pair.
|
|
74
|
+
*/
|
|
75
|
+
export declare function writeIdentityMarker(input: WriteIdentityMarkerInput): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Merge a partial update into the existing marker, preserving every field the
|
|
78
|
+
* caller does not override (notably `createdAt` and `onboardingComplete`). When
|
|
79
|
+
* no marker exists yet, a partial carrying at least `publicKey` + `origin`
|
|
80
|
+
* creates one; otherwise the update is a no-op returning `false`.
|
|
81
|
+
*
|
|
82
|
+
* Used to (a) mirror the onboarding milestone (`{ onboardingComplete: true }`)
|
|
83
|
+
* without disturbing provenance, and (b) refresh `origin` on a same-identity
|
|
84
|
+
* re-persist without resetting `createdAt`.
|
|
85
|
+
*/
|
|
86
|
+
export declare function updateIdentityMarker(partial: Partial<Omit<IdentityMarker, 'v'>>): Promise<boolean>;
|
|
87
|
+
/**
|
|
88
|
+
* Remove the marker. Called ONLY after the identity's keys have been
|
|
89
|
+
* successfully deleted (`KeyManager.deleteIdentity`), so a marker never outlives
|
|
90
|
+
* the identity it records. Fails open (swallows errors) — a leftover marker
|
|
91
|
+
* simply routes a truly-absent identity to `recovery` instead of `welcome`,
|
|
92
|
+
* which is the safe direction.
|
|
93
|
+
*/
|
|
94
|
+
export declare function clearIdentityMarker(): Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key Derivation Function (HKDF-SHA256)
|
|
3
|
+
*
|
|
4
|
+
* Pure-JS/TS HKDF via `@noble/hashes` — identical behaviour on web, Node, and
|
|
5
|
+
* React Native with zero WebCrypto / native-module dependency. Used to derive
|
|
6
|
+
* fixed-length symmetric keys from higher-entropy input keying material (an
|
|
7
|
+
* ECDH shared secret, a recovery-phrase seed, etc.) for the Commons encrypted
|
|
8
|
+
* backup and device-to-device transfer flows.
|
|
9
|
+
*
|
|
10
|
+
* ESM/CJS safe: static `import` only, no `require()`.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Derive `length` bytes of keying material from `ikm` using HKDF-SHA256
|
|
14
|
+
* (RFC 5869 — extract-then-expand).
|
|
15
|
+
*
|
|
16
|
+
* @param ikm Input keying material (the raw secret; NOT necessarily uniform).
|
|
17
|
+
* @param salt Non-secret random salt. An empty array is treated by HKDF as a
|
|
18
|
+
* zero-filled salt of the hash length — pass a real salt whenever
|
|
19
|
+
* one is available so derivations for different contexts diverge.
|
|
20
|
+
* @param info Context/application-binding string ("what is this key for").
|
|
21
|
+
* Distinct `info` values yield independent keys from the same ikm.
|
|
22
|
+
* @param length Number of output bytes. Must be in (0, 255 * 32].
|
|
23
|
+
* @returns Exactly `length` bytes of derived keying material.
|
|
24
|
+
*/
|
|
25
|
+
export declare function hkdfSha256(ikm: Uint8Array, salt: Uint8Array, info: Uint8Array, length: number): Uint8Array;
|