@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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxy.so/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "OxyHQ SDK Foundation — API client, authentication, cryptographic identity, and shared utilities",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -12,6 +12,18 @@
|
|
|
12
12
|
],
|
|
13
13
|
"logger": [
|
|
14
14
|
"dist/types/logger/index.d.ts"
|
|
15
|
+
],
|
|
16
|
+
"inference": [
|
|
17
|
+
"dist/types/inference/index.d.ts"
|
|
18
|
+
],
|
|
19
|
+
"session": [
|
|
20
|
+
"dist/types/session/index.d.ts"
|
|
21
|
+
],
|
|
22
|
+
"crypto": [
|
|
23
|
+
"dist/types/crypto/index.d.ts"
|
|
24
|
+
],
|
|
25
|
+
"civic": [
|
|
26
|
+
"dist/types/civic/index.d.ts"
|
|
15
27
|
]
|
|
16
28
|
}
|
|
17
29
|
},
|
|
@@ -59,12 +71,62 @@
|
|
|
59
71
|
},
|
|
60
72
|
"default": "./dist/esm/logger/index.js"
|
|
61
73
|
},
|
|
74
|
+
"./inference": {
|
|
75
|
+
"react-native": "./dist/esm/inference/index.js",
|
|
76
|
+
"import": {
|
|
77
|
+
"types": "./dist/types/inference/index.d.ts",
|
|
78
|
+
"default": "./dist/esm/inference/index.js"
|
|
79
|
+
},
|
|
80
|
+
"require": {
|
|
81
|
+
"types": "./dist/types/inference/index.d.ts",
|
|
82
|
+
"default": "./dist/cjs/inference/index.js"
|
|
83
|
+
},
|
|
84
|
+
"default": "./dist/esm/inference/index.js"
|
|
85
|
+
},
|
|
86
|
+
"./session": {
|
|
87
|
+
"react-native": "./dist/esm/session/index.js",
|
|
88
|
+
"import": {
|
|
89
|
+
"types": "./dist/types/session/index.d.ts",
|
|
90
|
+
"default": "./dist/esm/session/index.js"
|
|
91
|
+
},
|
|
92
|
+
"require": {
|
|
93
|
+
"types": "./dist/types/session/index.d.ts",
|
|
94
|
+
"default": "./dist/cjs/session/index.js"
|
|
95
|
+
},
|
|
96
|
+
"default": "./dist/esm/session/index.js"
|
|
97
|
+
},
|
|
98
|
+
"./crypto": {
|
|
99
|
+
"react-native": "./dist/esm/crypto/index.js",
|
|
100
|
+
"import": {
|
|
101
|
+
"types": "./dist/types/crypto/index.d.ts",
|
|
102
|
+
"default": "./dist/esm/crypto/index.js"
|
|
103
|
+
},
|
|
104
|
+
"require": {
|
|
105
|
+
"types": "./dist/types/crypto/index.d.ts",
|
|
106
|
+
"default": "./dist/cjs/crypto/index.js"
|
|
107
|
+
},
|
|
108
|
+
"default": "./dist/esm/crypto/index.js"
|
|
109
|
+
},
|
|
110
|
+
"./civic": {
|
|
111
|
+
"react-native": "./dist/esm/civic/index.js",
|
|
112
|
+
"import": {
|
|
113
|
+
"types": "./dist/types/civic/index.d.ts",
|
|
114
|
+
"default": "./dist/esm/civic/index.js"
|
|
115
|
+
},
|
|
116
|
+
"require": {
|
|
117
|
+
"types": "./dist/types/civic/index.d.ts",
|
|
118
|
+
"default": "./dist/cjs/civic/index.js"
|
|
119
|
+
},
|
|
120
|
+
"default": "./dist/esm/civic/index.js"
|
|
121
|
+
},
|
|
62
122
|
"./package.json": "./package.json"
|
|
63
123
|
},
|
|
64
124
|
"files": [
|
|
65
125
|
"NOTICE",
|
|
66
126
|
"dist",
|
|
67
|
-
"
|
|
127
|
+
"!dist/**/*.tsbuildinfo",
|
|
128
|
+
"src",
|
|
129
|
+
"!src/**/__tests__"
|
|
68
130
|
],
|
|
69
131
|
"keywords": [
|
|
70
132
|
"oxyhq",
|
|
@@ -83,11 +145,10 @@
|
|
|
83
145
|
"license": "SEE LICENSE IN LICENSE",
|
|
84
146
|
"homepage": "https://oxy.so",
|
|
85
147
|
"engines": {
|
|
86
|
-
"node": ">=
|
|
148
|
+
"node": ">=20.0.0"
|
|
87
149
|
},
|
|
88
150
|
"scripts": {
|
|
89
|
-
"build": "node scripts/build-workspace-deps.mjs @oxy.so/telemetry && bun run build:cjs && bun run build:esm && bun run build:types &&
|
|
90
|
-
"copy-assets": "cp -r src/i18n/locales dist/cjs/i18n/locales && cp -r src/i18n/locales dist/esm/i18n/locales",
|
|
151
|
+
"build": "node scripts/build-workspace-deps.mjs @oxy.so/telemetry && bun run build:cjs && bun run build:esm && bun run build:types && node scripts/mark-module-formats.mjs",
|
|
91
152
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
92
153
|
"build:esm": "tsc -p tsconfig.esm.json && node scripts/fix-esm-imports.mjs",
|
|
93
154
|
"build:types": "tsc -p tsconfig.types.json",
|
|
@@ -115,10 +176,10 @@
|
|
|
115
176
|
}
|
|
116
177
|
},
|
|
117
178
|
"dependencies": {
|
|
118
|
-
"@oxy.so/telemetry": "^1.
|
|
179
|
+
"@oxy.so/telemetry": "^1.2.0",
|
|
119
180
|
"@noble/ciphers": "^1.3.0",
|
|
120
181
|
"@noble/hashes": "^1.8.0",
|
|
121
|
-
"@oxy.so/contracts": "^
|
|
182
|
+
"@oxy.so/contracts": "^3.0.0",
|
|
122
183
|
"@oxy.so/protocol": "^1.1.2",
|
|
123
184
|
"@scure/bip39": "^1.6.0",
|
|
124
185
|
"buffer": "^6.0.3",
|
package/src/HttpService.ts
CHANGED
|
@@ -13,28 +13,20 @@
|
|
|
13
13
|
* - Request queuing
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { TTLCache, registerCacheForCleanup } from './utils/cache';
|
|
16
|
+
import { TTLCache, registerCacheForCleanup, unregisterCacheFromCleanup } from './utils/cache';
|
|
17
17
|
import { RequestDeduplicator, RequestQueue, SimpleLogger } from './utils/requestUtils';
|
|
18
18
|
import { retryAsync } from './utils/asyncUtils';
|
|
19
19
|
import { createCancelledError, ErrorCodes, handleHttpError, isCancelledError, parseHttpErrorBody } from './utils/errorUtils';
|
|
20
|
-
import {
|
|
21
|
-
import { isReactNative } from '@oxy.so/protocol';
|
|
20
|
+
import { decodeTokenClaims } from './utils/tokenClaims';
|
|
21
|
+
import { isReactNative } from '@oxy.so/protocol/random';
|
|
22
22
|
import { computeIdentityTag, fnv1a32 } from './utils/cacheKey';
|
|
23
23
|
import { redactUrlQuery } from './utils/redactUrl';
|
|
24
24
|
import type { OxyConfig } from './models/interfaces';
|
|
25
25
|
import type { DeviceSecretMintOutcome } from './session/refresh';
|
|
26
26
|
import { OxyAuthenticationError } from './OxyServices.errors';
|
|
27
|
-
import {
|
|
27
|
+
import { peekBrowserEdgeRegionHeader } from './utils/edgeRegion';
|
|
28
28
|
import { getBrowserActivityIdHeader } from './utils/activityId';
|
|
29
29
|
|
|
30
|
-
interface JwtPayload {
|
|
31
|
-
exp?: number;
|
|
32
|
-
userId?: string;
|
|
33
|
-
id?: string;
|
|
34
|
-
sessionId?: string;
|
|
35
|
-
[key: string]: unknown;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
30
|
export type AuthRefreshReason = 'preflight' | 'response-401';
|
|
39
31
|
export type AuthRefreshHandler = (reason: AuthRefreshReason) => Promise<string | null>;
|
|
40
32
|
export type AccessTokenProvider = () => string | null;
|
|
@@ -150,6 +142,25 @@ interface RequestConfig extends RequestOptions {
|
|
|
150
142
|
* endpoint surfaces as an `AbortError` quickly rather than blocking the
|
|
151
143
|
* request queue.
|
|
152
144
|
*/
|
|
145
|
+
/**
|
|
146
|
+
* Strip leading or trailing `/`s without a regex: `/\/+$/` backtracks
|
|
147
|
+
* polynomially on a long run of slashes (CodeQL js/polynomial-redos), and this
|
|
148
|
+
* runs on every request.
|
|
149
|
+
*/
|
|
150
|
+
function trimSlashes(value: string, side: 'start' | 'end'): string {
|
|
151
|
+
let start = 0;
|
|
152
|
+
let end = value.length;
|
|
153
|
+
if (side === 'start') while (start < end && value.charCodeAt(start) === 47) start++;
|
|
154
|
+
else while (end > start && value.charCodeAt(end - 1) === 47) end--;
|
|
155
|
+
return value.slice(start, end);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Methods whose calls concurrent callers may share (read-only). */
|
|
159
|
+
const SAFE_METHODS: ReadonlySet<string> = new Set(['GET']);
|
|
160
|
+
|
|
161
|
+
/** Methods safe to re-send after a transient failure (RFC 9110 §9.2.2). */
|
|
162
|
+
const IDEMPOTENT_METHODS: ReadonlySet<string> = new Set(['GET', 'PUT', 'DELETE']);
|
|
163
|
+
|
|
153
164
|
const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|
|
154
165
|
|
|
155
166
|
/**
|
|
@@ -220,17 +231,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
|
|
|
220
231
|
* lead window. `false` for an expired, opaque or no-`exp` token.
|
|
221
232
|
*/
|
|
222
233
|
function isInsideRefreshLeadWindow(token: string): boolean {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (typeof decoded.exp !== 'number') {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
const now = Math.floor(Date.now() / 1000);
|
|
229
|
-
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
230
|
-
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
231
|
-
} catch {
|
|
234
|
+
const decoded = decodeTokenClaims(token);
|
|
235
|
+
if (typeof decoded?.exp !== 'number') {
|
|
232
236
|
return false;
|
|
233
237
|
}
|
|
238
|
+
const now = Math.floor(Date.now() / 1000);
|
|
239
|
+
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
240
|
+
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
234
241
|
}
|
|
235
242
|
|
|
236
243
|
/**
|
|
@@ -325,7 +332,7 @@ function linkAbort(parent: AbortSignal, child: AbortController): () => void {
|
|
|
325
332
|
export class HttpService {
|
|
326
333
|
private baseURL: string;
|
|
327
334
|
private tokenStore: TokenStore;
|
|
328
|
-
private cache: TTLCache<
|
|
335
|
+
private cache: TTLCache<unknown>;
|
|
329
336
|
/**
|
|
330
337
|
* When true, the per-instance GET response cache is OFF: GET responses are
|
|
331
338
|
* never read from nor written to {@link cache}, so every request hits the
|
|
@@ -448,7 +455,7 @@ export class HttpService {
|
|
|
448
455
|
this.cacheDisabled =
|
|
449
456
|
config.enableCache === false ||
|
|
450
457
|
(typeof config.cacheTTL === 'number' && config.cacheTTL <= 0);
|
|
451
|
-
this.cache = new TTLCache<
|
|
458
|
+
this.cache = new TTLCache<unknown>(config.cacheTTL && config.cacheTTL > 0 ? config.cacheTTL : 5 * 60 * 1000);
|
|
452
459
|
if (!this.cacheDisabled) {
|
|
453
460
|
registerCacheForCleanup(this.cache);
|
|
454
461
|
}
|
|
@@ -563,8 +570,14 @@ export class HttpService {
|
|
|
563
570
|
signal,
|
|
564
571
|
cache: cacheRequested = method === 'GET',
|
|
565
572
|
cacheTTL,
|
|
566
|
-
|
|
567
|
-
|
|
573
|
+
// Only reads are shared by default. A write's body can be opaque
|
|
574
|
+
// (`FormData`, `URLSearchParams` key as empty objects), so two different
|
|
575
|
+
// uploads used to collapse into one call and the second caller got the
|
|
576
|
+
// first file's result.
|
|
577
|
+
deduplicate = SAFE_METHODS.has(method),
|
|
578
|
+
// Only idempotent methods are re-sent by default: re-sending a POST after a
|
|
579
|
+
// 5xx or a dropped connection can apply it twice.
|
|
580
|
+
retry = this.config.enableRetry !== false && IDEMPOTENT_METHODS.has(method),
|
|
568
581
|
maxRetries = this.config.maxRetries || 3,
|
|
569
582
|
} = config;
|
|
570
583
|
|
|
@@ -600,7 +613,9 @@ export class HttpService {
|
|
|
600
613
|
// 401 retry re-enters request() with a fresh config, so it re-resolves
|
|
601
614
|
// this here with the refreshed token.
|
|
602
615
|
const authHeader = config.skipAuth ? null : await this.getAuthHeader();
|
|
603
|
-
|
|
616
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
617
|
+
// to a second in front of requests.
|
|
618
|
+
const edgeRegionHeader = peekBrowserEdgeRegionHeader();
|
|
604
619
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
605
620
|
|
|
606
621
|
// A request the caller has ALREADY abandoned takes no queue slot and makes
|
|
@@ -611,43 +626,32 @@ export class HttpService {
|
|
|
611
626
|
throw createCancelledError('Request cancelled before it was sent');
|
|
612
627
|
}
|
|
613
628
|
|
|
614
|
-
//
|
|
615
|
-
//
|
|
616
|
-
//
|
|
617
|
-
|
|
618
|
-
// linked to each new controller with a bare `addEventListener`. An `abort`
|
|
619
|
-
// event fires once, so on attempt 2 the caller's already-fired signal could
|
|
620
|
-
// not abort the freshly built controller, and the request the caller had
|
|
621
|
-
// cancelled went out for real. Hoisting the linkage means a cancellation
|
|
622
|
-
// arrives once and is then true for every attempt, including ones not yet
|
|
623
|
-
// started.
|
|
624
|
-
const callController = new AbortController();
|
|
625
|
-
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
626
|
-
|
|
627
|
-
/**
|
|
628
|
-
* Which of our own timers fired, so a timeout can be told apart from a
|
|
629
|
-
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
630
|
-
* `AbortError`, and collapsing them (as this used to) is what let the retry
|
|
631
|
-
* predicate treat an abandoned request as a transient failure.
|
|
632
|
-
*/
|
|
633
|
-
let timedOut = false;
|
|
634
|
-
|
|
635
|
-
// Request function
|
|
636
|
-
const requestFn = async (): Promise<T> => {
|
|
629
|
+
// One network attempt, inside the call's abort domain `domain`: the caller's
|
|
630
|
+
// own signal, or — when deduplicated — the shared work's, which aborts only
|
|
631
|
+
// once every caller waiting on it has cancelled.
|
|
632
|
+
const attempt = async (domain: AbortSignal): Promise<T> => {
|
|
637
633
|
const startTime = Date.now();
|
|
638
634
|
// Re-checked per attempt so no retry can issue a network call after the
|
|
639
635
|
// caller gave up — belt to `retryAsync`'s braces, and the one that holds
|
|
640
636
|
// if a custom `shouldRetry` ever says yes to a cancellation.
|
|
641
|
-
if (
|
|
637
|
+
if (domain.aborted) {
|
|
642
638
|
throw createCancelledError('Request cancelled');
|
|
643
639
|
}
|
|
644
640
|
|
|
641
|
+
/**
|
|
642
|
+
* Whether OUR timer fired, so a timeout can be told apart from a
|
|
643
|
+
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
644
|
+
* `AbortError`, and collapsing them is what let the retry predicate treat
|
|
645
|
+
* an abandoned request as a transient failure.
|
|
646
|
+
*/
|
|
647
|
+
let timedOut = false;
|
|
648
|
+
|
|
645
649
|
// This attempt's controller carries its own timeout and inherits the
|
|
646
650
|
// call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
|
|
647
651
|
// that releases them can see them — the timer and the listener are
|
|
648
652
|
// exactly what leaked when they lived inside it.
|
|
649
653
|
const controller = new AbortController();
|
|
650
|
-
const disposeCallLink = linkAbort(
|
|
654
|
+
const disposeCallLink = linkAbort(domain, controller);
|
|
651
655
|
const timeoutId = timeout
|
|
652
656
|
? setTimeout(() => {
|
|
653
657
|
timedOut = true;
|
|
@@ -677,20 +681,20 @@ export class HttpService {
|
|
|
677
681
|
|
|
678
682
|
// Add authorization header if available
|
|
679
683
|
if (authHeader) {
|
|
680
|
-
headers
|
|
684
|
+
headers.Authorization = authHeader;
|
|
681
685
|
}
|
|
682
686
|
|
|
683
687
|
// Merge custom headers if provided
|
|
684
688
|
if (config.headers) {
|
|
685
|
-
Object.entries(config.headers)
|
|
689
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
686
690
|
// For FormData, explicitly remove Content-Type if user tries to set it
|
|
687
691
|
// The browser/fetch API will set it automatically with the boundary
|
|
688
692
|
if (isFormData && key.toLowerCase() === 'content-type') {
|
|
689
693
|
this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
|
|
690
|
-
|
|
694
|
+
continue;
|
|
691
695
|
}
|
|
692
696
|
headers[key] = value;
|
|
693
|
-
}
|
|
697
|
+
}
|
|
694
698
|
}
|
|
695
699
|
|
|
696
700
|
// This is Cloudflare's coarse serving PoP (for example `mad`), never an
|
|
@@ -751,7 +755,12 @@ export class HttpService {
|
|
|
751
755
|
// deduplicated retry would resolve to the still-pending original
|
|
752
756
|
// and await itself (deadlock). Opting the retry out of dedupe makes
|
|
753
757
|
// it a fresh request.
|
|
754
|
-
|
|
758
|
+
//
|
|
759
|
+
// `bypassQueue: true` is REQUIRED too: this attempt still holds its
|
|
760
|
+
// queue slot, so a queued retry waits for a slot while holding one.
|
|
761
|
+
// With every slot held by a 401 (a revoked session under load) no
|
|
762
|
+
// retry could ever start and the whole client stalled.
|
|
763
|
+
return this.request<T>({ ...config, _isAuthRetry: true, retry: false, deduplicate: false, bypassQueue: true });
|
|
755
764
|
}
|
|
756
765
|
// Refresh failed or no token — clear tokens
|
|
757
766
|
this.tokenStore.clearTokens();
|
|
@@ -805,7 +814,7 @@ export class HttpService {
|
|
|
805
814
|
|
|
806
815
|
if (config.responseType === 'blob') {
|
|
807
816
|
responseData = await response.blob();
|
|
808
|
-
} else if (contentType
|
|
817
|
+
} else if (contentType?.includes('application/json')) {
|
|
809
818
|
// Use response.json() directly for better performance
|
|
810
819
|
try {
|
|
811
820
|
responseData = await response.json();
|
|
@@ -889,50 +898,57 @@ export class HttpService {
|
|
|
889
898
|
}
|
|
890
899
|
};
|
|
891
900
|
|
|
892
|
-
//
|
|
901
|
+
// Composition: dedupe(retry(queue(attempt))). A queue slot is network
|
|
902
|
+
// occupancy only — each attempt takes one and releases it — so neither the
|
|
903
|
+
// retry backoff sleep nor a deduplicated caller waiting on shared work holds
|
|
904
|
+
// a slot while doing nothing.
|
|
893
905
|
//
|
|
894
|
-
// `retryOnTimeout` defaults to false in `retryAsync
|
|
895
|
-
//
|
|
896
|
-
//
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
//
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
//
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
906
|
+
// `retryOnTimeout` defaults to false in `retryAsync`: a timeout costs ONE
|
|
907
|
+
// attempt, a cancellation none. `deadline` bounds whatever retries do happen
|
|
908
|
+
// by wall clock rather than by attempts x timeout + backoff.
|
|
909
|
+
const runAttempt = (domain: AbortSignal): Promise<T> =>
|
|
910
|
+
// Control-plane calls the auth lane depends on (`bypassQueue`, e.g. the
|
|
911
|
+
// device-secret mint) run DIRECTLY — a queued mint could never acquire a
|
|
912
|
+
// slot when every slot is parked awaiting it.
|
|
913
|
+
config.bypassQueue ? attempt(domain) : this.requestQueue.enqueue(() => attempt(domain), domain);
|
|
914
|
+
const execute = (domain: AbortSignal): Promise<T> =>
|
|
915
|
+
retry
|
|
916
|
+
? retryAsync(() => runAttempt(domain), {
|
|
917
|
+
maxRetries,
|
|
918
|
+
baseDelay: this.config.retryDelay || 1000,
|
|
919
|
+
retryOnTimeout: config.retryOnTimeout ?? false,
|
|
920
|
+
deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
|
|
921
|
+
})
|
|
922
|
+
: runAttempt(domain);
|
|
923
|
+
|
|
924
|
+
let result: T;
|
|
925
|
+
if (deduplicate) {
|
|
926
|
+
// The cache key IS the dedupe key (same method, url, payload, identity);
|
|
927
|
+
// computed once per call.
|
|
928
|
+
const dedupeKey = cacheKey ?? this.generateCacheKey(method, url, data || params);
|
|
929
|
+
result = await this.deduplicator.deduplicate(dedupeKey, execute, signal);
|
|
930
|
+
} else {
|
|
931
|
+
// The call's own abort domain, linked to the caller's signal ONCE, so a
|
|
932
|
+
// cancellation arrives once and is then true for every attempt, including
|
|
933
|
+
// ones not yet started. Released however the call ends: a caller signal
|
|
934
|
+
// that outlives the request (a React Query signal) would otherwise accrue
|
|
935
|
+
// one listener per request.
|
|
936
|
+
const callController = new AbortController();
|
|
937
|
+
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
938
|
+
try {
|
|
939
|
+
result = await execute(callController.signal);
|
|
940
|
+
} finally {
|
|
941
|
+
disposeCallerLink?.();
|
|
926
942
|
}
|
|
943
|
+
}
|
|
927
944
|
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
// request — the normal case for a React Query query signal — accrues one
|
|
933
|
-
// listener per request for its whole lifetime.
|
|
934
|
-
disposeCallerLink?.();
|
|
945
|
+
// Cache the result if caching is enabled
|
|
946
|
+
if (cache && cacheKey && result) {
|
|
947
|
+
this.cache.set(cacheKey, result, cacheTTL);
|
|
948
|
+
this.warnIfCacheOversized();
|
|
935
949
|
}
|
|
950
|
+
|
|
951
|
+
return result;
|
|
936
952
|
}
|
|
937
953
|
|
|
938
954
|
/**
|
|
@@ -1162,18 +1178,18 @@ export class HttpService {
|
|
|
1162
1178
|
private buildURL(url: string, params?: Record<string, unknown>): string {
|
|
1163
1179
|
const base = /^https?:\/\//i.test(url)
|
|
1164
1180
|
? url
|
|
1165
|
-
: `${this.baseURL
|
|
1181
|
+
: `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
|
|
1166
1182
|
|
|
1167
1183
|
if (!params || Object.keys(params).length === 0) {
|
|
1168
1184
|
return base;
|
|
1169
1185
|
}
|
|
1170
1186
|
|
|
1171
1187
|
const searchParams = new URLSearchParams();
|
|
1172
|
-
|
|
1188
|
+
for (const [key, value] of Object.entries(params)) {
|
|
1173
1189
|
if (value !== undefined && value !== null) {
|
|
1174
1190
|
searchParams.append(key, String(value));
|
|
1175
1191
|
}
|
|
1176
|
-
}
|
|
1192
|
+
}
|
|
1177
1193
|
|
|
1178
1194
|
const queryString = searchParams.toString();
|
|
1179
1195
|
return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
|
|
@@ -1201,7 +1217,8 @@ export class HttpService {
|
|
|
1201
1217
|
}
|
|
1202
1218
|
|
|
1203
1219
|
try {
|
|
1204
|
-
const decoded =
|
|
1220
|
+
const decoded = decodeTokenClaims(accessToken);
|
|
1221
|
+
if (!decoded) throw new Error('opaque token');
|
|
1205
1222
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
1206
1223
|
|
|
1207
1224
|
// If the token expires within the refresh lead window, refresh it.
|
|
@@ -1353,26 +1370,23 @@ export class HttpService {
|
|
|
1353
1370
|
if (!token) {
|
|
1354
1371
|
return false;
|
|
1355
1372
|
}
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
|
|
1359
|
-
} catch {
|
|
1360
|
-
return false;
|
|
1361
|
-
}
|
|
1373
|
+
const exp = decodeTokenClaims(token)?.exp;
|
|
1374
|
+
return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
|
|
1362
1375
|
}
|
|
1363
1376
|
|
|
1364
1377
|
/**
|
|
1365
|
-
* PROCESS-WIDE single-flight for the
|
|
1378
|
+
* PROCESS-WIDE single-flight for the device-secret mint
|
|
1366
1379
|
* (`POST /session/device/token`).
|
|
1367
1380
|
*
|
|
1368
|
-
* The server
|
|
1369
|
-
*
|
|
1370
|
-
*
|
|
1371
|
-
*
|
|
1372
|
-
*
|
|
1373
|
-
*
|
|
1374
|
-
*
|
|
1375
|
-
*
|
|
1381
|
+
* The server does not rotate the presented `deviceSecret` (it echoes it back
|
|
1382
|
+
* as `nextDeviceSecret`; each holder of a shared DeviceSession has its own
|
|
1383
|
+
* stable credential), so this is no longer what keeps the store's secret
|
|
1384
|
+
* valid. It still collapses concurrent callers onto one request and one
|
|
1385
|
+
* persisted write. Every mint lane (the re-mint handler behind
|
|
1386
|
+
* `refreshAccessToken`, the device-first cold boot, the socket token
|
|
1387
|
+
* transport, the tab-focus reconcile) funnels its `refreshDeviceSecretArm`
|
|
1388
|
+
* call through here, so concurrent callers await the SAME in-flight mint and
|
|
1389
|
+
* all receive its result.
|
|
1376
1390
|
*
|
|
1377
1391
|
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
1378
1392
|
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
@@ -1485,7 +1499,9 @@ export class HttpService {
|
|
|
1485
1499
|
// Authentication is owned by this SDK instance. A caller cannot replace
|
|
1486
1500
|
// the bearer with a different session or leak one across linked apps.
|
|
1487
1501
|
headers.set('Authorization', authHeader);
|
|
1488
|
-
|
|
1502
|
+
// Never awaited: the PoP is a hint, and waiting on its trace fetch put up
|
|
1503
|
+
// to a second in front of requests.
|
|
1504
|
+
const edgeRegionHeader = peekBrowserEdgeRegionHeader();
|
|
1489
1505
|
for (const [name, value] of Object.entries(edgeRegionHeader)) headers.set(name, value);
|
|
1490
1506
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
1491
1507
|
for (const [name, value] of Object.entries(activityIdHeader)) headers.set(name, value);
|
|
@@ -1680,13 +1696,7 @@ export class HttpService {
|
|
|
1680
1696
|
* identity-scoped variant `<key> id=*`.
|
|
1681
1697
|
*/
|
|
1682
1698
|
clearCacheEntry(key: string): void {
|
|
1683
|
-
this.
|
|
1684
|
-
const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
|
|
1685
|
-
for (const existing of this.cache.keys()) {
|
|
1686
|
-
if (existing.startsWith(identityVariantPrefix)) {
|
|
1687
|
-
this.cache.delete(existing);
|
|
1688
|
-
}
|
|
1689
|
-
}
|
|
1699
|
+
this.invalidateCache({ keys: [key] });
|
|
1690
1700
|
}
|
|
1691
1701
|
|
|
1692
1702
|
/**
|
|
@@ -1698,14 +1708,39 @@ export class HttpService {
|
|
|
1698
1708
|
* deleted entries (for observability in tests).
|
|
1699
1709
|
*/
|
|
1700
1710
|
clearCacheByPrefix(prefix: string): number {
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1711
|
+
return this.invalidateCache({ prefixes: [prefix] });
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
/**
|
|
1715
|
+
* Invalidate a set of LOGICAL keys (each with every identity-scoped variant,
|
|
1716
|
+
* see `clearCacheEntry`) and key prefixes in ONE pass over the cache. A
|
|
1717
|
+
* mutation touching many resources (a bulk follow) costs one scan, not one
|
|
1718
|
+
* per resource.
|
|
1719
|
+
* @returns Number of entries deleted
|
|
1720
|
+
*/
|
|
1721
|
+
invalidateCache({ keys = [], prefixes = [] }: { keys?: readonly string[]; prefixes?: readonly string[] }): number {
|
|
1722
|
+
if (keys.length === 0 && prefixes.length === 0) return 0;
|
|
1723
|
+
const exact = new Set(keys);
|
|
1724
|
+
const delim = HttpService.CACHE_IDENTITY_DELIM;
|
|
1725
|
+
return this.cache.deleteWhere((stored) => {
|
|
1726
|
+
const cut = stored.lastIndexOf(delim);
|
|
1727
|
+
if (exact.has(cut === -1 ? stored : stored.slice(0, cut))) return true;
|
|
1728
|
+
for (const prefix of prefixes) {
|
|
1729
|
+
if (stored.startsWith(prefix)) return true;
|
|
1706
1730
|
}
|
|
1707
|
-
|
|
1708
|
-
|
|
1731
|
+
return false;
|
|
1732
|
+
});
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
/**
|
|
1736
|
+
* Release this client: its response cache leaves the global cleanup sweep and
|
|
1737
|
+
* is emptied, pending shared calls are forgotten, and the session ends.
|
|
1738
|
+
*/
|
|
1739
|
+
dispose(): void {
|
|
1740
|
+
unregisterCacheFromCleanup(this.cache);
|
|
1741
|
+
this.cache.clear();
|
|
1742
|
+
this.deduplicator.clear();
|
|
1743
|
+
this.endSession();
|
|
1709
1744
|
}
|
|
1710
1745
|
|
|
1711
1746
|
getCacheStats() {
|