@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,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized mixin exports and composition helper
|
|
3
|
+
*
|
|
4
|
+
* This module provides a clean way to compose all mixins
|
|
5
|
+
* and ensures consistent ordering for better maintainability
|
|
6
|
+
*/
|
|
7
|
+
import { OxyServicesBase } from '../OxyServices.base.js';
|
|
8
|
+
import { OxyServicesAuthMixin } from './OxyServices.auth.js';
|
|
9
|
+
import { OxyServicesUserMixin } from './OxyServices.user.js';
|
|
10
|
+
import { OxyServicesIdentityMixin } from './OxyServices.identity.js';
|
|
11
|
+
import { OxyServicesIdentityBackupMixin } from './OxyServices.identityBackup.js';
|
|
12
|
+
import { OxyServicesPrivacyMixin } from './OxyServices.privacy.js';
|
|
13
|
+
import { OxyServicesLanguageMixin } from './OxyServices.language.js';
|
|
14
|
+
import { OxyServicesPaymentMixin } from './OxyServices.payment.js';
|
|
15
|
+
import { OxyServicesReputationMixin } from './OxyServices.reputation.js';
|
|
16
|
+
import { OxyServicesAssetsMixin } from './OxyServices.assets.js';
|
|
17
|
+
import { OxyServicesAccountsMixin } from './OxyServices.accounts.js';
|
|
18
|
+
import { OxyServicesConnectedAppsMixin } from './OxyServices.connectedApps.js';
|
|
19
|
+
import { OxyServicesStoreMixin } from './OxyServices.store.js';
|
|
20
|
+
import { OxyServicesLocationMixin } from './OxyServices.location.js';
|
|
21
|
+
import { OxyServicesAnalyticsMixin } from './OxyServices.analytics.js';
|
|
22
|
+
import { OxyServicesDevicesMixin } from './OxyServices.devices.js';
|
|
23
|
+
import { OxyServicesSecurityMixin } from './OxyServices.security.js';
|
|
24
|
+
import { OxyServicesUtilityMixin } from './OxyServices.utility.js';
|
|
25
|
+
import { OxyServicesFeaturesMixin } from './OxyServices.features.js';
|
|
26
|
+
import { OxyServicesTopicsMixin } from './OxyServices.topics.js';
|
|
27
|
+
import { OxyServicesContactsMixin } from './OxyServices.contacts.js';
|
|
28
|
+
import { OxyServicesNotificationsMixin } from './OxyServices.notifications.js';
|
|
29
|
+
import { OxyServicesAppDataMixin } from './OxyServices.appData.js';
|
|
30
|
+
import { OxyServicesCivicMixin } from './OxyServices.civic.js';
|
|
31
|
+
import { OxyServicesChainsMixin } from './OxyServices.chains.js';
|
|
32
|
+
import { OxyServicesNodesMixin } from './OxyServices.nodes.js';
|
|
33
|
+
import { OxyServicesLinksMixin } from './OxyServices.links.js';
|
|
34
|
+
import { OxyServicesFollowGraphMixin } from './OxyServices.followGraph.js';
|
|
35
|
+
import { OxyServicesInferenceMixin } from './OxyServices.inference.js';
|
|
36
|
+
import { OxyServicesDeviceBootMixin } from './OxyServices.deviceBoot.js';
|
|
37
|
+
import { OxyServicesDeviceTransferMixin } from './OxyServices.deviceTransfer.js';
|
|
38
|
+
/**
|
|
39
|
+
* Mixin pipeline - applied in order from first to last.
|
|
40
|
+
*
|
|
41
|
+
* Order matters for dependencies:
|
|
42
|
+
* 1. Base auth mixin first (required by all others)
|
|
43
|
+
* 2. User mixin (requires auth)
|
|
44
|
+
* 3. Feature mixins (can depend on user)
|
|
45
|
+
* 4. Utility mixin last (augments all)
|
|
46
|
+
*
|
|
47
|
+
* To add a new mixin: insert it at the appropriate position in this array.
|
|
48
|
+
*/
|
|
49
|
+
const MIXIN_PIPELINE = [
|
|
50
|
+
// Base authentication
|
|
51
|
+
OxyServicesAuthMixin,
|
|
52
|
+
// User management (requires auth)
|
|
53
|
+
OxyServicesUserMixin,
|
|
54
|
+
// Self-sovereign identity (DID, signed records, auth-method ↔ VM mapping)
|
|
55
|
+
OxyServicesIdentityMixin,
|
|
56
|
+
// Encrypted off-device identity backup (b3 Feature 1): store/restore an
|
|
57
|
+
// encrypted copy of the self-custody key, keyed off the recovery phrase.
|
|
58
|
+
OxyServicesIdentityBackupMixin,
|
|
59
|
+
OxyServicesPrivacyMixin,
|
|
60
|
+
// Feature mixins
|
|
61
|
+
OxyServicesLanguageMixin,
|
|
62
|
+
OxyServicesPaymentMixin,
|
|
63
|
+
OxyServicesReputationMixin,
|
|
64
|
+
OxyServicesAssetsMixin,
|
|
65
|
+
// Unified account graph + the applications owned within it. The clean-cut
|
|
66
|
+
// replacement for the former managedAccounts + workspaces + applications
|
|
67
|
+
// (account-management) mixins.
|
|
68
|
+
OxyServicesAccountsMixin,
|
|
69
|
+
// OAuth-consent surface (public app identity + connected-app grants). Kept
|
|
70
|
+
// separate from account ownership.
|
|
71
|
+
OxyServicesConnectedAppsMixin,
|
|
72
|
+
// The app store: the public storefront, the reviews on it, and the listing a
|
|
73
|
+
// publisher edits. A module OVER the platform — turn it off and OAuth still
|
|
74
|
+
// works — so it is its own surface rather than more of `accounts`.
|
|
75
|
+
OxyServicesStoreMixin,
|
|
76
|
+
OxyServicesLocationMixin,
|
|
77
|
+
OxyServicesAnalyticsMixin,
|
|
78
|
+
OxyServicesDevicesMixin,
|
|
79
|
+
OxyServicesSecurityMixin,
|
|
80
|
+
OxyServicesFeaturesMixin,
|
|
81
|
+
OxyServicesTopicsMixin,
|
|
82
|
+
OxyServicesContactsMixin,
|
|
83
|
+
// Push-token registration: the one SDK-owned register/unregister pair every
|
|
84
|
+
// Oxy app uses, and what lets a "Sign in with Oxy" request be delivered to a
|
|
85
|
+
// known Commons installation instead of falling back to a QR.
|
|
86
|
+
OxyServicesNotificationsMixin,
|
|
87
|
+
OxyServicesAppDataMixin,
|
|
88
|
+
// Civic / Commons "Oxy ID" (public signed cards, Oxy ID QR payload)
|
|
89
|
+
OxyServicesCivicMixin,
|
|
90
|
+
OxyServicesChainsMixin,
|
|
91
|
+
// User nodes / decentralization (Fase 5): register/read/revoke/manage the
|
|
92
|
+
// caller's personal data node + ingest hint.
|
|
93
|
+
OxyServicesNodesMixin,
|
|
94
|
+
// Link previews / unfurls: SDK-owned link-metadata resolution via oxy-api,
|
|
95
|
+
// so apps stop scraping link metadata locally.
|
|
96
|
+
OxyServicesLinksMixin,
|
|
97
|
+
// The user-owned follow graph (#809). One relationship per user and target,
|
|
98
|
+
// shared across applications, with per-application context on top.
|
|
99
|
+
OxyServicesFollowGraphMixin,
|
|
100
|
+
// The inference model catalogue (#972). Reads only, and deliberately no
|
|
101
|
+
// request/stream/receipt methods — the public inference edge those would
|
|
102
|
+
// call is workstream 4 and does not exist yet. See
|
|
103
|
+
// `docs/inference/README.md` for what is and is not built.
|
|
104
|
+
OxyServicesInferenceMixin,
|
|
105
|
+
// Device-first token mint: the client half of the zero-cookie transport
|
|
106
|
+
// (`mintFromDeviceSecret` → `POST /session/device/token`).
|
|
107
|
+
OxyServicesDeviceBootMixin,
|
|
108
|
+
// Device-to-device identity transfer ("add a device"): E2E-encrypted key
|
|
109
|
+
// clone over a short-lived relay (b3 Feature 2).
|
|
110
|
+
OxyServicesDeviceTransferMixin,
|
|
111
|
+
// Utility (last, can use all above)
|
|
112
|
+
OxyServicesUtilityMixin,
|
|
113
|
+
];
|
|
114
|
+
/**
|
|
115
|
+
* Composes all OxyServices mixins using a pipeline pattern.
|
|
116
|
+
*
|
|
117
|
+
* This is equivalent to the nested calls but more readable and maintainable.
|
|
118
|
+
* Adding a new mixin: add it to MIXIN_PIPELINE at the appropriate position
|
|
119
|
+
* AND extend `AllMixinInstances` so its methods are visible to consumers.
|
|
120
|
+
*
|
|
121
|
+
* The cast through `unknown` carries the runtime augmentation chain into the
|
|
122
|
+
* static type system. `Array.reduce` cannot track each mixin's generic
|
|
123
|
+
* refinement, so we assert the final shape exposed by all mixins together.
|
|
124
|
+
*
|
|
125
|
+
* @returns The fully composed OxyServices constructor with all mixins applied
|
|
126
|
+
*/
|
|
127
|
+
export function composeOxyServices() {
|
|
128
|
+
const composed = MIXIN_PIPELINE.reduce((Base, mixin) => mixin(Base), OxyServicesBase);
|
|
129
|
+
return composed;
|
|
130
|
+
}
|
|
131
|
+
// Export the pipeline for testing/debugging
|
|
132
|
+
export { MIXIN_PIPELINE };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper utilities for mixin classes
|
|
3
|
+
* Provides common patterns to reduce code duplication
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Wraps an async method with standard error handling
|
|
7
|
+
* Reduces boilerplate in mixin methods
|
|
8
|
+
*/
|
|
9
|
+
export async function withErrorHandling(operation, handleError) {
|
|
10
|
+
try {
|
|
11
|
+
return await operation();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
throw handleError(error);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Creates a standard API request method with error handling
|
|
19
|
+
* Reduces duplication across mixin methods
|
|
20
|
+
*/
|
|
21
|
+
export function createApiMethod(makeRequest, handleError, method, url, options = {}) {
|
|
22
|
+
return async (...args) => {
|
|
23
|
+
const urlString = typeof url === 'function' ? url(...args) : url;
|
|
24
|
+
const requestData = options.transformData ? options.transformData(args) : args[0];
|
|
25
|
+
const requestOptions = {
|
|
26
|
+
cache: options.cache ?? true,
|
|
27
|
+
cacheTTL: options.cacheTTL,
|
|
28
|
+
retry: options.retry ?? true,
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const response = await makeRequest(method, urlString, requestData, requestOptions);
|
|
32
|
+
return options.transformResponse ? options.transformResponse(response) : response;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw handleError(error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cache time constants (in milliseconds)
|
|
41
|
+
*/
|
|
42
|
+
export const CACHE_TIMES = {
|
|
43
|
+
SHORT: 1 * 60 * 1000, // 1 minute
|
|
44
|
+
MEDIUM: 2 * 60 * 1000, // 2 minutes
|
|
45
|
+
LONG: 5 * 60 * 1000, // 5 minutes
|
|
46
|
+
VERY_LONG: 10 * 60 * 1000, // 10 minutes
|
|
47
|
+
EXTRA_LONG: 30 * 60 * 1000, // 30 minutes
|
|
48
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export var TopicType;
|
|
2
|
+
(function (TopicType) {
|
|
3
|
+
TopicType["CATEGORY"] = "category";
|
|
4
|
+
TopicType["TOPIC"] = "topic";
|
|
5
|
+
TopicType["ENTITY"] = "entity";
|
|
6
|
+
})(TopicType || (TopicType = {}));
|
|
7
|
+
export var TopicSource;
|
|
8
|
+
(function (TopicSource) {
|
|
9
|
+
TopicSource["SEED"] = "seed";
|
|
10
|
+
TopicSource["AI"] = "ai";
|
|
11
|
+
TopicSource["MANUAL"] = "manual";
|
|
12
|
+
TopicSource["SYSTEM"] = "system";
|
|
13
|
+
})(TopicSource || (TopicSource = {}));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security event severity mapping (single source of truth)
|
|
3
|
+
* Maps each event type to its default severity level
|
|
4
|
+
*/
|
|
5
|
+
export const SECURITY_EVENT_SEVERITY_MAP = {
|
|
6
|
+
'sign_in': 'low',
|
|
7
|
+
'sign_out': 'low',
|
|
8
|
+
'profile_updated': 'low',
|
|
9
|
+
'email_changed': 'medium',
|
|
10
|
+
'device_added': 'medium',
|
|
11
|
+
'device_removed': 'medium',
|
|
12
|
+
'security_settings_changed': 'medium',
|
|
13
|
+
'account_recovery': 'high',
|
|
14
|
+
'private_key_exported': 'high',
|
|
15
|
+
'backup_created': 'high',
|
|
16
|
+
'suspicious_activity': 'critical',
|
|
17
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { OXY_SERVICE_ENVIRONMENTS } from '../utils/oxyServiceEnvironment.js';
|
|
2
|
+
export { OXY_SERVICE_ENVIRONMENTS };
|
|
3
|
+
function normalizeId(value) {
|
|
4
|
+
const normalized = value?.trim();
|
|
5
|
+
return normalized && normalized.length > 0 ? normalized : null;
|
|
6
|
+
}
|
|
7
|
+
function ensureUser(req, userId) {
|
|
8
|
+
const existing = req.user;
|
|
9
|
+
if (existing) {
|
|
10
|
+
const user = {
|
|
11
|
+
...existing,
|
|
12
|
+
id: normalizeId(existing.id) ?? normalizeId(existing._id) ?? userId,
|
|
13
|
+
};
|
|
14
|
+
req.user = user;
|
|
15
|
+
return user;
|
|
16
|
+
}
|
|
17
|
+
const user = { id: userId };
|
|
18
|
+
req.user = user;
|
|
19
|
+
return user;
|
|
20
|
+
}
|
|
21
|
+
export function getOxyUserId(req) {
|
|
22
|
+
const authReq = req;
|
|
23
|
+
return (normalizeId(authReq.userId) ??
|
|
24
|
+
normalizeId(authReq.user?.id) ??
|
|
25
|
+
normalizeId(authReq.user?._id));
|
|
26
|
+
}
|
|
27
|
+
export function isOxyAuthenticated(req) {
|
|
28
|
+
return getOxyUserId(req) !== null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The billing principal of a request, or `null` when the request carries no
|
|
32
|
+
* verified service principal (an ordinary user session is not a billable
|
|
33
|
+
* machine principal — its account is resolved from the account graph, not from
|
|
34
|
+
* a token claim).
|
|
35
|
+
*
|
|
36
|
+
* Reads `req.serviceApp` and NOTHING else: not `req.userId`, not `req.user`,
|
|
37
|
+
* not `req.serviceActingAs`. That exclusivity is the invariant this function
|
|
38
|
+
* exists to hold, and `serviceTokenAttribution.test.ts` mutation-tests it.
|
|
39
|
+
*
|
|
40
|
+
* **It answers for the SERVICE-TOKEN lane only.** The API's machine-credential
|
|
41
|
+
* lane (`oxy_sk_*`, issue #972 §2.3) resolves the same five facts into its own
|
|
42
|
+
* `req.machineCredential`, deliberately never `req.serviceApp` — populating the
|
|
43
|
+
* latter would hand a self-serve third-party credential the lane that only
|
|
44
|
+
* platform-trusted applications may enter. So a machine-credential request has
|
|
45
|
+
* no billing principal HERE and resolves `null`, which fails closed: the caller
|
|
46
|
+
* must handle it, and `getRequiredOxyBillingPrincipal` throws rather than
|
|
47
|
+
* charging anyone. One accessor answering for both lanes belongs to the public
|
|
48
|
+
* inference edge that has to admit both, and it needs the machine principal's
|
|
49
|
+
* shape to move into this package first.
|
|
50
|
+
*/
|
|
51
|
+
export function getOxyBillingPrincipal(req) {
|
|
52
|
+
const serviceApp = req.serviceApp;
|
|
53
|
+
if (!serviceApp) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const accountId = normalizeId(serviceApp.ownerAccountId);
|
|
57
|
+
const applicationId = normalizeId(serviceApp.appId);
|
|
58
|
+
const credentialId = normalizeId(serviceApp.credentialId);
|
|
59
|
+
if (!accountId || !applicationId || !credentialId) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
accountId,
|
|
64
|
+
applicationId,
|
|
65
|
+
credentialId,
|
|
66
|
+
environment: serviceApp.environment,
|
|
67
|
+
scopes: serviceApp.scopes,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* {@link getOxyBillingPrincipal}, throwing when the request has none. Use on
|
|
72
|
+
* routes that have already required a service token.
|
|
73
|
+
*/
|
|
74
|
+
export function getRequiredOxyBillingPrincipal(req) {
|
|
75
|
+
const principal = getOxyBillingPrincipal(req);
|
|
76
|
+
if (!principal) {
|
|
77
|
+
throw new Error('Request has no verified Oxy service principal');
|
|
78
|
+
}
|
|
79
|
+
return principal;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The delegated end user of a service request, or `null`.
|
|
83
|
+
*
|
|
84
|
+
* Deliberately reads `req.serviceActingAs` — the grant-verified delegation —
|
|
85
|
+
* and not `req.userId`, which on a non-service request is the caller's own
|
|
86
|
+
* session identity and is not a delegation at all.
|
|
87
|
+
*/
|
|
88
|
+
export function getOxyDelegatedUserId(req) {
|
|
89
|
+
return normalizeId(req.serviceActingAs?.userId);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The whole attribution tuple for a service request: who pays, which
|
|
93
|
+
* application and credential, and optionally on whose behalf.
|
|
94
|
+
*/
|
|
95
|
+
export function getOxyRequestAttribution(req) {
|
|
96
|
+
const principal = getOxyBillingPrincipal(req);
|
|
97
|
+
if (!principal) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
return { ...principal, delegatedUserId: getOxyDelegatedUserId(req) };
|
|
101
|
+
}
|
|
102
|
+
export function getRequiredOxyUserId(req) {
|
|
103
|
+
const userId = getOxyUserId(req);
|
|
104
|
+
if (!userId) {
|
|
105
|
+
throw new Error('User not authenticated');
|
|
106
|
+
}
|
|
107
|
+
return userId;
|
|
108
|
+
}
|
|
109
|
+
export function requireOxyAuth(req, res, next) {
|
|
110
|
+
const userId = getOxyUserId(req);
|
|
111
|
+
if (!userId) {
|
|
112
|
+
res.status(401).json({
|
|
113
|
+
error: 'Unauthorized',
|
|
114
|
+
message: 'Authentication required',
|
|
115
|
+
});
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const authReq = req;
|
|
119
|
+
authReq.userId = userId;
|
|
120
|
+
ensureUser(authReq, userId);
|
|
121
|
+
next();
|
|
122
|
+
}
|
|
123
|
+
export function createOptionalOxyAuth(oxy, options = {}) {
|
|
124
|
+
const resolveSession = oxy.auth({ ...options.auth, optional: true });
|
|
125
|
+
return (req, res, next) => {
|
|
126
|
+
if (getOxyUserId(req)) {
|
|
127
|
+
next();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
resolveSession(req, res, (error) => {
|
|
131
|
+
if (error) {
|
|
132
|
+
next(error);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
next();
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export function createOxyAuthMiddleware(oxy, options = {}) {
|
|
140
|
+
const resolveSession = createOptionalOxyAuth(oxy, options);
|
|
141
|
+
return (req, res, next) => {
|
|
142
|
+
if (getOxyUserId(req)) {
|
|
143
|
+
requireOxyAuth(req, res, next);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
resolveSession(req, res, (error) => {
|
|
147
|
+
if (error) {
|
|
148
|
+
next(error);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
requireOxyAuth(req, res, next);
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { randomUUID, sign as signBytes, verify as verifyBytes, } from 'node:crypto';
|
|
2
|
+
import { capabilityTicketClaimsSchema, } from '@oxy.so/contracts';
|
|
3
|
+
const ALGORITHM = 'EdDSA';
|
|
4
|
+
const TOKEN_TYPE = 'OXY-CAPABILITY+JWT';
|
|
5
|
+
const DEFAULT_MAX_TTL_SECONDS = 300;
|
|
6
|
+
export class CapabilityTicketError extends Error {
|
|
7
|
+
constructor(code, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = 'CapabilityTicketError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function base64UrlEncode(value) {
|
|
14
|
+
return Buffer.from(value).toString('base64url');
|
|
15
|
+
}
|
|
16
|
+
function decodeJsonSegment(segment) {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(Buffer.from(segment, 'base64url').toString('utf8'));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket is not valid base64url JSON');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function valuesAtPath(input, path) {
|
|
25
|
+
let current = [input];
|
|
26
|
+
for (const segment of path.split('.')) {
|
|
27
|
+
const next = [];
|
|
28
|
+
for (const value of current) {
|
|
29
|
+
const records = Array.isArray(value) ? value : [value];
|
|
30
|
+
for (const record of records) {
|
|
31
|
+
if (typeof record !== 'object' || record === null || Array.isArray(record))
|
|
32
|
+
continue;
|
|
33
|
+
if (Object.prototype.hasOwnProperty.call(record, segment)) {
|
|
34
|
+
next.push(record[segment]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (next.length === 0)
|
|
39
|
+
return [];
|
|
40
|
+
current = next;
|
|
41
|
+
}
|
|
42
|
+
return current.flatMap((value) => Array.isArray(value) ? value : [value]);
|
|
43
|
+
}
|
|
44
|
+
/** Enforces the signed per-action bounds before a domain handler runs. */
|
|
45
|
+
export function inputSatisfiesCapabilityLimits(tool, input, limits) {
|
|
46
|
+
for (const limit of limits) {
|
|
47
|
+
if (limit.tool !== tool)
|
|
48
|
+
return false;
|
|
49
|
+
const actualValues = valuesAtPath(input, limit.key);
|
|
50
|
+
if (actualValues.length === 0)
|
|
51
|
+
return false;
|
|
52
|
+
if (typeof limit.value === 'number') {
|
|
53
|
+
const maximum = limit.value;
|
|
54
|
+
if (!actualValues.every((actual) => (typeof actual === 'number' && Number.isFinite(actual) && actual <= maximum)))
|
|
55
|
+
return false;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!actualValues.every((actual) => actual === limit.value))
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
export function issueCapabilityTicket(claims, options) {
|
|
64
|
+
const ttlSeconds = options.ttlSeconds ?? 60;
|
|
65
|
+
if (!Number.isInteger(ttlSeconds) || ttlSeconds < 1 || ttlSeconds > DEFAULT_MAX_TTL_SECONDS) {
|
|
66
|
+
throw new CapabilityTicketError('ttl_exceeded', `Capability ticket TTL must be between 1 and ${DEFAULT_MAX_TTL_SECONDS} seconds`);
|
|
67
|
+
}
|
|
68
|
+
const issuedAt = Math.floor((options.now ?? new Date()).getTime() / 1000);
|
|
69
|
+
const payload = capabilityTicketClaimsSchema.parse({
|
|
70
|
+
...claims,
|
|
71
|
+
iss: options.issuer,
|
|
72
|
+
iat: issuedAt,
|
|
73
|
+
exp: issuedAt + ttlSeconds,
|
|
74
|
+
jti: options.jti ?? randomUUID(),
|
|
75
|
+
});
|
|
76
|
+
if (options.privateKey.asymmetricKeyType !== 'ed25519') {
|
|
77
|
+
throw new CapabilityTicketError('invalid_claims', 'Capability tickets require an Ed25519 private key');
|
|
78
|
+
}
|
|
79
|
+
const header = { alg: ALGORITHM, typ: TOKEN_TYPE, kid: options.keyId };
|
|
80
|
+
const signingInput = `${base64UrlEncode(JSON.stringify(header))}.${base64UrlEncode(JSON.stringify(payload))}`;
|
|
81
|
+
return `${signingInput}.${base64UrlEncode(signBytes(null, Buffer.from(signingInput), options.privateKey))}`;
|
|
82
|
+
}
|
|
83
|
+
export function verifyCapabilityTicket(token, options) {
|
|
84
|
+
const segments = token.split('.');
|
|
85
|
+
if (segments.length !== 3) {
|
|
86
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket must have three segments');
|
|
87
|
+
}
|
|
88
|
+
const [encodedHeader, encodedPayload, encodedSignature] = segments;
|
|
89
|
+
if (!encodedHeader || !encodedPayload || !encodedSignature) {
|
|
90
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket contains an empty segment');
|
|
91
|
+
}
|
|
92
|
+
const header = decodeJsonSegment(encodedHeader);
|
|
93
|
+
if (typeof header !== 'object' || header === null || Array.isArray(header)) {
|
|
94
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket header is not supported');
|
|
95
|
+
}
|
|
96
|
+
const headerRecord = header;
|
|
97
|
+
if (Object.keys(headerRecord).length !== 3
|
|
98
|
+
|| headerRecord.alg !== ALGORITHM
|
|
99
|
+
|| headerRecord.typ !== TOKEN_TYPE
|
|
100
|
+
|| typeof headerRecord.kid !== 'string'
|
|
101
|
+
|| headerRecord.kid.length === 0) {
|
|
102
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket header is not supported');
|
|
103
|
+
}
|
|
104
|
+
const publicKey = options.resolvePublicKey(headerRecord.kid);
|
|
105
|
+
if (!publicKey || publicKey.asymmetricKeyType !== 'ed25519') {
|
|
106
|
+
throw new CapabilityTicketError('unknown_key', 'Capability ticket signing key is not trusted');
|
|
107
|
+
}
|
|
108
|
+
let providedSignature;
|
|
109
|
+
try {
|
|
110
|
+
providedSignature = Buffer.from(encodedSignature, 'base64url');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new CapabilityTicketError('malformed', 'Capability ticket signature is malformed');
|
|
114
|
+
}
|
|
115
|
+
if (!verifyBytes(null, Buffer.from(`${encodedHeader}.${encodedPayload}`), publicKey, providedSignature)) {
|
|
116
|
+
throw new CapabilityTicketError('invalid_signature', 'Capability ticket signature is invalid');
|
|
117
|
+
}
|
|
118
|
+
const parsed = capabilityTicketClaimsSchema.safeParse(decodeJsonSegment(encodedPayload));
|
|
119
|
+
if (!parsed.success) {
|
|
120
|
+
throw new CapabilityTicketError('invalid_claims', 'Capability ticket claims are invalid');
|
|
121
|
+
}
|
|
122
|
+
const claims = parsed.data;
|
|
123
|
+
const now = Math.floor((options.now ?? new Date()).getTime() / 1000);
|
|
124
|
+
if (claims.iat > now + 5) {
|
|
125
|
+
throw new CapabilityTicketError('not_yet_valid', 'Capability ticket is not yet valid');
|
|
126
|
+
}
|
|
127
|
+
if (claims.exp <= now) {
|
|
128
|
+
throw new CapabilityTicketError('expired', 'Capability ticket has expired');
|
|
129
|
+
}
|
|
130
|
+
if (claims.exp - claims.iat > (options.maximumTtlSeconds ?? DEFAULT_MAX_TTL_SECONDS)) {
|
|
131
|
+
throw new CapabilityTicketError('ttl_exceeded', 'Capability ticket lifetime exceeds the accepted maximum');
|
|
132
|
+
}
|
|
133
|
+
if (claims.aud !== options.audience) {
|
|
134
|
+
throw new CapabilityTicketError('wrong_audience', 'Capability ticket audience does not match this app');
|
|
135
|
+
}
|
|
136
|
+
if (options.issuer && claims.iss !== options.issuer) {
|
|
137
|
+
throw new CapabilityTicketError('wrong_issuer', 'Capability ticket issuer is not trusted');
|
|
138
|
+
}
|
|
139
|
+
return claims;
|
|
140
|
+
}
|
|
141
|
+
export function readCapabilityAuthorization(authorization) {
|
|
142
|
+
if (!authorization)
|
|
143
|
+
return null;
|
|
144
|
+
const [scheme, token, extra] = authorization.trim().split(/\s+/);
|
|
145
|
+
if (scheme?.toLowerCase() !== 'capability' || !token || extra)
|
|
146
|
+
return null;
|
|
147
|
+
return token;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Verifies cryptographic scope first, then asks the authority service for a
|
|
151
|
+
* live decision. This second check is what makes revocation effective between
|
|
152
|
+
* planning and execution.
|
|
153
|
+
*/
|
|
154
|
+
export function createCapabilityTicketMiddleware(options) {
|
|
155
|
+
return async (request, response, next) => {
|
|
156
|
+
const token = readCapabilityAuthorization(request.header('authorization'));
|
|
157
|
+
if (!token) {
|
|
158
|
+
response.status(401).json({ error: 'capability_ticket_required' });
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
let claims;
|
|
162
|
+
try {
|
|
163
|
+
claims = verifyCapabilityTicket(token, options);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
const code = error instanceof CapabilityTicketError ? error.code : 'invalid_claims';
|
|
167
|
+
response.status(401).json({ error: 'invalid_capability_ticket', code });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const decision = await options.authorize(claims);
|
|
172
|
+
if (!decision.allowed) {
|
|
173
|
+
response.status(403).json({ error: 'capability_denied', reason: decision.reason });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
request.capabilityTicket = claims;
|
|
177
|
+
next();
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
response.status(503).json({ error: 'capability_authority_unavailable' });
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}
|