@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/README.md
CHANGED
|
@@ -11,7 +11,7 @@ bun add @oxy.so/core
|
|
|
11
11
|
## Contents
|
|
12
12
|
|
|
13
13
|
- **OxyServices API client** — all API methods for interacting with OxyHQ services
|
|
14
|
-
- **Device-first session engine** — `SessionClient` (`src/session/`), `runSessionColdBoot
|
|
14
|
+
- **Device-first session engine** — `SessionClient` (`src/session/`), `runSessionColdBoot` and `oxy.devices.mintToken` (all in `@oxy.so/core/session` + the client), which back `OxyProvider` in `@oxy.so/services`
|
|
15
15
|
- **OAuth helpers** — `generatePkcePair`, `generateOAuthState`, `buildOAuthAuthorizeUrl` for third-party "Sign in with Oxy" (see [docs/auth/integration-guide.md](../../docs/auth/integration-guide.md))
|
|
16
16
|
- **Crypto** — KeyManager, SignatureService, RecoveryPhraseService
|
|
17
17
|
- **Models and types** — User, ApiError, ClientSession, and more
|
|
@@ -27,19 +27,25 @@ bun add @oxy.so/core
|
|
|
27
27
|
|
|
28
28
|
The package exposes two public entry points:
|
|
29
29
|
|
|
30
|
-
- `@oxy.so/core` —
|
|
31
|
-
- `@oxy.so/core/
|
|
30
|
+
- `@oxy.so/core` — the `OxyServices` client and its namespaces, `OxyApiError`, models, shared utilities, i18n, platform helpers
|
|
31
|
+
- `@oxy.so/core/session` — `SessionClient`, the account dialog controller, auth-state stores, cold boot
|
|
32
|
+
- `@oxy.so/core/crypto` — `KeyManager`, `SignatureService`, `RecoveryPhraseService` and the primitives under them
|
|
33
|
+
- `@oxy.so/core/civic`, `@oxy.so/core/inference`, `@oxy.so/core/logger`
|
|
34
|
+
- `@oxy.so/core/server` — `OxyServer` (service tokens, `middleware.*`) and the Express helpers (`createOxyRateLimit`, `createOxyAuthMiddleware`, `requireOxyAuth`, `getOxyUserId`, `getRequiredOxyUserId`, `createOxyCors`, `createOxySecurityHeaders`, `buildOxyCspDirectives`, `safeFetch`, `verifySecret`, and request types)
|
|
32
35
|
|
|
33
|
-
|
|
36
|
+
Heavy pieces have their own entries so an app ships only what it uses; React Native and browser bundles never import Express. The full API map is [docs/api.mdx](./docs/api.mdx).
|
|
34
37
|
|
|
35
38
|
## Usage
|
|
36
39
|
|
|
37
40
|
```ts
|
|
38
|
-
import { OxyServices
|
|
39
|
-
import
|
|
41
|
+
import { OxyServices } from '@oxy.so/core';
|
|
42
|
+
import { KeyManager } from '@oxy.so/core/crypto';
|
|
43
|
+
import type { User } from '@oxy.so/core';
|
|
44
|
+
|
|
45
|
+
const oxy = new OxyServices({ baseURL: 'https://api.oxy.so' });
|
|
40
46
|
|
|
41
47
|
// Get user
|
|
42
|
-
const user = await
|
|
48
|
+
const user: User = await oxy.users.get('123');
|
|
43
49
|
|
|
44
50
|
// Crypto (KeyManager methods are static)
|
|
45
51
|
const hasIdentity = await KeyManager.hasIdentity();
|
package/dist/cjs/HttpService.js
CHANGED
|
@@ -19,8 +19,8 @@ const cache_1 = require("./utils/cache");
|
|
|
19
19
|
const requestUtils_1 = require("./utils/requestUtils");
|
|
20
20
|
const asyncUtils_1 = require("./utils/asyncUtils");
|
|
21
21
|
const errorUtils_1 = require("./utils/errorUtils");
|
|
22
|
-
const
|
|
23
|
-
const
|
|
22
|
+
const tokenClaims_1 = require("./utils/tokenClaims");
|
|
23
|
+
const random_1 = require("@oxy.so/protocol/random");
|
|
24
24
|
const cacheKey_1 = require("./utils/cacheKey");
|
|
25
25
|
const redactUrl_1 = require("./utils/redactUrl");
|
|
26
26
|
const OxyServices_errors_1 = require("./OxyServices.errors");
|
|
@@ -32,6 +32,26 @@ const activityId_1 = require("./utils/activityId");
|
|
|
32
32
|
* endpoint surfaces as an `AbortError` quickly rather than blocking the
|
|
33
33
|
* request queue.
|
|
34
34
|
*/
|
|
35
|
+
/**
|
|
36
|
+
* Strip leading or trailing `/`s without a regex: `/\/+$/` backtracks
|
|
37
|
+
* polynomially on a long run of slashes (CodeQL js/polynomial-redos), and this
|
|
38
|
+
* runs on every request.
|
|
39
|
+
*/
|
|
40
|
+
function trimSlashes(value, side) {
|
|
41
|
+
let start = 0;
|
|
42
|
+
let end = value.length;
|
|
43
|
+
if (side === 'start')
|
|
44
|
+
while (start < end && value.charCodeAt(start) === 47)
|
|
45
|
+
start++;
|
|
46
|
+
else
|
|
47
|
+
while (end > start && value.charCodeAt(end - 1) === 47)
|
|
48
|
+
end--;
|
|
49
|
+
return value.slice(start, end);
|
|
50
|
+
}
|
|
51
|
+
/** Methods whose calls concurrent callers may share (read-only). */
|
|
52
|
+
const SAFE_METHODS = new Set(['GET']);
|
|
53
|
+
/** Methods safe to re-send after a transient failure (RFC 9110 §9.2.2). */
|
|
54
|
+
const IDEMPOTENT_METHODS = new Set(['GET', 'PUT', 'DELETE']);
|
|
35
55
|
const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|
|
36
56
|
/**
|
|
37
57
|
* Cooldown (ms) applied after a failed access-token refresh before another
|
|
@@ -97,18 +117,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
|
|
|
97
117
|
* lead window. `false` for an expired, opaque or no-`exp` token.
|
|
98
118
|
*/
|
|
99
119
|
function isInsideRefreshLeadWindow(token) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (typeof decoded.exp !== 'number') {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
const now = Math.floor(Date.now() / 1000);
|
|
106
|
-
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
107
|
-
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
120
|
+
const decoded = (0, tokenClaims_1.decodeTokenClaims)(token);
|
|
121
|
+
if (typeof decoded?.exp !== 'number') {
|
|
110
122
|
return false;
|
|
111
123
|
}
|
|
124
|
+
const now = Math.floor(Date.now() / 1000);
|
|
125
|
+
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
126
|
+
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
112
127
|
}
|
|
113
128
|
/**
|
|
114
129
|
* Soft ceiling on the number of live entries in the identity-scoped GET
|
|
@@ -236,6 +251,7 @@ class HttpService {
|
|
|
236
251
|
this.noFresherTokenThan = null;
|
|
237
252
|
this.authRefreshHandler = null;
|
|
238
253
|
this.accessTokenProvider = null;
|
|
254
|
+
this.anonymousAuthProvider = null;
|
|
239
255
|
this.deviceSecretMintInFlight = null;
|
|
240
256
|
/**
|
|
241
257
|
* Bumped by every {@link endSession}. A re-mint captures it before its first
|
|
@@ -378,7 +394,15 @@ class HttpService {
|
|
|
378
394
|
* Main request method - handles everything in one place
|
|
379
395
|
*/
|
|
380
396
|
async request(config) {
|
|
381
|
-
const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL,
|
|
397
|
+
const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL,
|
|
398
|
+
// Only reads are shared by default. A write's body can be opaque
|
|
399
|
+
// (`FormData`, `URLSearchParams` key as empty objects), so two different
|
|
400
|
+
// uploads used to collapse into one call and the second caller got the
|
|
401
|
+
// first file's result.
|
|
402
|
+
deduplicate = SAFE_METHODS.has(method),
|
|
403
|
+
// Only idempotent methods are re-sent by default: re-sending a POST after a
|
|
404
|
+
// 5xx or a dropped connection can apply it twice.
|
|
405
|
+
retry = this.config.enableRetry !== false && IDEMPOTENT_METHODS.has(method), maxRetries = this.config.maxRetries || 3, } = config;
|
|
382
406
|
// A per-instance disabled cache (`enableCache:false` / `cacheTTL<=0`)
|
|
383
407
|
// overrides any per-request `cache:true`: nothing is read from nor written
|
|
384
408
|
// to the response cache. Request deduplication below is unaffected.
|
|
@@ -408,7 +432,9 @@ class HttpService {
|
|
|
408
432
|
// 401 retry re-enters request() with a fresh config, so it re-resolves
|
|
409
433
|
// this here with the refreshed token.
|
|
410
434
|
const authHeader = config.skipAuth ? null : await this.getAuthHeader();
|
|
411
|
-
|
|
435
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
436
|
+
// to a second in front of requests.
|
|
437
|
+
const edgeRegionHeader = (0, edgeRegion_1.peekBrowserEdgeRegionHeader)();
|
|
412
438
|
const activityIdHeader = (0, activityId_1.getBrowserActivityIdHeader)();
|
|
413
439
|
// A request the caller has ALREADY abandoned takes no queue slot and makes
|
|
414
440
|
// no network call. Checked here, before enqueue, because a slot is the
|
|
@@ -417,40 +443,30 @@ class HttpService {
|
|
|
417
443
|
if (signal?.aborted) {
|
|
418
444
|
throw (0, errorUtils_1.createCancelledError)('Request cancelled before it was sent');
|
|
419
445
|
}
|
|
420
|
-
//
|
|
421
|
-
//
|
|
422
|
-
//
|
|
423
|
-
|
|
424
|
-
// linked to each new controller with a bare `addEventListener`. An `abort`
|
|
425
|
-
// event fires once, so on attempt 2 the caller's already-fired signal could
|
|
426
|
-
// not abort the freshly built controller, and the request the caller had
|
|
427
|
-
// cancelled went out for real. Hoisting the linkage means a cancellation
|
|
428
|
-
// arrives once and is then true for every attempt, including ones not yet
|
|
429
|
-
// started.
|
|
430
|
-
const callController = new AbortController();
|
|
431
|
-
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
432
|
-
/**
|
|
433
|
-
* Which of our own timers fired, so a timeout can be told apart from a
|
|
434
|
-
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
435
|
-
* `AbortError`, and collapsing them (as this used to) is what let the retry
|
|
436
|
-
* predicate treat an abandoned request as a transient failure.
|
|
437
|
-
*/
|
|
438
|
-
let timedOut = false;
|
|
439
|
-
// Request function
|
|
440
|
-
const requestFn = async () => {
|
|
446
|
+
// One network attempt, inside the call's abort domain `domain`: the caller's
|
|
447
|
+
// own signal, or — when deduplicated — the shared work's, which aborts only
|
|
448
|
+
// once every caller waiting on it has cancelled.
|
|
449
|
+
const attempt = async (domain) => {
|
|
441
450
|
const startTime = Date.now();
|
|
442
451
|
// Re-checked per attempt so no retry can issue a network call after the
|
|
443
452
|
// caller gave up — belt to `retryAsync`'s braces, and the one that holds
|
|
444
453
|
// if a custom `shouldRetry` ever says yes to a cancellation.
|
|
445
|
-
if (
|
|
454
|
+
if (domain.aborted) {
|
|
446
455
|
throw (0, errorUtils_1.createCancelledError)('Request cancelled');
|
|
447
456
|
}
|
|
457
|
+
/**
|
|
458
|
+
* Whether OUR timer fired, so a timeout can be told apart from a
|
|
459
|
+
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
460
|
+
* `AbortError`, and collapsing them is what let the retry predicate treat
|
|
461
|
+
* an abandoned request as a transient failure.
|
|
462
|
+
*/
|
|
463
|
+
let timedOut = false;
|
|
448
464
|
// This attempt's controller carries its own timeout and inherits the
|
|
449
465
|
// call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
|
|
450
466
|
// that releases them can see them — the timer and the listener are
|
|
451
467
|
// exactly what leaked when they lived inside it.
|
|
452
468
|
const controller = new AbortController();
|
|
453
|
-
const disposeCallLink = linkAbort(
|
|
469
|
+
const disposeCallLink = linkAbort(domain, controller);
|
|
454
470
|
const timeoutId = timeout
|
|
455
471
|
? setTimeout(() => {
|
|
456
472
|
timedOut = true;
|
|
@@ -476,19 +492,19 @@ class HttpService {
|
|
|
476
492
|
}
|
|
477
493
|
// Add authorization header if available
|
|
478
494
|
if (authHeader) {
|
|
479
|
-
headers
|
|
495
|
+
headers.Authorization = authHeader;
|
|
480
496
|
}
|
|
481
497
|
// Merge custom headers if provided
|
|
482
498
|
if (config.headers) {
|
|
483
|
-
Object.entries(config.headers)
|
|
499
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
484
500
|
// For FormData, explicitly remove Content-Type if user tries to set it
|
|
485
501
|
// The browser/fetch API will set it automatically with the boundary
|
|
486
502
|
if (isFormData && key.toLowerCase() === 'content-type') {
|
|
487
503
|
this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
|
|
488
|
-
|
|
504
|
+
continue;
|
|
489
505
|
}
|
|
490
506
|
headers[key] = value;
|
|
491
|
-
}
|
|
507
|
+
}
|
|
492
508
|
}
|
|
493
509
|
// This is Cloudflare's coarse serving PoP (for example `mad`), never an
|
|
494
510
|
// IP or coordinate. Set it after caller headers so request code cannot
|
|
@@ -507,7 +523,7 @@ class HttpService {
|
|
|
507
523
|
// RN's native XMLHttpRequest handles those descriptors correctly, so we
|
|
508
524
|
// route multipart uploads through XHR on RN only. JSON, text, etc. still
|
|
509
525
|
// use fetch on every platform.
|
|
510
|
-
const useXhrForUpload = isFormData && (0,
|
|
526
|
+
const useXhrForUpload = isFormData && (0, random_1.isReactNative)() && typeof XMLHttpRequest !== 'undefined';
|
|
511
527
|
const response = useXhrForUpload
|
|
512
528
|
? await this.uploadViaXHR(fullUrl, method, headers, bodyValue, controller.signal, timeout, this.shouldSendCredentials(fullUrl))
|
|
513
529
|
: await fetch(fullUrl, {
|
|
@@ -536,7 +552,12 @@ class HttpService {
|
|
|
536
552
|
// deduplicated retry would resolve to the still-pending original
|
|
537
553
|
// and await itself (deadlock). Opting the retry out of dedupe makes
|
|
538
554
|
// it a fresh request.
|
|
539
|
-
|
|
555
|
+
//
|
|
556
|
+
// `bypassQueue: true` is REQUIRED too: this attempt still holds its
|
|
557
|
+
// queue slot, so a queued retry waits for a slot while holding one.
|
|
558
|
+
// With every slot held by a 401 (a revoked session under load) no
|
|
559
|
+
// retry could ever start and the whole client stalled.
|
|
560
|
+
return this.request({ ...config, _isAuthRetry: true, retry: false, deduplicate: false, bypassQueue: true });
|
|
540
561
|
}
|
|
541
562
|
// Refresh failed or no token — clear tokens
|
|
542
563
|
this.tokenStore.clearTokens();
|
|
@@ -581,7 +602,7 @@ class HttpService {
|
|
|
581
602
|
if (config.responseType === 'blob') {
|
|
582
603
|
responseData = await response.blob();
|
|
583
604
|
}
|
|
584
|
-
else if (contentType
|
|
605
|
+
else if (contentType?.includes('application/json')) {
|
|
585
606
|
// Use response.json() directly for better performance
|
|
586
607
|
try {
|
|
587
608
|
responseData = await response.json();
|
|
@@ -664,47 +685,55 @@ class HttpService {
|
|
|
664
685
|
disposeCallLink();
|
|
665
686
|
}
|
|
666
687
|
};
|
|
667
|
-
//
|
|
688
|
+
// Composition: dedupe(retry(queue(attempt))). A queue slot is network
|
|
689
|
+
// occupancy only — each attempt takes one and releases it — so neither the
|
|
690
|
+
// retry backoff sleep nor a deduplicated caller waiting on shared work holds
|
|
691
|
+
// a slot while doing nothing.
|
|
668
692
|
//
|
|
669
|
-
// `retryOnTimeout` defaults to false in `retryAsync
|
|
670
|
-
//
|
|
671
|
-
//
|
|
672
|
-
|
|
673
|
-
//
|
|
674
|
-
|
|
675
|
-
|
|
693
|
+
// `retryOnTimeout` defaults to false in `retryAsync`: a timeout costs ONE
|
|
694
|
+
// attempt, a cancellation none. `deadline` bounds whatever retries do happen
|
|
695
|
+
// by wall clock rather than by attempts x timeout + backoff.
|
|
696
|
+
const runAttempt = (domain) =>
|
|
697
|
+
// Control-plane calls the auth lane depends on (`bypassQueue`, e.g. the
|
|
698
|
+
// device-secret mint) run DIRECTLY — a queued mint could never acquire a
|
|
699
|
+
// slot when every slot is parked awaiting it.
|
|
700
|
+
config.bypassQueue ? attempt(domain) : this.requestQueue.enqueue(() => attempt(domain), domain);
|
|
701
|
+
const execute = (domain) => retry
|
|
702
|
+
? (0, asyncUtils_1.retryAsync)(() => runAttempt(domain), {
|
|
676
703
|
maxRetries,
|
|
677
704
|
baseDelay: this.config.retryDelay || 1000,
|
|
678
705
|
retryOnTimeout: config.retryOnTimeout ?? false,
|
|
679
706
|
deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
|
|
680
707
|
})
|
|
681
|
-
:
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
//
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
//
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
708
|
+
: runAttempt(domain);
|
|
709
|
+
let result;
|
|
710
|
+
if (deduplicate) {
|
|
711
|
+
// The cache key IS the dedupe key (same method, url, payload, identity);
|
|
712
|
+
// computed once per call.
|
|
713
|
+
const dedupeKey = cacheKey ?? this.generateCacheKey(method, url, data || params);
|
|
714
|
+
result = await this.deduplicator.deduplicate(dedupeKey, execute, signal);
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
// The call's own abort domain, linked to the caller's signal ONCE, so a
|
|
718
|
+
// cancellation arrives once and is then true for every attempt, including
|
|
719
|
+
// ones not yet started. Released however the call ends: a caller signal
|
|
720
|
+
// that outlives the request (a React Query signal) would otherwise accrue
|
|
721
|
+
// one listener per request.
|
|
722
|
+
const callController = new AbortController();
|
|
723
|
+
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
724
|
+
try {
|
|
725
|
+
result = await execute(callController.signal);
|
|
726
|
+
}
|
|
727
|
+
finally {
|
|
728
|
+
disposeCallerLink?.();
|
|
698
729
|
}
|
|
699
|
-
return result;
|
|
700
730
|
}
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
// listener per request for its whole lifetime.
|
|
706
|
-
disposeCallerLink?.();
|
|
731
|
+
// Cache the result if caching is enabled
|
|
732
|
+
if (cache && cacheKey && result) {
|
|
733
|
+
this.cache.set(cacheKey, result, cacheTTL);
|
|
734
|
+
this.warnIfCacheOversized();
|
|
707
735
|
}
|
|
736
|
+
return result;
|
|
708
737
|
}
|
|
709
738
|
/**
|
|
710
739
|
* Soft cache-size guard. Emits a single throttled telemetry warning when the
|
|
@@ -891,16 +920,16 @@ class HttpService {
|
|
|
891
920
|
buildURL(url, params) {
|
|
892
921
|
const base = /^https?:\/\//i.test(url)
|
|
893
922
|
? url
|
|
894
|
-
: `${this.baseURL
|
|
923
|
+
: `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
|
|
895
924
|
if (!params || Object.keys(params).length === 0) {
|
|
896
925
|
return base;
|
|
897
926
|
}
|
|
898
927
|
const searchParams = new URLSearchParams();
|
|
899
|
-
|
|
928
|
+
for (const [key, value] of Object.entries(params)) {
|
|
900
929
|
if (value !== undefined && value !== null) {
|
|
901
930
|
searchParams.append(key, String(value));
|
|
902
931
|
}
|
|
903
|
-
}
|
|
932
|
+
}
|
|
904
933
|
const queryString = searchParams.toString();
|
|
905
934
|
return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
|
|
906
935
|
}
|
|
@@ -921,10 +950,12 @@ class HttpService {
|
|
|
921
950
|
async getAuthHeader() {
|
|
922
951
|
const accessToken = this.syncAccessTokenFromProvider();
|
|
923
952
|
if (!accessToken) {
|
|
924
|
-
return
|
|
953
|
+
return this.getAnonymousAuthHeader();
|
|
925
954
|
}
|
|
926
955
|
try {
|
|
927
|
-
const decoded = (0,
|
|
956
|
+
const decoded = (0, tokenClaims_1.decodeTokenClaims)(accessToken);
|
|
957
|
+
if (!decoded)
|
|
958
|
+
throw new Error('opaque token');
|
|
928
959
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
929
960
|
// If the token expires within the refresh lead window, refresh it.
|
|
930
961
|
if (decoded.exp && decoded.exp - currentTime < TOKEN_REFRESH_LEAD_SECONDS) {
|
|
@@ -950,6 +981,24 @@ class HttpService {
|
|
|
950
981
|
return null;
|
|
951
982
|
}
|
|
952
983
|
}
|
|
984
|
+
/**
|
|
985
|
+
* The bearer for a request that has no user session behind it, from the
|
|
986
|
+
* {@link AnonymousAuthProvider} if one is installed. Never throws: a provider
|
|
987
|
+
* that fails sends the request anonymous, exactly as it went before any
|
|
988
|
+
* provider existed.
|
|
989
|
+
*/
|
|
990
|
+
async getAnonymousAuthHeader() {
|
|
991
|
+
if (!this.anonymousAuthProvider)
|
|
992
|
+
return null;
|
|
993
|
+
try {
|
|
994
|
+
const token = await this.anonymousAuthProvider();
|
|
995
|
+
return token ? `Bearer ${token}` : null;
|
|
996
|
+
}
|
|
997
|
+
catch (error) {
|
|
998
|
+
this.logger.debug('Anonymous auth provider failed; sending the request anonymous:', error);
|
|
999
|
+
return null;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
953
1002
|
async refreshAccessToken(reason) {
|
|
954
1003
|
if (!this.authRefreshHandler) {
|
|
955
1004
|
return null;
|
|
@@ -1052,26 +1101,22 @@ class HttpService {
|
|
|
1052
1101
|
if (!token) {
|
|
1053
1102
|
return false;
|
|
1054
1103
|
}
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
|
|
1058
|
-
}
|
|
1059
|
-
catch {
|
|
1060
|
-
return false;
|
|
1061
|
-
}
|
|
1104
|
+
const exp = (0, tokenClaims_1.decodeTokenClaims)(token)?.exp;
|
|
1105
|
+
return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
|
|
1062
1106
|
}
|
|
1063
1107
|
/**
|
|
1064
|
-
* PROCESS-WIDE single-flight for the
|
|
1108
|
+
* PROCESS-WIDE single-flight for the device-secret mint
|
|
1065
1109
|
* (`POST /session/device/token`).
|
|
1066
1110
|
*
|
|
1067
|
-
* The server
|
|
1068
|
-
*
|
|
1069
|
-
*
|
|
1070
|
-
*
|
|
1071
|
-
*
|
|
1072
|
-
*
|
|
1073
|
-
*
|
|
1074
|
-
*
|
|
1111
|
+
* The server does not rotate the presented `deviceSecret` (it echoes it back
|
|
1112
|
+
* as `nextDeviceSecret`; each holder of a shared DeviceSession has its own
|
|
1113
|
+
* stable credential), so this is no longer what keeps the store's secret
|
|
1114
|
+
* valid. It still collapses concurrent callers onto one request and one
|
|
1115
|
+
* persisted write. Every mint lane (the re-mint handler behind
|
|
1116
|
+
* `refreshAccessToken`, the device-first cold boot, the socket token
|
|
1117
|
+
* transport, the tab-focus reconcile) funnels its `refreshDeviceSecretArm`
|
|
1118
|
+
* call through here, so concurrent callers await the SAME in-flight mint and
|
|
1119
|
+
* all receive its result.
|
|
1075
1120
|
*
|
|
1076
1121
|
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
1077
1122
|
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
@@ -1168,7 +1213,9 @@ class HttpService {
|
|
|
1168
1213
|
// Authentication is owned by this SDK instance. A caller cannot replace
|
|
1169
1214
|
// the bearer with a different session or leak one across linked apps.
|
|
1170
1215
|
headers.set('Authorization', authHeader);
|
|
1171
|
-
|
|
1216
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
1217
|
+
// to a second in front of requests.
|
|
1218
|
+
const edgeRegionHeader = (0, edgeRegion_1.peekBrowserEdgeRegionHeader)();
|
|
1172
1219
|
for (const [name, value] of Object.entries(edgeRegionHeader))
|
|
1173
1220
|
headers.set(name, value);
|
|
1174
1221
|
const activityIdHeader = (0, activityId_1.getBrowserActivityIdHeader)();
|
|
@@ -1258,6 +1305,16 @@ class HttpService {
|
|
|
1258
1305
|
setAccessTokenProvider(provider) {
|
|
1259
1306
|
this.accessTokenProvider = provider;
|
|
1260
1307
|
}
|
|
1308
|
+
/**
|
|
1309
|
+
* Authenticate requests that carry no user session with the bearer this
|
|
1310
|
+
* provider returns — in practice a backend's own service token (see
|
|
1311
|
+
* `OxyConfig.serviceIdentity`). A user session always wins: the provider is
|
|
1312
|
+
* consulted only when there is no access token, and never for `skipAuth`
|
|
1313
|
+
* requests. `null` removes it.
|
|
1314
|
+
*/
|
|
1315
|
+
setAnonymousAuthProvider(provider) {
|
|
1316
|
+
this.anonymousAuthProvider = provider;
|
|
1317
|
+
}
|
|
1261
1318
|
clearTokens() {
|
|
1262
1319
|
this.tokenStore.clearTokens();
|
|
1263
1320
|
// Drop the response cache on logout. The cache is identity-scoped, so a
|
|
@@ -1334,13 +1391,7 @@ class HttpService {
|
|
|
1334
1391
|
* identity-scoped variant `<key> id=*`.
|
|
1335
1392
|
*/
|
|
1336
1393
|
clearCacheEntry(key) {
|
|
1337
|
-
this.
|
|
1338
|
-
const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
|
|
1339
|
-
for (const existing of this.cache.keys()) {
|
|
1340
|
-
if (existing.startsWith(identityVariantPrefix)) {
|
|
1341
|
-
this.cache.delete(existing);
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1394
|
+
this.invalidateCache({ keys: [key] });
|
|
1344
1395
|
}
|
|
1345
1396
|
/**
|
|
1346
1397
|
* Delete every cache entry whose key starts with `prefix`.
|
|
@@ -1351,14 +1402,40 @@ class HttpService {
|
|
|
1351
1402
|
* deleted entries (for observability in tests).
|
|
1352
1403
|
*/
|
|
1353
1404
|
clearCacheByPrefix(prefix) {
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1405
|
+
return this.invalidateCache({ prefixes: [prefix] });
|
|
1406
|
+
}
|
|
1407
|
+
/**
|
|
1408
|
+
* Invalidate a set of LOGICAL keys (each with every identity-scoped variant,
|
|
1409
|
+
* see `clearCacheEntry`) and key prefixes in ONE pass over the cache. A
|
|
1410
|
+
* mutation touching many resources (a bulk follow) costs one scan, not one
|
|
1411
|
+
* per resource.
|
|
1412
|
+
* @returns Number of entries deleted
|
|
1413
|
+
*/
|
|
1414
|
+
invalidateCache({ keys = [], prefixes = [] }) {
|
|
1415
|
+
if (keys.length === 0 && prefixes.length === 0)
|
|
1416
|
+
return 0;
|
|
1417
|
+
const exact = new Set(keys);
|
|
1418
|
+
const delim = HttpService.CACHE_IDENTITY_DELIM;
|
|
1419
|
+
return this.cache.deleteWhere((stored) => {
|
|
1420
|
+
const cut = stored.lastIndexOf(delim);
|
|
1421
|
+
if (exact.has(cut === -1 ? stored : stored.slice(0, cut)))
|
|
1422
|
+
return true;
|
|
1423
|
+
for (const prefix of prefixes) {
|
|
1424
|
+
if (stored.startsWith(prefix))
|
|
1425
|
+
return true;
|
|
1359
1426
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1427
|
+
return false;
|
|
1428
|
+
});
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* Release this client: its response cache leaves the global cleanup sweep and
|
|
1432
|
+
* is emptied, pending shared calls are forgotten, and the session ends.
|
|
1433
|
+
*/
|
|
1434
|
+
dispose() {
|
|
1435
|
+
(0, cache_1.unregisterCacheFromCleanup)(this.cache);
|
|
1436
|
+
this.cache.clear();
|
|
1437
|
+
this.deduplicator.clear();
|
|
1438
|
+
this.endSession();
|
|
1362
1439
|
}
|
|
1363
1440
|
getCacheStats() {
|
|
1364
1441
|
const cacheStats = this.cache.getStats();
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OxyAuthenticationTimeoutError = exports.ServiceLinkedDownloadUrlError = exports.ServiceAssetMetadataError = exports.AssetUrlResolutionError = exports.OxyAuthenticationError = void 0;
|
|
3
|
+
exports.OxyApiError = exports.OxyAuthenticationTimeoutError = exports.ServiceLinkedDownloadUrlError = exports.ServiceAssetMetadataError = exports.AssetUrlResolutionError = exports.OxyAuthenticationError = void 0;
|
|
4
|
+
exports.toOxyApiError = toOxyApiError;
|
|
5
|
+
const errorUtils_1 = require("./utils/errorUtils");
|
|
4
6
|
/**
|
|
5
7
|
* Custom error types for better error handling
|
|
6
8
|
*/
|
|
@@ -120,3 +122,48 @@ class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
|
|
|
120
122
|
}
|
|
121
123
|
}
|
|
122
124
|
exports.OxyAuthenticationTimeoutError = OxyAuthenticationTimeoutError;
|
|
125
|
+
/**
|
|
126
|
+
* The one error every `OxyServices` call rejects with.
|
|
127
|
+
*
|
|
128
|
+
* `status` is the HTTP status (0 when no response arrived: a network failure,
|
|
129
|
+
* a timeout or a cancellation), `code` the API's machine code when it sent one
|
|
130
|
+
* (else a transport code such as `TIMEOUT`, `NETWORK_ERROR`, `CANCELLED`), and
|
|
131
|
+
* `details` the API's structured detail. The original error is `cause`.
|
|
132
|
+
*/
|
|
133
|
+
class OxyApiError extends Error {
|
|
134
|
+
constructor(message, init) {
|
|
135
|
+
super(message);
|
|
136
|
+
this.name = 'OxyApiError';
|
|
137
|
+
this.status = init.status;
|
|
138
|
+
this.code = init.code;
|
|
139
|
+
this.details = init.details;
|
|
140
|
+
this.response = init.response;
|
|
141
|
+
this.cancelled = init.cancelled ?? false;
|
|
142
|
+
this.timeout = init.timeout ?? false;
|
|
143
|
+
if (init.cause !== undefined) {
|
|
144
|
+
this.cause = init.cause;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.OxyApiError = OxyApiError;
|
|
149
|
+
/**
|
|
150
|
+
* Normalise anything a request rejected with into an `OxyApiError`. An error
|
|
151
|
+
* that already is one (or a typed SDK error such as `OxyAuthenticationError`)
|
|
152
|
+
* passes through unchanged.
|
|
153
|
+
*/
|
|
154
|
+
function toOxyApiError(error) {
|
|
155
|
+
if (error instanceof OxyApiError || error instanceof OxyAuthenticationError) {
|
|
156
|
+
return error;
|
|
157
|
+
}
|
|
158
|
+
const api = (0, errorUtils_1.handleHttpError)(error);
|
|
159
|
+
const source = (error && typeof error === 'object' ? error : {});
|
|
160
|
+
return new OxyApiError(api.message?.trim() || 'An unexpected error occurred', {
|
|
161
|
+
status: api.status,
|
|
162
|
+
code: api.code,
|
|
163
|
+
details: api.details,
|
|
164
|
+
response: source.response,
|
|
165
|
+
cancelled: source.cancelled === true,
|
|
166
|
+
timeout: source.timeout === true,
|
|
167
|
+
cause: error,
|
|
168
|
+
});
|
|
169
|
+
}
|