@oxy.so/core 1.18.1 → 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 +159 -111
- 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 +160 -112
- 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 +26 -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 -22
- 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 +166 -131
- 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 -22
- 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 -1495
- 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 -1455
- 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 -998
- 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__/serviceIdentityWhenAnonymous.test.ts +0 -159
- 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 -2083
- 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
|
|
@@ -376,7 +391,15 @@ export class HttpService {
|
|
|
376
391
|
* Main request method - handles everything in one place
|
|
377
392
|
*/
|
|
378
393
|
async request(config) {
|
|
379
|
-
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;
|
|
380
403
|
// A per-instance disabled cache (`enableCache:false` / `cacheTTL<=0`)
|
|
381
404
|
// overrides any per-request `cache:true`: nothing is read from nor written
|
|
382
405
|
// to the response cache. Request deduplication below is unaffected.
|
|
@@ -406,7 +429,9 @@ export class HttpService {
|
|
|
406
429
|
// 401 retry re-enters request() with a fresh config, so it re-resolves
|
|
407
430
|
// this here with the refreshed token.
|
|
408
431
|
const authHeader = config.skipAuth ? null : await this.getAuthHeader();
|
|
409
|
-
|
|
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();
|
|
410
435
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
411
436
|
// A request the caller has ALREADY abandoned takes no queue slot and makes
|
|
412
437
|
// no network call. Checked here, before enqueue, because a slot is the
|
|
@@ -415,40 +440,30 @@ export class HttpService {
|
|
|
415
440
|
if (signal?.aborted) {
|
|
416
441
|
throw createCancelledError('Request cancelled before it was sent');
|
|
417
442
|
}
|
|
418
|
-
//
|
|
419
|
-
//
|
|
420
|
-
//
|
|
421
|
-
|
|
422
|
-
// linked to each new controller with a bare `addEventListener`. An `abort`
|
|
423
|
-
// event fires once, so on attempt 2 the caller's already-fired signal could
|
|
424
|
-
// not abort the freshly built controller, and the request the caller had
|
|
425
|
-
// cancelled went out for real. Hoisting the linkage means a cancellation
|
|
426
|
-
// arrives once and is then true for every attempt, including ones not yet
|
|
427
|
-
// started.
|
|
428
|
-
const callController = new AbortController();
|
|
429
|
-
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
430
|
-
/**
|
|
431
|
-
* Which of our own timers fired, so a timeout can be told apart from a
|
|
432
|
-
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
433
|
-
* `AbortError`, and collapsing them (as this used to) is what let the retry
|
|
434
|
-
* predicate treat an abandoned request as a transient failure.
|
|
435
|
-
*/
|
|
436
|
-
let timedOut = false;
|
|
437
|
-
// Request function
|
|
438
|
-
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) => {
|
|
439
447
|
const startTime = Date.now();
|
|
440
448
|
// Re-checked per attempt so no retry can issue a network call after the
|
|
441
449
|
// caller gave up — belt to `retryAsync`'s braces, and the one that holds
|
|
442
450
|
// if a custom `shouldRetry` ever says yes to a cancellation.
|
|
443
|
-
if (
|
|
451
|
+
if (domain.aborted) {
|
|
444
452
|
throw createCancelledError('Request cancelled');
|
|
445
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;
|
|
446
461
|
// This attempt's controller carries its own timeout and inherits the
|
|
447
462
|
// call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
|
|
448
463
|
// that releases them can see them — the timer and the listener are
|
|
449
464
|
// exactly what leaked when they lived inside it.
|
|
450
465
|
const controller = new AbortController();
|
|
451
|
-
const disposeCallLink = linkAbort(
|
|
466
|
+
const disposeCallLink = linkAbort(domain, controller);
|
|
452
467
|
const timeoutId = timeout
|
|
453
468
|
? setTimeout(() => {
|
|
454
469
|
timedOut = true;
|
|
@@ -474,19 +489,19 @@ export class HttpService {
|
|
|
474
489
|
}
|
|
475
490
|
// Add authorization header if available
|
|
476
491
|
if (authHeader) {
|
|
477
|
-
headers
|
|
492
|
+
headers.Authorization = authHeader;
|
|
478
493
|
}
|
|
479
494
|
// Merge custom headers if provided
|
|
480
495
|
if (config.headers) {
|
|
481
|
-
Object.entries(config.headers)
|
|
496
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
482
497
|
// For FormData, explicitly remove Content-Type if user tries to set it
|
|
483
498
|
// The browser/fetch API will set it automatically with the boundary
|
|
484
499
|
if (isFormData && key.toLowerCase() === 'content-type') {
|
|
485
500
|
this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
|
|
486
|
-
|
|
501
|
+
continue;
|
|
487
502
|
}
|
|
488
503
|
headers[key] = value;
|
|
489
|
-
}
|
|
504
|
+
}
|
|
490
505
|
}
|
|
491
506
|
// This is Cloudflare's coarse serving PoP (for example `mad`), never an
|
|
492
507
|
// IP or coordinate. Set it after caller headers so request code cannot
|
|
@@ -534,7 +549,12 @@ export class HttpService {
|
|
|
534
549
|
// deduplicated retry would resolve to the still-pending original
|
|
535
550
|
// and await itself (deadlock). Opting the retry out of dedupe makes
|
|
536
551
|
// it a fresh request.
|
|
537
|
-
|
|
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 });
|
|
538
558
|
}
|
|
539
559
|
// Refresh failed or no token — clear tokens
|
|
540
560
|
this.tokenStore.clearTokens();
|
|
@@ -579,7 +599,7 @@ export class HttpService {
|
|
|
579
599
|
if (config.responseType === 'blob') {
|
|
580
600
|
responseData = await response.blob();
|
|
581
601
|
}
|
|
582
|
-
else if (contentType
|
|
602
|
+
else if (contentType?.includes('application/json')) {
|
|
583
603
|
// Use response.json() directly for better performance
|
|
584
604
|
try {
|
|
585
605
|
responseData = await response.json();
|
|
@@ -662,47 +682,55 @@ export class HttpService {
|
|
|
662
682
|
disposeCallLink();
|
|
663
683
|
}
|
|
664
684
|
};
|
|
665
|
-
//
|
|
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.
|
|
666
689
|
//
|
|
667
|
-
// `retryOnTimeout` defaults to false in `retryAsync
|
|
668
|
-
//
|
|
669
|
-
//
|
|
670
|
-
|
|
671
|
-
//
|
|
672
|
-
|
|
673
|
-
|
|
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), {
|
|
674
700
|
maxRetries,
|
|
675
701
|
baseDelay: this.config.retryDelay || 1000,
|
|
676
702
|
retryOnTimeout: config.retryOnTimeout ?? false,
|
|
677
703
|
deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
|
|
678
704
|
})
|
|
679
|
-
:
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
//
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
//
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
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?.();
|
|
696
726
|
}
|
|
697
|
-
return result;
|
|
698
727
|
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
// listener per request for its whole lifetime.
|
|
704
|
-
disposeCallerLink?.();
|
|
728
|
+
// Cache the result if caching is enabled
|
|
729
|
+
if (cache && cacheKey && result) {
|
|
730
|
+
this.cache.set(cacheKey, result, cacheTTL);
|
|
731
|
+
this.warnIfCacheOversized();
|
|
705
732
|
}
|
|
733
|
+
return result;
|
|
706
734
|
}
|
|
707
735
|
/**
|
|
708
736
|
* Soft cache-size guard. Emits a single throttled telemetry warning when the
|
|
@@ -889,16 +917,16 @@ export class HttpService {
|
|
|
889
917
|
buildURL(url, params) {
|
|
890
918
|
const base = /^https?:\/\//i.test(url)
|
|
891
919
|
? url
|
|
892
|
-
: `${this.baseURL
|
|
920
|
+
: `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
|
|
893
921
|
if (!params || Object.keys(params).length === 0) {
|
|
894
922
|
return base;
|
|
895
923
|
}
|
|
896
924
|
const searchParams = new URLSearchParams();
|
|
897
|
-
|
|
925
|
+
for (const [key, value] of Object.entries(params)) {
|
|
898
926
|
if (value !== undefined && value !== null) {
|
|
899
927
|
searchParams.append(key, String(value));
|
|
900
928
|
}
|
|
901
|
-
}
|
|
929
|
+
}
|
|
902
930
|
const queryString = searchParams.toString();
|
|
903
931
|
return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
|
|
904
932
|
}
|
|
@@ -922,7 +950,9 @@ export class HttpService {
|
|
|
922
950
|
return this.getAnonymousAuthHeader();
|
|
923
951
|
}
|
|
924
952
|
try {
|
|
925
|
-
const decoded =
|
|
953
|
+
const decoded = decodeTokenClaims(accessToken);
|
|
954
|
+
if (!decoded)
|
|
955
|
+
throw new Error('opaque token');
|
|
926
956
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
927
957
|
// If the token expires within the refresh lead window, refresh it.
|
|
928
958
|
if (decoded.exp && decoded.exp - currentTime < TOKEN_REFRESH_LEAD_SECONDS) {
|
|
@@ -1068,26 +1098,22 @@ export class HttpService {
|
|
|
1068
1098
|
if (!token) {
|
|
1069
1099
|
return false;
|
|
1070
1100
|
}
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
|
|
1074
|
-
}
|
|
1075
|
-
catch {
|
|
1076
|
-
return false;
|
|
1077
|
-
}
|
|
1101
|
+
const exp = decodeTokenClaims(token)?.exp;
|
|
1102
|
+
return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
|
|
1078
1103
|
}
|
|
1079
1104
|
/**
|
|
1080
|
-
* PROCESS-WIDE single-flight for the
|
|
1105
|
+
* PROCESS-WIDE single-flight for the device-secret mint
|
|
1081
1106
|
* (`POST /session/device/token`).
|
|
1082
1107
|
*
|
|
1083
|
-
* The server
|
|
1084
|
-
*
|
|
1085
|
-
*
|
|
1086
|
-
*
|
|
1087
|
-
*
|
|
1088
|
-
*
|
|
1089
|
-
*
|
|
1090
|
-
*
|
|
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.
|
|
1091
1117
|
*
|
|
1092
1118
|
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
1093
1119
|
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
@@ -1184,7 +1210,9 @@ export class HttpService {
|
|
|
1184
1210
|
// Authentication is owned by this SDK instance. A caller cannot replace
|
|
1185
1211
|
// the bearer with a different session or leak one across linked apps.
|
|
1186
1212
|
headers.set('Authorization', authHeader);
|
|
1187
|
-
|
|
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();
|
|
1188
1216
|
for (const [name, value] of Object.entries(edgeRegionHeader))
|
|
1189
1217
|
headers.set(name, value);
|
|
1190
1218
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
@@ -1360,13 +1388,7 @@ export class HttpService {
|
|
|
1360
1388
|
* identity-scoped variant `<key> id=*`.
|
|
1361
1389
|
*/
|
|
1362
1390
|
clearCacheEntry(key) {
|
|
1363
|
-
this.
|
|
1364
|
-
const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
|
|
1365
|
-
for (const existing of this.cache.keys()) {
|
|
1366
|
-
if (existing.startsWith(identityVariantPrefix)) {
|
|
1367
|
-
this.cache.delete(existing);
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1391
|
+
this.invalidateCache({ keys: [key] });
|
|
1370
1392
|
}
|
|
1371
1393
|
/**
|
|
1372
1394
|
* Delete every cache entry whose key starts with `prefix`.
|
|
@@ -1377,14 +1399,40 @@ export class HttpService {
|
|
|
1377
1399
|
* deleted entries (for observability in tests).
|
|
1378
1400
|
*/
|
|
1379
1401
|
clearCacheByPrefix(prefix) {
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
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;
|
|
1385
1423
|
}
|
|
1386
|
-
|
|
1387
|
-
|
|
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();
|
|
1388
1436
|
}
|
|
1389
1437
|
getCacheStats() {
|
|
1390
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
|
+
}
|