@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/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,31 +13,28 @@
|
|
|
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;
|
|
33
|
+
/**
|
|
34
|
+
* Supplies a bearer for a request made while this client holds NO user session
|
|
35
|
+
* — `null` to send it anonymous. See {@link HttpService.setAnonymousAuthProvider}.
|
|
36
|
+
*/
|
|
37
|
+
export type AnonymousAuthProvider = () => Promise<string | null>;
|
|
41
38
|
|
|
42
39
|
/**
|
|
43
40
|
* A low-level authenticated request whose response body remains unread.
|
|
@@ -145,6 +142,25 @@ interface RequestConfig extends RequestOptions {
|
|
|
145
142
|
* endpoint surfaces as an `AbortError` quickly rather than blocking the
|
|
146
143
|
* request queue.
|
|
147
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
|
+
|
|
148
164
|
const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|
|
149
165
|
|
|
150
166
|
/**
|
|
@@ -215,17 +231,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
|
|
|
215
231
|
* lead window. `false` for an expired, opaque or no-`exp` token.
|
|
216
232
|
*/
|
|
217
233
|
function isInsideRefreshLeadWindow(token: string): boolean {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (typeof decoded.exp !== 'number') {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
const now = Math.floor(Date.now() / 1000);
|
|
224
|
-
// `<=`: the proactive scheduler fires at exactly `exp - lead`.
|
|
225
|
-
return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
|
|
226
|
-
} catch {
|
|
234
|
+
const decoded = decodeTokenClaims(token);
|
|
235
|
+
if (typeof decoded?.exp !== 'number') {
|
|
227
236
|
return false;
|
|
228
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;
|
|
229
241
|
}
|
|
230
242
|
|
|
231
243
|
/**
|
|
@@ -320,7 +332,7 @@ function linkAbort(parent: AbortSignal, child: AbortController): () => void {
|
|
|
320
332
|
export class HttpService {
|
|
321
333
|
private baseURL: string;
|
|
322
334
|
private tokenStore: TokenStore;
|
|
323
|
-
private cache: TTLCache<
|
|
335
|
+
private cache: TTLCache<unknown>;
|
|
324
336
|
/**
|
|
325
337
|
* When true, the per-instance GET response cache is OFF: GET responses are
|
|
326
338
|
* never read from nor written to {@link cache}, so every request hits the
|
|
@@ -378,6 +390,7 @@ export class HttpService {
|
|
|
378
390
|
private noFresherTokenThan: string | null = null;
|
|
379
391
|
private authRefreshHandler: AuthRefreshHandler | null = null;
|
|
380
392
|
private accessTokenProvider: AccessTokenProvider | null = null;
|
|
393
|
+
private anonymousAuthProvider: AnonymousAuthProvider | null = null;
|
|
381
394
|
private deviceSecretMintInFlight: Promise<DeviceSecretMintOutcome> | null = null;
|
|
382
395
|
/**
|
|
383
396
|
* Bumped by every {@link endSession}. A re-mint captures it before its first
|
|
@@ -442,7 +455,7 @@ export class HttpService {
|
|
|
442
455
|
this.cacheDisabled =
|
|
443
456
|
config.enableCache === false ||
|
|
444
457
|
(typeof config.cacheTTL === 'number' && config.cacheTTL <= 0);
|
|
445
|
-
this.cache = new TTLCache<
|
|
458
|
+
this.cache = new TTLCache<unknown>(config.cacheTTL && config.cacheTTL > 0 ? config.cacheTTL : 5 * 60 * 1000);
|
|
446
459
|
if (!this.cacheDisabled) {
|
|
447
460
|
registerCacheForCleanup(this.cache);
|
|
448
461
|
}
|
|
@@ -557,8 +570,14 @@ export class HttpService {
|
|
|
557
570
|
signal,
|
|
558
571
|
cache: cacheRequested = method === 'GET',
|
|
559
572
|
cacheTTL,
|
|
560
|
-
|
|
561
|
-
|
|
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),
|
|
562
581
|
maxRetries = this.config.maxRetries || 3,
|
|
563
582
|
} = config;
|
|
564
583
|
|
|
@@ -594,7 +613,9 @@ export class HttpService {
|
|
|
594
613
|
// 401 retry re-enters request() with a fresh config, so it re-resolves
|
|
595
614
|
// this here with the refreshed token.
|
|
596
615
|
const authHeader = config.skipAuth ? null : await this.getAuthHeader();
|
|
597
|
-
|
|
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();
|
|
598
619
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
599
620
|
|
|
600
621
|
// A request the caller has ALREADY abandoned takes no queue slot and makes
|
|
@@ -605,43 +626,32 @@ export class HttpService {
|
|
|
605
626
|
throw createCancelledError('Request cancelled before it was sent');
|
|
606
627
|
}
|
|
607
628
|
|
|
608
|
-
//
|
|
609
|
-
//
|
|
610
|
-
//
|
|
611
|
-
|
|
612
|
-
// linked to each new controller with a bare `addEventListener`. An `abort`
|
|
613
|
-
// event fires once, so on attempt 2 the caller's already-fired signal could
|
|
614
|
-
// not abort the freshly built controller, and the request the caller had
|
|
615
|
-
// cancelled went out for real. Hoisting the linkage means a cancellation
|
|
616
|
-
// arrives once and is then true for every attempt, including ones not yet
|
|
617
|
-
// started.
|
|
618
|
-
const callController = new AbortController();
|
|
619
|
-
const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
|
|
620
|
-
|
|
621
|
-
/**
|
|
622
|
-
* Which of our own timers fired, so a timeout can be told apart from a
|
|
623
|
-
* cancellation. Both reach us from `fetch` as an indistinguishable
|
|
624
|
-
* `AbortError`, and collapsing them (as this used to) is what let the retry
|
|
625
|
-
* predicate treat an abandoned request as a transient failure.
|
|
626
|
-
*/
|
|
627
|
-
let timedOut = false;
|
|
628
|
-
|
|
629
|
-
// Request function
|
|
630
|
-
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> => {
|
|
631
633
|
const startTime = Date.now();
|
|
632
634
|
// Re-checked per attempt so no retry can issue a network call after the
|
|
633
635
|
// caller gave up — belt to `retryAsync`'s braces, and the one that holds
|
|
634
636
|
// if a custom `shouldRetry` ever says yes to a cancellation.
|
|
635
|
-
if (
|
|
637
|
+
if (domain.aborted) {
|
|
636
638
|
throw createCancelledError('Request cancelled');
|
|
637
639
|
}
|
|
638
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
|
+
|
|
639
649
|
// This attempt's controller carries its own timeout and inherits the
|
|
640
650
|
// call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
|
|
641
651
|
// that releases them can see them — the timer and the listener are
|
|
642
652
|
// exactly what leaked when they lived inside it.
|
|
643
653
|
const controller = new AbortController();
|
|
644
|
-
const disposeCallLink = linkAbort(
|
|
654
|
+
const disposeCallLink = linkAbort(domain, controller);
|
|
645
655
|
const timeoutId = timeout
|
|
646
656
|
? setTimeout(() => {
|
|
647
657
|
timedOut = true;
|
|
@@ -671,20 +681,20 @@ export class HttpService {
|
|
|
671
681
|
|
|
672
682
|
// Add authorization header if available
|
|
673
683
|
if (authHeader) {
|
|
674
|
-
headers
|
|
684
|
+
headers.Authorization = authHeader;
|
|
675
685
|
}
|
|
676
686
|
|
|
677
687
|
// Merge custom headers if provided
|
|
678
688
|
if (config.headers) {
|
|
679
|
-
Object.entries(config.headers)
|
|
689
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
680
690
|
// For FormData, explicitly remove Content-Type if user tries to set it
|
|
681
691
|
// The browser/fetch API will set it automatically with the boundary
|
|
682
692
|
if (isFormData && key.toLowerCase() === 'content-type') {
|
|
683
693
|
this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
|
|
684
|
-
|
|
694
|
+
continue;
|
|
685
695
|
}
|
|
686
696
|
headers[key] = value;
|
|
687
|
-
}
|
|
697
|
+
}
|
|
688
698
|
}
|
|
689
699
|
|
|
690
700
|
// This is Cloudflare's coarse serving PoP (for example `mad`), never an
|
|
@@ -745,7 +755,12 @@ export class HttpService {
|
|
|
745
755
|
// deduplicated retry would resolve to the still-pending original
|
|
746
756
|
// and await itself (deadlock). Opting the retry out of dedupe makes
|
|
747
757
|
// it a fresh request.
|
|
748
|
-
|
|
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 });
|
|
749
764
|
}
|
|
750
765
|
// Refresh failed or no token — clear tokens
|
|
751
766
|
this.tokenStore.clearTokens();
|
|
@@ -799,7 +814,7 @@ export class HttpService {
|
|
|
799
814
|
|
|
800
815
|
if (config.responseType === 'blob') {
|
|
801
816
|
responseData = await response.blob();
|
|
802
|
-
} else if (contentType
|
|
817
|
+
} else if (contentType?.includes('application/json')) {
|
|
803
818
|
// Use response.json() directly for better performance
|
|
804
819
|
try {
|
|
805
820
|
responseData = await response.json();
|
|
@@ -883,50 +898,57 @@ export class HttpService {
|
|
|
883
898
|
}
|
|
884
899
|
};
|
|
885
900
|
|
|
886
|
-
//
|
|
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.
|
|
887
905
|
//
|
|
888
|
-
// `retryOnTimeout` defaults to false in `retryAsync
|
|
889
|
-
//
|
|
890
|
-
//
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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
|
-
|
|
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?.();
|
|
920
942
|
}
|
|
943
|
+
}
|
|
921
944
|
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
// request — the normal case for a React Query query signal — accrues one
|
|
927
|
-
// listener per request for its whole lifetime.
|
|
928
|
-
disposeCallerLink?.();
|
|
945
|
+
// Cache the result if caching is enabled
|
|
946
|
+
if (cache && cacheKey && result) {
|
|
947
|
+
this.cache.set(cacheKey, result, cacheTTL);
|
|
948
|
+
this.warnIfCacheOversized();
|
|
929
949
|
}
|
|
950
|
+
|
|
951
|
+
return result;
|
|
930
952
|
}
|
|
931
953
|
|
|
932
954
|
/**
|
|
@@ -1156,18 +1178,18 @@ export class HttpService {
|
|
|
1156
1178
|
private buildURL(url: string, params?: Record<string, unknown>): string {
|
|
1157
1179
|
const base = /^https?:\/\//i.test(url)
|
|
1158
1180
|
? url
|
|
1159
|
-
: `${this.baseURL
|
|
1181
|
+
: `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
|
|
1160
1182
|
|
|
1161
1183
|
if (!params || Object.keys(params).length === 0) {
|
|
1162
1184
|
return base;
|
|
1163
1185
|
}
|
|
1164
1186
|
|
|
1165
1187
|
const searchParams = new URLSearchParams();
|
|
1166
|
-
|
|
1188
|
+
for (const [key, value] of Object.entries(params)) {
|
|
1167
1189
|
if (value !== undefined && value !== null) {
|
|
1168
1190
|
searchParams.append(key, String(value));
|
|
1169
1191
|
}
|
|
1170
|
-
}
|
|
1192
|
+
}
|
|
1171
1193
|
|
|
1172
1194
|
const queryString = searchParams.toString();
|
|
1173
1195
|
return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
|
|
@@ -1191,11 +1213,12 @@ export class HttpService {
|
|
|
1191
1213
|
private async getAuthHeader(): Promise<string | null> {
|
|
1192
1214
|
const accessToken = this.syncAccessTokenFromProvider();
|
|
1193
1215
|
if (!accessToken) {
|
|
1194
|
-
return
|
|
1216
|
+
return this.getAnonymousAuthHeader();
|
|
1195
1217
|
}
|
|
1196
1218
|
|
|
1197
1219
|
try {
|
|
1198
|
-
const decoded =
|
|
1220
|
+
const decoded = decodeTokenClaims(accessToken);
|
|
1221
|
+
if (!decoded) throw new Error('opaque token');
|
|
1199
1222
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
1200
1223
|
|
|
1201
1224
|
// If the token expires within the refresh lead window, refresh it.
|
|
@@ -1222,6 +1245,23 @@ export class HttpService {
|
|
|
1222
1245
|
}
|
|
1223
1246
|
}
|
|
1224
1247
|
|
|
1248
|
+
/**
|
|
1249
|
+
* The bearer for a request that has no user session behind it, from the
|
|
1250
|
+
* {@link AnonymousAuthProvider} if one is installed. Never throws: a provider
|
|
1251
|
+
* that fails sends the request anonymous, exactly as it went before any
|
|
1252
|
+
* provider existed.
|
|
1253
|
+
*/
|
|
1254
|
+
private async getAnonymousAuthHeader(): Promise<string | null> {
|
|
1255
|
+
if (!this.anonymousAuthProvider) return null;
|
|
1256
|
+
try {
|
|
1257
|
+
const token = await this.anonymousAuthProvider();
|
|
1258
|
+
return token ? `Bearer ${token}` : null;
|
|
1259
|
+
} catch (error) {
|
|
1260
|
+
this.logger.debug('Anonymous auth provider failed; sending the request anonymous:', error);
|
|
1261
|
+
return null;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1225
1265
|
async refreshAccessToken(reason: AuthRefreshReason): Promise<string | null> {
|
|
1226
1266
|
if (!this.authRefreshHandler) {
|
|
1227
1267
|
return null;
|
|
@@ -1330,26 +1370,23 @@ export class HttpService {
|
|
|
1330
1370
|
if (!token) {
|
|
1331
1371
|
return false;
|
|
1332
1372
|
}
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
|
|
1336
|
-
} catch {
|
|
1337
|
-
return false;
|
|
1338
|
-
}
|
|
1373
|
+
const exp = decodeTokenClaims(token)?.exp;
|
|
1374
|
+
return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
|
|
1339
1375
|
}
|
|
1340
1376
|
|
|
1341
1377
|
/**
|
|
1342
|
-
* PROCESS-WIDE single-flight for the
|
|
1378
|
+
* PROCESS-WIDE single-flight for the device-secret mint
|
|
1343
1379
|
* (`POST /session/device/token`).
|
|
1344
1380
|
*
|
|
1345
|
-
* The server
|
|
1346
|
-
*
|
|
1347
|
-
*
|
|
1348
|
-
*
|
|
1349
|
-
*
|
|
1350
|
-
*
|
|
1351
|
-
*
|
|
1352
|
-
*
|
|
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.
|
|
1353
1390
|
*
|
|
1354
1391
|
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
1355
1392
|
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
@@ -1462,7 +1499,9 @@ export class HttpService {
|
|
|
1462
1499
|
// Authentication is owned by this SDK instance. A caller cannot replace
|
|
1463
1500
|
// the bearer with a different session or leak one across linked apps.
|
|
1464
1501
|
headers.set('Authorization', authHeader);
|
|
1465
|
-
|
|
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();
|
|
1466
1505
|
for (const [name, value] of Object.entries(edgeRegionHeader)) headers.set(name, value);
|
|
1467
1506
|
const activityIdHeader = getBrowserActivityIdHeader();
|
|
1468
1507
|
for (const [name, value] of Object.entries(activityIdHeader)) headers.set(name, value);
|
|
@@ -1565,6 +1604,17 @@ export class HttpService {
|
|
|
1565
1604
|
this.accessTokenProvider = provider;
|
|
1566
1605
|
}
|
|
1567
1606
|
|
|
1607
|
+
/**
|
|
1608
|
+
* Authenticate requests that carry no user session with the bearer this
|
|
1609
|
+
* provider returns — in practice a backend's own service token (see
|
|
1610
|
+
* `OxyConfig.serviceIdentity`). A user session always wins: the provider is
|
|
1611
|
+
* consulted only when there is no access token, and never for `skipAuth`
|
|
1612
|
+
* requests. `null` removes it.
|
|
1613
|
+
*/
|
|
1614
|
+
setAnonymousAuthProvider(provider: AnonymousAuthProvider | null): void {
|
|
1615
|
+
this.anonymousAuthProvider = provider;
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1568
1618
|
clearTokens(): void {
|
|
1569
1619
|
this.tokenStore.clearTokens();
|
|
1570
1620
|
// Drop the response cache on logout. The cache is identity-scoped, so a
|
|
@@ -1646,13 +1696,7 @@ export class HttpService {
|
|
|
1646
1696
|
* identity-scoped variant `<key> id=*`.
|
|
1647
1697
|
*/
|
|
1648
1698
|
clearCacheEntry(key: string): void {
|
|
1649
|
-
this.
|
|
1650
|
-
const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
|
|
1651
|
-
for (const existing of this.cache.keys()) {
|
|
1652
|
-
if (existing.startsWith(identityVariantPrefix)) {
|
|
1653
|
-
this.cache.delete(existing);
|
|
1654
|
-
}
|
|
1655
|
-
}
|
|
1699
|
+
this.invalidateCache({ keys: [key] });
|
|
1656
1700
|
}
|
|
1657
1701
|
|
|
1658
1702
|
/**
|
|
@@ -1664,14 +1708,39 @@ export class HttpService {
|
|
|
1664
1708
|
* deleted entries (for observability in tests).
|
|
1665
1709
|
*/
|
|
1666
1710
|
clearCacheByPrefix(prefix: string): number {
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
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;
|
|
1672
1730
|
}
|
|
1673
|
-
|
|
1674
|
-
|
|
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();
|
|
1675
1744
|
}
|
|
1676
1745
|
|
|
1677
1746
|
getCacheStats() {
|