@oxy.so/core 1.18.0 → 3.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/README.md +13 -7
- package/dist/cjs/HttpService.js +189 -112
- package/dist/cjs/OxyServices.errors.js +48 -1
- package/dist/cjs/OxyServices.js +263 -60
- package/dist/cjs/api/accounts.js +231 -0
- package/dist/cjs/api/agency.js +102 -0
- package/dist/cjs/api/appData.js +45 -0
- package/dist/cjs/api/apps.js +197 -0
- package/dist/cjs/api/assets.js +329 -0
- package/dist/cjs/api/auth.js +900 -0
- package/dist/cjs/api/billing.js +44 -0
- package/dist/cjs/api/civic.js +289 -0
- package/dist/cjs/api/contacts.js +16 -0
- package/dist/cjs/api/devices.js +351 -0
- package/dist/cjs/api/follows.js +240 -0
- package/dist/cjs/api/identity.js +569 -0
- package/dist/cjs/api/linkedAccounts.js +48 -0
- package/dist/cjs/api/nodes.js +75 -0
- package/dist/cjs/api/notifications.js +75 -0
- package/dist/cjs/api/privacy.js +105 -0
- package/dist/cjs/api/reputation.js +74 -0
- package/dist/cjs/api/session.js +177 -0
- package/dist/cjs/api/store.js +199 -0
- package/dist/cjs/api/topics.js +66 -0
- package/dist/cjs/api/users.js +309 -0
- package/dist/cjs/boot/sessionColdBoot.js +4 -4
- package/dist/cjs/civic/index.js +16 -0
- package/dist/cjs/civic/payloads.js +156 -0
- package/dist/cjs/client/context.js +2 -0
- package/dist/cjs/crypto/identityLink.js +5 -5
- package/dist/cjs/crypto/index.js +44 -0
- package/dist/cjs/crypto/internal.js +37 -0
- package/dist/cjs/crypto/keyManager.js +2 -2
- package/dist/cjs/crypto/polyfill.js +9 -80
- package/dist/cjs/crypto/recoveryPhrase.js +1 -0
- package/dist/cjs/crypto/registrationPow.js +1 -1
- package/dist/cjs/crypto/signatureService.js +1 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
- package/dist/cjs/i18n/accountRoleLabels.js +7 -7
- package/dist/cjs/i18n/index.js +130 -52
- package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
- package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
- package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
- package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
- package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
- package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
- package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
- package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
- package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
- package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
- package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
- package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
- package/dist/cjs/i18n/trustTierLabels.js +2 -2
- package/dist/cjs/index.js +55 -263
- package/dist/cjs/inference/index.js +21 -0
- package/dist/cjs/server/OxyServer.js +521 -0
- package/dist/cjs/server/auth.js +2 -2
- package/dist/cjs/server/index.js +23 -6
- package/dist/cjs/server/middleware.js +1154 -0
- package/dist/cjs/server/namespaces.js +214 -0
- package/dist/cjs/server/rateLimit.js +2 -2
- package/dist/cjs/server/requesterAssertion.js +5 -5
- package/dist/cjs/server/securityHeaders.js +3 -3
- package/dist/cjs/server/traffic.js +7 -6
- package/dist/cjs/server/trafficNodeHttp.js +9 -3
- package/dist/cjs/server/userInvalidation.js +5 -5
- package/dist/cjs/session/accountDialogController.js +23 -23
- package/dist/cjs/session/authStateStore.js +2 -2
- package/dist/cjs/session/identitySession.js +3 -3
- package/dist/cjs/session/index.js +131 -0
- package/dist/cjs/session/refresh.js +37 -30
- package/dist/cjs/session/sessionClientHost.js +5 -5
- package/dist/cjs/session/sharedDeviceCredential.js +3 -2
- package/dist/cjs/shared/utils/networkUtils.js +2 -2
- package/dist/cjs/utils/accountCacheSweep.js +11 -15
- package/dist/cjs/utils/asyncUtils.js +22 -163
- package/dist/cjs/utils/authHelpers.js +2 -2
- package/dist/cjs/utils/authWebUrl.js +3 -4
- package/dist/cjs/utils/avatarUtils.js +2 -2
- package/dist/cjs/utils/cache.js +32 -2
- package/dist/cjs/utils/cacheKey.js +5 -10
- package/dist/cjs/utils/deviceManager.js +17 -16
- package/dist/cjs/utils/edgeRegion.js +2 -3
- package/dist/cjs/utils/identityCacheSweep.js +6 -10
- package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
- package/dist/cjs/utils/requestUtils.js +40 -33
- package/dist/cjs/utils/sessionUtils.js +0 -2
- package/dist/cjs/utils/tokenClaims.js +34 -0
- package/dist/esm/HttpService.js +190 -113
- package/dist/esm/OxyServices.errors.js +45 -0
- package/dist/esm/OxyServices.js +262 -57
- package/dist/esm/api/accounts.js +218 -0
- package/dist/esm/api/agency.js +95 -0
- package/dist/esm/api/appData.js +40 -0
- package/dist/esm/api/apps.js +191 -0
- package/dist/esm/api/assets.js +324 -0
- package/dist/esm/api/auth.js +858 -0
- package/dist/esm/api/billing.js +40 -0
- package/dist/esm/api/civic.js +250 -0
- package/dist/esm/api/contacts.js +12 -0
- package/dist/esm/api/devices.js +346 -0
- package/dist/esm/api/follows.js +236 -0
- package/dist/esm/api/identity.js +527 -0
- package/dist/esm/api/linkedAccounts.js +44 -0
- package/dist/esm/api/nodes.js +71 -0
- package/dist/esm/api/notifications.js +71 -0
- package/dist/esm/api/privacy.js +101 -0
- package/dist/esm/api/reputation.js +70 -0
- package/dist/esm/api/session.js +173 -0
- package/dist/esm/api/store.js +192 -0
- package/dist/esm/api/topics.js +62 -0
- package/dist/esm/api/users.js +272 -0
- package/dist/esm/boot/sessionColdBoot.js +4 -4
- package/dist/esm/civic/index.js +10 -0
- package/dist/esm/civic/payloads.js +118 -0
- package/dist/esm/client/context.js +1 -0
- package/dist/esm/crypto/identityLink.js +5 -5
- package/dist/esm/crypto/index.js +24 -0
- package/dist/esm/crypto/internal.js +19 -0
- package/dist/esm/crypto/keyManager.js +2 -2
- package/dist/esm/crypto/polyfill.js +10 -81
- package/dist/esm/crypto/recoveryPhrase.js +1 -0
- package/dist/esm/crypto/registrationPow.js +1 -1
- package/dist/esm/crypto/signatureService.js +1 -0
- package/dist/esm/i18n/accountCategoryLabels.js +2 -2
- package/dist/esm/i18n/accountRoleLabels.js +1 -1
- package/dist/esm/i18n/index.js +93 -52
- package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
- package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
- package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
- package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
- package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
- package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
- package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
- package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
- package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
- package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
- package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
- package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
- package/dist/esm/i18n/trustTierLabels.js +1 -1
- package/dist/esm/index.js +30 -166
- package/dist/esm/inference/index.js +13 -0
- package/dist/esm/server/OxyServer.js +516 -0
- package/dist/esm/server/auth.js +2 -2
- package/dist/esm/server/index.js +10 -5
- package/dist/esm/server/middleware.js +1147 -0
- package/dist/esm/server/namespaces.js +206 -0
- package/dist/esm/server/rateLimit.js +2 -2
- package/dist/esm/server/requesterAssertion.js +5 -5
- package/dist/esm/server/securityHeaders.js +3 -3
- package/dist/esm/server/traffic.js +7 -6
- package/dist/esm/server/trafficNodeHttp.js +9 -3
- package/dist/esm/server/userInvalidation.js +5 -5
- package/dist/esm/session/accountDialogController.js +23 -23
- package/dist/esm/session/authStateStore.js +2 -2
- package/dist/esm/session/identitySession.js +3 -3
- package/dist/esm/session/index.js +82 -0
- package/dist/esm/session/refresh.js +37 -30
- package/dist/esm/session/sessionClientHost.js +5 -5
- package/dist/esm/session/sharedDeviceCredential.js +3 -2
- package/dist/esm/shared/utils/networkUtils.js +2 -2
- package/dist/esm/utils/accountCacheSweep.js +11 -15
- package/dist/esm/utils/asyncUtils.js +22 -151
- package/dist/esm/utils/authHelpers.js +2 -2
- package/dist/esm/utils/authWebUrl.js +3 -4
- package/dist/esm/utils/avatarUtils.js +2 -2
- package/dist/esm/utils/cache.js +32 -2
- package/dist/esm/utils/cacheKey.js +5 -10
- package/dist/esm/utils/deviceManager.js +17 -16
- package/dist/esm/utils/edgeRegion.js +1 -2
- package/dist/esm/utils/identityCacheSweep.js +6 -10
- package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
- package/dist/esm/utils/requestUtils.js +40 -33
- package/dist/esm/utils/sessionUtils.js +0 -2
- package/dist/esm/utils/tokenClaims.js +31 -0
- package/dist/types/HttpService.d.ts +47 -9
- package/dist/types/OxyServices.d.ts +160 -131
- package/dist/types/OxyServices.errors.d.ts +42 -0
- package/dist/types/api/accounts.d.ts +415 -0
- package/dist/types/api/agency.d.ts +135 -0
- package/dist/types/api/appData.d.ts +27 -0
- package/dist/types/api/apps.d.ts +433 -0
- package/dist/types/api/assets.d.ts +174 -0
- package/dist/types/api/auth.d.ts +766 -0
- package/dist/types/api/billing.d.ts +113 -0
- package/dist/types/api/civic.d.ts +203 -0
- package/dist/types/api/contacts.d.ts +31 -0
- package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
- package/dist/types/api/follows.d.ts +236 -0
- package/dist/types/api/identity.d.ts +275 -0
- package/dist/types/api/linkedAccounts.d.ts +48 -0
- package/dist/types/api/nodes.d.ts +102 -0
- package/dist/types/api/notifications.d.ts +77 -0
- package/dist/types/api/privacy.d.ts +43 -0
- package/dist/types/api/reputation.d.ts +50 -0
- package/dist/types/api/session.d.ts +85 -0
- package/dist/types/api/store.d.ts +278 -0
- package/dist/types/api/topics.d.ts +34 -0
- package/dist/types/api/users.d.ts +134 -0
- package/dist/types/boot/sessionColdBoot.d.ts +1 -1
- package/dist/types/civic/index.d.ts +10 -0
- package/dist/types/civic/payloads.d.ts +83 -0
- package/dist/types/client/context.d.ts +33 -0
- package/dist/types/crypto/identityLink.d.ts +5 -5
- package/dist/types/crypto/index.d.ts +24 -0
- package/dist/types/crypto/internal.d.ts +19 -0
- package/dist/types/crypto/polyfill.d.ts +6 -9
- package/dist/types/crypto/registrationPow.d.ts +1 -1
- package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
- package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
- package/dist/types/i18n/index.d.ts +20 -1
- package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
- package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
- package/dist/types/i18n/locales/de-DE.d.ts +386 -0
- package/dist/types/i18n/locales/en-US.d.ts +2034 -0
- package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
- package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
- package/dist/types/i18n/locales/it-IT.d.ts +386 -0
- package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
- package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
- package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
- package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
- package/dist/types/index.d.ts +46 -95
- package/dist/types/inference/index.d.ts +22 -0
- package/dist/types/models/interfaces.d.ts +1 -1
- package/dist/types/server/OxyServer.d.ts +183 -0
- package/dist/types/server/auth.d.ts +10 -7
- package/dist/types/server/index.d.ts +10 -4
- package/dist/types/server/middleware.d.ts +291 -0
- package/dist/types/server/namespaces.d.ts +98 -0
- package/dist/types/server/rateLimit.d.ts +7 -5
- package/dist/types/server/requesterAssertion.d.ts +14 -11
- package/dist/types/server/securityHeaders.d.ts +4 -5
- package/dist/types/server/userInvalidation.d.ts +10 -8
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/accountDialogController.d.ts +8 -8
- package/dist/types/session/accountSwitchTargets.d.ts +1 -1
- package/dist/types/session/authStateStore.d.ts +7 -6
- package/dist/types/session/index.d.ts +40 -0
- package/dist/types/utils/accountCacheSweep.d.ts +7 -10
- package/dist/types/utils/apiUtils.d.ts +3 -3
- package/dist/types/utils/asyncUtils.d.ts +11 -58
- package/dist/types/utils/authWebUrl.d.ts +3 -4
- package/dist/types/utils/avatarUtils.d.ts +5 -6
- package/dist/types/utils/cache.d.ts +11 -3
- package/dist/types/utils/commonsApproval.d.ts +1 -1
- package/dist/types/utils/edgeRegion.d.ts +1 -2
- package/dist/types/utils/identityCacheSweep.d.ts +6 -4
- package/dist/types/utils/oauthPkce.d.ts +2 -2
- package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
- package/dist/types/utils/requestUtils.d.ts +18 -14
- package/dist/types/utils/tokenClaims.d.ts +9 -0
- package/package.json +68 -7
- package/src/HttpService.ts +201 -132
- package/src/OxyServices.errors.ts +73 -0
- package/src/OxyServices.ts +289 -164
- package/src/api/accounts.ts +579 -0
- package/src/api/agency.ts +277 -0
- package/src/api/appData.ts +63 -0
- package/src/api/apps.ts +596 -0
- package/src/api/assets.ts +416 -0
- package/src/api/auth.ts +1457 -0
- package/src/api/billing.ts +144 -0
- package/src/api/civic.ts +428 -0
- package/src/api/contacts.ts +41 -0
- package/src/api/devices.ts +438 -0
- package/src/api/follows.ts +414 -0
- package/src/api/identity.ts +727 -0
- package/src/api/linkedAccounts.ts +78 -0
- package/src/api/nodes.ts +169 -0
- package/src/api/notifications.ts +135 -0
- package/src/api/privacy.ts +120 -0
- package/src/api/reputation.ts +134 -0
- package/src/api/session.ts +210 -0
- package/src/api/store.ts +435 -0
- package/src/api/topics.ts +83 -0
- package/src/api/users.ts +357 -0
- package/src/boot/sessionColdBoot.ts +4 -4
- package/src/civic/index.ts +12 -0
- package/src/civic/payloads.ts +175 -0
- package/src/client/context.ts +34 -0
- package/src/crypto/identityLink.ts +5 -5
- package/src/crypto/index.ts +39 -0
- package/src/crypto/internal.ts +20 -0
- package/src/crypto/keyManager.ts +2 -2
- package/src/crypto/polyfill.ts +9 -89
- package/src/crypto/recoveryPhrase.ts +1 -0
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +1 -0
- package/src/i18n/accountCategoryLabels.ts +2 -2
- package/src/i18n/accountRoleLabels.ts +2 -2
- package/src/i18n/index.ts +105 -54
- package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
- package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
- package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
- package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
- package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
- package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
- package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
- package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
- package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
- package/src/i18n/reputationCategoryLabels.ts +1 -1
- package/src/i18n/trustTierLabels.ts +1 -1
- package/src/index.ts +170 -501
- package/src/inference/index.ts +48 -0
- package/src/models/interfaces.ts +1 -1
- package/src/server/OxyServer.ts +637 -0
- package/src/server/auth.ts +12 -8
- package/src/server/index.ts +28 -5
- package/src/server/middleware.ts +1520 -0
- package/src/server/namespaces.ts +257 -0
- package/src/server/rateLimit.ts +10 -9
- package/src/server/requesterAssertion.ts +13 -10
- package/src/server/securityHeaders.ts +7 -8
- package/src/server/traffic.ts +6 -6
- package/src/server/trafficNodeHttp.ts +7 -3
- package/src/server/userInvalidation.ts +9 -9
- package/src/session/accountDelegationAccess.ts +1 -1
- package/src/session/accountDialogController.ts +24 -24
- package/src/session/accountSwitchTargets.ts +1 -1
- package/src/session/authStateStore.ts +9 -8
- package/src/session/identitySession.ts +3 -3
- package/src/session/index.ts +210 -0
- package/src/session/refresh.ts +36 -30
- package/src/session/sessionClientHost.ts +5 -5
- package/src/session/sharedDeviceCredential.ts +3 -2
- package/src/shared/utils/networkUtils.ts +2 -2
- package/src/utils/accountCacheSweep.ts +11 -15
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +38 -235
- package/src/utils/authHelpers.ts +2 -2
- package/src/utils/authWebUrl.ts +3 -4
- package/src/utils/avatarUtils.ts +4 -7
- package/src/utils/cache.ts +36 -5
- package/src/utils/cacheKey.ts +5 -9
- package/src/utils/commonsApproval.ts +1 -1
- package/src/utils/deviceManager.ts +17 -16
- package/src/utils/edgeRegion.ts +1 -2
- package/src/utils/identityCacheSweep.ts +7 -12
- package/src/utils/oauthPkce.ts +2 -2
- package/src/utils/oxyServiceEnvironment.ts +3 -7
- package/src/utils/requestUtils.ts +48 -44
- package/src/utils/sessionUtils.ts +0 -2
- package/src/utils/tokenClaims.ts +38 -0
- package/dist/cjs/.tsbuildinfo +0 -1
- package/dist/cjs/OxyServices.base.js +0 -392
- package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
- package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
- package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
- package/dist/cjs/mixins/OxyServices.agency.js +0 -154
- package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
- package/dist/cjs/mixins/OxyServices.appData.js +0 -108
- package/dist/cjs/mixins/OxyServices.assets.js +0 -854
- package/dist/cjs/mixins/OxyServices.auth.js +0 -1440
- package/dist/cjs/mixins/OxyServices.chains.js +0 -73
- package/dist/cjs/mixins/OxyServices.civic.js +0 -611
- package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
- package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
- package/dist/cjs/mixins/OxyServices.devices.js +0 -116
- package/dist/cjs/mixins/OxyServices.features.js +0 -335
- package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
- package/dist/cjs/mixins/OxyServices.identity.js +0 -562
- package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
- package/dist/cjs/mixins/OxyServices.inference.js +0 -59
- package/dist/cjs/mixins/OxyServices.language.js +0 -125
- package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
- package/dist/cjs/mixins/OxyServices.location.js +0 -43
- package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
- package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
- package/dist/cjs/mixins/OxyServices.payment.js +0 -158
- package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
- package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
- package/dist/cjs/mixins/OxyServices.security.js +0 -89
- package/dist/cjs/mixins/OxyServices.store.js +0 -266
- package/dist/cjs/mixins/OxyServices.topics.js +0 -137
- package/dist/cjs/mixins/OxyServices.user.js +0 -954
- package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
- package/dist/cjs/mixins/index.js +0 -136
- package/dist/cjs/mixins/mixinHelpers.js +0 -53
- package/dist/cjs/utils/webauthnOrigin.js +0 -51
- package/dist/esm/.tsbuildinfo +0 -1
- package/dist/esm/OxyServices.base.js +0 -388
- package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
- package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
- package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
- package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
- package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
- package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/esm/mixins/OxyServices.accounts.js +0 -543
- package/dist/esm/mixins/OxyServices.agency.js +0 -151
- package/dist/esm/mixins/OxyServices.analytics.js +0 -46
- package/dist/esm/mixins/OxyServices.appData.js +0 -103
- package/dist/esm/mixins/OxyServices.assets.js +0 -851
- package/dist/esm/mixins/OxyServices.auth.js +0 -1400
- package/dist/esm/mixins/OxyServices.chains.js +0 -70
- package/dist/esm/mixins/OxyServices.civic.js +0 -605
- package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
- package/dist/esm/mixins/OxyServices.contacts.js +0 -47
- package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
- package/dist/esm/mixins/OxyServices.devices.js +0 -113
- package/dist/esm/mixins/OxyServices.features.js +0 -332
- package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
- package/dist/esm/mixins/OxyServices.identity.js +0 -558
- package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
- package/dist/esm/mixins/OxyServices.inference.js +0 -56
- package/dist/esm/mixins/OxyServices.language.js +0 -122
- package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
- package/dist/esm/mixins/OxyServices.location.js +0 -40
- package/dist/esm/mixins/OxyServices.nodes.js +0 -172
- package/dist/esm/mixins/OxyServices.notifications.js +0 -60
- package/dist/esm/mixins/OxyServices.payment.js +0 -155
- package/dist/esm/mixins/OxyServices.privacy.js +0 -196
- package/dist/esm/mixins/OxyServices.reputation.js +0 -286
- package/dist/esm/mixins/OxyServices.security.js +0 -86
- package/dist/esm/mixins/OxyServices.store.js +0 -263
- package/dist/esm/mixins/OxyServices.topics.js +0 -134
- package/dist/esm/mixins/OxyServices.user.js +0 -951
- package/dist/esm/mixins/OxyServices.utility.js +0 -1397
- package/dist/esm/mixins/index.js +0 -133
- package/dist/esm/mixins/mixinHelpers.js +0 -48
- package/dist/esm/utils/webauthnOrigin.js +0 -48
- package/dist/types/.tsbuildinfo +0 -1
- package/dist/types/OxyServices.base.d.ts +0 -189
- package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
- package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
- package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
- package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
- package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
- package/dist/types/mixins/OxyServices.auth.d.ts +0 -965
- package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
- package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
- package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
- package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
- package/dist/types/mixins/OxyServices.features.d.ts +0 -250
- package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
- package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
- package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
- package/dist/types/mixins/OxyServices.language.d.ts +0 -87
- package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
- package/dist/types/mixins/OxyServices.location.d.ts +0 -70
- package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
- package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
- package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
- package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
- package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
- package/dist/types/mixins/OxyServices.security.d.ts +0 -84
- package/dist/types/mixins/OxyServices.store.d.ts +0 -334
- package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
- package/dist/types/mixins/OxyServices.user.d.ts +0 -600
- package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
- package/dist/types/mixins/index.d.ts +0 -87
- package/dist/types/mixins/mixinHelpers.d.ts +0 -31
- package/dist/types/utils/webauthnOrigin.d.ts +0 -32
- package/src/OxyServices.base.ts +0 -480
- package/src/__tests__/authSocket.test.ts +0 -96
- package/src/__tests__/fixEsmImports.test.ts +0 -132
- package/src/__tests__/httpServiceAbort.test.ts +0 -308
- package/src/__tests__/httpServiceActivityId.test.ts +0 -49
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
- package/src/__tests__/httpServiceCache.test.ts +0 -318
- package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
- package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
- package/src/__tests__/httpServiceWrites.test.ts +0 -175
- package/src/__tests__/inSessionRefresh.test.ts +0 -313
- package/src/__tests__/linkedClient.test.ts +0 -363
- package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
- package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
- package/src/__tests__/publicInterfaceParity.test.ts +0 -75
- package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
- package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
- package/src/__tests__/userIdentity.test.ts +0 -143
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
- package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
- package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
- package/src/crypto/__tests__/identityLink.test.ts +0 -18
- package/src/crypto/__tests__/identityMocks.ts +0 -125
- package/src/crypto/__tests__/identityProof.test.ts +0 -81
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
- package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
- package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
- package/src/crypto/__tests__/keyManager.test.ts +0 -329
- package/src/crypto/__tests__/polyfill.test.ts +0 -109
- package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
- package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
- package/src/crypto/__tests__/registrationPow.test.ts +0 -61
- package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
- package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
- package/src/crypto/__tests__/signedRecord.test.ts +0 -230
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
- package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
- package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
- package/src/i18n/locales/de-DE.json +0 -306
- package/src/i18n/locales/es-ES.json +0 -2127
- package/src/i18n/locales/ja-JP.json +0 -306
- package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
- package/src/logger/__tests__/logger.test.ts +0 -207
- package/src/mixins/OxyServices.accounts.ts +0 -1330
- package/src/mixins/OxyServices.agency.ts +0 -353
- package/src/mixins/OxyServices.analytics.ts +0 -53
- package/src/mixins/OxyServices.appData.ts +0 -158
- package/src/mixins/OxyServices.assets.ts +0 -964
- package/src/mixins/OxyServices.auth.ts +0 -2028
- package/src/mixins/OxyServices.chains.ts +0 -134
- package/src/mixins/OxyServices.civic.ts +0 -945
- package/src/mixins/OxyServices.connectedApps.ts +0 -212
- package/src/mixins/OxyServices.contacts.ts +0 -73
- package/src/mixins/OxyServices.devices.ts +0 -120
- package/src/mixins/OxyServices.features.ts +0 -454
- package/src/mixins/OxyServices.followGraph.ts +0 -293
- package/src/mixins/OxyServices.identity.ts +0 -787
- package/src/mixins/OxyServices.identityBackup.ts +0 -250
- package/src/mixins/OxyServices.inference.ts +0 -57
- package/src/mixins/OxyServices.language.ts +0 -144
- package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
- package/src/mixins/OxyServices.location.ts +0 -46
- package/src/mixins/OxyServices.nodes.ts +0 -337
- package/src/mixins/OxyServices.notifications.ts +0 -142
- package/src/mixins/OxyServices.payment.ts +0 -163
- package/src/mixins/OxyServices.privacy.ts +0 -219
- package/src/mixins/OxyServices.reputation.ts +0 -436
- package/src/mixins/OxyServices.security.ts +0 -110
- package/src/mixins/OxyServices.store.ts +0 -585
- package/src/mixins/OxyServices.topics.ts +0 -169
- package/src/mixins/OxyServices.user.ts +0 -1208
- package/src/mixins/OxyServices.utility.ts +0 -1803
- package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
- package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
- package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
- package/src/mixins/__tests__/accountEvents.test.ts +0 -158
- package/src/mixins/__tests__/accounts.test.ts +0 -727
- package/src/mixins/__tests__/agency.test.ts +0 -120
- package/src/mixins/__tests__/appData.test.ts +0 -203
- package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
- package/src/mixins/__tests__/assetUpload.test.ts +0 -191
- package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
- package/src/mixins/__tests__/chains.test.ts +0 -113
- package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
- package/src/mixins/__tests__/connectedApps.test.ts +0 -146
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
- package/src/mixins/__tests__/followGraph.test.ts +0 -147
- package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
- package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
- package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
- package/src/mixins/__tests__/identityBackup.test.ts +0 -315
- package/src/mixins/__tests__/identityLink.test.ts +0 -89
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
- package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
- package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
- package/src/mixins/__tests__/notifications.read.test.ts +0 -82
- package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
- package/src/mixins/__tests__/reputation.test.ts +0 -522
- package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
- package/src/mixins/__tests__/store.test.ts +0 -304
- package/src/mixins/__tests__/topics.test.ts +0 -155
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
- package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
- package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
- package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
- package/src/mixins/index.ts +0 -203
- package/src/mixins/mixinHelpers.ts +0 -69
- package/src/server/__tests__/auth.test.ts +0 -78
- package/src/server/__tests__/capabilityTicket.test.ts +0 -111
- package/src/server/__tests__/cors.socket.test.ts +0 -225
- package/src/server/__tests__/cors.test.ts +0 -158
- package/src/server/__tests__/rateLimit.test.ts +0 -257
- package/src/server/__tests__/requesterAssertion.test.ts +0 -359
- package/src/server/__tests__/safeFetch.test.ts +0 -232
- package/src/server/__tests__/securityHeaders.test.ts +0 -387
- package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
- package/src/server/__tests__/traffic.test.ts +0 -180
- package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
- package/src/server/__tests__/userInvalidation.test.ts +0 -203
- package/src/server/__tests__/verifySecret.test.ts +0 -40
- package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
- package/src/server/__tests__/workloadIdentity.test.ts +0 -128
- package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
- package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
- package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
- package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
- package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
- package/src/session/__tests__/SessionClient.state.test.ts +0 -78
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
- package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
- package/src/session/__tests__/accountDialogController.test.ts +0 -2502
- package/src/session/__tests__/accountDialogShape.test.ts +0 -120
- package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
- package/src/session/__tests__/authStateStore.test.ts +0 -451
- package/src/session/__tests__/deviceDirectory.test.ts +0 -422
- package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
- package/src/session/__tests__/identityPin.test.ts +0 -131
- package/src/session/__tests__/identitySession.test.ts +0 -194
- package/src/session/__tests__/projectSessionState.test.ts +0 -105
- package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
- package/src/session/__tests__/refresh.test.ts +0 -606
- package/src/session/__tests__/sessionIntegration.test.ts +0 -209
- package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
- package/src/utils/__tests__/accountUtils.test.ts +0 -151
- package/src/utils/__tests__/activityId.test.ts +0 -45
- package/src/utils/__tests__/asyncUtils.test.ts +0 -279
- package/src/utils/__tests__/authWebUrl.test.ts +0 -15
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
- package/src/utils/__tests__/coldBoot.test.ts +0 -496
- package/src/utils/__tests__/commonsApproval.test.ts +0 -60
- package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
- package/src/utils/__tests__/languageUtils.test.ts +0 -244
- package/src/utils/__tests__/oauthPkce.test.ts +0 -303
- package/src/utils/__tests__/officialOrigins.test.ts +0 -31
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
- package/src/utils/__tests__/profileLinks.test.ts +0 -180
- package/src/utils/__tests__/redactUrl.test.ts +0 -33
- package/src/utils/__tests__/registrableApex.test.ts +0 -62
- package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
- package/src/utils/__tests__/textNormalization.test.ts +0 -205
- package/src/utils/__tests__/validationUtils.test.ts +0 -703
- package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
- package/src/utils/webauthnOrigin.ts +0 -52
package/dist/esm/HttpService.js
CHANGED
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
* - Error handling
|
|
13
13
|
* - Request queuing
|
|
14
14
|
*/
|
|
15
|
-
import { TTLCache, registerCacheForCleanup } from './utils/cache.js';
|
|
15
|
+
import { TTLCache, registerCacheForCleanup, unregisterCacheFromCleanup } from './utils/cache.js';
|
|
16
16
|
import { RequestDeduplicator, RequestQueue, SimpleLogger } from './utils/requestUtils.js';
|
|
17
17
|
import { retryAsync } from './utils/asyncUtils.js';
|
|
18
18
|
import { createCancelledError, ErrorCodes, handleHttpError, parseHttpErrorBody } from './utils/errorUtils.js';
|
|
19
|
-
import {
|
|
20
|
-
import { isReactNative } from '@oxy.so/protocol';
|
|
19
|
+
import { decodeTokenClaims } from './utils/tokenClaims.js';
|
|
20
|
+
import { isReactNative } from '@oxy.so/protocol/random';
|
|
21
21
|
import { computeIdentityTag, fnv1a32 } from './utils/cacheKey.js';
|
|
22
22
|
import { redactUrlQuery } from './utils/redactUrl.js';
|
|
23
23
|
import { OxyAuthenticationError } from './OxyServices.errors.js';
|
|
24
|
-
import {
|
|
24
|
+
import { peekBrowserEdgeRegionHeader } from './utils/edgeRegion.js';
|
|
25
25
|
import { getBrowserActivityIdHeader } from './utils/activityId.js';
|
|
26
26
|
/**
|
|
27
27
|
* Default per-request timeout (ms) when neither the call site nor
|
|
@@ -29,6 +29,26 @@ import { getBrowserActivityIdHeader } from './utils/activityId.js';
|
|
|
29
29
|
* endpoint surfaces as an `AbortError` quickly rather than blocking the
|
|
30
30
|
* request queue.
|
|
31
31
|
*/
|
|
32
|
+
/**
|
|
33
|
+
* Strip leading or trailing `/`s without a regex: `/\/+$/` backtracks
|
|
34
|
+
* polynomially on a long run of slashes (CodeQL js/polynomial-redos), and this
|
|
35
|
+
* runs on every request.
|
|
36
|
+
*/
|
|
37
|
+
function trimSlashes(value, side) {
|
|
38
|
+
let start = 0;
|
|
39
|
+
let end = value.length;
|
|
40
|
+
if (side === 'start')
|
|
41
|
+
while (start < end && value.charCodeAt(start) === 47)
|
|
42
|
+
start++;
|
|
43
|
+
else
|
|
44
|
+
while (end > start && value.charCodeAt(end - 1) === 47)
|
|
45
|
+
end--;
|
|
46
|
+
return value.slice(start, end);
|
|
47
|
+
}
|
|
48
|
+
/** Methods whose calls concurrent callers may share (read-only). */
|
|
49
|
+
const SAFE_METHODS = new Set(['GET']);
|
|
50
|
+
/** Methods safe to re-send after a transient failure (RFC 9110 §9.2.2). */
|
|
51
|
+
const IDEMPOTENT_METHODS = new Set(['GET', 'PUT', 'DELETE']);
|
|
32
52
|
const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|
|
33
53
|
/**
|
|
34
54
|
* Cooldown (ms) applied after a failed access-token refresh before another
|
|
@@ -94,18 +114,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
|
|
|
94
114
|
* lead window. `false` for an expired, opaque or no-`exp` token.
|
|
95
115
|
*/
|
|
96
116
|
function isInsideRefreshLeadWindow(token) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (typeof decoded.exp !== 'number') {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
const now = Math.floor(Date.now() / 1000);
|
|
103
|
-
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
104
|
-
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
117
|
+
const decoded = decodeTokenClaims(token);
|
|
118
|
+
if (typeof decoded?.exp !== 'number') {
|
|
107
119
|
return false;
|
|
108
120
|
}
|
|
121
|
+
const now = Math.floor(Date.now() / 1000);
|
|
122
|
+
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
123
|
+
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
109
124
|
}
|
|
110
125
|
/**
|
|
111
126
|
* Soft ceiling on the number of live entries in the identity-scoped GET
|
|
@@ -233,6 +248,7 @@ export class HttpService {
|
|
|
233
248
|
this.noFresherTokenThan = null;
|
|
234
249
|
this.authRefreshHandler = null;
|
|
235
250
|
this.accessTokenProvider = null;
|
|
251
|
+
this.anonymousAuthProvider = null;
|
|
236
252
|
this.deviceSecretMintInFlight = null;
|
|
237
253
|
/**
|
|
238
254
|
* Bumped by every {@link endSession}. A re-mint captures it before its first
|
|
@@ -375,7 +391,15 @@ export class HttpService {
|
|
|
375
391
|
* Main request method - handles everything in one place
|
|
376
392
|
*/
|
|
377
393
|
async request(config) {
|
|
378
|
-
const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL,
|
|
394
|
+
const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL,
|
|
395
|
+
// Only reads are shared by default. A write's body can be opaque
|
|
396
|
+
// (`FormData`, `URLSearchParams` key as empty objects), so two different
|
|
397
|
+
// uploads used to collapse into one call and the second caller got the
|
|
398
|
+
// first file's result.
|
|
399
|
+
deduplicate = SAFE_METHODS.has(method),
|
|
400
|
+
// Only idempotent methods are re-sent by default: re-sending a POST after a
|
|
401
|
+
// 5xx or a dropped connection can apply it twice.
|
|
402
|
+
retry = this.config.enableRetry !== false && IDEMPOTENT_METHODS.has(method), maxRetries = this.config.maxRetries || 3, } = config;
|
|
379
403
|
// A per-instance disabled cache (`enableCache:false` / `cacheTTL<=0`)
|
|
380
404
|
// overrides any per-request `cache:true`: nothing is read from nor written
|
|
381
405
|
// to the response cache. Request deduplication below is unaffected.
|
|
@@ -405,7 +429,9 @@ export class HttpService {
|
|
|
405
429
|
// 401 retry re-enters request() with a fresh config, so it re-resolves
|
|
406
430
|
// this here with the refreshed token.
|
|
407
431
|
const authHeader = config.skipAuth ? null : await this.getAuthHeader();
|
|
408
|
-
|
|
432
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
433
|
+
// to a second in front of requests.
|
|
434
|
+
const edgeRegionHeader = peekBrowserEdgeRegionHeader();
|
|
409
435
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
410
436
|
// A request the caller has ALREADY abandoned takes no queue slot and makes
|
|
411
437
|
// no network call. Checked here, before enqueue, because a slot is the
|
|
@@ -414,40 +440,30 @@ export class HttpService {
|
|
|
414
440
|
if (signal?.aborted) {
|
|
415
441
|
throw createCancelledError('Request cancelled before it was sent');
|
|
416
442
|
}
|
|
417
|
-
//
|
|
418
|
-
//
|
|
419
|
-
//
|
|
420
|
-
|
|
421
|
-
// linked to each new controller with a bare `addEventListener`. An `abort`
|
|
422
|
-
// event fires once, so on attempt 2 the caller's already-fired signal could
|
|
423
|
-
// not abort the freshly built controller, and the request the caller had
|
|
424
|
-
// cancelled went out for real. Hoisting the linkage means a cancellation
|
|
425
|
-
// arrives once and is then true for every attempt, including ones not yet
|
|
426
|
-
// started.
|
|
427
|
-
const callController = new AbortController();
|
|
428
|
-
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
429
|
-
/**
|
|
430
|
-
* Which of our own timers fired, so a timeout can be told apart from a
|
|
431
|
-
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
432
|
-
* `AbortError`, and collapsing them (as this used to) is what let the retry
|
|
433
|
-
* predicate treat an abandoned request as a transient failure.
|
|
434
|
-
*/
|
|
435
|
-
let timedOut = false;
|
|
436
|
-
// Request function
|
|
437
|
-
const requestFn = async () => {
|
|
443
|
+
// One network attempt, inside the call's abort domain `domain`: the caller's
|
|
444
|
+
// own signal, or — when deduplicated — the shared work's, which aborts only
|
|
445
|
+
// once every caller waiting on it has cancelled.
|
|
446
|
+
const attempt = async (domain) => {
|
|
438
447
|
const startTime = Date.now();
|
|
439
448
|
// Re-checked per attempt so no retry can issue a network call after the
|
|
440
449
|
// caller gave up — belt to `retryAsync`'s braces, and the one that holds
|
|
441
450
|
// if a custom `shouldRetry` ever says yes to a cancellation.
|
|
442
|
-
if (
|
|
451
|
+
if (domain.aborted) {
|
|
443
452
|
throw createCancelledError('Request cancelled');
|
|
444
453
|
}
|
|
454
|
+
/**
|
|
455
|
+
* Whether OUR timer fired, so a timeout can be told apart from a
|
|
456
|
+
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
457
|
+
* `AbortError`, and collapsing them is what let the retry predicate treat
|
|
458
|
+
* an abandoned request as a transient failure.
|
|
459
|
+
*/
|
|
460
|
+
let timedOut = false;
|
|
445
461
|
// This attempt's controller carries its own timeout and inherits the
|
|
446
462
|
// call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
|
|
447
463
|
// that releases them can see them — the timer and the listener are
|
|
448
464
|
// exactly what leaked when they lived inside it.
|
|
449
465
|
const controller = new AbortController();
|
|
450
|
-
const disposeCallLink = linkAbort(
|
|
466
|
+
const disposeCallLink = linkAbort(domain, controller);
|
|
451
467
|
const timeoutId = timeout
|
|
452
468
|
? setTimeout(() => {
|
|
453
469
|
timedOut = true;
|
|
@@ -473,19 +489,19 @@ export class HttpService {
|
|
|
473
489
|
}
|
|
474
490
|
// Add authorization header if available
|
|
475
491
|
if (authHeader) {
|
|
476
|
-
headers
|
|
492
|
+
headers.Authorization = authHeader;
|
|
477
493
|
}
|
|
478
494
|
// Merge custom headers if provided
|
|
479
495
|
if (config.headers) {
|
|
480
|
-
Object.entries(config.headers)
|
|
496
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
481
497
|
// For FormData, explicitly remove Content-Type if user tries to set it
|
|
482
498
|
// The browser/fetch API will set it automatically with the boundary
|
|
483
499
|
if (isFormData && key.toLowerCase() === 'content-type') {
|
|
484
500
|
this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
|
|
485
|
-
|
|
501
|
+
continue;
|
|
486
502
|
}
|
|
487
503
|
headers[key] = value;
|
|
488
|
-
}
|
|
504
|
+
}
|
|
489
505
|
}
|
|
490
506
|
// This is Cloudflare's coarse serving PoP (for example `mad`), never an
|
|
491
507
|
// IP or coordinate. Set it after caller headers so request code cannot
|
|
@@ -533,7 +549,12 @@ export class HttpService {
|
|
|
533
549
|
// deduplicated retry would resolve to the still-pending original
|
|
534
550
|
// and await itself (deadlock). Opting the retry out of dedupe makes
|
|
535
551
|
// it a fresh request.
|
|
536
|
-
|
|
552
|
+
//
|
|
553
|
+
// `bypassQueue: true` is REQUIRED too: this attempt still holds its
|
|
554
|
+
// queue slot, so a queued retry waits for a slot while holding one.
|
|
555
|
+
// With every slot held by a 401 (a revoked session under load) no
|
|
556
|
+
// retry could ever start and the whole client stalled.
|
|
557
|
+
return this.request({ ...config, _isAuthRetry: true, retry: false, deduplicate: false, bypassQueue: true });
|
|
537
558
|
}
|
|
538
559
|
// Refresh failed or no token — clear tokens
|
|
539
560
|
this.tokenStore.clearTokens();
|
|
@@ -578,7 +599,7 @@ export class HttpService {
|
|
|
578
599
|
if (config.responseType === 'blob') {
|
|
579
600
|
responseData = await response.blob();
|
|
580
601
|
}
|
|
581
|
-
else if (contentType
|
|
602
|
+
else if (contentType?.includes('application/json')) {
|
|
582
603
|
// Use response.json() directly for better performance
|
|
583
604
|
try {
|
|
584
605
|
responseData = await response.json();
|
|
@@ -661,47 +682,55 @@ export class HttpService {
|
|
|
661
682
|
disposeCallLink();
|
|
662
683
|
}
|
|
663
684
|
};
|
|
664
|
-
//
|
|
685
|
+
// Composition: dedupe(retry(queue(attempt))). A queue slot is network
|
|
686
|
+
// occupancy only — each attempt takes one and releases it — so neither the
|
|
687
|
+
// retry backoff sleep nor a deduplicated caller waiting on shared work holds
|
|
688
|
+
// a slot while doing nothing.
|
|
665
689
|
//
|
|
666
|
-
// `retryOnTimeout` defaults to false in `retryAsync
|
|
667
|
-
//
|
|
668
|
-
//
|
|
669
|
-
|
|
670
|
-
//
|
|
671
|
-
|
|
672
|
-
|
|
690
|
+
// `retryOnTimeout` defaults to false in `retryAsync`: a timeout costs ONE
|
|
691
|
+
// attempt, a cancellation none. `deadline` bounds whatever retries do happen
|
|
692
|
+
// by wall clock rather than by attempts x timeout + backoff.
|
|
693
|
+
const runAttempt = (domain) =>
|
|
694
|
+
// Control-plane calls the auth lane depends on (`bypassQueue`, e.g. the
|
|
695
|
+
// device-secret mint) run DIRECTLY — a queued mint could never acquire a
|
|
696
|
+
// slot when every slot is parked awaiting it.
|
|
697
|
+
config.bypassQueue ? attempt(domain) : this.requestQueue.enqueue(() => attempt(domain), domain);
|
|
698
|
+
const execute = (domain) => retry
|
|
699
|
+
? retryAsync(() => runAttempt(domain), {
|
|
673
700
|
maxRetries,
|
|
674
701
|
baseDelay: this.config.retryDelay || 1000,
|
|
675
702
|
retryOnTimeout: config.retryOnTimeout ?? false,
|
|
676
703
|
deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
|
|
677
704
|
})
|
|
678
|
-
:
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
//
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
//
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
705
|
+
: runAttempt(domain);
|
|
706
|
+
let result;
|
|
707
|
+
if (deduplicate) {
|
|
708
|
+
// The cache key IS the dedupe key (same method, url, payload, identity);
|
|
709
|
+
// computed once per call.
|
|
710
|
+
const dedupeKey = cacheKey ?? this.generateCacheKey(method, url, data || params);
|
|
711
|
+
result = await this.deduplicator.deduplicate(dedupeKey, execute, signal);
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
// The call's own abort domain, linked to the caller's signal ONCE, so a
|
|
715
|
+
// cancellation arrives once and is then true for every attempt, including
|
|
716
|
+
// ones not yet started. Released however the call ends: a caller signal
|
|
717
|
+
// that outlives the request (a React Query signal) would otherwise accrue
|
|
718
|
+
// one listener per request.
|
|
719
|
+
const callController = new AbortController();
|
|
720
|
+
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
721
|
+
try {
|
|
722
|
+
result = await execute(callController.signal);
|
|
723
|
+
}
|
|
724
|
+
finally {
|
|
725
|
+
disposeCallerLink?.();
|
|
695
726
|
}
|
|
696
|
-
return result;
|
|
697
727
|
}
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
// listener per request for its whole lifetime.
|
|
703
|
-
disposeCallerLink?.();
|
|
728
|
+
// Cache the result if caching is enabled
|
|
729
|
+
if (cache && cacheKey && result) {
|
|
730
|
+
this.cache.set(cacheKey, result, cacheTTL);
|
|
731
|
+
this.warnIfCacheOversized();
|
|
704
732
|
}
|
|
733
|
+
return result;
|
|
705
734
|
}
|
|
706
735
|
/**
|
|
707
736
|
* Soft cache-size guard. Emits a single throttled telemetry warning when the
|
|
@@ -888,16 +917,16 @@ export class HttpService {
|
|
|
888
917
|
buildURL(url, params) {
|
|
889
918
|
const base = /^https?:\/\//i.test(url)
|
|
890
919
|
? url
|
|
891
|
-
: `${this.baseURL
|
|
920
|
+
: `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
|
|
892
921
|
if (!params || Object.keys(params).length === 0) {
|
|
893
922
|
return base;
|
|
894
923
|
}
|
|
895
924
|
const searchParams = new URLSearchParams();
|
|
896
|
-
|
|
925
|
+
for (const [key, value] of Object.entries(params)) {
|
|
897
926
|
if (value !== undefined && value !== null) {
|
|
898
927
|
searchParams.append(key, String(value));
|
|
899
928
|
}
|
|
900
|
-
}
|
|
929
|
+
}
|
|
901
930
|
const queryString = searchParams.toString();
|
|
902
931
|
return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
|
|
903
932
|
}
|
|
@@ -918,10 +947,12 @@ export class HttpService {
|
|
|
918
947
|
async getAuthHeader() {
|
|
919
948
|
const accessToken = this.syncAccessTokenFromProvider();
|
|
920
949
|
if (!accessToken) {
|
|
921
|
-
return
|
|
950
|
+
return this.getAnonymousAuthHeader();
|
|
922
951
|
}
|
|
923
952
|
try {
|
|
924
|
-
const decoded =
|
|
953
|
+
const decoded = decodeTokenClaims(accessToken);
|
|
954
|
+
if (!decoded)
|
|
955
|
+
throw new Error('opaque token');
|
|
925
956
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
926
957
|
// If the token expires within the refresh lead window, refresh it.
|
|
927
958
|
if (decoded.exp && decoded.exp - currentTime < TOKEN_REFRESH_LEAD_SECONDS) {
|
|
@@ -947,6 +978,24 @@ export class HttpService {
|
|
|
947
978
|
return null;
|
|
948
979
|
}
|
|
949
980
|
}
|
|
981
|
+
/**
|
|
982
|
+
* The bearer for a request that has no user session behind it, from the
|
|
983
|
+
* {@link AnonymousAuthProvider} if one is installed. Never throws: a provider
|
|
984
|
+
* that fails sends the request anonymous, exactly as it went before any
|
|
985
|
+
* provider existed.
|
|
986
|
+
*/
|
|
987
|
+
async getAnonymousAuthHeader() {
|
|
988
|
+
if (!this.anonymousAuthProvider)
|
|
989
|
+
return null;
|
|
990
|
+
try {
|
|
991
|
+
const token = await this.anonymousAuthProvider();
|
|
992
|
+
return token ? `Bearer ${token}` : null;
|
|
993
|
+
}
|
|
994
|
+
catch (error) {
|
|
995
|
+
this.logger.debug('Anonymous auth provider failed; sending the request anonymous:', error);
|
|
996
|
+
return null;
|
|
997
|
+
}
|
|
998
|
+
}
|
|
950
999
|
async refreshAccessToken(reason) {
|
|
951
1000
|
if (!this.authRefreshHandler) {
|
|
952
1001
|
return null;
|
|
@@ -1049,26 +1098,22 @@ export class HttpService {
|
|
|
1049
1098
|
if (!token) {
|
|
1050
1099
|
return false;
|
|
1051
1100
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
|
|
1055
|
-
}
|
|
1056
|
-
catch {
|
|
1057
|
-
return false;
|
|
1058
|
-
}
|
|
1101
|
+
const exp = decodeTokenClaims(token)?.exp;
|
|
1102
|
+
return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
|
|
1059
1103
|
}
|
|
1060
1104
|
/**
|
|
1061
|
-
* PROCESS-WIDE single-flight for the
|
|
1105
|
+
* PROCESS-WIDE single-flight for the device-secret mint
|
|
1062
1106
|
* (`POST /session/device/token`).
|
|
1063
1107
|
*
|
|
1064
|
-
* The server
|
|
1065
|
-
*
|
|
1066
|
-
*
|
|
1067
|
-
*
|
|
1068
|
-
*
|
|
1069
|
-
*
|
|
1070
|
-
*
|
|
1071
|
-
*
|
|
1108
|
+
* The server does not rotate the presented `deviceSecret` (it echoes it back
|
|
1109
|
+
* as `nextDeviceSecret`; each holder of a shared DeviceSession has its own
|
|
1110
|
+
* stable credential), so this is no longer what keeps the store's secret
|
|
1111
|
+
* valid. It still collapses concurrent callers onto one request and one
|
|
1112
|
+
* persisted write. Every mint lane (the re-mint handler behind
|
|
1113
|
+
* `refreshAccessToken`, the device-first cold boot, the socket token
|
|
1114
|
+
* transport, the tab-focus reconcile) funnels its `refreshDeviceSecretArm`
|
|
1115
|
+
* call through here, so concurrent callers await the SAME in-flight mint and
|
|
1116
|
+
* all receive its result.
|
|
1072
1117
|
*
|
|
1073
1118
|
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
1074
1119
|
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
@@ -1165,7 +1210,9 @@ export class HttpService {
|
|
|
1165
1210
|
// Authentication is owned by this SDK instance. A caller cannot replace
|
|
1166
1211
|
// the bearer with a different session or leak one across linked apps.
|
|
1167
1212
|
headers.set('Authorization', authHeader);
|
|
1168
|
-
|
|
1213
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
1214
|
+
// to a second in front of requests.
|
|
1215
|
+
const edgeRegionHeader = peekBrowserEdgeRegionHeader();
|
|
1169
1216
|
for (const [name, value] of Object.entries(edgeRegionHeader))
|
|
1170
1217
|
headers.set(name, value);
|
|
1171
1218
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
@@ -1255,6 +1302,16 @@ export class HttpService {
|
|
|
1255
1302
|
setAccessTokenProvider(provider) {
|
|
1256
1303
|
this.accessTokenProvider = provider;
|
|
1257
1304
|
}
|
|
1305
|
+
/**
|
|
1306
|
+
* Authenticate requests that carry no user session with the bearer this
|
|
1307
|
+
* provider returns — in practice a backend's own service token (see
|
|
1308
|
+
* `OxyConfig.serviceIdentity`). A user session always wins: the provider is
|
|
1309
|
+
* consulted only when there is no access token, and never for `skipAuth`
|
|
1310
|
+
* requests. `null` removes it.
|
|
1311
|
+
*/
|
|
1312
|
+
setAnonymousAuthProvider(provider) {
|
|
1313
|
+
this.anonymousAuthProvider = provider;
|
|
1314
|
+
}
|
|
1258
1315
|
clearTokens() {
|
|
1259
1316
|
this.tokenStore.clearTokens();
|
|
1260
1317
|
// Drop the response cache on logout. The cache is identity-scoped, so a
|
|
@@ -1331,13 +1388,7 @@ export class HttpService {
|
|
|
1331
1388
|
* identity-scoped variant `<key> id=*`.
|
|
1332
1389
|
*/
|
|
1333
1390
|
clearCacheEntry(key) {
|
|
1334
|
-
this.
|
|
1335
|
-
const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
|
|
1336
|
-
for (const existing of this.cache.keys()) {
|
|
1337
|
-
if (existing.startsWith(identityVariantPrefix)) {
|
|
1338
|
-
this.cache.delete(existing);
|
|
1339
|
-
}
|
|
1340
|
-
}
|
|
1391
|
+
this.invalidateCache({ keys: [key] });
|
|
1341
1392
|
}
|
|
1342
1393
|
/**
|
|
1343
1394
|
* Delete every cache entry whose key starts with `prefix`.
|
|
@@ -1348,14 +1399,40 @@ export class HttpService {
|
|
|
1348
1399
|
* deleted entries (for observability in tests).
|
|
1349
1400
|
*/
|
|
1350
1401
|
clearCacheByPrefix(prefix) {
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1402
|
+
return this.invalidateCache({ prefixes: [prefix] });
|
|
1403
|
+
}
|
|
1404
|
+
/**
|
|
1405
|
+
* Invalidate a set of LOGICAL keys (each with every identity-scoped variant,
|
|
1406
|
+
* see `clearCacheEntry`) and key prefixes in ONE pass over the cache. A
|
|
1407
|
+
* mutation touching many resources (a bulk follow) costs one scan, not one
|
|
1408
|
+
* per resource.
|
|
1409
|
+
* @returns Number of entries deleted
|
|
1410
|
+
*/
|
|
1411
|
+
invalidateCache({ keys = [], prefixes = [] }) {
|
|
1412
|
+
if (keys.length === 0 && prefixes.length === 0)
|
|
1413
|
+
return 0;
|
|
1414
|
+
const exact = new Set(keys);
|
|
1415
|
+
const delim = HttpService.CACHE_IDENTITY_DELIM;
|
|
1416
|
+
return this.cache.deleteWhere((stored) => {
|
|
1417
|
+
const cut = stored.lastIndexOf(delim);
|
|
1418
|
+
if (exact.has(cut === -1 ? stored : stored.slice(0, cut)))
|
|
1419
|
+
return true;
|
|
1420
|
+
for (const prefix of prefixes) {
|
|
1421
|
+
if (stored.startsWith(prefix))
|
|
1422
|
+
return true;
|
|
1356
1423
|
}
|
|
1357
|
-
|
|
1358
|
-
|
|
1424
|
+
return false;
|
|
1425
|
+
});
|
|
1426
|
+
}
|
|
1427
|
+
/**
|
|
1428
|
+
* Release this client: its response cache leaves the global cleanup sweep and
|
|
1429
|
+
* is emptied, pending shared calls are forgotten, and the session ends.
|
|
1430
|
+
*/
|
|
1431
|
+
dispose() {
|
|
1432
|
+
unregisterCacheFromCleanup(this.cache);
|
|
1433
|
+
this.cache.clear();
|
|
1434
|
+
this.deduplicator.clear();
|
|
1435
|
+
this.endSession();
|
|
1359
1436
|
}
|
|
1360
1437
|
getCacheStats() {
|
|
1361
1438
|
const cacheStats = this.cache.getStats();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { handleHttpError } from './utils/errorUtils.js';
|
|
1
2
|
/**
|
|
2
3
|
* Custom error types for better error handling
|
|
3
4
|
*/
|
|
@@ -112,3 +113,47 @@ export class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
|
|
|
112
113
|
this.name = 'OxyAuthenticationTimeoutError';
|
|
113
114
|
}
|
|
114
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* The one error every `OxyServices` call rejects with.
|
|
118
|
+
*
|
|
119
|
+
* `status` is the HTTP status (0 when no response arrived: a network failure,
|
|
120
|
+
* a timeout or a cancellation), `code` the API's machine code when it sent one
|
|
121
|
+
* (else a transport code such as `TIMEOUT`, `NETWORK_ERROR`, `CANCELLED`), and
|
|
122
|
+
* `details` the API's structured detail. The original error is `cause`.
|
|
123
|
+
*/
|
|
124
|
+
export class OxyApiError extends Error {
|
|
125
|
+
constructor(message, init) {
|
|
126
|
+
super(message);
|
|
127
|
+
this.name = 'OxyApiError';
|
|
128
|
+
this.status = init.status;
|
|
129
|
+
this.code = init.code;
|
|
130
|
+
this.details = init.details;
|
|
131
|
+
this.response = init.response;
|
|
132
|
+
this.cancelled = init.cancelled ?? false;
|
|
133
|
+
this.timeout = init.timeout ?? false;
|
|
134
|
+
if (init.cause !== undefined) {
|
|
135
|
+
this.cause = init.cause;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Normalise anything a request rejected with into an `OxyApiError`. An error
|
|
141
|
+
* that already is one (or a typed SDK error such as `OxyAuthenticationError`)
|
|
142
|
+
* passes through unchanged.
|
|
143
|
+
*/
|
|
144
|
+
export function toOxyApiError(error) {
|
|
145
|
+
if (error instanceof OxyApiError || error instanceof OxyAuthenticationError) {
|
|
146
|
+
return error;
|
|
147
|
+
}
|
|
148
|
+
const api = handleHttpError(error);
|
|
149
|
+
const source = (error && typeof error === 'object' ? error : {});
|
|
150
|
+
return new OxyApiError(api.message?.trim() || 'An unexpected error occurred', {
|
|
151
|
+
status: api.status,
|
|
152
|
+
code: api.code,
|
|
153
|
+
details: api.details,
|
|
154
|
+
response: source.response,
|
|
155
|
+
cancelled: source.cancelled === true,
|
|
156
|
+
timeout: source.timeout === true,
|
|
157
|
+
cause: error,
|
|
158
|
+
});
|
|
159
|
+
}
|