@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
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
* account` pair) and the two removals an account id cannot name —
|
|
21
21
|
* `signOutContext` and `signOutPrincipal`;
|
|
22
22
|
* - the "Sign in with Oxy" device flow (same-device shared-keychain via
|
|
23
|
-
* `
|
|
24
|
-
* via `
|
|
23
|
+
* `oxy.auth.signInWithSharedIdentity`, else the cross-device QR handoff
|
|
24
|
+
* via `oxy.auth.commons.start` → poll → `oxy.auth.claimSession`);
|
|
25
25
|
* - AUTOMATIC delivery selection for that flow (issue #691): the user presses
|
|
26
26
|
* ONE primary action and the controller — not the user — picks how the
|
|
27
27
|
* request reaches their Commons identity, by gathering the facts
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
* (native only, via the injected `canOpenApp` probe), so the QR view can
|
|
38
38
|
* offer a "Get Commons" fallback instead of a same-device dead end.
|
|
39
39
|
*
|
|
40
|
-
* Sign-in is
|
|
41
|
-
*
|
|
42
|
-
* creation (`signup` view) is
|
|
43
|
-
*
|
|
40
|
+
* Sign-in is by email (a code or a link), an optional password and an
|
|
41
|
+
* optional authenticator, or the Commons QR / shared-keychain handoff. Account
|
|
42
|
+
* creation (`signup` view) is a username and a confirmed email, or a
|
|
43
|
+
* Commons-created identity.
|
|
44
44
|
*
|
|
45
45
|
* The controller owns NO surface PRESENTATION: whether the account dialog is
|
|
46
46
|
* mounted, visible, or dismissed is the job of the shared surface stack
|
|
@@ -59,7 +59,7 @@ import { extractErrorStatus } from '../utils/errorUtils';
|
|
|
59
59
|
import type { SessionClient } from './SessionClient';
|
|
60
60
|
import { getSocketIO, type MinimalSocket, type SocketIOFactory } from './socketLoader';
|
|
61
61
|
import { resolveActiveContext, type DeviceContext } from './deviceDirectory';
|
|
62
|
-
import type { CommonsSignInHandle } from '../
|
|
62
|
+
import type { CommonsSignInHandle } from '../api/auth';
|
|
63
63
|
import {
|
|
64
64
|
pushTargetsFromDelivery,
|
|
65
65
|
selectCommonsDelivery,
|
|
@@ -606,9 +606,9 @@ export class AccountDialogController {
|
|
|
606
606
|
// has returned; `ensureActiveToken` plants it async later), so the
|
|
607
607
|
// device-state subscription alone cannot observe the signed-out → signed-in
|
|
608
608
|
// edge. Observe the SDK-canonical readiness signal directly — a change to
|
|
609
|
-
// `
|
|
609
|
+
// `oxy.session.accessToken`, the `hasAccessToken` term of
|
|
610
610
|
// `OxyContext.canUsePrivateApi`.
|
|
611
|
-
this.unsubscribeTokens = this.oxyServices.
|
|
611
|
+
this.unsubscribeTokens = this.oxyServices.session.onChange(() => {
|
|
612
612
|
this.reconcileAuth();
|
|
613
613
|
});
|
|
614
614
|
// Initial projection is device-only. `refresh()` fetches the graph IFF a
|
|
@@ -652,7 +652,7 @@ export class AccountDialogController {
|
|
|
652
652
|
* Whether a PRIVATE endpoint may be called right now. Mirrors the
|
|
653
653
|
* `hasAccessToken` term of `OxyContext.canUsePrivateApi`
|
|
654
654
|
* (`authResolved && isAuthenticated && tokenReady && hasAccessToken`, where
|
|
655
|
-
* `hasAccessToken = Boolean(
|
|
655
|
+
* `hasAccessToken = Boolean(oxy.session.accessToken)`): a planted bearer
|
|
656
656
|
* is the only term that decides whether a request carries auth — the other
|
|
657
657
|
* three are provider render-lifecycle gates with no headless equivalent.
|
|
658
658
|
*
|
|
@@ -663,7 +663,7 @@ export class AccountDialogController {
|
|
|
663
663
|
* on this.
|
|
664
664
|
*/
|
|
665
665
|
private isAuthenticated(): boolean {
|
|
666
|
-
return Boolean(this.oxyServices.
|
|
666
|
+
return Boolean(this.oxyServices.session.accessToken);
|
|
667
667
|
}
|
|
668
668
|
|
|
669
669
|
/**
|
|
@@ -755,7 +755,7 @@ export class AccountDialogController {
|
|
|
755
755
|
this.setView('add');
|
|
756
756
|
}
|
|
757
757
|
|
|
758
|
-
/** Switch to the "create account" view (
|
|
758
|
+
/** Switch to the "create account" view (email / Commons signup entry). */
|
|
759
759
|
startSignup(): void {
|
|
760
760
|
this.setView('signup');
|
|
761
761
|
}
|
|
@@ -1030,7 +1030,7 @@ export class AccountDialogController {
|
|
|
1030
1030
|
try {
|
|
1031
1031
|
// Minted WITHOUT planting the bearer: `completeSignIn` installs it only if
|
|
1032
1032
|
// this attempt is still the current one when the mint returns.
|
|
1033
|
-
const session = await this.oxyServices.signInWithSharedIdentity({ plantTokens: false });
|
|
1033
|
+
const session = await this.oxyServices.auth.signInWithSharedIdentity({ plantTokens: false });
|
|
1034
1034
|
if (!this.isCurrentAttempt(attempt)) return;
|
|
1035
1035
|
if (session) {
|
|
1036
1036
|
await this.completeSignIn(attempt, session, session.user);
|
|
@@ -1132,7 +1132,7 @@ export class AccountDialogController {
|
|
|
1132
1132
|
this.setSignIn({ ...IDLE_SIGN_IN_FACTS, phase: 'starting' });
|
|
1133
1133
|
let handle: CommonsSignInHandle;
|
|
1134
1134
|
try {
|
|
1135
|
-
handle = await this.oxyServices.
|
|
1135
|
+
handle = await this.oxyServices.auth.commons.start({ clientId: this.clientId });
|
|
1136
1136
|
} catch (error) {
|
|
1137
1137
|
if (!this.isCurrentAttempt(attempt)) return null;
|
|
1138
1138
|
this.failSignIn(requestFailureReason(error), errorMessage(error));
|
|
@@ -1241,7 +1241,7 @@ export class AccountDialogController {
|
|
|
1241
1241
|
if (this.platform === 'mobile' && commonsAvailable) return 0;
|
|
1242
1242
|
if (!this.isAuthenticated()) return 0;
|
|
1243
1243
|
try {
|
|
1244
|
-
const result = await this.oxyServices.
|
|
1244
|
+
const result = await this.oxyServices.auth.commons.deliver(authorizeCode);
|
|
1245
1245
|
// `delivered: false` with `targets > 0` is a transport failure, not a
|
|
1246
1246
|
// reachable install — the shared helper owns that rule so the surface
|
|
1247
1247
|
// can never park a user on "check your phone" for a push that failed.
|
|
@@ -1350,7 +1350,7 @@ export class AccountDialogController {
|
|
|
1350
1350
|
*/
|
|
1351
1351
|
private async withdrawRequest(authorizeCode: string): Promise<void> {
|
|
1352
1352
|
try {
|
|
1353
|
-
await this.oxyServices.
|
|
1353
|
+
await this.oxyServices.auth.commons.deny(authorizeCode);
|
|
1354
1354
|
} catch (error) {
|
|
1355
1355
|
logger.debug(
|
|
1356
1356
|
'[AccountDialogController] request withdrawal failed',
|
|
@@ -1390,7 +1390,7 @@ export class AccountDialogController {
|
|
|
1390
1390
|
return;
|
|
1391
1391
|
}
|
|
1392
1392
|
try {
|
|
1393
|
-
const status = await this.oxyServices.
|
|
1393
|
+
const status = await this.oxyServices.auth.commons.poll(sessionToken);
|
|
1394
1394
|
if (this.signInToken !== sessionToken) return; // cancelled mid-request
|
|
1395
1395
|
// Delivery PROGRESS first: it is reported alongside every status, and
|
|
1396
1396
|
// recording it before the terminal branches means a poll that also
|
|
@@ -1457,7 +1457,7 @@ export class AccountDialogController {
|
|
|
1457
1457
|
try {
|
|
1458
1458
|
// Claimed WITHOUT planting the bearer — `completeSignIn` installs it only
|
|
1459
1459
|
// if the user is still waiting for this attempt when the claim returns.
|
|
1460
|
-
claimed = await this.oxyServices.
|
|
1460
|
+
claimed = await this.oxyServices.auth.claimSession(sessionToken, { plantTokens: false });
|
|
1461
1461
|
} catch (error) {
|
|
1462
1462
|
if (!this.isCurrentAttempt(attempt)) return;
|
|
1463
1463
|
this.failSignIn('claim-failed', errorMessage(error));
|
|
@@ -1525,14 +1525,14 @@ export class AccountDialogController {
|
|
|
1525
1525
|
user: MinimalUserData,
|
|
1526
1526
|
): Promise<void> {
|
|
1527
1527
|
if (!this.isCurrentAttempt(attempt)) return;
|
|
1528
|
-
const previousToken = this.oxyServices.
|
|
1528
|
+
const previousToken = this.oxyServices.session.accessToken;
|
|
1529
1529
|
try {
|
|
1530
|
-
if (session.accessToken) this.oxyServices.
|
|
1530
|
+
if (session.accessToken) this.oxyServices.session.setAccessToken(session.accessToken);
|
|
1531
1531
|
await this.commitAuthorizedSession(session, user);
|
|
1532
1532
|
} catch (error) {
|
|
1533
|
-
if (session.accessToken && this.oxyServices.
|
|
1534
|
-
if (previousToken) this.oxyServices.
|
|
1535
|
-
else this.oxyServices.
|
|
1533
|
+
if (session.accessToken && this.oxyServices.session.accessToken === session.accessToken) {
|
|
1534
|
+
if (previousToken) this.oxyServices.session.setAccessToken(previousToken);
|
|
1535
|
+
else this.oxyServices.session.clear();
|
|
1536
1536
|
}
|
|
1537
1537
|
throw error;
|
|
1538
1538
|
}
|
|
@@ -1606,7 +1606,7 @@ export class AccountDialogController {
|
|
|
1606
1606
|
if (!socketFactory || this.signInToken !== sessionToken) return;
|
|
1607
1607
|
let socket: MinimalSocket;
|
|
1608
1608
|
try {
|
|
1609
|
-
socket = socketFactory(`${this.oxyServices.
|
|
1609
|
+
socket = socketFactory(`${this.oxyServices.baseURL}${AUTH_SESSION_NAMESPACE}`, {
|
|
1610
1610
|
transports: ['websocket'],
|
|
1611
1611
|
autoConnect: true,
|
|
1612
1612
|
reconnection: true,
|
|
@@ -25,9 +25,10 @@ import { logger } from '../logger';
|
|
|
25
25
|
* `sessionId` + `userId` identify the owning device session and active account.
|
|
26
26
|
* `deviceId` + `deviceSecret` are the zero-cookie mint credential: the client
|
|
27
27
|
* presents BOTH at `POST /session/device/token` — the secret is the proof, the
|
|
28
|
-
* deviceId selects the device doc. The
|
|
29
|
-
*
|
|
30
|
-
*
|
|
28
|
+
* deviceId selects the device doc. The mint returns `nextDeviceSecret` (today the
|
|
29
|
+
* presented secret, unchanged — the server never rotates a holder's
|
|
30
|
+
* credential), which the cold boot / re-mint handler persist BEFORE planting
|
|
31
|
+
* the minted access token.
|
|
31
32
|
*
|
|
32
33
|
* `accessToken` + `expiresAt` are OPTIONAL warm-boot fields. Persisting them lets
|
|
33
34
|
* the cold boot plant a still-valid access token on the very first paint WITHOUT
|
|
@@ -49,9 +50,9 @@ export interface PersistedAuthState {
|
|
|
49
50
|
*/
|
|
50
51
|
deviceId?: string;
|
|
51
52
|
/**
|
|
52
|
-
*
|
|
53
|
-
* short access token for the device's active account via
|
|
54
|
-
* `POST /session/device/token`.
|
|
53
|
+
* This holder's device secret (zero-cookie transport). Possession of it mints
|
|
54
|
+
* a short access token for the device's active account via
|
|
55
|
+
* `POST /session/device/token`. Stable: the server never rotates it.
|
|
55
56
|
*/
|
|
56
57
|
deviceSecret?: string;
|
|
57
58
|
/** Optional warm-boot access token (short-lived; see interface docs). */
|
|
@@ -263,8 +264,8 @@ function composeState(durableRaw: string | null, warmRaw: string | null): Persis
|
|
|
263
264
|
// New split layout: the warm key is authoritative for the token fields.
|
|
264
265
|
// Drop anything the durable blob may have carried, then overlay the warm
|
|
265
266
|
// values (a warm key with no token → the session simply has no warm token).
|
|
266
|
-
|
|
267
|
-
|
|
267
|
+
Reflect.deleteProperty(state, 'accessToken');
|
|
268
|
+
Reflect.deleteProperty(state, 'expiresAt');
|
|
268
269
|
const warm = parseWarmToken(warmRaw);
|
|
269
270
|
if (warm?.accessToken) {
|
|
270
271
|
state.accessToken = warm.accessToken;
|
|
@@ -154,7 +154,7 @@ export async function establishIdentitySession(args: {
|
|
|
154
154
|
return null;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
const { challenge } = await oxy.requestChallenge(publicKey, requestOptions);
|
|
157
|
+
const { challenge } = await oxy.auth.requestChallenge(publicKey, requestOptions);
|
|
158
158
|
const signed = await signChallengeOf(binding)(challenge);
|
|
159
159
|
if (signed.publicKey.toLowerCase() !== publicKey.toLowerCase()) {
|
|
160
160
|
// The signer disagrees with the key we resolved a challenge for — the
|
|
@@ -164,7 +164,7 @@ export async function establishIdentitySession(args: {
|
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
// `signed.challenge` carries the SIGNATURE (mirrors `signChallengeWithSharedKey`).
|
|
167
|
-
const session = await oxy.verifyChallenge(
|
|
167
|
+
const session = await oxy.auth.verifyChallenge(
|
|
168
168
|
signed.publicKey,
|
|
169
169
|
challenge,
|
|
170
170
|
signed.challenge,
|
|
@@ -177,7 +177,7 @@ export async function establishIdentitySession(args: {
|
|
|
177
177
|
return null;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
// Persist the
|
|
180
|
+
// Persist the device credential so later boots re-mint through the
|
|
181
181
|
// fast `POST /session/device/token` lane instead of re-signing a challenge.
|
|
182
182
|
if (session.deviceId && session.deviceSecret) {
|
|
183
183
|
await store.save({
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@oxy.so/core/session` — the device-first session machinery.
|
|
3
|
+
*
|
|
4
|
+
* The multi-account `SessionClient`, the headless account dialog, the persisted
|
|
5
|
+
* auth-state stores, the token re-mint handler and scheduler, and the cold
|
|
6
|
+
* boot. `@oxy.so/services` builds `OxyProvider` on it; an app that only calls
|
|
7
|
+
* the API with a token it already has never needs it.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// Session code reaches the identity key (identity-bound sessions), so the
|
|
11
|
+
// crypto shim goes first — see `../crypto/polyfill`.
|
|
12
|
+
import '../crypto/polyfill';
|
|
13
|
+
|
|
14
|
+
export { DeviceManager } from '../utils/deviceManager';
|
|
15
|
+
export type { DeviceFingerprint, StoredDeviceInfo } from '../utils/deviceManager';
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Session sync (device-scoped multi-account session client)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export { SessionClient } from './SessionClient';
|
|
21
|
+
export type { TokenTransport, SessionClientHost, SessionClientOptions, DeviceCredential, SessionStateOrigin } from './SessionClient';
|
|
22
|
+
// Injectable for tests/specialized hosts; ordinary consumers use core's lazy
|
|
23
|
+
// transport and do not pull socket.io-client into their initial module graph.
|
|
24
|
+
export type { SocketIOFactory, MinimalSocket } from './socketLoader';
|
|
25
|
+
|
|
26
|
+
// Shared SessionClient integration layer: the host adapter, the pure
|
|
27
|
+
// DeviceSessionState projection helpers, and the client factory are defined
|
|
28
|
+
// ONCE here so every `@oxy.so/services` platform variant reuses them instead of
|
|
29
|
+
// duplicating a local copy. Each consumer supplies its own `TokenTransport`
|
|
30
|
+
// (native vs. web mint strategies differ) to `createSessionClient`.
|
|
31
|
+
export { createSessionClientHost } from './sessionClientHost';
|
|
32
|
+
export { createSessionClient } from './createSessionClient';
|
|
33
|
+
export {
|
|
34
|
+
deviceStateToClientSessions,
|
|
35
|
+
activeSessionIdOf,
|
|
36
|
+
activeUserOf,
|
|
37
|
+
accountIdsOf,
|
|
38
|
+
} from './projectSessionState';
|
|
39
|
+
|
|
40
|
+
// Pure projections over the device DIRECTORY (`GET /session/device/directory`,
|
|
41
|
+
// ADR 0002) — the read model that keeps the actor (the human who authenticated)
|
|
42
|
+
// and the subject (the account being acted as) apart. The flat
|
|
43
|
+
// `DeviceSessionState` collapses them into one row, so it can neither tell
|
|
44
|
+
// "signed in as an org" from "a person operating that org" nor hold two people
|
|
45
|
+
// reaching the same org on one device.
|
|
46
|
+
// `canActivateContext` is the switchability question — `available` alone, never
|
|
47
|
+
// composed with `onDevice`, which is a different fact in both directions.
|
|
48
|
+
// `projectDevicePrincipals` is the switcher's shape: people, each with what
|
|
49
|
+
// they may become. Grouped rather than flat because the same organization
|
|
50
|
+
// reached through two people is TWO rows under two humans, which a list keyed
|
|
51
|
+
// by account cannot say.
|
|
52
|
+
export {
|
|
53
|
+
canActivateContext,
|
|
54
|
+
directoryDisplayName,
|
|
55
|
+
directoryHandle,
|
|
56
|
+
projectDevicePrincipals,
|
|
57
|
+
resolveActiveContext,
|
|
58
|
+
resolveDeviceContext,
|
|
59
|
+
} from './deviceDirectory';
|
|
60
|
+
export type {
|
|
61
|
+
DeviceContext,
|
|
62
|
+
DeviceContextActor,
|
|
63
|
+
DeviceContextSubject,
|
|
64
|
+
DevicePrincipalGroup,
|
|
65
|
+
} from './deviceDirectory';
|
|
66
|
+
|
|
67
|
+
// The switcher's RENDER model over that projection — names, handles and avatar
|
|
68
|
+
// URLs resolved once. Shared by `@oxy.so/services`' account dialog and the
|
|
69
|
+
// auth.oxy.so chooser so the two cannot drift, the same reason the flat
|
|
70
|
+
// projection lived here before it.
|
|
71
|
+
export { buildSwitcherRows, showsPrincipalHeaders } from './deviceSwitcherRows';
|
|
72
|
+
export type {
|
|
73
|
+
ResolveAvatarUrl,
|
|
74
|
+
SwitcherContextRow,
|
|
75
|
+
SwitcherPrincipalRow,
|
|
76
|
+
} from './deviceSwitcherRows';
|
|
77
|
+
|
|
78
|
+
// The switch-target predicates over the account GRAPH — a list of accounts to
|
|
79
|
+
// manage, not the device's list of identities to become (that is the directory
|
|
80
|
+
// above). `isSwitchTargetAccount` is the structural half ("is this kind
|
|
81
|
+
// switchable at all?"); `canSwitchIntoAccount` adds the caller's
|
|
82
|
+
// `account:act_as` permission. Exported so the surfaces that render
|
|
83
|
+
// `AccountNode`s — the Console workspace switcher, managed-accounts rows — ask
|
|
84
|
+
// the SAME questions instead of testing a kind literal.
|
|
85
|
+
export {
|
|
86
|
+
isSwitchTargetAccount,
|
|
87
|
+
canSwitchIntoAccount,
|
|
88
|
+
} from './accountSwitchTargets';
|
|
89
|
+
|
|
90
|
+
// The service/agent counterpart to the human switch predicates above. Kept on
|
|
91
|
+
// its own semantic seam because `bot` is delegable but never human-switchable.
|
|
92
|
+
export { resolveAccountDelegationAccess } from './accountDelegationAccess';
|
|
93
|
+
export type {
|
|
94
|
+
AccountDelegationAccess,
|
|
95
|
+
AccountDelegationNode,
|
|
96
|
+
} from './accountDelegationAccess';
|
|
97
|
+
|
|
98
|
+
// Headless controller for the unified account dialog. Framework-agnostic
|
|
99
|
+
// state machine + subscribe/getSnapshot store (bind via `useSyncExternalStore`)
|
|
100
|
+
// — sign-in runs through `oxy.auth` (email, password, authenticator, the
|
|
101
|
+
// Commons QR / shared-keychain handoff). Reuses `SessionClient.switchAccount` /
|
|
102
|
+
// `oxy.accounts.actAs` for the uniform switch.
|
|
103
|
+
export {
|
|
104
|
+
AccountDialogController,
|
|
105
|
+
createAccountDialogController,
|
|
106
|
+
} from './accountDialogController';
|
|
107
|
+
export type {
|
|
108
|
+
AccountDialogControllerOptions,
|
|
109
|
+
AccountDialogSnapshot,
|
|
110
|
+
AccountDialogView,
|
|
111
|
+
CommonsAvailability,
|
|
112
|
+
ContextChoiceOutcome,
|
|
113
|
+
SignInFailureReason,
|
|
114
|
+
SignInFlowPhase,
|
|
115
|
+
SignInFlowState,
|
|
116
|
+
SignInProgress,
|
|
117
|
+
} from './accountDialogController';
|
|
118
|
+
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Device-first session machinery (zero-cookie transport).
|
|
121
|
+
// Persisted auth-state store, the unified re-mint handler + scheduler, and the
|
|
122
|
+
// cold-boot runner. Built ON the `runColdBoot` primitive + `SessionClient`. The
|
|
123
|
+
// device credential is `deviceId` + `deviceSecret`; the access token is re-minted
|
|
124
|
+
// via `POST /session/device/token`.
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
export {
|
|
127
|
+
createWebAuthStateStore,
|
|
128
|
+
createNativeAuthStateStore,
|
|
129
|
+
createMemoryAuthStateStore,
|
|
130
|
+
AUTH_STATE_STORAGE_KEY,
|
|
131
|
+
} from './authStateStore';
|
|
132
|
+
export type {
|
|
133
|
+
PersistedAuthState,
|
|
134
|
+
AuthStateStore,
|
|
135
|
+
NativeKeyValueStorage,
|
|
136
|
+
} from './authStateStore';
|
|
137
|
+
|
|
138
|
+
// The shared NATIVE DeviceSession credential — how several official apps on one
|
|
139
|
+
// device end up on ONE `DeviceSession` and therefore one active context. It is an
|
|
140
|
+
// ordinary revocable `deviceId` + `deviceSecret`, deliberately NOT the
|
|
141
|
+
// Commons private identity key: an app that only needs a session must never be
|
|
142
|
+
// handed the key that signs identity approvals.
|
|
143
|
+
export {
|
|
144
|
+
createSharedMirroringAuthStateStore,
|
|
145
|
+
decideSharedDeviceJoin,
|
|
146
|
+
decideSharedDevicePublish,
|
|
147
|
+
normalizeSharedDeviceSessionRead,
|
|
148
|
+
publishProvenDeviceCredential,
|
|
149
|
+
readLocalDeviceCredential,
|
|
150
|
+
} from './sharedDeviceCredential';
|
|
151
|
+
export type {
|
|
152
|
+
SharedDeviceCredential,
|
|
153
|
+
SharedDeviceCredentialRead,
|
|
154
|
+
SharedDeviceCredentialStore,
|
|
155
|
+
SharedDeviceJoinDecision,
|
|
156
|
+
SharedDeviceJoinSkipReason,
|
|
157
|
+
SharedDevicePublishDecision,
|
|
158
|
+
SharedDevicePublishOutcome,
|
|
159
|
+
SharedDevicePublishSkipReason,
|
|
160
|
+
} from './sharedDeviceCredential';
|
|
161
|
+
|
|
162
|
+
// Identity-bound sessions (the identity vault). The pin is the durable
|
|
163
|
+
// `{publicKey, accountId}` binding between this device's PRIMARY identity key
|
|
164
|
+
// and the account it authenticates as; it is what keeps such a client from
|
|
165
|
+
// following the device's mutable `activeAccountId`.
|
|
166
|
+
export {
|
|
167
|
+
createWebIdentityPinStore,
|
|
168
|
+
createNativeIdentityPinStore,
|
|
169
|
+
createMemoryIdentityPinStore,
|
|
170
|
+
identityPinMatches,
|
|
171
|
+
IDENTITY_PIN_STORAGE_KEY,
|
|
172
|
+
} from './identityPin';
|
|
173
|
+
export type { IdentityPin, IdentityPinStore } from './identityPin';
|
|
174
|
+
export {
|
|
175
|
+
resolveIdentityPin,
|
|
176
|
+
establishIdentitySession,
|
|
177
|
+
} from './identitySession';
|
|
178
|
+
export type {
|
|
179
|
+
IdentityBinding,
|
|
180
|
+
IdentityRequestOptions,
|
|
181
|
+
EstablishedIdentitySession,
|
|
182
|
+
} from './identitySession';
|
|
183
|
+
export {
|
|
184
|
+
refreshPersistedSession,
|
|
185
|
+
refreshDeviceSecretArm,
|
|
186
|
+
createAuthRefreshHandler,
|
|
187
|
+
installAuthRefreshHandler,
|
|
188
|
+
startTokenRefreshScheduler,
|
|
189
|
+
TOKEN_REFRESH_LEAD_MS,
|
|
190
|
+
} from './refresh';
|
|
191
|
+
export type { RefreshDeps, TokenRefreshSchedulerHandle, DeviceSecretMintOutcome } from './refresh';
|
|
192
|
+
|
|
193
|
+
export { runSessionColdBoot } from '../boot/sessionColdBoot';
|
|
194
|
+
export type {
|
|
195
|
+
RunSessionColdBootOptions,
|
|
196
|
+
SessionMode,
|
|
197
|
+
SignedOutReason,
|
|
198
|
+
DeviceBootSession,
|
|
199
|
+
} from '../boot/sessionColdBoot';
|
|
200
|
+
|
|
201
|
+
export { runColdBoot } from '../utils/coldBoot';
|
|
202
|
+
export type {
|
|
203
|
+
ColdBootStep,
|
|
204
|
+
ColdBootStepResult,
|
|
205
|
+
ColdBootSession,
|
|
206
|
+
ColdBootSkip,
|
|
207
|
+
ColdBootOutcome,
|
|
208
|
+
RunColdBootOptions,
|
|
209
|
+
} from '../utils/coldBoot';
|
|
210
|
+
|
package/src/session/refresh.ts
CHANGED
|
@@ -164,8 +164,8 @@ export async function refreshDeviceSecretArm(deps: {
|
|
|
164
164
|
}): Promise<DeviceSecretMintOutcome> {
|
|
165
165
|
const { oxy, store } = deps;
|
|
166
166
|
const pin = deps.pin ?? null;
|
|
167
|
-
return oxy.
|
|
168
|
-
const epoch = oxy.
|
|
167
|
+
return oxy.http.runSingleFlightDeviceSecretMint(async () => {
|
|
168
|
+
const epoch = oxy.http.getSessionEpoch();
|
|
169
169
|
const persisted = await store.load();
|
|
170
170
|
if (!persisted?.deviceId || !persisted?.deviceSecret) {
|
|
171
171
|
return { status: 'no-secret' };
|
|
@@ -176,10 +176,10 @@ export async function refreshDeviceSecretArm(deps: {
|
|
|
176
176
|
// Unpinned callers pass NO third argument at all, so the account-mode call
|
|
177
177
|
// shape (and therefore the request body) is untouched by this feature.
|
|
178
178
|
mint = pin
|
|
179
|
-
? await oxy.
|
|
179
|
+
? await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret, {
|
|
180
180
|
accountId: pin.accountId,
|
|
181
181
|
})
|
|
182
|
-
: await oxy.
|
|
182
|
+
: await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret);
|
|
183
183
|
} catch (error) {
|
|
184
184
|
// 429 keeps the credential like any other transient failure — the secret
|
|
185
185
|
// was never judged — but it must NOT retry on the transient cadence. The
|
|
@@ -190,7 +190,7 @@ export async function refreshDeviceSecretArm(deps: {
|
|
|
190
190
|
// requests. Telling HttpService lengthens the next cooldown to one attempt
|
|
191
191
|
// per limiter window, which lets the budget drain and the session heal.
|
|
192
192
|
if (extractErrorStatus(error) === 429) {
|
|
193
|
-
oxy.
|
|
193
|
+
oxy.http.noteRefreshRateLimited();
|
|
194
194
|
return { status: 'transient' };
|
|
195
195
|
}
|
|
196
196
|
if (extractErrorStatus(error) === 401) {
|
|
@@ -229,11 +229,11 @@ export async function refreshDeviceSecretArm(deps: {
|
|
|
229
229
|
expiresAt: mint.expiresAt,
|
|
230
230
|
...(bound ? { sessionId: bound.sessionId, userId: bound.accountId } : {}),
|
|
231
231
|
};
|
|
232
|
-
if (oxy.
|
|
233
|
-
// Signed out while minting.
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
232
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
233
|
+
// Signed out while minting. A store that still holds the presented
|
|
234
|
+
// secret takes the server's `nextDeviceSecret` (the token-null lane keeps
|
|
235
|
+
// the store so a reload can restore); a store the sign-out cleared must
|
|
236
|
+
// NOT be refilled. Either way, plant nothing.
|
|
237
237
|
const current = await store.load();
|
|
238
238
|
if (current?.deviceId === persisted.deviceId && current.deviceSecret === persisted.deviceSecret) {
|
|
239
239
|
await store.save(next);
|
|
@@ -246,10 +246,10 @@ export async function refreshDeviceSecretArm(deps: {
|
|
|
246
246
|
if (!persistedOk) {
|
|
247
247
|
return { status: 'persist-failed' };
|
|
248
248
|
}
|
|
249
|
-
if (oxy.
|
|
249
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
250
250
|
return { status: 'session-ended' };
|
|
251
251
|
}
|
|
252
|
-
oxy.
|
|
252
|
+
oxy.session.setAccessToken(mint.accessToken);
|
|
253
253
|
return {
|
|
254
254
|
status: 'ok',
|
|
255
255
|
token: mint.accessToken,
|
|
@@ -287,7 +287,7 @@ export async function refreshPersistedSession(deps: RefreshDeps): Promise<string
|
|
|
287
287
|
const identity = deps.identity ?? null;
|
|
288
288
|
// The shared keychain is never an identity-bound client's recovery path.
|
|
289
289
|
const allowSharedKeyFallback = identity ? false : (deps.allowSharedKeyFallback ?? isNative());
|
|
290
|
-
const epoch = oxy.
|
|
290
|
+
const epoch = oxy.http.getSessionEpoch();
|
|
291
291
|
// Resolved per call: a re-established identity session can move the pin, and a
|
|
292
292
|
// replaced/removed local key clears it (in which case arm 1 must NOT mint —
|
|
293
293
|
// an unpinned mint would adopt whatever account the device switched to).
|
|
@@ -324,12 +324,18 @@ export async function refreshPersistedSession(deps: RefreshDeps): Promise<string
|
|
|
324
324
|
// 401: secret diverged or no live session. When a key-based arm 2 can still
|
|
325
325
|
// recover (native shared key, or an identity-bound client's own primary
|
|
326
326
|
// key) drop ONLY the secret and keep the deviceId; otherwise (web) the
|
|
327
|
-
// session is over
|
|
327
|
+
// session is over.
|
|
328
328
|
const persisted = await store.load();
|
|
329
329
|
if (allowSharedKeyFallback || identity) {
|
|
330
330
|
if (persisted) {
|
|
331
331
|
await store.save({ ...persisted, deviceSecret: undefined });
|
|
332
332
|
}
|
|
333
|
+
} else if (arm1.status === 'no-session' && persisted?.deviceId && persisted.deviceSecret) {
|
|
334
|
+
// Web, a credential the server still recognises: this origin stays a
|
|
335
|
+
// holder of the browser's device (ADR 0029 D2) — the next sign-in in any
|
|
336
|
+
// app lands on it, and this app follows without opening the bridge
|
|
337
|
+
// again. Only the session fields go.
|
|
338
|
+
await store.save({ sessionId: '', userId: '', deviceId: persisted.deviceId, deviceSecret: persisted.deviceSecret });
|
|
333
339
|
} else {
|
|
334
340
|
await store.clear();
|
|
335
341
|
}
|
|
@@ -353,14 +359,14 @@ export async function refreshPersistedSession(deps: RefreshDeps): Promise<string
|
|
|
353
359
|
|
|
354
360
|
// Never after a sign-out: the shared keychain holds an identity KEY, not a
|
|
355
361
|
// session, and using it here would sign the user straight back in.
|
|
356
|
-
if (allowSharedKeyFallback && !oxy.
|
|
362
|
+
if (allowSharedKeyFallback && !oxy.http.hasSessionEnded()) {
|
|
357
363
|
try {
|
|
358
364
|
// Planted here, not by the sign-in: a sign-out that lands while the
|
|
359
365
|
// challenge round-trips must win, or the shared keychain signs the user
|
|
360
366
|
// straight back in.
|
|
361
|
-
const session = await oxy.signInWithSharedIdentity({ plantTokens: false });
|
|
367
|
+
const session = await oxy.auth.signInWithSharedIdentity({ plantTokens: false });
|
|
362
368
|
if (session?.accessToken) {
|
|
363
|
-
if (oxy.
|
|
369
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
364
370
|
return null;
|
|
365
371
|
}
|
|
366
372
|
// Repopulate the fast device-secret lane from the shared-key re-mint.
|
|
@@ -374,10 +380,10 @@ export async function refreshPersistedSession(deps: RefreshDeps): Promise<string
|
|
|
374
380
|
expiresAt: session.expiresAt,
|
|
375
381
|
});
|
|
376
382
|
}
|
|
377
|
-
if (oxy.
|
|
383
|
+
if (oxy.http.getSessionEpoch() !== epoch) {
|
|
378
384
|
return null;
|
|
379
385
|
}
|
|
380
|
-
oxy.
|
|
386
|
+
oxy.session.setAccessToken(session.accessToken);
|
|
381
387
|
return session.accessToken;
|
|
382
388
|
}
|
|
383
389
|
} catch (error) {
|
|
@@ -438,9 +444,9 @@ export function createAuthRefreshHandler(deps: RefreshDeps): AuthRefreshHandler
|
|
|
438
444
|
* Returns a disposer that removes it.
|
|
439
445
|
*/
|
|
440
446
|
export function installAuthRefreshHandler(deps: RefreshDeps): () => void {
|
|
441
|
-
deps.oxy.
|
|
447
|
+
deps.oxy.http.setAuthRefreshHandler(createAuthRefreshHandler(deps));
|
|
442
448
|
return () => {
|
|
443
|
-
deps.oxy.
|
|
449
|
+
deps.oxy.http.setAuthRefreshHandler(null);
|
|
444
450
|
};
|
|
445
451
|
}
|
|
446
452
|
|
|
@@ -491,10 +497,10 @@ export function startTokenRefreshScheduler(oxy: OxyServices): TokenRefreshSchedu
|
|
|
491
497
|
/** Schedule the next re-mint from the current token's expiry (the healthy path). */
|
|
492
498
|
const scheduleFromExpiry = (): void => {
|
|
493
499
|
clearTimer();
|
|
494
|
-
if (disposed || !oxy.
|
|
500
|
+
if (disposed || !oxy.session.accessToken) {
|
|
495
501
|
return;
|
|
496
502
|
}
|
|
497
|
-
const expSeconds = oxy.
|
|
503
|
+
const expSeconds = oxy.session.accessTokenExpiry;
|
|
498
504
|
if (expSeconds === null) {
|
|
499
505
|
return;
|
|
500
506
|
}
|
|
@@ -502,7 +508,7 @@ export function startTokenRefreshScheduler(oxy: OxyServices): TokenRefreshSchedu
|
|
|
502
508
|
// The server already answered this token's refresh with this very token:
|
|
503
509
|
// asking again before `exp` only gets it back again. Ask just after expiry,
|
|
504
510
|
// when the server rotates (see REMINT_AFTER_EXPIRY_MS).
|
|
505
|
-
if (untilExpiryMs > 0 && oxy.
|
|
511
|
+
if (untilExpiryMs > 0 && oxy.http.isAwaitingCurrentTokenExpiry?.()) {
|
|
506
512
|
armTimer(untilExpiryMs + REMINT_AFTER_EXPIRY_MS);
|
|
507
513
|
return;
|
|
508
514
|
}
|
|
@@ -515,11 +521,11 @@ export function startTokenRefreshScheduler(oxy: OxyServices): TokenRefreshSchedu
|
|
|
515
521
|
clearTimer();
|
|
516
522
|
// Another lane (a request-time preflight) already asked, and the server
|
|
517
523
|
// answered with this same token: re-arm for just past expiry instead.
|
|
518
|
-
if (oxy.
|
|
524
|
+
if (oxy.http.isAwaitingCurrentTokenExpiry?.()) {
|
|
519
525
|
scheduleFromExpiry();
|
|
520
526
|
return;
|
|
521
527
|
}
|
|
522
|
-
void oxy.
|
|
528
|
+
void oxy.http.refreshAccessToken('preflight')
|
|
523
529
|
.then((token) => Boolean(token))
|
|
524
530
|
.catch(() => false)
|
|
525
531
|
.then((ok) => {
|
|
@@ -548,10 +554,10 @@ export function startTokenRefreshScheduler(oxy: OxyServices): TokenRefreshSchedu
|
|
|
548
554
|
};
|
|
549
555
|
|
|
550
556
|
const onFocus = (): void => {
|
|
551
|
-
if (disposed || !oxy.
|
|
557
|
+
if (disposed || !oxy.session.accessToken) {
|
|
552
558
|
return;
|
|
553
559
|
}
|
|
554
|
-
const expSeconds = oxy.
|
|
560
|
+
const expSeconds = oxy.session.accessTokenExpiry;
|
|
555
561
|
if (expSeconds === null) {
|
|
556
562
|
return;
|
|
557
563
|
}
|
|
@@ -566,8 +572,8 @@ export function startTokenRefreshScheduler(oxy: OxyServices): TokenRefreshSchedu
|
|
|
566
572
|
// Re-arm only on a token that actually CHANGED. The mint plants the token it
|
|
567
573
|
// returns even when that is the token already held, and treating the repeat
|
|
568
574
|
// as new re-armed from an in-lead-window expiry, i.e. at the 1s floor.
|
|
569
|
-
let lastSeenToken = oxy.
|
|
570
|
-
const unsubscribeTokens = oxy.
|
|
575
|
+
let lastSeenToken = oxy.session.accessToken;
|
|
576
|
+
const unsubscribeTokens = oxy.session.onChange((token) => {
|
|
571
577
|
if (disposed || token === lastSeenToken) {
|
|
572
578
|
return;
|
|
573
579
|
}
|
|
@@ -22,12 +22,12 @@ export function createSessionClientHost(
|
|
|
22
22
|
let currentAccountId: string | null = null;
|
|
23
23
|
let deviceCredential: DeviceCredential | null = null;
|
|
24
24
|
return {
|
|
25
|
-
makeRequest: (method, url, data, options) => oxyServices.
|
|
26
|
-
getBaseURL: () => oxyServices.
|
|
27
|
-
getAccessToken: () => oxyServices.
|
|
25
|
+
makeRequest: (method, url, data, options) => oxyServices.request(method, url, data, options),
|
|
26
|
+
getBaseURL: () => oxyServices.baseURL,
|
|
27
|
+
getAccessToken: () => oxyServices.session.accessToken,
|
|
28
28
|
getDeviceCredential: () => deviceCredential,
|
|
29
|
-
onTokensChanged: (listener) => oxyServices.
|
|
30
|
-
setTokens: (accessToken) => oxyServices.
|
|
29
|
+
onTokensChanged: (listener) => oxyServices.session.onChange(listener),
|
|
30
|
+
setTokens: (accessToken) => oxyServices.session.setAccessToken(accessToken),
|
|
31
31
|
getCurrentAccountId: () => currentAccountId,
|
|
32
32
|
setCurrentAccountId: (id) => {
|
|
33
33
|
currentAccountId = id;
|