@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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared security headers (Helmet + Content-Security-Policy) for Oxy backends.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* A CSP only governs an origin that serves DOCUMENTS; on a JSON API it governs
|
|
7
|
+
* no browsing context. The Oxy origins that serve HTML through Cloudflare have
|
|
8
|
+
* so far either hand-written their own policy or shipped none at all, and two
|
|
9
|
+
* bugs follow from that:
|
|
10
|
+
*
|
|
11
|
+
* 1. THE CLOUDFLARE INSIGHTS BEACON IS BLOCKED BY A HAND-WRITTEN POLICY.
|
|
12
|
+
* Cloudflare injects `<script src="https://static.cloudflareinsights.com/
|
|
13
|
+
* beacon.min.js/...">` into HTML it proxies. No application code loads it,
|
|
14
|
+
* so it cannot be allowlisted from the app side any other way, and an
|
|
15
|
+
* origin whose policy says `script-src 'self'` logs
|
|
16
|
+
* `Loading the script 'https://static.cloudflareinsights.com/beacon.min.js'
|
|
17
|
+
* violates the following Content Security Policy directive: "script-src
|
|
18
|
+
* 'self'"` and collects nothing. The beacon needs BOTH hosts, and they are
|
|
19
|
+
* different halves of the same feature: `static.cloudflareinsights.com`
|
|
20
|
+
* serves the script (`script-src`), `cloudflareinsights.com` receives the
|
|
21
|
+
* measurements (`connect-src`). Allowing only the script leaves the beacon
|
|
22
|
+
* loading but unable to report, which looks fixed and is not. Verified in
|
|
23
|
+
* production 2026-07-29: `mention.earth` serves HTML behind Cloudflare with
|
|
24
|
+
* the beacon injected and `script-src 'self'` — blocked; `oxy.so` had
|
|
25
|
+
* already allowlisted the same two hosts in its own static `_headers`,
|
|
26
|
+
* independently, which is the divergence this baseline exists to end.
|
|
27
|
+
*
|
|
28
|
+
* 2. AN EXPLICIT DIRECTIVE SILENTLY REPLACES HELMET'S DEFAULT.
|
|
29
|
+
* Writing `scriptSrc: ['https://example.com']` drops `'self'` — the page's
|
|
30
|
+
* own bundle stops loading (or, worse, only some lazily-loaded chunk does,
|
|
31
|
+
* so it ships). This helper makes that structurally impossible: callers can
|
|
32
|
+
* only ADD sources to the Oxy baseline, never replace a directive, and they
|
|
33
|
+
* cannot pass their own `contentSecurityPolicy` through to Helmet at all
|
|
34
|
+
* (the option is typed `never`).
|
|
35
|
+
*
|
|
36
|
+
* 3. A STATIC EXPO EXPORT SHIPS AN INLINE SCRIPT THE BASELINE FORBIDS.
|
|
37
|
+
* `web.output: 'static'` makes Expo Router emit
|
|
38
|
+
* `<script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script>`,
|
|
39
|
+
* which is what tells the client entry to call `hydrateRoot` instead of
|
|
40
|
+
* `createRoot().render()`. Nothing in app code puts it there, so — like the
|
|
41
|
+
* Cloudflare beacon above — an app cannot allowlist it from the app side.
|
|
42
|
+
* Measured on `accounts.oxy.so` 2026-08-21: blocked, so every visit threw
|
|
43
|
+
* away the server-rendered markup and re-rendered from scratch, with only a
|
|
44
|
+
* console error to show for it. The hashes are therefore DERIVED from the
|
|
45
|
+
* built output rather than hand-written (see {@link extractInlineScripts}):
|
|
46
|
+
* a hash pasted into config is correct exactly until the build changes one
|
|
47
|
+
* byte, and then it fails the same silent way.
|
|
48
|
+
*
|
|
49
|
+
* WHAT IT PROVIDES
|
|
50
|
+
* ----------------
|
|
51
|
+
* `createOxySecurityHeaders(options)` returns the Helmet middleware with the
|
|
52
|
+
* Oxy-wide CSP baseline applied, plus per-app extensions merged (and deduped)
|
|
53
|
+
* into it. Everything Helmet does that is NOT the CSP (HSTS, frameguard,
|
|
54
|
+
* referrer policy, CORP/COOP, …) is passed straight through, so an app keeps
|
|
55
|
+
* full control of those.
|
|
56
|
+
*
|
|
57
|
+
* `buildOxyCspDirectives(extensions)` is the same resolution as a pure
|
|
58
|
+
* function, for the Oxy document origins that are NOT Express — a Next.js
|
|
59
|
+
* `headers()`, a Cloudflare Pages `_headers` generator — so one policy can
|
|
60
|
+
* cover them without a second implementation.
|
|
61
|
+
*
|
|
62
|
+
* SCOPE: mount this on backends that serve HTML. A JSON-only API gains nothing
|
|
63
|
+
* from a source-list CSP; harden those with the non-CSP headers instead
|
|
64
|
+
* (`hsts`, `noSniff`, `frameguard`, CORP) rather than adding directives that
|
|
65
|
+
* apply to no document.
|
|
66
|
+
*
|
|
67
|
+
* Node/Express-only: exported solely from `@oxy.so/core/server`.
|
|
68
|
+
*/
|
|
69
|
+
import type { RequestHandler } from 'express';
|
|
70
|
+
import { type HelmetOptions } from 'helmet';
|
|
71
|
+
/** The CSP directives an Oxy app may extend, in Helmet's camelCase spelling. */
|
|
72
|
+
export type OxyCspDirective = 'baseUri' | 'connectSrc' | 'defaultSrc' | 'fontSrc' | 'formAction' | 'frameAncestors' | 'frameSrc' | 'imgSrc' | 'manifestSrc' | 'mediaSrc' | 'objectSrc' | 'scriptSrc' | 'scriptSrcAttr' | 'scriptSrcElem' | 'styleSrc' | 'styleSrcElem' | 'workerSrc';
|
|
73
|
+
/**
|
|
74
|
+
* Per-app ADDITIONS to the Oxy baseline, keyed by directive. Values are merged
|
|
75
|
+
* into the baseline and deduped — they never replace it, so `'self'` (and the
|
|
76
|
+
* Cloudflare beacon hosts) cannot be lost. Extending a directive the baseline
|
|
77
|
+
* does not define seeds it with `'self'` first, for the same reason.
|
|
78
|
+
*/
|
|
79
|
+
export type OxyCspExtensions = Partial<Record<OxyCspDirective, readonly string[]>>;
|
|
80
|
+
/**
|
|
81
|
+
* The Oxy-wide CSP baseline. Deliberately the floor every Oxy origin needs, not
|
|
82
|
+
* a superset of what any one app allows — permissive sources an individual app
|
|
83
|
+
* wants (`https:` images, `blob:` media, embed hosts, LiveKit) are that app's
|
|
84
|
+
* extension, so each widening stays visible at its call site.
|
|
85
|
+
*
|
|
86
|
+
* `style-src` carries `'unsafe-inline'` because react-native-web injects its
|
|
87
|
+
* stylesheet as inline `<style>` at runtime; without it every Oxy web app
|
|
88
|
+
* renders unstyled.
|
|
89
|
+
*/
|
|
90
|
+
export declare const OXY_CSP_BASELINE: Readonly<Partial<Record<OxyCspDirective, readonly string[]>>>;
|
|
91
|
+
/**
|
|
92
|
+
* Resolve the effective CSP directives: the Oxy baseline, with each app
|
|
93
|
+
* extension merged in and deduped.
|
|
94
|
+
*
|
|
95
|
+
* Merge rules:
|
|
96
|
+
* - A baseline directive is EXTENDED, never replaced — `'self'` and the
|
|
97
|
+
* Cloudflare beacon hosts always survive.
|
|
98
|
+
* - A directive absent from the baseline is seeded with `'self'`, so adding
|
|
99
|
+
* (say) an embed host to `frame-src` cannot lock the origin out of itself.
|
|
100
|
+
* - A directive whose baseline is exactly `'none'` is CLOSED: extending it
|
|
101
|
+
* drops the sentinel, because `'none'` alongside any other source is
|
|
102
|
+
* meaningless per the CSP spec. This is how an app that must be framable
|
|
103
|
+
* opts back in with `frameAncestors: ["'self'"]`.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* buildOxyCspDirectives({ frameSrc: ['https://player.vimeo.com'] });
|
|
108
|
+
* // → { ..., 'frame-src': ["'self'", 'https://player.vimeo.com'], ... }
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function buildOxyCspDirectives(extensions?: OxyCspExtensions): Record<string, string[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Serialize resolved CSP directives into the single-line header value browsers
|
|
114
|
+
* and Cloudflare `_headers` expect. Valueless directives (e.g.
|
|
115
|
+
* `upgrade-insecure-requests`) emit the name alone.
|
|
116
|
+
*/
|
|
117
|
+
export declare function formatOxyCspPolicy(directives: Record<string, string[]>): string;
|
|
118
|
+
/**
|
|
119
|
+
* The source list one directive carries in a serialized policy, or `[]` when
|
|
120
|
+
* the policy does not name that directive. The inverse of
|
|
121
|
+
* {@link formatOxyCspPolicy}, and the reason it lives here rather than beside
|
|
122
|
+
* either caller: the post-deploy gate parses the policy the ORIGIN serves while
|
|
123
|
+
* the unit test parses the one the middleware renders, so a copy in each would
|
|
124
|
+
* let the header shape change with the test still green and the gate reading
|
|
125
|
+
* `[]` — reporting every script blocked, which reads as a broken app rather
|
|
126
|
+
* than as a broken parser.
|
|
127
|
+
*
|
|
128
|
+
* A directive present with no sources (`upgrade-insecure-requests`) and a
|
|
129
|
+
* directive absent entirely both answer `[]`. Callers that need to tell those
|
|
130
|
+
* apart are asking a different question than "what is allowed here".
|
|
131
|
+
*/
|
|
132
|
+
export declare function cspSourcesFor(policy: string, directive: string): string[];
|
|
133
|
+
/**
|
|
134
|
+
* Every inline `<script>` body in an HTML document, in document order. A
|
|
135
|
+
* `<script src=…>` is a URL the source list already governs and is skipped.
|
|
136
|
+
*
|
|
137
|
+
* Scanned rather than matched with one regex because the two failure modes are
|
|
138
|
+
* not symmetric: an EXTRA body costs a redundant hash nobody notices, while a
|
|
139
|
+
* MISSED body silently reinstates the exact breakage this exists to prevent.
|
|
140
|
+
* So the scan errs toward finding them — it walks the open tag quote-aware
|
|
141
|
+
* instead of letting a `>` inside an attribute value truncate it.
|
|
142
|
+
*
|
|
143
|
+
* The type attribute is deliberately not consulted. Whether a given `type`
|
|
144
|
+
* executes is a browser decision (and it changes: `importmap` and
|
|
145
|
+
* `speculationrules` were both once inert), and pinning the exact bytes of a
|
|
146
|
+
* data block we ship ourselves weakens nothing.
|
|
147
|
+
*/
|
|
148
|
+
export declare function extractInlineScripts(html: string): string[];
|
|
149
|
+
/**
|
|
150
|
+
* The `'sha256-…'` source that allows one inline script, hashed over its exact
|
|
151
|
+
* bytes as CSP specifies — no trimming, no normalization. One byte of
|
|
152
|
+
* whitespace either way is a different hash and the script stays blocked.
|
|
153
|
+
*/
|
|
154
|
+
export declare function inlineScriptCspHash(source: string): string;
|
|
155
|
+
export interface OxyPagesHeadersOptions {
|
|
156
|
+
/** Per-app additions merged into {@link OXY_CSP_BASELINE}. */
|
|
157
|
+
csp?: OxyCspExtensions;
|
|
158
|
+
/**
|
|
159
|
+
* Emit `Strict-Transport-Security` (default `true`). Cloudflare Pages serves
|
|
160
|
+
* HTTPS only, so static deploys should keep this on.
|
|
161
|
+
*/
|
|
162
|
+
hsts?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* The BUILT HTML documents this `_headers` will be served alongside. Every
|
|
165
|
+
* inline script found in them is allowed by hash, added to `script-src`.
|
|
166
|
+
*
|
|
167
|
+
* Passing the built output — rather than hand-writing a hash into
|
|
168
|
+
* `oxy.pages-headers.json` — is the whole point: a pasted hash is correct
|
|
169
|
+
* until the generator changes one byte of that script, and then the script is
|
|
170
|
+
* blocked again with nothing but a console error to show for it.
|
|
171
|
+
*/
|
|
172
|
+
html?: readonly string[];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Build a Cloudflare Pages `_headers` block for an Oxy HTML origin. Uses the
|
|
176
|
+
* same CSP resolution as {@link createOxySecurityHeaders} plus the non-CSP
|
|
177
|
+
* hardening headers Helmet would add on an Express HTML backend.
|
|
178
|
+
*
|
|
179
|
+
* Adding a hash to `script-src` does not narrow it: per CSP Level 3 a hash is
|
|
180
|
+
* an additional source, so `'self'` and the beacon host keep matching external
|
|
181
|
+
* scripts. (It WOULD neutralize `'unsafe-inline'` in the same directive — which
|
|
182
|
+
* is why this hashes scripts only. `style-src` keeps `'unsafe-inline'` for
|
|
183
|
+
* react-native-web's runtime stylesheet, and a style hash would silently switch
|
|
184
|
+
* that off and render every Oxy web app unstyled.)
|
|
185
|
+
*/
|
|
186
|
+
export declare function buildOxyPagesHeaders(options?: OxyPagesHeadersOptions): string;
|
|
187
|
+
export interface OxySecurityHeadersOptions {
|
|
188
|
+
/**
|
|
189
|
+
* Per-app additions to the Oxy CSP baseline. Merged, deduped, never
|
|
190
|
+
* replacing — see {@link buildOxyCspDirectives}.
|
|
191
|
+
*/
|
|
192
|
+
csp?: OxyCspExtensions;
|
|
193
|
+
/**
|
|
194
|
+
* Everything Helmet does that is not the CSP: `hsts`, `frameguard`,
|
|
195
|
+
* `referrerPolicy`, `crossOriginResourcePolicy`, … Passed straight through.
|
|
196
|
+
*
|
|
197
|
+
* `contentSecurityPolicy` is typed `never` on purpose: the CSP is owned by
|
|
198
|
+
* this helper so the baseline cannot be replaced (nor the `'self'` guarantee
|
|
199
|
+
* bypassed) by an app that hands Helmet its own directive block. Extend it
|
|
200
|
+
* through `csp` instead.
|
|
201
|
+
*/
|
|
202
|
+
helmet?: HelmetOptions & {
|
|
203
|
+
contentSecurityPolicy?: never;
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Build the shared Oxy security-headers middleware: Helmet with the Oxy CSP
|
|
208
|
+
* baseline plus this app's extensions.
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```ts
|
|
212
|
+
* app.use(createOxySecurityHeaders({
|
|
213
|
+
* csp: {
|
|
214
|
+
* connectSrc: ['https://api.example.com', 'wss://api.example.com'],
|
|
215
|
+
* frameSrc: ['https://player.vimeo.com'],
|
|
216
|
+
* },
|
|
217
|
+
* helmet: { crossOriginResourcePolicy: { policy: 'cross-origin' } },
|
|
218
|
+
* }));
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
export declare function createOxySecurityHeaders(options?: OxySecurityHeadersOptions): RequestHandler;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oxy user-invalidation publish/consume helpers for Oxy backends.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* Every Oxy backend caches Oxy identity, and none of them find out when it
|
|
7
|
+
* changes. The `OxyServices` GET response cache holds `GET /users/:id` and
|
|
8
|
+
* `GET /profiles/username/:name` for five minutes; it is swept when THIS process
|
|
9
|
+
* writes the profile (the `evictOxyIdentityCache` calls in the user and accounts
|
|
10
|
+
* mixins) and never when somebody else does — which is the normal case, since
|
|
11
|
+
* profiles are edited in Oxy's own apps. So an avatar or display-name change is
|
|
12
|
+
* invisible to every consuming backend for up to five minutes, per process.
|
|
13
|
+
*
|
|
14
|
+
* oxy-api broadcasts {@link OXY_USER_INVALIDATION_CHANNEL} on the shared Valkey
|
|
15
|
+
* when a user's identity changes. This module is the consumer half: it parses
|
|
16
|
+
* and validates the event, sweeps the SDK's own cache, and hands the event to
|
|
17
|
+
* app-specific eviction. Wiring it is two lines and every backend that does so
|
|
18
|
+
* stops serving stale identity.
|
|
19
|
+
*
|
|
20
|
+
* WHY THE TRANSPORT IS THE CALLER'S JOB
|
|
21
|
+
* -------------------------------------
|
|
22
|
+
* This module deliberately does NOT take a Redis client. ioredis and node-redis
|
|
23
|
+
* disagree about how to subscribe — node-redis passes the listener to
|
|
24
|
+
* `subscribe(channel, listener)`, ioredis takes `subscribe(channel)` and then
|
|
25
|
+
* emits `'message'` on the client — and a helper that accepted "a client" would
|
|
26
|
+
* have to sniff which library it was handed. That kind of detection is exactly
|
|
27
|
+
* what breaks silently when a consumer upgrades a client library.
|
|
28
|
+
*
|
|
29
|
+
* So the split is: this module owns parsing, validation, dispatch and the
|
|
30
|
+
* never-throw guarantee (the parts that are easy to get wrong and identical
|
|
31
|
+
* everywhere), and the caller owns its own client's two-line subscribe idiom
|
|
32
|
+
* (trivial, but library-specific).
|
|
33
|
+
*
|
|
34
|
+
* // node-redis
|
|
35
|
+
* await subscriber.subscribe(
|
|
36
|
+
* OXY_USER_INVALIDATION_CHANNEL,
|
|
37
|
+
* createOxyUserInvalidationHandler({ oxy: oxyClient }),
|
|
38
|
+
* );
|
|
39
|
+
*
|
|
40
|
+
* // ioredis
|
|
41
|
+
* const handle = createOxyUserInvalidationHandler({ oxy: oxyClient });
|
|
42
|
+
* await subscriber.subscribe(OXY_USER_INVALIDATION_CHANNEL);
|
|
43
|
+
* subscriber.on('message', (_channel, raw) => handle(raw));
|
|
44
|
+
*
|
|
45
|
+
* Subscribe on EVERY task, not just an elected leader. The SDK cache this sweeps
|
|
46
|
+
* is per-process in-memory, so a leader-only subscriber would leave every other
|
|
47
|
+
* task stale — and leader-gating would add a failure mode (leader down means no
|
|
48
|
+
* invalidation anywhere) to a signal whose whole point is that losing it is
|
|
49
|
+
* merely slow, never wrong.
|
|
50
|
+
*
|
|
51
|
+
* Node-only; exported solely from `@oxy.so/core/server`.
|
|
52
|
+
*/
|
|
53
|
+
import { type OxyUserChangeReason, type OxyUserInvalidationEvent } from '@oxy.so/contracts';
|
|
54
|
+
import { type OxyIdentityCacheEvictor } from '../utils/identityCacheSweep';
|
|
55
|
+
/**
|
|
56
|
+
* The publish surface of a Redis client. Both `ioredis` and `node-redis`
|
|
57
|
+
* satisfy this structurally, so neither library is a dependency here.
|
|
58
|
+
*/
|
|
59
|
+
export interface OxyInvalidationPublisher {
|
|
60
|
+
publish(channel: string, message: string): unknown;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Broadcast that an Oxy user's record changed.
|
|
64
|
+
*
|
|
65
|
+
* Returns `true` when a message was put on the wire and `false` when the reason
|
|
66
|
+
* is not a broadcast one ({@link isPublishedOxyUserChangeReason}) — the latter is
|
|
67
|
+
* a deliberate no-op, not a failure. Suppressing at the publisher rather than
|
|
68
|
+
* letting every subscriber discard matters at bulk-follow scale, where a single
|
|
69
|
+
* call moves up to 200 edges.
|
|
70
|
+
*
|
|
71
|
+
* NEVER THROWS AND NEVER RETURNS A REJECTED PROMISE. This is called from inside
|
|
72
|
+
* cache invalidation, which itself runs after a successful database write on the
|
|
73
|
+
* request path: a publish failure must not turn a completed profile update into
|
|
74
|
+
* a 500. A dropped message costs a consumer its TTL and nothing more.
|
|
75
|
+
*
|
|
76
|
+
* @param publisher - A connected Redis client. Must NOT be a client currently in
|
|
77
|
+
* subscriber mode — Redis forbids `PUBLISH` on a subscribed
|
|
78
|
+
* connection, so pass the publisher half of a pub/sub pair.
|
|
79
|
+
* @param userId - The Oxy user whose record changed.
|
|
80
|
+
* @param reason - How the record changed. See {@link OxyUserChangeReason}.
|
|
81
|
+
* @param onError - Optional diagnostic sink for a failed publish.
|
|
82
|
+
*/
|
|
83
|
+
export declare function publishOxyUserInvalidation(publisher: OxyInvalidationPublisher, userId: string, reason: OxyUserChangeReason, onError?: (error: unknown) => void): boolean;
|
|
84
|
+
/** Options for {@link createOxyUserInvalidationHandler}. */
|
|
85
|
+
export interface OxyUserInvalidationHandlerOptions {
|
|
86
|
+
/**
|
|
87
|
+
* The backend's `OxyServices` instance. When supplied, its GET response cache
|
|
88
|
+
* is swept for the invalidated user — this is the whole reason a backend that
|
|
89
|
+
* has no cache of its own still benefits from subscribing.
|
|
90
|
+
*/
|
|
91
|
+
oxy?: OxyIdentityCacheEvictor;
|
|
92
|
+
/**
|
|
93
|
+
* App-specific eviction (e.g. a Redis identity cache the app maintains itself).
|
|
94
|
+
* May be async; a rejection is routed to `onError` and never escapes.
|
|
95
|
+
*/
|
|
96
|
+
onInvalidate?: (event: OxyUserInvalidationEvent) => void | Promise<void>;
|
|
97
|
+
/** Diagnostic sink for an unparseable message or a failing `onInvalidate`. */
|
|
98
|
+
onError?: (error: unknown, raw: string) => void;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Build the message handler for {@link OXY_USER_INVALIDATION_CHANNEL}.
|
|
102
|
+
*
|
|
103
|
+
* The returned function NEVER THROWS and never returns a rejected promise. It
|
|
104
|
+
* runs inside the Redis client's message dispatch, where an exception either
|
|
105
|
+
* takes down the subscriber connection or surfaces as an unhandled rejection —
|
|
106
|
+
* and losing the subscription is strictly worse than losing one message, because
|
|
107
|
+
* it is silent and permanent.
|
|
108
|
+
*
|
|
109
|
+
* A message that fails schema validation is dropped, not retried: the payload is
|
|
110
|
+
* produced by a contract both sides compile against, so a malformed one means a
|
|
111
|
+
* version skew or an unrelated publisher on the channel, neither of which a retry
|
|
112
|
+
* fixes.
|
|
113
|
+
*/
|
|
114
|
+
export declare function createOxyUserInvalidationHandler(options?: OxyUserInvalidationHandlerOptions): (raw: string) => void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constant-time secret comparison for Oxy backends.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* Backends kept comparing secrets with `provided !== EXPECTED`. A plain `===`/
|
|
7
|
+
* `!==` short-circuits on the first differing byte, leaking timing information
|
|
8
|
+
* an attacker can use to recover a secret byte-by-byte. This helper performs a
|
|
9
|
+
* constant-time comparison via `crypto.timingSafeEqual`, guarded by a length
|
|
10
|
+
* check, and never throws — replacing the `token !== SECRET` pattern (Alia
|
|
11
|
+
* docker-host / integrations webhook secrets, internal webhook bearers, etc.).
|
|
12
|
+
*
|
|
13
|
+
* Node-only (`node:crypto`); exported solely from `@oxy.so/core/server`.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Compare two secrets in constant time.
|
|
17
|
+
*
|
|
18
|
+
* Returns `true` iff both are non-empty strings of equal byte length with
|
|
19
|
+
* identical contents. Returns `false` — without throwing — when either value is
|
|
20
|
+
* not a string, when lengths differ, or when contents differ.
|
|
21
|
+
*
|
|
22
|
+
* The length-equality guard is required because `crypto.timingSafeEqual` throws
|
|
23
|
+
* on unequal-length buffers; comparing lengths first leaks only the LENGTH of
|
|
24
|
+
* the expected secret (already low-value / often public), never its bytes.
|
|
25
|
+
*
|
|
26
|
+
* @param provided - The untrusted, caller-supplied value (e.g. a request token).
|
|
27
|
+
* @param expected - The trusted secret to compare against.
|
|
28
|
+
*/
|
|
29
|
+
export declare function verifySecret(provided: string, expected: string): boolean;
|