@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
|
@@ -70,8 +70,8 @@ export const REMINT_AFTER_EXPIRY_MS = 2000;
|
|
|
70
70
|
export async function refreshDeviceSecretArm(deps) {
|
|
71
71
|
const { oxy, store } = deps;
|
|
72
72
|
const pin = deps.pin ?? null;
|
|
73
|
-
return oxy.
|
|
74
|
-
const epoch = oxy.
|
|
73
|
+
return oxy.http.runSingleFlightDeviceSecretMint(async () => {
|
|
74
|
+
const epoch = oxy.http.getSessionEpoch();
|
|
75
75
|
const persisted = await store.load();
|
|
76
76
|
if (!persisted?.deviceId || !persisted?.deviceSecret) {
|
|
77
77
|
return { status: 'no-secret' };
|
|
@@ -81,10 +81,10 @@ export async function refreshDeviceSecretArm(deps) {
|
|
|
81
81
|
// Unpinned callers pass NO third argument at all, so the account-mode call
|
|
82
82
|
// shape (and therefore the request body) is untouched by this feature.
|
|
83
83
|
mint = pin
|
|
84
|
-
? await oxy.
|
|
84
|
+
? await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret, {
|
|
85
85
|
accountId: pin.accountId,
|
|
86
86
|
})
|
|
87
|
-
: await oxy.
|
|
87
|
+
: await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret);
|
|
88
88
|
}
|
|
89
89
|
catch (error) {
|
|
90
90
|
// 429 keeps the credential like any other transient failure — the secret
|
|
@@ -96,7 +96,7 @@ export async function refreshDeviceSecretArm(deps) {
|
|
|
96
96
|
// requests. Telling HttpService lengthens the next cooldown to one attempt
|
|
97
97
|
// per limiter window, which lets the budget drain and the session heal.
|
|
98
98
|
if (extractErrorStatus(error) === 429) {
|
|
99
|
-
oxy.
|
|
99
|
+
oxy.http.noteRefreshRateLimited();
|
|
100
100
|
return { status: 'transient' };
|
|
101
101
|
}
|
|
102
102
|
if (extractErrorStatus(error) === 401) {
|
|
@@ -137,11 +137,11 @@ export async function refreshDeviceSecretArm(deps) {
|
|
|
137
137
|
expiresAt: mint.expiresAt,
|
|
138
138
|
...(bound ? { sessionId: bound.sessionId, userId: bound.accountId } : {}),
|
|
139
139
|
};
|
|
140
|
-
if (oxy.
|
|
141
|
-
// Signed out while minting.
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
//
|
|
140
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
141
|
+
// Signed out while minting. A store that still holds the presented
|
|
142
|
+
// secret takes the server's `nextDeviceSecret` (the token-null lane keeps
|
|
143
|
+
// the store so a reload can restore); a store the sign-out cleared must
|
|
144
|
+
// NOT be refilled. Either way, plant nothing.
|
|
145
145
|
const current = await store.load();
|
|
146
146
|
if (current?.deviceId === persisted.deviceId && current.deviceSecret === persisted.deviceSecret) {
|
|
147
147
|
await store.save(next);
|
|
@@ -154,10 +154,10 @@ export async function refreshDeviceSecretArm(deps) {
|
|
|
154
154
|
if (!persistedOk) {
|
|
155
155
|
return { status: 'persist-failed' };
|
|
156
156
|
}
|
|
157
|
-
if (oxy.
|
|
157
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
158
158
|
return { status: 'session-ended' };
|
|
159
159
|
}
|
|
160
|
-
oxy.
|
|
160
|
+
oxy.session.setAccessToken(mint.accessToken);
|
|
161
161
|
return {
|
|
162
162
|
status: 'ok',
|
|
163
163
|
token: mint.accessToken,
|
|
@@ -194,7 +194,7 @@ export async function refreshPersistedSession(deps) {
|
|
|
194
194
|
const identity = deps.identity ?? null;
|
|
195
195
|
// The shared keychain is never an identity-bound client's recovery path.
|
|
196
196
|
const allowSharedKeyFallback = identity ? false : (deps.allowSharedKeyFallback ?? isNative());
|
|
197
|
-
const epoch = oxy.
|
|
197
|
+
const epoch = oxy.http.getSessionEpoch();
|
|
198
198
|
// Resolved per call: a re-established identity session can move the pin, and a
|
|
199
199
|
// replaced/removed local key clears it (in which case arm 1 must NOT mint —
|
|
200
200
|
// an unpinned mint would adopt whatever account the device switched to).
|
|
@@ -223,13 +223,20 @@ export async function refreshPersistedSession(deps) {
|
|
|
223
223
|
// 401: secret diverged or no live session. When a key-based arm 2 can still
|
|
224
224
|
// recover (native shared key, or an identity-bound client's own primary
|
|
225
225
|
// key) drop ONLY the secret and keep the deviceId; otherwise (web) the
|
|
226
|
-
// session is over
|
|
226
|
+
// session is over.
|
|
227
227
|
const persisted = await store.load();
|
|
228
228
|
if (allowSharedKeyFallback || identity) {
|
|
229
229
|
if (persisted) {
|
|
230
230
|
await store.save({ ...persisted, deviceSecret: undefined });
|
|
231
231
|
}
|
|
232
232
|
}
|
|
233
|
+
else if (arm1.status === 'no-session' && persisted?.deviceId && persisted.deviceSecret) {
|
|
234
|
+
// Web, a credential the server still recognises: this origin stays a
|
|
235
|
+
// holder of the browser's device (ADR 0029 D2) — the next sign-in in any
|
|
236
|
+
// app lands on it, and this app follows without opening the bridge
|
|
237
|
+
// again. Only the session fields go.
|
|
238
|
+
await store.save({ sessionId: '', userId: '', deviceId: persisted.deviceId, deviceSecret: persisted.deviceSecret });
|
|
239
|
+
}
|
|
233
240
|
else {
|
|
234
241
|
await store.clear();
|
|
235
242
|
}
|
|
@@ -248,14 +255,14 @@ export async function refreshPersistedSession(deps) {
|
|
|
248
255
|
}
|
|
249
256
|
// Never after a sign-out: the shared keychain holds an identity KEY, not a
|
|
250
257
|
// session, and using it here would sign the user straight back in.
|
|
251
|
-
if (allowSharedKeyFallback && !oxy.
|
|
258
|
+
if (allowSharedKeyFallback && !oxy.http.hasSessionEnded()) {
|
|
252
259
|
try {
|
|
253
260
|
// Planted here, not by the sign-in: a sign-out that lands while the
|
|
254
261
|
// challenge round-trips must win, or the shared keychain signs the user
|
|
255
262
|
// straight back in.
|
|
256
|
-
const session = await oxy.signInWithSharedIdentity({ plantTokens: false });
|
|
263
|
+
const session = await oxy.auth.signInWithSharedIdentity({ plantTokens: false });
|
|
257
264
|
if (session?.accessToken) {
|
|
258
|
-
if (oxy.
|
|
265
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
259
266
|
return null;
|
|
260
267
|
}
|
|
261
268
|
// Repopulate the fast device-secret lane from the shared-key re-mint.
|
|
@@ -269,10 +276,10 @@ export async function refreshPersistedSession(deps) {
|
|
|
269
276
|
expiresAt: session.expiresAt,
|
|
270
277
|
});
|
|
271
278
|
}
|
|
272
|
-
if (oxy.
|
|
279
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
273
280
|
return null;
|
|
274
281
|
}
|
|
275
|
-
oxy.
|
|
282
|
+
oxy.session.setAccessToken(session.accessToken);
|
|
276
283
|
return session.accessToken;
|
|
277
284
|
}
|
|
278
285
|
}
|
|
@@ -319,9 +326,9 @@ export function createAuthRefreshHandler(deps) {
|
|
|
319
326
|
* Returns a disposer that removes it.
|
|
320
327
|
*/
|
|
321
328
|
export function installAuthRefreshHandler(deps) {
|
|
322
|
-
deps.oxy.
|
|
329
|
+
deps.oxy.http.setAuthRefreshHandler(createAuthRefreshHandler(deps));
|
|
323
330
|
return () => {
|
|
324
|
-
deps.oxy.
|
|
331
|
+
deps.oxy.http.setAuthRefreshHandler(null);
|
|
325
332
|
};
|
|
326
333
|
}
|
|
327
334
|
/**
|
|
@@ -363,10 +370,10 @@ export function startTokenRefreshScheduler(oxy) {
|
|
|
363
370
|
/** Schedule the next re-mint from the current token's expiry (the healthy path). */
|
|
364
371
|
const scheduleFromExpiry = () => {
|
|
365
372
|
clearTimer();
|
|
366
|
-
if (disposed || !oxy.
|
|
373
|
+
if (disposed || !oxy.session.accessToken) {
|
|
367
374
|
return;
|
|
368
375
|
}
|
|
369
|
-
const expSeconds = oxy.
|
|
376
|
+
const expSeconds = oxy.session.accessTokenExpiry;
|
|
370
377
|
if (expSeconds === null) {
|
|
371
378
|
return;
|
|
372
379
|
}
|
|
@@ -374,7 +381,7 @@ export function startTokenRefreshScheduler(oxy) {
|
|
|
374
381
|
// The server already answered this token's refresh with this very token:
|
|
375
382
|
// asking again before `exp` only gets it back again. Ask just after expiry,
|
|
376
383
|
// when the server rotates (see REMINT_AFTER_EXPIRY_MS).
|
|
377
|
-
if (untilExpiryMs > 0 && oxy.
|
|
384
|
+
if (untilExpiryMs > 0 && oxy.http.isAwaitingCurrentTokenExpiry?.()) {
|
|
378
385
|
armTimer(untilExpiryMs + REMINT_AFTER_EXPIRY_MS);
|
|
379
386
|
return;
|
|
380
387
|
}
|
|
@@ -386,11 +393,11 @@ export function startTokenRefreshScheduler(oxy) {
|
|
|
386
393
|
clearTimer();
|
|
387
394
|
// Another lane (a request-time preflight) already asked, and the server
|
|
388
395
|
// answered with this same token: re-arm for just past expiry instead.
|
|
389
|
-
if (oxy.
|
|
396
|
+
if (oxy.http.isAwaitingCurrentTokenExpiry?.()) {
|
|
390
397
|
scheduleFromExpiry();
|
|
391
398
|
return;
|
|
392
399
|
}
|
|
393
|
-
void oxy.
|
|
400
|
+
void oxy.http.refreshAccessToken('preflight')
|
|
394
401
|
.then((token) => Boolean(token))
|
|
395
402
|
.catch(() => false)
|
|
396
403
|
.then((ok) => {
|
|
@@ -417,10 +424,10 @@ export function startTokenRefreshScheduler(oxy) {
|
|
|
417
424
|
scheduleFromExpiry();
|
|
418
425
|
};
|
|
419
426
|
const onFocus = () => {
|
|
420
|
-
if (disposed || !oxy.
|
|
427
|
+
if (disposed || !oxy.session.accessToken) {
|
|
421
428
|
return;
|
|
422
429
|
}
|
|
423
|
-
const expSeconds = oxy.
|
|
430
|
+
const expSeconds = oxy.session.accessTokenExpiry;
|
|
424
431
|
if (expSeconds === null) {
|
|
425
432
|
return;
|
|
426
433
|
}
|
|
@@ -435,8 +442,8 @@ export function startTokenRefreshScheduler(oxy) {
|
|
|
435
442
|
// Re-arm only on a token that actually CHANGED. The mint plants the token it
|
|
436
443
|
// returns even when that is the token already held, and treating the repeat
|
|
437
444
|
// as new re-armed from an in-lead-window expiry, i.e. at the 1s floor.
|
|
438
|
-
let lastSeenToken = oxy.
|
|
439
|
-
const unsubscribeTokens = oxy.
|
|
445
|
+
let lastSeenToken = oxy.session.accessToken;
|
|
446
|
+
const unsubscribeTokens = oxy.session.onChange((token) => {
|
|
440
447
|
if (disposed || token === lastSeenToken) {
|
|
441
448
|
return;
|
|
442
449
|
}
|
|
@@ -14,12 +14,12 @@ export function createSessionClientHost(oxyServices) {
|
|
|
14
14
|
let currentAccountId = null;
|
|
15
15
|
let deviceCredential = null;
|
|
16
16
|
return {
|
|
17
|
-
makeRequest: (method, url, data, options) => oxyServices.
|
|
18
|
-
getBaseURL: () => oxyServices.
|
|
19
|
-
getAccessToken: () => oxyServices.
|
|
17
|
+
makeRequest: (method, url, data, options) => oxyServices.request(method, url, data, options),
|
|
18
|
+
getBaseURL: () => oxyServices.baseURL,
|
|
19
|
+
getAccessToken: () => oxyServices.session.accessToken,
|
|
20
20
|
getDeviceCredential: () => deviceCredential,
|
|
21
|
-
onTokensChanged: (listener) => oxyServices.
|
|
22
|
-
setTokens: (accessToken) => oxyServices.
|
|
21
|
+
onTokensChanged: (listener) => oxyServices.session.onChange(listener),
|
|
22
|
+
setTokens: (accessToken) => oxyServices.session.setAccessToken(accessToken),
|
|
23
23
|
getCurrentAccountId: () => currentAccountId,
|
|
24
24
|
setCurrentAccountId: (id) => {
|
|
25
25
|
currentAccountId = id;
|
|
@@ -155,8 +155,9 @@ export function decideSharedDevicePublish(proven, shared) {
|
|
|
155
155
|
if (shared.credential.deviceSecret === proven.deviceSecret) {
|
|
156
156
|
return { action: 'skip', reason: 'already-current' };
|
|
157
157
|
}
|
|
158
|
-
// Same device, newer secret.
|
|
159
|
-
//
|
|
158
|
+
// Same device, newer secret. Each sign-in issues a new holder credential
|
|
159
|
+
// (the older one stays valid until the device ends with nobody signed
|
|
160
|
+
// in), so the just-proven one is the credential a fresh install should
|
|
160
161
|
// join with.
|
|
161
162
|
return { action: 'publish' };
|
|
162
163
|
}
|
|
@@ -56,7 +56,7 @@ export const calculateBackoffInterval = (state) => {
|
|
|
56
56
|
const { consecutiveFailures, baseInterval, maxInterval } = state;
|
|
57
57
|
if (consecutiveFailures === 0)
|
|
58
58
|
return baseInterval;
|
|
59
|
-
const backoffMultiplier = Math.min(
|
|
59
|
+
const backoffMultiplier = Math.min(2 ** (consecutiveFailures - 1), maxInterval / baseInterval);
|
|
60
60
|
return Math.min(baseInterval * backoffMultiplier, maxInterval);
|
|
61
61
|
};
|
|
62
62
|
/**
|
|
@@ -164,7 +164,7 @@ export const withRetry = async (fn, options = {}) => {
|
|
|
164
164
|
if (attempt === maxRetries || !shouldRetry(error)) {
|
|
165
165
|
throw error;
|
|
166
166
|
}
|
|
167
|
-
const delayMs = Math.min(baseDelay *
|
|
167
|
+
const delayMs = Math.min(baseDelay * 2 ** attempt, maxDelay);
|
|
168
168
|
onRetry?.(error, attempt + 1);
|
|
169
169
|
await delay(delayMs);
|
|
170
170
|
}
|
|
@@ -12,15 +12,12 @@
|
|
|
12
12
|
* those cached and the account switcher keeps drawing the pre-edit name and
|
|
13
13
|
* picture for the full TTL, against a perfectly healthy server.
|
|
14
14
|
*
|
|
15
|
-
* The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* alternative — a second hand-written copy of these keys in the other mixin —
|
|
22
|
-
* is the drift that shipped the two stale-profile bugs `identityCacheSweep`
|
|
23
|
-
* documents.
|
|
15
|
+
* The key list lives here, once, and every writer (`users.updateMe`, the
|
|
16
|
+
* `accounts` namespace) reads it — exactly like the identity key list in
|
|
17
|
+
* `identityCacheSweep`, which account writes use for the mirror-image case (an
|
|
18
|
+
* account write staling the identity reads). A second hand-written copy of
|
|
19
|
+
* these keys in another namespace is the drift that shipped the two
|
|
20
|
+
* stale-profile bugs `identityCacheSweep` documents.
|
|
24
21
|
*
|
|
25
22
|
* WHY THE LIST NEEDS A PREFIX AND THE DETAIL DOES NOT
|
|
26
23
|
* --------------------------------------------------
|
|
@@ -66,10 +63,9 @@ export function oxyAccountDetailCacheKey(accountId) {
|
|
|
66
63
|
* account in it (create, archive, ownership transfer) has no
|
|
67
64
|
* detail row to name, and clears only the lists.
|
|
68
65
|
*/
|
|
69
|
-
export function evictOxyAccountForestCache(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
66
|
+
export function evictOxyAccountForestCache(http, accountId) {
|
|
67
|
+
http.invalidateCache({
|
|
68
|
+
keys: accountId ? [OXY_ACCOUNT_LIST_CACHE_KEY, oxyAccountDetailCacheKey(accountId)] : [OXY_ACCOUNT_LIST_CACHE_KEY],
|
|
69
|
+
prefixes: [OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX],
|
|
70
|
+
});
|
|
75
71
|
}
|
|
@@ -1,35 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Retry with exponential backoff and jitter — the policy `HttpService` uses.
|
|
3
3
|
*/
|
|
4
|
-
import { logger } from '../logger/index.js';
|
|
5
4
|
import { ErrorCodes, isCancelledError } from './errorUtils.js';
|
|
6
5
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (errorHandler) {
|
|
16
|
-
errorHandler(error);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
|
|
20
|
-
component: 'asyncUtils',
|
|
21
|
-
method: 'withErrorHandling',
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Execute multiple async operations in parallel with error handling
|
|
6
|
+
* Whether an error came from a request hitting its own timeout.
|
|
7
|
+
*
|
|
8
|
+
* A timeout and a caller cancellation both surface from `fetch` as an
|
|
9
|
+
* `AbortError`, so this only recognises one that has already been CLASSIFIED
|
|
10
|
+
* (by `HttpService`, which knows which of its own timers fired). An
|
|
11
|
+
* unclassified abort is treated as a cancellation, which is the safe
|
|
12
|
+
* direction: refusing to retry something that was abandoned costs nothing,
|
|
13
|
+
* while retrying it is the defect this whole option exists to fix.
|
|
29
14
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
15
|
+
function isTimeoutError(error) {
|
|
16
|
+
if (!error || typeof error !== 'object')
|
|
17
|
+
return false;
|
|
18
|
+
const candidate = error;
|
|
19
|
+
return candidate.timeout === true || candidate.code === ErrorCodes.TIMEOUT;
|
|
33
20
|
}
|
|
34
21
|
/**
|
|
35
22
|
* Extract an HTTP status code from an error value, tolerating both the
|
|
@@ -54,21 +41,15 @@ function extractHttpStatus(error) {
|
|
|
54
41
|
return undefined;
|
|
55
42
|
}
|
|
56
43
|
/**
|
|
57
|
-
*
|
|
44
|
+
* Retry an async operation with exponential backoff
|
|
58
45
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
46
|
+
* By default, does not retry on 4xx errors (client errors). The default
|
|
47
|
+
* predicate accepts both the axios-style `error.response.status` and the
|
|
48
|
+
* flat `error.status` shape produced by {@link handleHttpError}, so callers
|
|
49
|
+
* never accidentally retry a deterministic client failure.
|
|
50
|
+
*
|
|
51
|
+
* Use the `shouldRetry` callback to customize retry behavior.
|
|
65
52
|
*/
|
|
66
|
-
function isTimeoutError(error) {
|
|
67
|
-
if (!error || typeof error !== 'object')
|
|
68
|
-
return false;
|
|
69
|
-
const candidate = error;
|
|
70
|
-
return candidate.timeout === true || candidate.code === ErrorCodes.TIMEOUT;
|
|
71
|
-
}
|
|
72
53
|
export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayArg = 1000, shouldRetryArg) {
|
|
73
54
|
// An options-object overload rather than a fifth positional parameter:
|
|
74
55
|
// `retryOnError` below and other in-tree callers pass positionally, and a
|
|
@@ -125,7 +106,7 @@ export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayAr
|
|
|
125
106
|
break;
|
|
126
107
|
}
|
|
127
108
|
// Calculate delay with exponential backoff and jitter
|
|
128
|
-
const delay = baseDelay *
|
|
109
|
+
const delay = baseDelay * 2 ** attempt + Math.random() * 1000;
|
|
129
110
|
// Nothing may start, or even sleep, past the deadline — otherwise the
|
|
130
111
|
// budget bounds the attempts but not the wall clock the caller feels.
|
|
131
112
|
if (deadline !== undefined && Date.now() + delay >= deadline) {
|
|
@@ -136,113 +117,3 @@ export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayAr
|
|
|
136
117
|
}
|
|
137
118
|
throw lastError;
|
|
138
119
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Debounce async function calls
|
|
141
|
-
*/
|
|
142
|
-
export function debounceAsync(func, delay) {
|
|
143
|
-
let timeoutId;
|
|
144
|
-
return (...args) => {
|
|
145
|
-
return new Promise((resolve, reject) => {
|
|
146
|
-
clearTimeout(timeoutId);
|
|
147
|
-
timeoutId = setTimeout(async () => {
|
|
148
|
-
try {
|
|
149
|
-
const result = await func(...args);
|
|
150
|
-
resolve(result);
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
reject(error);
|
|
154
|
-
}
|
|
155
|
-
}, delay);
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Throttle async function calls
|
|
161
|
-
*/
|
|
162
|
-
export function throttleAsync(func, limit, interval) {
|
|
163
|
-
let inThrottle = false;
|
|
164
|
-
let lastPromise = null;
|
|
165
|
-
return (...args) => {
|
|
166
|
-
if (inThrottle) {
|
|
167
|
-
return lastPromise;
|
|
168
|
-
}
|
|
169
|
-
inThrottle = true;
|
|
170
|
-
lastPromise = func(...args);
|
|
171
|
-
setTimeout(() => {
|
|
172
|
-
inThrottle = false;
|
|
173
|
-
}, interval);
|
|
174
|
-
return lastPromise;
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Execute async operations sequentially with progress tracking
|
|
179
|
-
*/
|
|
180
|
-
export async function sequentialWithProgress(operations, onProgress) {
|
|
181
|
-
const results = [];
|
|
182
|
-
for (let i = 0; i < operations.length; i++) {
|
|
183
|
-
const result = await operations[i]();
|
|
184
|
-
results.push(result);
|
|
185
|
-
onProgress?.(i + 1, operations.length);
|
|
186
|
-
}
|
|
187
|
-
return results;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Batch async operations
|
|
191
|
-
*/
|
|
192
|
-
export async function batchAsync(items, batchSize, processor) {
|
|
193
|
-
for (let i = 0; i < items.length; i += batchSize) {
|
|
194
|
-
const batch = items.slice(i, i + batchSize);
|
|
195
|
-
await processor(batch);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Create a cancellable async operation
|
|
200
|
-
*/
|
|
201
|
-
export function createCancellableAsync(operation) {
|
|
202
|
-
let abortController = null;
|
|
203
|
-
return {
|
|
204
|
-
execute: async () => {
|
|
205
|
-
abortController = new AbortController();
|
|
206
|
-
return await operation(abortController.signal);
|
|
207
|
-
},
|
|
208
|
-
cancel: () => {
|
|
209
|
-
abortController?.abort();
|
|
210
|
-
}
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Timeout wrapper for async operations
|
|
215
|
-
*/
|
|
216
|
-
export async function withTimeout(operation, timeoutMs, timeoutMessage) {
|
|
217
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
218
|
-
setTimeout(() => {
|
|
219
|
-
reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));
|
|
220
|
-
}, timeoutMs);
|
|
221
|
-
});
|
|
222
|
-
return Promise.race([operation, timeoutPromise]);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Execute async operation with loading state
|
|
226
|
-
*/
|
|
227
|
-
export async function withLoadingState(operation, setLoading) {
|
|
228
|
-
setLoading(true);
|
|
229
|
-
try {
|
|
230
|
-
return await operation();
|
|
231
|
-
}
|
|
232
|
-
finally {
|
|
233
|
-
setLoading(false);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Create a promise that resolves after a delay
|
|
238
|
-
*/
|
|
239
|
-
export const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
240
|
-
/**
|
|
241
|
-
* Execute async operation with retry on specific errors
|
|
242
|
-
*/
|
|
243
|
-
export async function retryOnError(operation, retryableErrors, maxRetries = 3) {
|
|
244
|
-
return retryAsync(operation, maxRetries, 1000, (error) => {
|
|
245
|
-
const errorCode = error?.code || error?.status || error?.message;
|
|
246
|
-
return retryableErrors.includes(errorCode);
|
|
247
|
-
});
|
|
248
|
-
}
|
|
@@ -29,13 +29,13 @@ export class AuthenticationFailedError extends Error {
|
|
|
29
29
|
* @throws {SessionSyncRequiredError} If the session needs to be synced (offline session)
|
|
30
30
|
*/
|
|
31
31
|
export async function ensureValidToken(oxyServices, _activeSessionId, syncSession) {
|
|
32
|
-
if (oxyServices.
|
|
32
|
+
if (oxyServices.session.isAuthenticated) {
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
if (syncSession) {
|
|
36
36
|
try {
|
|
37
37
|
await syncSession();
|
|
38
|
-
if (oxyServices.
|
|
38
|
+
if (oxyServices.session.isAuthenticated) {
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -15,9 +15,8 @@
|
|
|
15
15
|
*/
|
|
16
16
|
export const CENTRAL_IDP_APEX = 'oxy.so';
|
|
17
17
|
/**
|
|
18
|
-
* The IdP's origin, `auth.oxy.so` — the OAuth authorize/consent surface
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* Apps open it; they never run the passkey themselves.
|
|
18
|
+
* The IdP's origin, `auth.oxy.so` — the OAuth authorize/consent surface for
|
|
19
|
+
* third parties, the browser bridge (ADR 0029 D2) and the page an email
|
|
20
|
+
* sign-in link opens. Official apps sign in inside their own dialog (ADR 0030).
|
|
22
21
|
*/
|
|
23
22
|
export const AUTH_WEB_ORIGIN = `https://auth.${CENTRAL_IDP_APEX}`;
|
|
@@ -4,7 +4,7 @@ import { logger } from '../logger/index.js';
|
|
|
4
4
|
* Logs non-404 errors to help debug upload issues.
|
|
5
5
|
*
|
|
6
6
|
* @param fileId - The file ID to update visibility for
|
|
7
|
-
* @param oxyServices - OxyServices
|
|
7
|
+
* @param oxyServices - An OxyServices client
|
|
8
8
|
* @param contextName - Context name for error logging
|
|
9
9
|
*/
|
|
10
10
|
export async function updateAvatarVisibility(fileId, oxyServices, contextName = 'AvatarUtils') {
|
|
@@ -12,7 +12,7 @@ export async function updateAvatarVisibility(fileId, oxyServices, contextName =
|
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
14
|
try {
|
|
15
|
-
await oxyServices.
|
|
15
|
+
await oxyServices.assets.setVisibility(fileId, 'public');
|
|
16
16
|
}
|
|
17
17
|
catch (visError) {
|
|
18
18
|
// 404 is expected when asset doesn't exist yet — skip logging
|
package/dist/esm/utils/cache.js
CHANGED
|
@@ -34,12 +34,15 @@ export class TTLCache {
|
|
|
34
34
|
/**
|
|
35
35
|
* Create a new TTL cache
|
|
36
36
|
* @param defaultTTL Default TTL in milliseconds (default: 5 minutes)
|
|
37
|
+
* @param maxEntries Bound on live entries; the least recently used is evicted
|
|
38
|
+
* past it (default: 1000)
|
|
37
39
|
*/
|
|
38
|
-
constructor(defaultTTL = 5 * 60 * 1000) {
|
|
40
|
+
constructor(defaultTTL = 5 * 60 * 1000, maxEntries = 1000) {
|
|
39
41
|
this.cache = new Map();
|
|
40
42
|
this.hits = 0;
|
|
41
43
|
this.misses = 0;
|
|
42
44
|
this.defaultTTL = defaultTTL;
|
|
45
|
+
this.maxEntries = maxEntries;
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Get a value from cache
|
|
@@ -58,6 +61,9 @@ export class TTLCache {
|
|
|
58
61
|
this.misses++;
|
|
59
62
|
return null;
|
|
60
63
|
}
|
|
64
|
+
// Re-insert so Map order is recency order and eviction drops the LRU.
|
|
65
|
+
this.cache.delete(key);
|
|
66
|
+
this.cache.set(key, entry);
|
|
61
67
|
this.hits++;
|
|
62
68
|
return entry.data;
|
|
63
69
|
}
|
|
@@ -77,7 +83,13 @@ export class TTLCache {
|
|
|
77
83
|
// both into the default, making `cacheTTL:0` impossible to honor.
|
|
78
84
|
const effectiveTTL = ttl === undefined ? this.defaultTTL : ttl;
|
|
79
85
|
const expiresAt = now + effectiveTTL;
|
|
86
|
+
this.cache.delete(key);
|
|
80
87
|
this.cache.set(key, { data, timestamp: now, expiresAt });
|
|
88
|
+
if (this.cache.size > this.maxEntries) {
|
|
89
|
+
const oldest = this.cache.keys().next().value;
|
|
90
|
+
if (oldest !== undefined)
|
|
91
|
+
this.cache.delete(oldest);
|
|
92
|
+
}
|
|
81
93
|
if (!cleanupInterval && activeCaches.has(this))
|
|
82
94
|
updateCleanupInterval();
|
|
83
95
|
}
|
|
@@ -88,7 +100,9 @@ export class TTLCache {
|
|
|
88
100
|
*/
|
|
89
101
|
delete(key) {
|
|
90
102
|
const deleted = this.cache.delete(key);
|
|
91
|
-
|
|
103
|
+
// Only the delete that EMPTIES this cache can let the timer stop; checking
|
|
104
|
+
// on every delete made bulk invalidation O(deletes x caches).
|
|
105
|
+
if (deleted && this.cache.size === 0 && activeCaches.has(this))
|
|
92
106
|
updateCleanupInterval();
|
|
93
107
|
return deleted;
|
|
94
108
|
}
|
|
@@ -102,6 +116,22 @@ export class TTLCache {
|
|
|
102
116
|
if (activeCaches.has(this))
|
|
103
117
|
updateCleanupInterval();
|
|
104
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Delete every entry whose key matches, in ONE pass.
|
|
121
|
+
* @returns Number of entries deleted
|
|
122
|
+
*/
|
|
123
|
+
deleteWhere(match) {
|
|
124
|
+
let removed = 0;
|
|
125
|
+
for (const key of this.cache.keys()) {
|
|
126
|
+
if (match(key)) {
|
|
127
|
+
this.cache.delete(key);
|
|
128
|
+
removed++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (removed > 0 && this.cache.size === 0 && activeCaches.has(this))
|
|
132
|
+
updateCleanupInterval();
|
|
133
|
+
return removed;
|
|
134
|
+
}
|
|
105
135
|
/**
|
|
106
136
|
* Check if a key exists and is not expired
|
|
107
137
|
* @param key Cache key
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* The HTTP service injects the live access token; everything here is
|
|
7
7
|
* referentially transparent given that input.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { decodeTokenClaims } from './tokenClaims.js';
|
|
10
10
|
/**
|
|
11
11
|
* Discriminator used when there is no access token at all. Anonymous responses
|
|
12
12
|
* must never collide with any authenticated identity.
|
|
@@ -68,13 +68,8 @@ export function computeIdentityTag(accessToken) {
|
|
|
68
68
|
if (!accessToken) {
|
|
69
69
|
return ANON_IDENTITY;
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
// Undecodable token — still partition it away from anon and from other
|
|
77
|
-
// tokens via a hash. Never silently fall back to ANON_IDENTITY.
|
|
78
|
-
return `t${fnv1a32(accessToken)}`;
|
|
79
|
-
}
|
|
71
|
+
const decoded = decodeTokenClaims(accessToken);
|
|
72
|
+
// An undecodable token is still partitioned away from anon and from other
|
|
73
|
+
// tokens via a hash — never silently ANON_IDENTITY.
|
|
74
|
+
return decoded?.userId || decoded?.id || `t${fnv1a32(accessToken)}`;
|
|
80
75
|
}
|