@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,478 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OxyServices Base Class
|
|
3
|
+
*
|
|
4
|
+
* Contains core infrastructure, HTTP client, request management, and error handling
|
|
5
|
+
*/
|
|
6
|
+
import { jwtDecode } from 'jwt-decode';
|
|
7
|
+
import type { OxyConfig as OxyConfigBase, ApiError, User } from './models/interfaces';
|
|
8
|
+
import { handleHttpError } from './utils/errorUtils';
|
|
9
|
+
import { HttpService, type AuthRefreshReason, type RequestOptions } from './HttpService';
|
|
10
|
+
import { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';
|
|
11
|
+
|
|
12
|
+
export interface OxyConfig extends OxyConfigBase {
|
|
13
|
+
cloudURL?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface LinkedHttpClient {
|
|
17
|
+
client: HttpService;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface JwtPayload {
|
|
22
|
+
exp?: number;
|
|
23
|
+
userId?: string;
|
|
24
|
+
id?: string;
|
|
25
|
+
sessionId?: string;
|
|
26
|
+
[key: string]: any;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Base class for OxyServices with core infrastructure
|
|
31
|
+
*/
|
|
32
|
+
export class OxyServicesBase {
|
|
33
|
+
public httpService: HttpService;
|
|
34
|
+
public cloudURL: string;
|
|
35
|
+
public config: OxyConfig;
|
|
36
|
+
|
|
37
|
+
constructor(...args: any[]) {
|
|
38
|
+
const config = args[0] as OxyConfig;
|
|
39
|
+
if (!config || typeof config !== 'object') {
|
|
40
|
+
throw new Error('OxyConfig is required');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// `authWebUrl` is a plain optional config value now (used only for building
|
|
44
|
+
// third-party "Sign in with Oxy" OAuth links). The SDK no longer derives or
|
|
45
|
+
// defaults an IdP host — the device-first cold boot restores sessions from
|
|
46
|
+
// the persisted refresh store, not an `auth.<apex>` bounce.
|
|
47
|
+
this.config = config;
|
|
48
|
+
this.cloudURL = config.cloudURL || 'https://cloud.oxy.so';
|
|
49
|
+
|
|
50
|
+
// Initialize unified HTTP service (handles auth, caching, deduplication, queuing, retry)
|
|
51
|
+
this.httpService = new HttpService(config);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Test-only utility to reset tokens on this instance between jest tests
|
|
55
|
+
// Note: tokens are now per-instance, so create new instances in tests for isolation
|
|
56
|
+
__resetTokensForTests(): void {
|
|
57
|
+
this.httpService.__resetTokensForTests();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Make a request with all performance optimizations
|
|
62
|
+
* This is the main method for all API calls - ensures authentication and performance features
|
|
63
|
+
*/
|
|
64
|
+
public async makeRequest<T>(
|
|
65
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
|
|
66
|
+
url: string,
|
|
67
|
+
data?: any,
|
|
68
|
+
options: RequestOptions = {}
|
|
69
|
+
): Promise<T> {
|
|
70
|
+
return this.httpService.request<T>({
|
|
71
|
+
method,
|
|
72
|
+
url,
|
|
73
|
+
data: method !== 'GET' ? data : undefined,
|
|
74
|
+
params: method === 'GET' ? data : undefined,
|
|
75
|
+
...options,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// CORE METHODS (HTTP Client, Token Management, Error Handling)
|
|
81
|
+
// ============================================================================
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get the configured Oxy API base URL
|
|
85
|
+
*/
|
|
86
|
+
public getBaseURL(): string {
|
|
87
|
+
return this.httpService.getBaseURL();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get the HTTP service instance
|
|
92
|
+
* Useful for advanced use cases where direct access to the HTTP service is needed
|
|
93
|
+
*/
|
|
94
|
+
public getClient(): HttpService {
|
|
95
|
+
return this.httpService;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Create an app/backend HTTP client linked to this Oxy session.
|
|
100
|
+
*
|
|
101
|
+
* Use this when an app has its own API origin (for example
|
|
102
|
+
* `https://api.syra.fm`) but authentication is owned by the canonical
|
|
103
|
+
* OxyServices instance mounted in OxyProvider. The returned client has its own
|
|
104
|
+
* base URL, cache and request queue, but its bearer token is kept in lockstep
|
|
105
|
+
* with this session and its 401 refresh path delegates back to this session.
|
|
106
|
+
*
|
|
107
|
+
* **GET response caching is OFF by default for linked clients.** The SDK's
|
|
108
|
+
* per-instance GET cache is only safe where the SDK OWNS invalidation: on the
|
|
109
|
+
* canonical OxyServices client, every mutation (`updateProfile`, `followUser`,
|
|
110
|
+
* `blockUser`, …) busts the matching cached GET. A linked client targets the
|
|
111
|
+
* consuming app's OWN backend (`api.mention.earth`, `api.syra.fm`, …), whose
|
|
112
|
+
* resources and write endpoints the SDK has no knowledge of — so it cannot
|
|
113
|
+
* invalidate them, and a cached GET there would silently serve stale data
|
|
114
|
+
* after the app mutates its own data. Caching is therefore unsafe-by-construction
|
|
115
|
+
* here and is left to the consumer's own layer (React Query / stores), which
|
|
116
|
+
* owns its invalidation. Pass `createLinkedClient({ baseURL, enableCache: true })`
|
|
117
|
+
* to explicitly opt back in when the consumer accepts that responsibility.
|
|
118
|
+
*/
|
|
119
|
+
public createLinkedClient(config: OxyConfig): LinkedHttpClient {
|
|
120
|
+
// Default the GET cache OFF unless the caller explicitly opts in (see the
|
|
121
|
+
// method doc): the SDK cannot invalidate the consumer backend's resources.
|
|
122
|
+
const client = new HttpService({ ...config, enableCache: config.enableCache ?? false });
|
|
123
|
+
|
|
124
|
+
const syncToken = (accessToken: string | null): void => {
|
|
125
|
+
const currentAccessToken = client.getAccessToken();
|
|
126
|
+
if (accessToken) {
|
|
127
|
+
if (currentAccessToken !== accessToken) {
|
|
128
|
+
client.setTokens(accessToken);
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (currentAccessToken) {
|
|
134
|
+
client.clearTokens();
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
syncToken(this.getAccessToken());
|
|
139
|
+
const unsubscribe = this.onTokensChanged(syncToken);
|
|
140
|
+
client.setAccessTokenProvider(() => this.getAccessToken());
|
|
141
|
+
client.setAuthRefreshHandler(async (reason: AuthRefreshReason) => {
|
|
142
|
+
const refreshed = await this.httpService.refreshAccessToken(reason);
|
|
143
|
+
if (!refreshed) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
syncToken(refreshed);
|
|
148
|
+
return refreshed;
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
client,
|
|
153
|
+
dispose: () => {
|
|
154
|
+
unsubscribe();
|
|
155
|
+
client.setAuthRefreshHandler(null);
|
|
156
|
+
client.setAccessTokenProvider(null);
|
|
157
|
+
client.clearTokens();
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get performance metrics
|
|
164
|
+
*/
|
|
165
|
+
public getMetrics() {
|
|
166
|
+
return this.httpService.getMetrics();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Clear request cache
|
|
171
|
+
*/
|
|
172
|
+
public clearCache(): void {
|
|
173
|
+
this.httpService.clearCache();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Clear specific cache entry
|
|
178
|
+
*/
|
|
179
|
+
public clearCacheEntry(key: string): void {
|
|
180
|
+
this.httpService.clearCacheEntry(key);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Clear every cache entry whose key starts with `prefix`.
|
|
185
|
+
* Useful for mutations that invalidate a family of GET responses
|
|
186
|
+
* without enumerating each one (e.g. all session-user lookups after
|
|
187
|
+
* a profile update).
|
|
188
|
+
*/
|
|
189
|
+
public clearCacheByPrefix(prefix: string): number {
|
|
190
|
+
return this.httpService.clearCacheByPrefix(prefix);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get cache statistics
|
|
195
|
+
*/
|
|
196
|
+
public getCacheStats() {
|
|
197
|
+
return this.httpService.getCacheStats();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Get the configured Oxy Cloud (file storage/CDN) URL
|
|
202
|
+
*/
|
|
203
|
+
public getCloudURL(): string {
|
|
204
|
+
return this.cloudURL;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Set authentication tokens
|
|
209
|
+
*/
|
|
210
|
+
public setTokens(accessToken: string): void {
|
|
211
|
+
this.httpService.setTokens(accessToken);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Clear stored authentication tokens
|
|
216
|
+
*/
|
|
217
|
+
public clearTokens(): void {
|
|
218
|
+
this.httpService.clearTokens();
|
|
219
|
+
this._cachedUserId = undefined;
|
|
220
|
+
this._cachedAccessToken = null;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Subscribe to access-token changes on this client.
|
|
225
|
+
*
|
|
226
|
+
* The listener fires on every access-token mutation — explicit
|
|
227
|
+
* `setTokens`/`clearTokens`, a successful silent refresh, and the internal
|
|
228
|
+
* 401-driven clear — receiving the resulting token, or `null` when cleared.
|
|
229
|
+
* Returns an unsubscribe function.
|
|
230
|
+
*
|
|
231
|
+
* Primary use: keeping an external token sink (e.g. the shared `oxyClient`
|
|
232
|
+
* singleton) in lockstep with whichever `OxyServices` instance actually owns
|
|
233
|
+
* the session, so imperative consumers reading the singleton always observe
|
|
234
|
+
* the live token regardless of the code path that changed it.
|
|
235
|
+
*/
|
|
236
|
+
public onTokensChanged(listener: (accessToken: string | null) => void): () => void {
|
|
237
|
+
return this.httpService.addTokenChangeListener(listener);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** @internal */ _cachedUserId: string | null | undefined = undefined;
|
|
241
|
+
/** @internal */ _cachedAccessToken: string | null = null;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Get the current user ID from the access token.
|
|
245
|
+
* Caches the decoded value and invalidates when the token changes.
|
|
246
|
+
*/
|
|
247
|
+
public getCurrentUserId(): string | null {
|
|
248
|
+
const accessToken = this.httpService.getAccessToken();
|
|
249
|
+
|
|
250
|
+
// Return cached value if token hasn't changed
|
|
251
|
+
if (accessToken === this._cachedAccessToken && this._cachedUserId !== undefined) {
|
|
252
|
+
return this._cachedUserId;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
this._cachedAccessToken = accessToken;
|
|
256
|
+
|
|
257
|
+
if (!accessToken) {
|
|
258
|
+
this._cachedUserId = null;
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
try {
|
|
263
|
+
const decoded = jwtDecode<JwtPayload>(accessToken);
|
|
264
|
+
const userId = decoded.userId || decoded.id || null;
|
|
265
|
+
this._cachedUserId = userId;
|
|
266
|
+
return userId;
|
|
267
|
+
} catch {
|
|
268
|
+
this._cachedUserId = null;
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Check if the client has a valid access token (public method)
|
|
275
|
+
*/
|
|
276
|
+
public hasValidToken(): boolean {
|
|
277
|
+
return this.httpService.hasAccessToken();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get the raw access token (for constructing anchor URLs when needed)
|
|
282
|
+
*/
|
|
283
|
+
public getAccessToken(): string | null {
|
|
284
|
+
return this.httpService.getAccessToken();
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Decode the current access token and return its `exp` claim in SECONDS since
|
|
289
|
+
* the Unix epoch (the raw JWT `exp` unit), or `null` when there is no token,
|
|
290
|
+
* the token is opaque/undecodable, or it carries no numeric `exp`.
|
|
291
|
+
*
|
|
292
|
+
* Exposed so `@oxy.so/services` can schedule a PROACTIVE in-session refresh a
|
|
293
|
+
* fixed lead before expiry without re-importing a JWT decoder (and without
|
|
294
|
+
* duplicating the `jwt-decode` dependency in the RN bundle). HttpService keeps
|
|
295
|
+
* the per-request preflight refresh; this powers the idle/background timer.
|
|
296
|
+
*/
|
|
297
|
+
public getAccessTokenExpiry(): number | null {
|
|
298
|
+
const token = this.httpService.getAccessToken();
|
|
299
|
+
if (!token) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
const decoded = jwtDecode<JwtPayload>(token);
|
|
304
|
+
return typeof decoded.exp === 'number' ? decoded.exp : null;
|
|
305
|
+
} catch {
|
|
306
|
+
// A malformed / non-JWT token has no usable expiry — fall back to the
|
|
307
|
+
// reactive 401 refresh path instead of a scheduled one.
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Wait for authentication to be ready
|
|
314
|
+
*
|
|
315
|
+
* Optimized for high-scale usage with immediate synchronous check and adaptive polling.
|
|
316
|
+
* Returns immediately if token is already available (0ms delay), otherwise uses
|
|
317
|
+
* adaptive polling that starts fast (50ms) and gradually increases to reduce CPU usage.
|
|
318
|
+
*
|
|
319
|
+
* @param timeoutMs Maximum time to wait in milliseconds (default: 5000ms)
|
|
320
|
+
* @returns Promise that resolves to true if authentication is ready, false if timeout
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```typescript
|
|
324
|
+
* const isReady = await oxyServices.waitForAuth(3000);
|
|
325
|
+
* if (isReady) {
|
|
326
|
+
* // Proceed with authenticated operations
|
|
327
|
+
* }
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
public async waitForAuth(timeoutMs = 5000): Promise<boolean> {
|
|
331
|
+
// Immediate synchronous check - no delay if token is ready
|
|
332
|
+
if (this.httpService.hasAccessToken()) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const startTime = performance.now();
|
|
337
|
+
const maxTime = startTime + timeoutMs;
|
|
338
|
+
|
|
339
|
+
// Adaptive polling: start fast, then slow down to reduce CPU usage
|
|
340
|
+
let pollInterval = 50; // Start with 50ms
|
|
341
|
+
|
|
342
|
+
while (performance.now() < maxTime) {
|
|
343
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
344
|
+
|
|
345
|
+
if (this.httpService.hasAccessToken()) {
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Increase interval after first few checks (adaptive polling)
|
|
350
|
+
// This reduces CPU usage for long waits while maintaining responsiveness
|
|
351
|
+
if (pollInterval < 200) {
|
|
352
|
+
pollInterval = Math.min(pollInterval * 1.5, 200);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Execute a function with automatic authentication retry logic
|
|
361
|
+
* This handles the common case where API calls are made before authentication completes
|
|
362
|
+
*/
|
|
363
|
+
public async withAuthRetry<T>(
|
|
364
|
+
operation: () => Promise<T>,
|
|
365
|
+
operationName: string,
|
|
366
|
+
options: {
|
|
367
|
+
maxRetries?: number;
|
|
368
|
+
retryDelay?: number;
|
|
369
|
+
authTimeoutMs?: number;
|
|
370
|
+
} = {}
|
|
371
|
+
): Promise<T> {
|
|
372
|
+
const {
|
|
373
|
+
maxRetries = 2,
|
|
374
|
+
retryDelay = 1000,
|
|
375
|
+
authTimeoutMs = 5000
|
|
376
|
+
} = options;
|
|
377
|
+
|
|
378
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
379
|
+
try {
|
|
380
|
+
// First attempt: check if we have a token
|
|
381
|
+
if (!this.httpService.hasAccessToken()) {
|
|
382
|
+
if (attempt === 0) {
|
|
383
|
+
// On first attempt, wait briefly for authentication to complete
|
|
384
|
+
const authReady = await this.waitForAuth(authTimeoutMs);
|
|
385
|
+
|
|
386
|
+
if (!authReady) {
|
|
387
|
+
throw new OxyAuthenticationTimeoutError(operationName, authTimeoutMs);
|
|
388
|
+
}
|
|
389
|
+
} else {
|
|
390
|
+
// On retry attempts, fail immediately if no token
|
|
391
|
+
throw new OxyAuthenticationError(
|
|
392
|
+
`Authentication required: ${operationName} requires a valid access token.`,
|
|
393
|
+
'AUTH_REQUIRED'
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Execute the operation
|
|
399
|
+
return await operation();
|
|
400
|
+
|
|
401
|
+
} catch (error: unknown) {
|
|
402
|
+
const isLastAttempt = attempt === maxRetries;
|
|
403
|
+
const errorObj = error && typeof error === 'object' ? error as { response?: { status?: number }; code?: string; message?: string } : null;
|
|
404
|
+
const isAuthError = errorObj?.response?.status === 401 ||
|
|
405
|
+
errorObj?.code === 'MISSING_TOKEN' ||
|
|
406
|
+
errorObj?.message?.includes('Authentication') ||
|
|
407
|
+
error instanceof OxyAuthenticationError;
|
|
408
|
+
|
|
409
|
+
if (isAuthError && !isLastAttempt && !(error instanceof OxyAuthenticationTimeoutError)) {
|
|
410
|
+
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// If it's not an auth error, or it's the last attempt, throw the error
|
|
415
|
+
if (error instanceof OxyAuthenticationError) {
|
|
416
|
+
throw error;
|
|
417
|
+
}
|
|
418
|
+
throw this.handleError(error);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// This should never be reached, but TypeScript requires it
|
|
423
|
+
throw new OxyAuthenticationError(`${operationName} failed after ${maxRetries + 1} attempts`);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Validate the current access token with the server
|
|
428
|
+
*/
|
|
429
|
+
async validate(): Promise<boolean> {
|
|
430
|
+
if (!this.hasValidToken()) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
try {
|
|
435
|
+
const res = await this.makeRequest<{ valid: boolean }>('GET', '/auth/validate', undefined, {
|
|
436
|
+
cache: false,
|
|
437
|
+
retry: false,
|
|
438
|
+
});
|
|
439
|
+
return res.valid === true;
|
|
440
|
+
} catch (error) {
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Centralized error handling
|
|
447
|
+
*/
|
|
448
|
+
public handleError(error: unknown): Error {
|
|
449
|
+
const api = handleHttpError(error);
|
|
450
|
+
// Ensure we always have a non-empty message
|
|
451
|
+
const message = api.message?.trim() || 'An unexpected error occurred';
|
|
452
|
+
const err = new Error(message) as Error & { code?: string; status?: number; details?: Record<string, unknown> };
|
|
453
|
+
err.code = api.code;
|
|
454
|
+
err.status = api.status;
|
|
455
|
+
err.details = api.details;
|
|
456
|
+
return err;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Health check endpoint
|
|
461
|
+
*/
|
|
462
|
+
async healthCheck(): Promise<{
|
|
463
|
+
status: string;
|
|
464
|
+
users?: number;
|
|
465
|
+
timestamp?: string;
|
|
466
|
+
[key: string]: any
|
|
467
|
+
}> {
|
|
468
|
+
try {
|
|
469
|
+
return await this.makeRequest('GET', '/health', undefined, {
|
|
470
|
+
cache: false,
|
|
471
|
+
retry: false,
|
|
472
|
+
timeout: 5000
|
|
473
|
+
});
|
|
474
|
+
} catch (error) {
|
|
475
|
+
throw this.handleError(error);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error types for better error handling
|
|
3
|
+
*/
|
|
4
|
+
export class OxyAuthenticationError extends Error {
|
|
5
|
+
public readonly code: string;
|
|
6
|
+
public readonly status: number;
|
|
7
|
+
|
|
8
|
+
constructor(message: string, code = 'AUTH_ERROR', status = 401) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'OxyAuthenticationError';
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.status = status;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Thrown when an asset's authorized download URL cannot be resolved.
|
|
18
|
+
*
|
|
19
|
+
* `getFileDownloadUrlAsync` asks the API for a URL that is valid for the
|
|
20
|
+
* CALLER and the asset's actual visibility. When that resolution fails there is
|
|
21
|
+
* no honest fallback: the public CDN origin only serves `public` assets, so
|
|
22
|
+
* handing back `https://cloud.oxy.so/<id>` for an unresolved asset produces a
|
|
23
|
+
* hard 404 at render time and hides the real failure from the caller. This
|
|
24
|
+
* error surfaces the failure instead.
|
|
25
|
+
*
|
|
26
|
+
* The message and fields deliberately carry only the asset id, the requested
|
|
27
|
+
* variant and the HTTP status — never the resolved URL, which embeds a scoped
|
|
28
|
+
* media token.
|
|
29
|
+
*
|
|
30
|
+
* ## `status` lets a caller decide whether a CDN fallback is safe
|
|
31
|
+
*
|
|
32
|
+
* Core itself never falls back to the public CDN builder, because it has no
|
|
33
|
+
* knowledge of the asset's visibility and that URL is a guaranteed 404 for a
|
|
34
|
+
* private asset. A CALLER that knows an asset is public MAY choose to fall back
|
|
35
|
+
* to `getFileDownloadUrl(id, variant)` — but only for a TRANSIENT failure, not
|
|
36
|
+
* a definitive denial:
|
|
37
|
+
* - `status` 401/403/404 → definitive: the asset is private/denied/missing.
|
|
38
|
+
* Never CDN-fall-back — it will 404.
|
|
39
|
+
* - `status` undefined (network error) or 5xx → transient: resolution itself
|
|
40
|
+
* failed. If the caller independently knows the asset is public, a CDN
|
|
41
|
+
* fallback is defensible best-effort.
|
|
42
|
+
*/
|
|
43
|
+
export class AssetUrlResolutionError extends Error {
|
|
44
|
+
public readonly code = 'ASSET_URL_UNRESOLVED';
|
|
45
|
+
public readonly fileId: string;
|
|
46
|
+
public readonly variant?: string;
|
|
47
|
+
public readonly status?: number;
|
|
48
|
+
/**
|
|
49
|
+
* The underlying transport/API failure, when there was one. Declared on the
|
|
50
|
+
* class rather than relying on `Error.cause` because this package targets
|
|
51
|
+
* ES2020, where `cause` is not part of the `Error` type.
|
|
52
|
+
*/
|
|
53
|
+
public readonly cause?: unknown;
|
|
54
|
+
|
|
55
|
+
constructor(fileId: string, variant: string | undefined, status: number | undefined, cause?: unknown) {
|
|
56
|
+
const variantSuffix = variant ? ` (variant "${variant}")` : '';
|
|
57
|
+
const statusSuffix = typeof status === 'number' ? ` — status ${status}` : '';
|
|
58
|
+
super(`Could not resolve a download URL for asset "${fileId}"${variantSuffix}${statusSuffix}`);
|
|
59
|
+
this.name = 'AssetUrlResolutionError';
|
|
60
|
+
this.fileId = fileId;
|
|
61
|
+
this.variant = variant;
|
|
62
|
+
this.status = status;
|
|
63
|
+
this.cause = cause;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Thrown when one or more chunks of `getServiceAssetMetadataByIds` could not be
|
|
69
|
+
* resolved.
|
|
70
|
+
*
|
|
71
|
+
* Exists because for this endpoint a FAILED request and an ABSENT asset produce
|
|
72
|
+
* the same observable result. The server legitimately omits unknown/deleted ids,
|
|
73
|
+
* so callers are documented to map the response by `id` and treat a missing
|
|
74
|
+
* entry as "no such asset" — which means a chunk that 429s, times out or 5xxs
|
|
75
|
+
* reads as authoritative absence unless it is raised.
|
|
76
|
+
*
|
|
77
|
+
* That was not hypothetical: a metadata backfill counted every throttled asset
|
|
78
|
+
* as needing no update and exited 0, and the MTN signed-record builder embedded
|
|
79
|
+
* media with no content hash into records that are immutable once signed. Both
|
|
80
|
+
* paths reported success and wrote nothing.
|
|
81
|
+
*
|
|
82
|
+
* `unresolvedIds` carries every id in a failed chunk — not the subset the server
|
|
83
|
+
* would have omitted anyway, which is unknowable when the request never landed.
|
|
84
|
+
* A caller that wants best-effort passes `{ partial: true }` and never sees this.
|
|
85
|
+
*/
|
|
86
|
+
export class ServiceAssetMetadataError extends Error {
|
|
87
|
+
public readonly code = 'SERVICE_ASSET_METADATA_UNRESOLVED';
|
|
88
|
+
/** Every id belonging to a chunk whose request failed. */
|
|
89
|
+
public readonly unresolvedIds: string[];
|
|
90
|
+
/** HTTP statuses observed across the failed chunks (deduped, ascending). */
|
|
91
|
+
public readonly statuses: number[];
|
|
92
|
+
/**
|
|
93
|
+
* The first underlying transport/API failure. Declared on the class rather
|
|
94
|
+
* than relying on `Error.cause` because this package targets ES2020, where
|
|
95
|
+
* `cause` is not part of the `Error` type.
|
|
96
|
+
*/
|
|
97
|
+
public readonly cause?: unknown;
|
|
98
|
+
|
|
99
|
+
constructor(unresolvedIds: string[], statuses: number[], cause?: unknown) {
|
|
100
|
+
const uniqueStatuses = Array.from(new Set(statuses)).sort((a, b) => a - b);
|
|
101
|
+
const statusSuffix = uniqueStatuses.length > 0 ? ` — status ${uniqueStatuses.join(', ')}` : '';
|
|
102
|
+
super(
|
|
103
|
+
`Could not resolve asset metadata for ${unresolvedIds.length} id(s)${statusSuffix}. Treat this as unknown, not as absent; pass { partial: true } for best-effort.`,
|
|
104
|
+
);
|
|
105
|
+
this.name = 'ServiceAssetMetadataError';
|
|
106
|
+
this.unresolvedIds = unresolvedIds;
|
|
107
|
+
this.statuses = uniqueStatuses;
|
|
108
|
+
this.cause = cause;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
|
|
113
|
+
constructor(operationName: string, timeoutMs: number) {
|
|
114
|
+
super(
|
|
115
|
+
`Authentication timeout (${timeoutMs}ms): ${operationName} requires user authentication. Please ensure the user is logged in before calling this method.`,
|
|
116
|
+
'AUTH_TIMEOUT',
|
|
117
|
+
408
|
|
118
|
+
);
|
|
119
|
+
this.name = 'OxyAuthenticationTimeoutError';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|