@oxy.so/core 1.18.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/cjs/HttpService.js +189 -112
- package/dist/cjs/OxyServices.errors.js +48 -1
- package/dist/cjs/OxyServices.js +263 -60
- package/dist/cjs/api/accounts.js +231 -0
- package/dist/cjs/api/agency.js +102 -0
- package/dist/cjs/api/appData.js +45 -0
- package/dist/cjs/api/apps.js +197 -0
- package/dist/cjs/api/assets.js +329 -0
- package/dist/cjs/api/auth.js +900 -0
- package/dist/cjs/api/billing.js +44 -0
- package/dist/cjs/api/civic.js +289 -0
- package/dist/cjs/api/contacts.js +16 -0
- package/dist/cjs/api/devices.js +351 -0
- package/dist/cjs/api/follows.js +240 -0
- package/dist/cjs/api/identity.js +569 -0
- package/dist/cjs/api/linkedAccounts.js +48 -0
- package/dist/cjs/api/nodes.js +75 -0
- package/dist/cjs/api/notifications.js +75 -0
- package/dist/cjs/api/privacy.js +105 -0
- package/dist/cjs/api/reputation.js +74 -0
- package/dist/cjs/api/session.js +177 -0
- package/dist/cjs/api/store.js +199 -0
- package/dist/cjs/api/topics.js +66 -0
- package/dist/cjs/api/users.js +309 -0
- package/dist/cjs/boot/sessionColdBoot.js +4 -4
- package/dist/cjs/civic/index.js +16 -0
- package/dist/cjs/civic/payloads.js +156 -0
- package/dist/cjs/client/context.js +2 -0
- package/dist/cjs/crypto/identityLink.js +5 -5
- package/dist/cjs/crypto/index.js +44 -0
- package/dist/cjs/crypto/internal.js +37 -0
- package/dist/cjs/crypto/keyManager.js +2 -2
- package/dist/cjs/crypto/polyfill.js +9 -80
- package/dist/cjs/crypto/recoveryPhrase.js +1 -0
- package/dist/cjs/crypto/registrationPow.js +1 -1
- package/dist/cjs/crypto/signatureService.js +1 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
- package/dist/cjs/i18n/accountRoleLabels.js +7 -7
- package/dist/cjs/i18n/index.js +130 -52
- package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
- package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
- package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
- package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
- package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
- package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
- package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
- package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
- package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
- package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
- package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
- package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
- package/dist/cjs/i18n/trustTierLabels.js +2 -2
- package/dist/cjs/index.js +55 -263
- package/dist/cjs/inference/index.js +21 -0
- package/dist/cjs/server/OxyServer.js +521 -0
- package/dist/cjs/server/auth.js +2 -2
- package/dist/cjs/server/index.js +23 -6
- package/dist/cjs/server/middleware.js +1154 -0
- package/dist/cjs/server/namespaces.js +214 -0
- package/dist/cjs/server/rateLimit.js +2 -2
- package/dist/cjs/server/requesterAssertion.js +5 -5
- package/dist/cjs/server/securityHeaders.js +3 -3
- package/dist/cjs/server/traffic.js +7 -6
- package/dist/cjs/server/trafficNodeHttp.js +9 -3
- package/dist/cjs/server/userInvalidation.js +5 -5
- package/dist/cjs/session/accountDialogController.js +23 -23
- package/dist/cjs/session/authStateStore.js +2 -2
- package/dist/cjs/session/identitySession.js +3 -3
- package/dist/cjs/session/index.js +131 -0
- package/dist/cjs/session/refresh.js +37 -30
- package/dist/cjs/session/sessionClientHost.js +5 -5
- package/dist/cjs/session/sharedDeviceCredential.js +3 -2
- package/dist/cjs/shared/utils/networkUtils.js +2 -2
- package/dist/cjs/utils/accountCacheSweep.js +11 -15
- package/dist/cjs/utils/asyncUtils.js +22 -163
- package/dist/cjs/utils/authHelpers.js +2 -2
- package/dist/cjs/utils/authWebUrl.js +3 -4
- package/dist/cjs/utils/avatarUtils.js +2 -2
- package/dist/cjs/utils/cache.js +32 -2
- package/dist/cjs/utils/cacheKey.js +5 -10
- package/dist/cjs/utils/deviceManager.js +17 -16
- package/dist/cjs/utils/edgeRegion.js +2 -3
- package/dist/cjs/utils/identityCacheSweep.js +6 -10
- package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
- package/dist/cjs/utils/requestUtils.js +40 -33
- package/dist/cjs/utils/sessionUtils.js +0 -2
- package/dist/cjs/utils/tokenClaims.js +34 -0
- package/dist/esm/HttpService.js +190 -113
- package/dist/esm/OxyServices.errors.js +45 -0
- package/dist/esm/OxyServices.js +262 -57
- package/dist/esm/api/accounts.js +218 -0
- package/dist/esm/api/agency.js +95 -0
- package/dist/esm/api/appData.js +40 -0
- package/dist/esm/api/apps.js +191 -0
- package/dist/esm/api/assets.js +324 -0
- package/dist/esm/api/auth.js +858 -0
- package/dist/esm/api/billing.js +40 -0
- package/dist/esm/api/civic.js +250 -0
- package/dist/esm/api/contacts.js +12 -0
- package/dist/esm/api/devices.js +346 -0
- package/dist/esm/api/follows.js +236 -0
- package/dist/esm/api/identity.js +527 -0
- package/dist/esm/api/linkedAccounts.js +44 -0
- package/dist/esm/api/nodes.js +71 -0
- package/dist/esm/api/notifications.js +71 -0
- package/dist/esm/api/privacy.js +101 -0
- package/dist/esm/api/reputation.js +70 -0
- package/dist/esm/api/session.js +173 -0
- package/dist/esm/api/store.js +192 -0
- package/dist/esm/api/topics.js +62 -0
- package/dist/esm/api/users.js +272 -0
- package/dist/esm/boot/sessionColdBoot.js +4 -4
- package/dist/esm/civic/index.js +10 -0
- package/dist/esm/civic/payloads.js +118 -0
- package/dist/esm/client/context.js +1 -0
- package/dist/esm/crypto/identityLink.js +5 -5
- package/dist/esm/crypto/index.js +24 -0
- package/dist/esm/crypto/internal.js +19 -0
- package/dist/esm/crypto/keyManager.js +2 -2
- package/dist/esm/crypto/polyfill.js +10 -81
- package/dist/esm/crypto/recoveryPhrase.js +1 -0
- package/dist/esm/crypto/registrationPow.js +1 -1
- package/dist/esm/crypto/signatureService.js +1 -0
- package/dist/esm/i18n/accountCategoryLabels.js +2 -2
- package/dist/esm/i18n/accountRoleLabels.js +1 -1
- package/dist/esm/i18n/index.js +93 -52
- package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
- package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
- package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
- package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
- package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
- package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
- package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
- package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
- package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
- package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
- package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
- package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
- package/dist/esm/i18n/trustTierLabels.js +1 -1
- package/dist/esm/index.js +30 -166
- package/dist/esm/inference/index.js +13 -0
- package/dist/esm/server/OxyServer.js +516 -0
- package/dist/esm/server/auth.js +2 -2
- package/dist/esm/server/index.js +10 -5
- package/dist/esm/server/middleware.js +1147 -0
- package/dist/esm/server/namespaces.js +206 -0
- package/dist/esm/server/rateLimit.js +2 -2
- package/dist/esm/server/requesterAssertion.js +5 -5
- package/dist/esm/server/securityHeaders.js +3 -3
- package/dist/esm/server/traffic.js +7 -6
- package/dist/esm/server/trafficNodeHttp.js +9 -3
- package/dist/esm/server/userInvalidation.js +5 -5
- package/dist/esm/session/accountDialogController.js +23 -23
- package/dist/esm/session/authStateStore.js +2 -2
- package/dist/esm/session/identitySession.js +3 -3
- package/dist/esm/session/index.js +82 -0
- package/dist/esm/session/refresh.js +37 -30
- package/dist/esm/session/sessionClientHost.js +5 -5
- package/dist/esm/session/sharedDeviceCredential.js +3 -2
- package/dist/esm/shared/utils/networkUtils.js +2 -2
- package/dist/esm/utils/accountCacheSweep.js +11 -15
- package/dist/esm/utils/asyncUtils.js +22 -151
- package/dist/esm/utils/authHelpers.js +2 -2
- package/dist/esm/utils/authWebUrl.js +3 -4
- package/dist/esm/utils/avatarUtils.js +2 -2
- package/dist/esm/utils/cache.js +32 -2
- package/dist/esm/utils/cacheKey.js +5 -10
- package/dist/esm/utils/deviceManager.js +17 -16
- package/dist/esm/utils/edgeRegion.js +1 -2
- package/dist/esm/utils/identityCacheSweep.js +6 -10
- package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
- package/dist/esm/utils/requestUtils.js +40 -33
- package/dist/esm/utils/sessionUtils.js +0 -2
- package/dist/esm/utils/tokenClaims.js +31 -0
- package/dist/types/HttpService.d.ts +47 -9
- package/dist/types/OxyServices.d.ts +160 -131
- package/dist/types/OxyServices.errors.d.ts +42 -0
- package/dist/types/api/accounts.d.ts +415 -0
- package/dist/types/api/agency.d.ts +135 -0
- package/dist/types/api/appData.d.ts +27 -0
- package/dist/types/api/apps.d.ts +433 -0
- package/dist/types/api/assets.d.ts +174 -0
- package/dist/types/api/auth.d.ts +766 -0
- package/dist/types/api/billing.d.ts +113 -0
- package/dist/types/api/civic.d.ts +203 -0
- package/dist/types/api/contacts.d.ts +31 -0
- package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
- package/dist/types/api/follows.d.ts +236 -0
- package/dist/types/api/identity.d.ts +275 -0
- package/dist/types/api/linkedAccounts.d.ts +48 -0
- package/dist/types/api/nodes.d.ts +102 -0
- package/dist/types/api/notifications.d.ts +77 -0
- package/dist/types/api/privacy.d.ts +43 -0
- package/dist/types/api/reputation.d.ts +50 -0
- package/dist/types/api/session.d.ts +85 -0
- package/dist/types/api/store.d.ts +278 -0
- package/dist/types/api/topics.d.ts +34 -0
- package/dist/types/api/users.d.ts +134 -0
- package/dist/types/boot/sessionColdBoot.d.ts +1 -1
- package/dist/types/civic/index.d.ts +10 -0
- package/dist/types/civic/payloads.d.ts +83 -0
- package/dist/types/client/context.d.ts +33 -0
- package/dist/types/crypto/identityLink.d.ts +5 -5
- package/dist/types/crypto/index.d.ts +24 -0
- package/dist/types/crypto/internal.d.ts +19 -0
- package/dist/types/crypto/polyfill.d.ts +6 -9
- package/dist/types/crypto/registrationPow.d.ts +1 -1
- package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
- package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
- package/dist/types/i18n/index.d.ts +20 -1
- package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
- package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
- package/dist/types/i18n/locales/de-DE.d.ts +386 -0
- package/dist/types/i18n/locales/en-US.d.ts +2034 -0
- package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
- package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
- package/dist/types/i18n/locales/it-IT.d.ts +386 -0
- package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
- package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
- package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
- package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
- package/dist/types/index.d.ts +46 -95
- package/dist/types/inference/index.d.ts +22 -0
- package/dist/types/models/interfaces.d.ts +1 -1
- package/dist/types/server/OxyServer.d.ts +183 -0
- package/dist/types/server/auth.d.ts +10 -7
- package/dist/types/server/index.d.ts +10 -4
- package/dist/types/server/middleware.d.ts +291 -0
- package/dist/types/server/namespaces.d.ts +98 -0
- package/dist/types/server/rateLimit.d.ts +7 -5
- package/dist/types/server/requesterAssertion.d.ts +14 -11
- package/dist/types/server/securityHeaders.d.ts +4 -5
- package/dist/types/server/userInvalidation.d.ts +10 -8
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/accountDialogController.d.ts +8 -8
- package/dist/types/session/accountSwitchTargets.d.ts +1 -1
- package/dist/types/session/authStateStore.d.ts +7 -6
- package/dist/types/session/index.d.ts +40 -0
- package/dist/types/utils/accountCacheSweep.d.ts +7 -10
- package/dist/types/utils/apiUtils.d.ts +3 -3
- package/dist/types/utils/asyncUtils.d.ts +11 -58
- package/dist/types/utils/authWebUrl.d.ts +3 -4
- package/dist/types/utils/avatarUtils.d.ts +5 -6
- package/dist/types/utils/cache.d.ts +11 -3
- package/dist/types/utils/commonsApproval.d.ts +1 -1
- package/dist/types/utils/edgeRegion.d.ts +1 -2
- package/dist/types/utils/identityCacheSweep.d.ts +6 -4
- package/dist/types/utils/oauthPkce.d.ts +2 -2
- package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
- package/dist/types/utils/requestUtils.d.ts +18 -14
- package/dist/types/utils/tokenClaims.d.ts +9 -0
- package/package.json +68 -7
- package/src/HttpService.ts +201 -132
- package/src/OxyServices.errors.ts +73 -0
- package/src/OxyServices.ts +289 -164
- package/src/api/accounts.ts +579 -0
- package/src/api/agency.ts +277 -0
- package/src/api/appData.ts +63 -0
- package/src/api/apps.ts +596 -0
- package/src/api/assets.ts +416 -0
- package/src/api/auth.ts +1457 -0
- package/src/api/billing.ts +144 -0
- package/src/api/civic.ts +428 -0
- package/src/api/contacts.ts +41 -0
- package/src/api/devices.ts +438 -0
- package/src/api/follows.ts +414 -0
- package/src/api/identity.ts +727 -0
- package/src/api/linkedAccounts.ts +78 -0
- package/src/api/nodes.ts +169 -0
- package/src/api/notifications.ts +135 -0
- package/src/api/privacy.ts +120 -0
- package/src/api/reputation.ts +134 -0
- package/src/api/session.ts +210 -0
- package/src/api/store.ts +435 -0
- package/src/api/topics.ts +83 -0
- package/src/api/users.ts +357 -0
- package/src/boot/sessionColdBoot.ts +4 -4
- package/src/civic/index.ts +12 -0
- package/src/civic/payloads.ts +175 -0
- package/src/client/context.ts +34 -0
- package/src/crypto/identityLink.ts +5 -5
- package/src/crypto/index.ts +39 -0
- package/src/crypto/internal.ts +20 -0
- package/src/crypto/keyManager.ts +2 -2
- package/src/crypto/polyfill.ts +9 -89
- package/src/crypto/recoveryPhrase.ts +1 -0
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +1 -0
- package/src/i18n/accountCategoryLabels.ts +2 -2
- package/src/i18n/accountRoleLabels.ts +2 -2
- package/src/i18n/index.ts +105 -54
- package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
- package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
- package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
- package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
- package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
- package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
- package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
- package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
- package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
- package/src/i18n/reputationCategoryLabels.ts +1 -1
- package/src/i18n/trustTierLabels.ts +1 -1
- package/src/index.ts +170 -501
- package/src/inference/index.ts +48 -0
- package/src/models/interfaces.ts +1 -1
- package/src/server/OxyServer.ts +637 -0
- package/src/server/auth.ts +12 -8
- package/src/server/index.ts +28 -5
- package/src/server/middleware.ts +1520 -0
- package/src/server/namespaces.ts +257 -0
- package/src/server/rateLimit.ts +10 -9
- package/src/server/requesterAssertion.ts +13 -10
- package/src/server/securityHeaders.ts +7 -8
- package/src/server/traffic.ts +6 -6
- package/src/server/trafficNodeHttp.ts +7 -3
- package/src/server/userInvalidation.ts +9 -9
- package/src/session/accountDelegationAccess.ts +1 -1
- package/src/session/accountDialogController.ts +24 -24
- package/src/session/accountSwitchTargets.ts +1 -1
- package/src/session/authStateStore.ts +9 -8
- package/src/session/identitySession.ts +3 -3
- package/src/session/index.ts +210 -0
- package/src/session/refresh.ts +36 -30
- package/src/session/sessionClientHost.ts +5 -5
- package/src/session/sharedDeviceCredential.ts +3 -2
- package/src/shared/utils/networkUtils.ts +2 -2
- package/src/utils/accountCacheSweep.ts +11 -15
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +38 -235
- package/src/utils/authHelpers.ts +2 -2
- package/src/utils/authWebUrl.ts +3 -4
- package/src/utils/avatarUtils.ts +4 -7
- package/src/utils/cache.ts +36 -5
- package/src/utils/cacheKey.ts +5 -9
- package/src/utils/commonsApproval.ts +1 -1
- package/src/utils/deviceManager.ts +17 -16
- package/src/utils/edgeRegion.ts +1 -2
- package/src/utils/identityCacheSweep.ts +7 -12
- package/src/utils/oauthPkce.ts +2 -2
- package/src/utils/oxyServiceEnvironment.ts +3 -7
- package/src/utils/requestUtils.ts +48 -44
- package/src/utils/sessionUtils.ts +0 -2
- package/src/utils/tokenClaims.ts +38 -0
- package/dist/cjs/.tsbuildinfo +0 -1
- package/dist/cjs/OxyServices.base.js +0 -392
- package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
- package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
- package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
- package/dist/cjs/mixins/OxyServices.agency.js +0 -154
- package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
- package/dist/cjs/mixins/OxyServices.appData.js +0 -108
- package/dist/cjs/mixins/OxyServices.assets.js +0 -854
- package/dist/cjs/mixins/OxyServices.auth.js +0 -1440
- package/dist/cjs/mixins/OxyServices.chains.js +0 -73
- package/dist/cjs/mixins/OxyServices.civic.js +0 -611
- package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
- package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
- package/dist/cjs/mixins/OxyServices.devices.js +0 -116
- package/dist/cjs/mixins/OxyServices.features.js +0 -335
- package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
- package/dist/cjs/mixins/OxyServices.identity.js +0 -562
- package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
- package/dist/cjs/mixins/OxyServices.inference.js +0 -59
- package/dist/cjs/mixins/OxyServices.language.js +0 -125
- package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
- package/dist/cjs/mixins/OxyServices.location.js +0 -43
- package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
- package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
- package/dist/cjs/mixins/OxyServices.payment.js +0 -158
- package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
- package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
- package/dist/cjs/mixins/OxyServices.security.js +0 -89
- package/dist/cjs/mixins/OxyServices.store.js +0 -266
- package/dist/cjs/mixins/OxyServices.topics.js +0 -137
- package/dist/cjs/mixins/OxyServices.user.js +0 -954
- package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
- package/dist/cjs/mixins/index.js +0 -136
- package/dist/cjs/mixins/mixinHelpers.js +0 -53
- package/dist/cjs/utils/webauthnOrigin.js +0 -51
- package/dist/esm/.tsbuildinfo +0 -1
- package/dist/esm/OxyServices.base.js +0 -388
- package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
- package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
- package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
- package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
- package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
- package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/esm/mixins/OxyServices.accounts.js +0 -543
- package/dist/esm/mixins/OxyServices.agency.js +0 -151
- package/dist/esm/mixins/OxyServices.analytics.js +0 -46
- package/dist/esm/mixins/OxyServices.appData.js +0 -103
- package/dist/esm/mixins/OxyServices.assets.js +0 -851
- package/dist/esm/mixins/OxyServices.auth.js +0 -1400
- package/dist/esm/mixins/OxyServices.chains.js +0 -70
- package/dist/esm/mixins/OxyServices.civic.js +0 -605
- package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
- package/dist/esm/mixins/OxyServices.contacts.js +0 -47
- package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
- package/dist/esm/mixins/OxyServices.devices.js +0 -113
- package/dist/esm/mixins/OxyServices.features.js +0 -332
- package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
- package/dist/esm/mixins/OxyServices.identity.js +0 -558
- package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
- package/dist/esm/mixins/OxyServices.inference.js +0 -56
- package/dist/esm/mixins/OxyServices.language.js +0 -122
- package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
- package/dist/esm/mixins/OxyServices.location.js +0 -40
- package/dist/esm/mixins/OxyServices.nodes.js +0 -172
- package/dist/esm/mixins/OxyServices.notifications.js +0 -60
- package/dist/esm/mixins/OxyServices.payment.js +0 -155
- package/dist/esm/mixins/OxyServices.privacy.js +0 -196
- package/dist/esm/mixins/OxyServices.reputation.js +0 -286
- package/dist/esm/mixins/OxyServices.security.js +0 -86
- package/dist/esm/mixins/OxyServices.store.js +0 -263
- package/dist/esm/mixins/OxyServices.topics.js +0 -134
- package/dist/esm/mixins/OxyServices.user.js +0 -951
- package/dist/esm/mixins/OxyServices.utility.js +0 -1397
- package/dist/esm/mixins/index.js +0 -133
- package/dist/esm/mixins/mixinHelpers.js +0 -48
- package/dist/esm/utils/webauthnOrigin.js +0 -48
- package/dist/types/.tsbuildinfo +0 -1
- package/dist/types/OxyServices.base.d.ts +0 -189
- package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
- package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
- package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
- package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
- package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
- package/dist/types/mixins/OxyServices.auth.d.ts +0 -965
- package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
- package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
- package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
- package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
- package/dist/types/mixins/OxyServices.features.d.ts +0 -250
- package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
- package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
- package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
- package/dist/types/mixins/OxyServices.language.d.ts +0 -87
- package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
- package/dist/types/mixins/OxyServices.location.d.ts +0 -70
- package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
- package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
- package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
- package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
- package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
- package/dist/types/mixins/OxyServices.security.d.ts +0 -84
- package/dist/types/mixins/OxyServices.store.d.ts +0 -334
- package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
- package/dist/types/mixins/OxyServices.user.d.ts +0 -600
- package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
- package/dist/types/mixins/index.d.ts +0 -87
- package/dist/types/mixins/mixinHelpers.d.ts +0 -31
- package/dist/types/utils/webauthnOrigin.d.ts +0 -32
- package/src/OxyServices.base.ts +0 -480
- package/src/__tests__/authSocket.test.ts +0 -96
- package/src/__tests__/fixEsmImports.test.ts +0 -132
- package/src/__tests__/httpServiceAbort.test.ts +0 -308
- package/src/__tests__/httpServiceActivityId.test.ts +0 -49
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
- package/src/__tests__/httpServiceCache.test.ts +0 -318
- package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
- package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
- package/src/__tests__/httpServiceWrites.test.ts +0 -175
- package/src/__tests__/inSessionRefresh.test.ts +0 -313
- package/src/__tests__/linkedClient.test.ts +0 -363
- package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
- package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
- package/src/__tests__/publicInterfaceParity.test.ts +0 -75
- package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
- package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
- package/src/__tests__/userIdentity.test.ts +0 -143
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
- package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
- package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
- package/src/crypto/__tests__/identityLink.test.ts +0 -18
- package/src/crypto/__tests__/identityMocks.ts +0 -125
- package/src/crypto/__tests__/identityProof.test.ts +0 -81
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
- package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
- package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
- package/src/crypto/__tests__/keyManager.test.ts +0 -329
- package/src/crypto/__tests__/polyfill.test.ts +0 -109
- package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
- package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
- package/src/crypto/__tests__/registrationPow.test.ts +0 -61
- package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
- package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
- package/src/crypto/__tests__/signedRecord.test.ts +0 -230
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
- package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
- package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
- package/src/i18n/locales/de-DE.json +0 -306
- package/src/i18n/locales/es-ES.json +0 -2127
- package/src/i18n/locales/ja-JP.json +0 -306
- package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
- package/src/logger/__tests__/logger.test.ts +0 -207
- package/src/mixins/OxyServices.accounts.ts +0 -1330
- package/src/mixins/OxyServices.agency.ts +0 -353
- package/src/mixins/OxyServices.analytics.ts +0 -53
- package/src/mixins/OxyServices.appData.ts +0 -158
- package/src/mixins/OxyServices.assets.ts +0 -964
- package/src/mixins/OxyServices.auth.ts +0 -2028
- package/src/mixins/OxyServices.chains.ts +0 -134
- package/src/mixins/OxyServices.civic.ts +0 -945
- package/src/mixins/OxyServices.connectedApps.ts +0 -212
- package/src/mixins/OxyServices.contacts.ts +0 -73
- package/src/mixins/OxyServices.devices.ts +0 -120
- package/src/mixins/OxyServices.features.ts +0 -454
- package/src/mixins/OxyServices.followGraph.ts +0 -293
- package/src/mixins/OxyServices.identity.ts +0 -787
- package/src/mixins/OxyServices.identityBackup.ts +0 -250
- package/src/mixins/OxyServices.inference.ts +0 -57
- package/src/mixins/OxyServices.language.ts +0 -144
- package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
- package/src/mixins/OxyServices.location.ts +0 -46
- package/src/mixins/OxyServices.nodes.ts +0 -337
- package/src/mixins/OxyServices.notifications.ts +0 -142
- package/src/mixins/OxyServices.payment.ts +0 -163
- package/src/mixins/OxyServices.privacy.ts +0 -219
- package/src/mixins/OxyServices.reputation.ts +0 -436
- package/src/mixins/OxyServices.security.ts +0 -110
- package/src/mixins/OxyServices.store.ts +0 -585
- package/src/mixins/OxyServices.topics.ts +0 -169
- package/src/mixins/OxyServices.user.ts +0 -1208
- package/src/mixins/OxyServices.utility.ts +0 -1803
- package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
- package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
- package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
- package/src/mixins/__tests__/accountEvents.test.ts +0 -158
- package/src/mixins/__tests__/accounts.test.ts +0 -727
- package/src/mixins/__tests__/agency.test.ts +0 -120
- package/src/mixins/__tests__/appData.test.ts +0 -203
- package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
- package/src/mixins/__tests__/assetUpload.test.ts +0 -191
- package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
- package/src/mixins/__tests__/chains.test.ts +0 -113
- package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
- package/src/mixins/__tests__/connectedApps.test.ts +0 -146
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
- package/src/mixins/__tests__/followGraph.test.ts +0 -147
- package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
- package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
- package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
- package/src/mixins/__tests__/identityBackup.test.ts +0 -315
- package/src/mixins/__tests__/identityLink.test.ts +0 -89
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
- package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
- package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
- package/src/mixins/__tests__/notifications.read.test.ts +0 -82
- package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
- package/src/mixins/__tests__/reputation.test.ts +0 -522
- package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
- package/src/mixins/__tests__/store.test.ts +0 -304
- package/src/mixins/__tests__/topics.test.ts +0 -155
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
- package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
- package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
- package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
- package/src/mixins/index.ts +0 -203
- package/src/mixins/mixinHelpers.ts +0 -69
- package/src/server/__tests__/auth.test.ts +0 -78
- package/src/server/__tests__/capabilityTicket.test.ts +0 -111
- package/src/server/__tests__/cors.socket.test.ts +0 -225
- package/src/server/__tests__/cors.test.ts +0 -158
- package/src/server/__tests__/rateLimit.test.ts +0 -257
- package/src/server/__tests__/requesterAssertion.test.ts +0 -359
- package/src/server/__tests__/safeFetch.test.ts +0 -232
- package/src/server/__tests__/securityHeaders.test.ts +0 -387
- package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
- package/src/server/__tests__/traffic.test.ts +0 -180
- package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
- package/src/server/__tests__/userInvalidation.test.ts +0 -203
- package/src/server/__tests__/verifySecret.test.ts +0 -40
- package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
- package/src/server/__tests__/workloadIdentity.test.ts +0 -128
- package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
- package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
- package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
- package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
- package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
- package/src/session/__tests__/SessionClient.state.test.ts +0 -78
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
- package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
- package/src/session/__tests__/accountDialogController.test.ts +0 -2502
- package/src/session/__tests__/accountDialogShape.test.ts +0 -120
- package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
- package/src/session/__tests__/authStateStore.test.ts +0 -451
- package/src/session/__tests__/deviceDirectory.test.ts +0 -422
- package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
- package/src/session/__tests__/identityPin.test.ts +0 -131
- package/src/session/__tests__/identitySession.test.ts +0 -194
- package/src/session/__tests__/projectSessionState.test.ts +0 -105
- package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
- package/src/session/__tests__/refresh.test.ts +0 -606
- package/src/session/__tests__/sessionIntegration.test.ts +0 -209
- package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
- package/src/utils/__tests__/accountUtils.test.ts +0 -151
- package/src/utils/__tests__/activityId.test.ts +0 -45
- package/src/utils/__tests__/asyncUtils.test.ts +0 -279
- package/src/utils/__tests__/authWebUrl.test.ts +0 -15
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
- package/src/utils/__tests__/coldBoot.test.ts +0 -496
- package/src/utils/__tests__/commonsApproval.test.ts +0 -60
- package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
- package/src/utils/__tests__/languageUtils.test.ts +0 -244
- package/src/utils/__tests__/oauthPkce.test.ts +0 -303
- package/src/utils/__tests__/officialOrigins.test.ts +0 -31
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
- package/src/utils/__tests__/profileLinks.test.ts +0 -180
- package/src/utils/__tests__/redactUrl.test.ts +0 -33
- package/src/utils/__tests__/registrableApex.test.ts +0 -62
- package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
- package/src/utils/__tests__/textNormalization.test.ts +0 -205
- package/src/utils/__tests__/validationUtils.test.ts +0 -703
- package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
- package/src/utils/webauthnOrigin.ts +0 -52
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { OxyServices, type OxyConfig } from '../OxyServices';
|
|
2
|
+
import type { HttpMethod } from '../client/context';
|
|
3
|
+
import type { RequestOptions } from '../HttpService';
|
|
4
|
+
import { type OxyAccountEvent, type OxyAccountEventFeedPage, type OxyMiddleware, type ServiceActingAsVerification, type VerifyAccountEventOptions } from './middleware';
|
|
5
|
+
import { ServerAgencyApi, ServerAssetsApi, ServerLinkedAccountsApi, ServerNotificationsApi, ServerReputationApi } from './namespaces';
|
|
6
|
+
export interface OxyServerConfig extends OxyConfig {
|
|
7
|
+
/** This service's application credential. Omit to use workload identity (ADR 0026). */
|
|
8
|
+
serviceAuth?: {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
apiSecret: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* How this backend identifies itself on requests that carry no user session.
|
|
14
|
+
*
|
|
15
|
+
* - `'never'` (default): such requests go out anonymous.
|
|
16
|
+
* - `'when-anonymous'`: they carry this process's service token instead —
|
|
17
|
+
* from `serviceAuth`, or, with none, from workload attestation (ADR 0026).
|
|
18
|
+
* A user session, when there is one, still wins; `skipAuth` requests stay
|
|
19
|
+
* unauthenticated; a process that can produce no service token (a local
|
|
20
|
+
* checkout) keeps sending them anonymous.
|
|
21
|
+
*
|
|
22
|
+
* Why a server wants it: oxy-api charges anonymous traffic to the SOURCE
|
|
23
|
+
* ADDRESS (`rl:general`, and a +500 ms `slowDown` per request past 100 in 15
|
|
24
|
+
* minutes), and a fleet leaves through one NAT address, so every anonymous
|
|
25
|
+
* read a backend makes shares — and past the threshold pays for — one budget.
|
|
26
|
+
* A first-party service token is exempt and charged to its own application.
|
|
27
|
+
* Measured from Mention's task (2026-09-25): `GET /users/:id` 543–575 ms
|
|
28
|
+
* anonymous past the threshold, `POST /users/by-ids` 19–24 ms with the
|
|
29
|
+
* service token.
|
|
30
|
+
*/
|
|
31
|
+
serviceIdentity?: 'never' | 'when-anonymous';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* How long a failed service-token mint sends session-less requests anonymous
|
|
35
|
+
* before the next attempt, under `serviceIdentity: 'when-anonymous'`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const ANONYMOUS_SERVICE_TOKEN_RETRY_MS = 30000;
|
|
38
|
+
/** `POST /auth/service-token`. */
|
|
39
|
+
export interface ServiceTokenResponse {
|
|
40
|
+
token: string;
|
|
41
|
+
expiresIn: number;
|
|
42
|
+
appName: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sentinel error raised when a service token is asked for with a known apiKey
|
|
46
|
+
* but a non-matching secret: credential drift in the caller, or a cross-tenant
|
|
47
|
+
* cache lookup attempt. Surface as a 401-equivalent.
|
|
48
|
+
*/
|
|
49
|
+
export declare class ServiceCredentialMismatchError extends Error {
|
|
50
|
+
constructor();
|
|
51
|
+
}
|
|
52
|
+
export declare class OxyServer extends OxyServices {
|
|
53
|
+
private readonly serviceTokens;
|
|
54
|
+
private serviceApiKey;
|
|
55
|
+
private serviceApiSecret;
|
|
56
|
+
private readonly actingAs;
|
|
57
|
+
private readonly actingAsPending;
|
|
58
|
+
/** Public keys only; never private material. */
|
|
59
|
+
private readonly jwksCache;
|
|
60
|
+
/**
|
|
61
|
+
* Before this instant a request without a user session does not try to mint
|
|
62
|
+
* a service token and goes out anonymous. Set after a failed mint.
|
|
63
|
+
*/
|
|
64
|
+
private anonymousServiceTokenRetryAt;
|
|
65
|
+
/**
|
|
66
|
+
* Express and Socket.IO middleware.
|
|
67
|
+
*
|
|
68
|
+
* - `auth(options)` — Express: resolve the caller (user session or service
|
|
69
|
+
* token) onto `req.userId` / `req.user` / `req.serviceApp`.
|
|
70
|
+
* - `socket(options)` — Socket.IO: the same for a handshake.
|
|
71
|
+
* - `service(options)` — Express: service tokens only.
|
|
72
|
+
* - `requireScope(scope)` — Express, after `auth`/`service`: the service
|
|
73
|
+
* token (and its delegation, if any) must hold `scope`.
|
|
74
|
+
*/
|
|
75
|
+
readonly middleware: OxyMiddleware;
|
|
76
|
+
constructor(config: OxyServerConfig);
|
|
77
|
+
private _serverAssets?;
|
|
78
|
+
private _serverNotifications?;
|
|
79
|
+
private _serverLinkedAccounts?;
|
|
80
|
+
private _serverAgency?;
|
|
81
|
+
private _serverReputation?;
|
|
82
|
+
/** Files, plus the service-only metadata and linked-URL lookups. */
|
|
83
|
+
get assets(): ServerAssetsApi;
|
|
84
|
+
/** The inbox and push tokens, plus `create`. */
|
|
85
|
+
get notifications(): ServerNotificationsApi;
|
|
86
|
+
/** Linked external accounts, plus `forUser`. */
|
|
87
|
+
get linkedAccounts(): ServerLinkedAccountsApi;
|
|
88
|
+
/** Delegated capabilities, plus `introspectRequesterAssertion`. */
|
|
89
|
+
get agency(): ServerAgencyApi;
|
|
90
|
+
/** Reputation reads, plus `award`. */
|
|
91
|
+
get reputation(): ServerReputationApi;
|
|
92
|
+
/**
|
|
93
|
+
* Set this service's application credential. Each `(apiKey, apiSecret)` pair
|
|
94
|
+
* is cached independently, so a multi-tenant host switching credentials
|
|
95
|
+
* cannot leak one tenant's token to another.
|
|
96
|
+
*/
|
|
97
|
+
configureServiceAuth(apiKey: string, apiSecret: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* A service token (short-lived, cached and refreshed per credential pair;
|
|
100
|
+
* concurrent callers share one mint).
|
|
101
|
+
*
|
|
102
|
+
* With no credential configured or passed, the token comes from the process's
|
|
103
|
+
* attested workload identity (ADR 0026); with neither, this throws.
|
|
104
|
+
*
|
|
105
|
+
* If the cache already holds a token for `apiKey` but `apiSecret` does not
|
|
106
|
+
* constant-time match the secret that produced it, this throws
|
|
107
|
+
* {@link ServiceCredentialMismatchError} rather than return the cached token.
|
|
108
|
+
*/
|
|
109
|
+
serviceToken(apiKey?: string, apiSecret?: string): Promise<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Forget cached service token(s) so the next `serviceToken()` mints anew —
|
|
112
|
+
* the way back from a 401 after a credential was revoked or rotated.
|
|
113
|
+
*
|
|
114
|
+
* `apiKey` clears that credential's entry; with none, the configured
|
|
115
|
+
* credential's; with neither, every entry. Synchronous.
|
|
116
|
+
*/
|
|
117
|
+
invalidateServiceToken(apiKey?: string): void;
|
|
118
|
+
/**
|
|
119
|
+
* One request with this service's token. `actAs` sends `X-Oxy-User-Id`: the
|
|
120
|
+
* request is on behalf of that user (the API checks the delegation grant).
|
|
121
|
+
* Never cached unless `cache` says so. Rejects with `OxyApiError`.
|
|
122
|
+
*/
|
|
123
|
+
serviceRequest<T>(method: HttpMethod, url: string, data?: unknown, options?: RequestOptions & {
|
|
124
|
+
actAs?: string;
|
|
125
|
+
}): Promise<T>;
|
|
126
|
+
/**
|
|
127
|
+
* Whether service app `appId` holds an active delegation grant to act for
|
|
128
|
+
* `userId`; the grant's scopes, or `null`. Used by `middleware.auth()` for
|
|
129
|
+
* `X-Oxy-User-Id`.
|
|
130
|
+
*
|
|
131
|
+
* Answers are cached per `appId:userId` (a grant for 5 minutes — the
|
|
132
|
+
* revocation window; a denial or failed lookup for 1 minute), bounded to the
|
|
133
|
+
* 1000 most recent pairs, and concurrent lookups of one pair share a single
|
|
134
|
+
* request.
|
|
135
|
+
*/
|
|
136
|
+
verifyActingAs(appId: string, userId: string): Promise<ServiceActingAsVerification | null>;
|
|
137
|
+
/**
|
|
138
|
+
* Account events addressed to this application (Oxy account deletions every
|
|
139
|
+
* relying application must honour, OxyHQ/Mention#1169).
|
|
140
|
+
*/
|
|
141
|
+
readonly accountEvents: {
|
|
142
|
+
/**
|
|
143
|
+
* Verify an account event token — a webhook body, or a feed entry's `token`
|
|
144
|
+
* — and return the event. Throws {@link OxyAccountEventError} unless it is
|
|
145
|
+
* an EdDSA `secevent+jwt` from Oxy's key set, issued by `oxy-auth`,
|
|
146
|
+
* addressed to this application, carrying exactly one known event. Be
|
|
147
|
+
* idempotent on `eventId`: Oxy delivers at least once.
|
|
148
|
+
*/
|
|
149
|
+
verify: (token: string, options?: VerifyAccountEventOptions) => Promise<OxyAccountEvent>;
|
|
150
|
+
/**
|
|
151
|
+
* One page of account events for this application, oldest first — the pull
|
|
152
|
+
* feed behind the webhook. Verify each entry's `token` before acting on it.
|
|
153
|
+
*/
|
|
154
|
+
list: (options?: {
|
|
155
|
+
after?: string;
|
|
156
|
+
limit?: number;
|
|
157
|
+
}) => Promise<OxyAccountEventFeedPage>;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* The bearer for a request with no user session, under `serviceIdentity:
|
|
161
|
+
* 'when-anonymous'`: this process's service token, or `null` to send the
|
|
162
|
+
* request anonymous.
|
|
163
|
+
*
|
|
164
|
+
* `null`, never a throw, whenever there is no token to offer:
|
|
165
|
+
* - no key pair and no attestable workload (a local checkout);
|
|
166
|
+
* - the mint failed. The request still goes out, anonymous, and so does every
|
|
167
|
+
* request for the next {@link ANONYMOUS_SERVICE_TOKEN_RETRY_MS}, so an Oxy
|
|
168
|
+
* refusing attestation is asked once per window rather than once per read.
|
|
169
|
+
*
|
|
170
|
+
* The token comes from {@link serviceToken}: cached and single-flight, so
|
|
171
|
+
* concurrent reads share one mint.
|
|
172
|
+
*/
|
|
173
|
+
private serviceTokenForAnonymousRequest;
|
|
174
|
+
private canMintServiceToken;
|
|
175
|
+
private mintServiceToken;
|
|
176
|
+
/** A token obtained by attestation, cached like a credential's (one identity per process). */
|
|
177
|
+
private workloadServiceToken;
|
|
178
|
+
private lookupActingAs;
|
|
179
|
+
private rememberActingAs;
|
|
180
|
+
private verifyAccountEvent;
|
|
181
|
+
/** The `appId` claim of this service's own token. */
|
|
182
|
+
private configuredServiceAppId;
|
|
183
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { NextFunction, Request, RequestHandler, Response } from 'express';
|
|
2
|
-
import type {
|
|
3
|
-
import type { OxyAuthRefusal } from '../mixins/OxyServices.utility';
|
|
2
|
+
import type { AuthMiddlewareOptions, OxyAuthRefusal, OxyMiddleware } from './middleware';
|
|
4
3
|
import { OXY_SERVICE_ENVIRONMENTS, type OxyServiceEnvironment } from '../utils/oxyServiceEnvironment';
|
|
5
4
|
export { OXY_SERVICE_ENVIRONMENTS };
|
|
6
5
|
export type { OxyServiceEnvironment, OxyAuthRefusal };
|
|
@@ -51,11 +50,11 @@ export interface OxyAuthenticatedRequest extends OxyAuthRequest {
|
|
|
51
50
|
}
|
|
52
51
|
export interface OxyAuthMiddlewareOptions {
|
|
53
52
|
/**
|
|
54
|
-
* Options forwarded to `
|
|
53
|
+
* Options forwarded to `server.middleware.auth()`.
|
|
55
54
|
* `optional` is forced to `true` by the composed helpers so route guards can
|
|
56
55
|
* produce one consistent 401 shape.
|
|
57
56
|
*/
|
|
58
|
-
auth?:
|
|
57
|
+
auth?: AuthMiddlewareOptions;
|
|
59
58
|
}
|
|
60
59
|
export declare function getOxyUserId(req: Request): string | null;
|
|
61
60
|
export declare function isOxyAuthenticated(req: Request): req is OxyAuthenticatedRequest;
|
|
@@ -138,7 +137,7 @@ export declare function getRequiredOxyUserId(req: Request): string;
|
|
|
138
137
|
* Why the credential on this request was refused, or `null` when none was
|
|
139
138
|
* presented (or it was accepted).
|
|
140
139
|
*
|
|
141
|
-
* Set by `
|
|
140
|
+
* Set by `server.middleware.auth()` — including the `optional: true` mount the composed
|
|
142
141
|
* helpers use, where a refusal otherwise leaves no trace: the request simply
|
|
143
142
|
* arrives unauthenticated and the host answers its own generic 401. Hosts log
|
|
144
143
|
* this beside their own 401; it is diagnostic and **must not be put into a
|
|
@@ -146,5 +145,9 @@ export declare function getRequiredOxyUserId(req: Request): string;
|
|
|
146
145
|
*/
|
|
147
146
|
export declare function getOxyAuthRefusal(req: Request): OxyAuthRefusal | null;
|
|
148
147
|
export declare function requireOxyAuth(req: Request, res: Response, next: NextFunction): void;
|
|
149
|
-
|
|
150
|
-
export
|
|
148
|
+
/** What the composed helpers need of an `OxyServer`: its `middleware.auth`. */
|
|
149
|
+
export interface OxyAuthHost {
|
|
150
|
+
readonly middleware: Pick<OxyMiddleware, 'auth'>;
|
|
151
|
+
}
|
|
152
|
+
export declare function createOptionalOxyAuth(oxy: OxyAuthHost, options?: OxyAuthMiddlewareOptions): RequestHandler;
|
|
153
|
+
export declare function createOxyAuthMiddleware(oxy: OxyAuthHost, options?: OxyAuthMiddlewareOptions): RequestHandler;
|
|
@@ -6,15 +6,21 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
|
9
|
-
* import { createOxyRateLimit } from '@oxy.so/core/server';
|
|
10
|
-
* import { oxyClient } from '@oxy.so/core';
|
|
9
|
+
* import { OxyServer, createOxyAuthMiddleware, createOxyRateLimit } from '@oxy.so/core/server';
|
|
11
10
|
*
|
|
12
|
-
* const oxy =
|
|
11
|
+
* const oxy = new OxyServer({ baseURL: 'https://api.oxy.so', serviceAuth: { apiKey, apiSecret } });
|
|
13
12
|
*
|
|
14
13
|
* app.use(createOxyRateLimit(oxy, { store: redisStore }));
|
|
14
|
+
* app.use('/api', createOxyAuthMiddleware(oxy));
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
|
+
export { OxyServer, ServiceCredentialMismatchError, ANONYMOUS_SERVICE_TOKEN_RETRY_MS } from './OxyServer';
|
|
18
|
+
export type { OxyServerConfig, ServiceTokenResponse } from './OxyServer';
|
|
19
|
+
export { ServerAgencyApi, ServerAssetsApi, ServerLinkedAccountsApi, ServerNotificationsApi, ServerReputationApi, } from './namespaces';
|
|
20
|
+
export { OxyAccountEventError, OXY_ACCOUNT_DELETED_EVENT_URI } from './middleware';
|
|
21
|
+
export type { AuthMiddlewareOptions, OxyAccountEvent, OxyAccountEventFeedItem, OxyAccountEventFeedPage, OxyMiddleware, ServiceActingAsVerification, ServiceApp, VerifyAccountEventOptions, } from './middleware';
|
|
17
22
|
export { createOptionalOxyAuth, createOxyAuthMiddleware, getOxyAuthRefusal, getOxyBillingPrincipal, getOxyDelegatedUserId, getOxyRequestAttribution, getOxyUserId, getRequiredOxyBillingPrincipal, getRequiredOxyUserId, isOxyAuthenticated, requireOxyAuth, OXY_SERVICE_ENVIRONMENTS, } from './auth';
|
|
23
|
+
export type { OxyAuthHost } from './auth';
|
|
18
24
|
export type { OxyAuthenticatedRequest, OxyAuthRefusal, OxyAuthMiddlewareOptions, OxyAuthRequest, OxyBillingPrincipal, OxyRequestAttribution, OxyRequestUser, OxyServiceActingAsContext, OxyServiceAppContext, OxyServiceEnvironment, } from './auth';
|
|
19
25
|
export { createOxyRateLimit } from './rateLimit';
|
|
20
26
|
export type { OxyRateLimitOptions } from './rateLimit';
|
|
@@ -34,7 +40,7 @@ export type { OxyInvalidationPublisher, OxyUserInvalidationHandlerOptions, } fro
|
|
|
34
40
|
export { evictOxyIdentityCache, oxyUserByIdCacheKey, OXY_IDENTITY_CACHE_PREFIXES } from '../utils/identityCacheSweep';
|
|
35
41
|
export type { OxyIdentityCacheEvictor } from '../utils/identityCacheSweep';
|
|
36
42
|
export { registrableApex } from '../utils/registrableApex';
|
|
37
|
-
export { isOfficialWebOrigin } from '../utils/officialOrigins';
|
|
43
|
+
export { isLoopbackOrigin, isOfficialWebOrigin, isAllowedDeviceJoinOrigin } from '../utils/officialOrigins';
|
|
38
44
|
export { createEcosystemTraffic } from './traffic';
|
|
39
45
|
export type { EcosystemTrafficOptions } from './traffic';
|
|
40
46
|
export { observeNodeHttp, withoutNodeHttpObservation } from './trafficNodeHttp';
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import type { ApiError, User } from '../models/interfaces';
|
|
2
|
+
import { type OxyServiceEnvironment } from '../utils/oxyServiceEnvironment';
|
|
3
|
+
/**
|
|
4
|
+
* Result from the service-acting-as verification endpoint.
|
|
5
|
+
* Confirms that a given service app holds an active delegation grant for
|
|
6
|
+
* the supplied user, along with the explicit scope list the grant covers.
|
|
7
|
+
*
|
|
8
|
+
* The API side stores this as an ordinary `app_grants` row — the SAME revocable
|
|
9
|
+
* record the OAuth consent screen writes and the "Connected apps" UI lists and
|
|
10
|
+
* deletes — whose `scopes` name `acting-as:offline`. There is deliberately no
|
|
11
|
+
* separate delegation table: a second store would be a second revocation
|
|
12
|
+
* surface, and a user who disconnects an application in "Connected apps" means
|
|
13
|
+
* it, so one revoke has to end everything.
|
|
14
|
+
*
|
|
15
|
+
* `scopes` is what THAT USER consented to, not what the application may do in
|
|
16
|
+
* general. `requireScope` intersects it with the token's own app-wide scopes for
|
|
17
|
+
* a delegated request, and the intersection is the effective authority.
|
|
18
|
+
*
|
|
19
|
+
* The SDK never inspects the grant directly — it round-trips through
|
|
20
|
+
* `GET /internal/service-acting-as/verify?appId=...&userId=...` so the
|
|
21
|
+
* authoritative store stays server-side.
|
|
22
|
+
*/
|
|
23
|
+
export interface ServiceActingAsVerification {
|
|
24
|
+
authorized: boolean;
|
|
25
|
+
scopes: string[];
|
|
26
|
+
}
|
|
27
|
+
/** The SET `events` member Oxy uses for an account deletion. */
|
|
28
|
+
export declare const OXY_ACCOUNT_DELETED_EVENT_URI = "https://oxy.so/events/account.deleted";
|
|
29
|
+
/**
|
|
30
|
+
* A verified account event from Oxy (OxyHQ/Mention#1169): a person deleted
|
|
31
|
+
* their Oxy account and every relying application must erase what it holds
|
|
32
|
+
* for them. Returned by `verifyAccountEvent` only after the signature, `typ`,
|
|
33
|
+
* issuer and audience all check out.
|
|
34
|
+
*/
|
|
35
|
+
export interface OxyAccountEvent {
|
|
36
|
+
/** The event id (`jti`). Stable across webhook retries and the pull feed: dedupe on it. */
|
|
37
|
+
eventId: string;
|
|
38
|
+
type: 'account.deleted';
|
|
39
|
+
/** The deleted Oxy account. */
|
|
40
|
+
userId: string;
|
|
41
|
+
/**
|
|
42
|
+
* The account's handle at deletion time, for relying parties that address
|
|
43
|
+
* the person by handle (an ActivityPub actor URI). `null` when the account had
|
|
44
|
+
* none, or when the token predates the field.
|
|
45
|
+
*/
|
|
46
|
+
username: string | null;
|
|
47
|
+
/** ISO-8601 time the deletion committed. */
|
|
48
|
+
occurredAt: string;
|
|
49
|
+
/** `true` when Oxy archived the row to keep financial records. Erase either way. */
|
|
50
|
+
retained: boolean;
|
|
51
|
+
/** The application the event was addressed to (`aud`). */
|
|
52
|
+
applicationId: string;
|
|
53
|
+
/** Seconds since the epoch the token was issued at (`iat`). */
|
|
54
|
+
issuedAt: number;
|
|
55
|
+
}
|
|
56
|
+
/** One entry of the account-event pull feed (`GET /account-events`). */
|
|
57
|
+
export interface OxyAccountEventFeedItem {
|
|
58
|
+
eventId: string;
|
|
59
|
+
type: 'account.deleted';
|
|
60
|
+
userId: string;
|
|
61
|
+
username: string | null;
|
|
62
|
+
occurredAt: string;
|
|
63
|
+
retained: boolean;
|
|
64
|
+
/** The same signed token the webhook carries. Verify it with `verifyAccountEvent`. */
|
|
65
|
+
token: string;
|
|
66
|
+
}
|
|
67
|
+
export interface OxyAccountEventFeedPage {
|
|
68
|
+
events: OxyAccountEventFeedItem[];
|
|
69
|
+
/** Pass back as `after` to continue; unchanged when the page is empty. */
|
|
70
|
+
nextCursor: string | null;
|
|
71
|
+
}
|
|
72
|
+
export interface VerifyAccountEventOptions {
|
|
73
|
+
/**
|
|
74
|
+
* The application id the token must be addressed to. Defaults to the `appId`
|
|
75
|
+
* of this client's configured service credential.
|
|
76
|
+
*/
|
|
77
|
+
audience?: string;
|
|
78
|
+
/** Defaults to `/.well-known/jwks.json` on this client's API origin. */
|
|
79
|
+
jwksUrl?: string;
|
|
80
|
+
}
|
|
81
|
+
/** Why an account event token was refused. `message` never contains the token. */
|
|
82
|
+
export declare class OxyAccountEventError extends Error {
|
|
83
|
+
constructor(message: string);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Service app metadata attached to requests authenticated with service tokens.
|
|
87
|
+
*
|
|
88
|
+
* Every field comes from the token's SIGNED payload and is populated only after
|
|
89
|
+
* the signature, `iss`/`aud`/`type` binding and expiry all pass — so a verifier
|
|
90
|
+
* holding this object can name the responsible principals without a lookup of
|
|
91
|
+
* its own. Together with `credentialId` and `ownerAccountId` it is the canonical
|
|
92
|
+
* attribution tuple of ADR 0007 minus the delegated user.
|
|
93
|
+
*
|
|
94
|
+
* `scopes` are the EFFECTIVE scopes: the credential's own scopes intersected
|
|
95
|
+
* with the owning application's grant at mint time (the API's `intersectScopes`
|
|
96
|
+
* is the single authority for that intersection — nothing re-intersects here).
|
|
97
|
+
* Route-level checks narrow further via `requireScope()`.
|
|
98
|
+
*
|
|
99
|
+
* A delegated end user is NOT a field of this type, and must never become one.
|
|
100
|
+
* It lives in `req.serviceActingAs` / `req.userId`, is authorised per request,
|
|
101
|
+
* and is attribution only.
|
|
102
|
+
*/
|
|
103
|
+
export interface ServiceApp {
|
|
104
|
+
appId: string;
|
|
105
|
+
appName: string;
|
|
106
|
+
scopes: string[];
|
|
107
|
+
/**
|
|
108
|
+
* `internal` when the caller is one of Oxy's own applications: app to app it
|
|
109
|
+
* is trusted outright — {@link requireScope} passes and it may act for a user
|
|
110
|
+
* without a delegation grant. `external` keeps every scope and grant rule.
|
|
111
|
+
* What the USER may do (their accounts, plan, limits) is still for the
|
|
112
|
+
* receiving service to decide. A token without the claim reads as `external`.
|
|
113
|
+
*/
|
|
114
|
+
tier: 'internal' | 'external';
|
|
115
|
+
/** The credentialId of the specific service credential that minted this token. */
|
|
116
|
+
credentialId: string;
|
|
117
|
+
/**
|
|
118
|
+
* The Oxy account that owns `appId` and is financially responsible for it.
|
|
119
|
+
* The BILLING principal — never a user id, and never the delegated
|
|
120
|
+
* `X-Oxy-User-Id` (ADR 0007).
|
|
121
|
+
*/
|
|
122
|
+
ownerAccountId: string;
|
|
123
|
+
/** Test/live isolation (F2.0): which `ApplicationCredential.environment` minted this token. */
|
|
124
|
+
environment: OxyServiceEnvironment;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Why a request's credential was refused, recorded on the request itself.
|
|
128
|
+
*
|
|
129
|
+
* The middleware answers a fixed, deliberately uninformative body to the
|
|
130
|
+
* client; this is the other half of that trade. A refusal is ALWAYS observable
|
|
131
|
+
* to the HOST: it is logged at `warn` with a stable `code`, handed to
|
|
132
|
+
* `onRefusal`, and left on `req.oxyAuthRefusal` for the host's own logs.
|
|
133
|
+
*
|
|
134
|
+
* It exists because the opposite cost was measured: Oxy served
|
|
135
|
+
* `{"keys":[]}` from `/.well-known/jwks.json` with no Ed25519 signing key
|
|
136
|
+
* bound, every service token failed `Oxy service-token key set is unavailable`,
|
|
137
|
+
* and on the OPTIONAL path that failure fell straight through to `next()`.
|
|
138
|
+
* The host then answered its own generic 401 and logged nothing at all, so the
|
|
139
|
+
* one fact that named the fault — an empty key set — existed nowhere. Hours.
|
|
140
|
+
*
|
|
141
|
+
* **Nothing here is ever sent to a client, and `reason` never contains the
|
|
142
|
+
* token, a signature, a secret or a session id.** It carries the SDK's own
|
|
143
|
+
* failure message (`kid` unknown, audience mismatch, key set unavailable) plus
|
|
144
|
+
* the ids already considered safe to log elsewhere in this middleware.
|
|
145
|
+
*/
|
|
146
|
+
export interface OxyAuthRefusal {
|
|
147
|
+
/** Stable, greppable code. Matches the `code` a non-optional refusal answers. */
|
|
148
|
+
code: string;
|
|
149
|
+
/** Which credential lane refused. */
|
|
150
|
+
stage: 'token' | 'service-token' | 'session';
|
|
151
|
+
/** Human-readable cause. Never a token, signature, secret or session id. */
|
|
152
|
+
reason: string;
|
|
153
|
+
/** The status a NON-optional mount would have answered with. */
|
|
154
|
+
status: number;
|
|
155
|
+
/**
|
|
156
|
+
* `true` when the middleware was mounted with `optional: true`, so this
|
|
157
|
+
* refusal did not produce a response — the request continued unauthenticated
|
|
158
|
+
* and whatever the host does next (typically its own generic 401) is the
|
|
159
|
+
* only thing the client sees.
|
|
160
|
+
*/
|
|
161
|
+
optional: boolean;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Expected JWT issuer for tokens issued by the Oxy auth service.
|
|
165
|
+
*/
|
|
166
|
+
export declare const OXY_JWT_ISSUER = "oxy-auth";
|
|
167
|
+
/**
|
|
168
|
+
* Options for `server.middleware.auth()`.
|
|
169
|
+
*/
|
|
170
|
+
export interface AuthMiddlewareOptions {
|
|
171
|
+
/** Enable debug logging (default: false) */
|
|
172
|
+
debug?: boolean;
|
|
173
|
+
/** Custom error handler - receives error object, can return response */
|
|
174
|
+
onError?: (error: ApiError) => unknown;
|
|
175
|
+
/** Load full user profile from API (default: false for performance) */
|
|
176
|
+
loadUser?: boolean;
|
|
177
|
+
/** Optional auth - attach user if token present but don't block (default: false) */
|
|
178
|
+
optional?: boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Called whenever a PRESENTED credential is refused, on the optional path as
|
|
181
|
+
* well as the blocking one. Runs before the response (if any) and after
|
|
182
|
+
* `req.oxyAuthRefusal` is set, so a host can raise its own alert or carry the
|
|
183
|
+
* code into its request log. Throwing from it is swallowed — an observer must
|
|
184
|
+
* not be able to turn a refusal into a 500.
|
|
185
|
+
*
|
|
186
|
+
* Refusal is about a credential that was offered and rejected: a request with
|
|
187
|
+
* NO `Authorization` header is not refused and does not reach this.
|
|
188
|
+
*/
|
|
189
|
+
onRefusal?: (refusal: OxyAuthRefusal) => void;
|
|
190
|
+
/**
|
|
191
|
+
* Public JWKS endpoint used for Ed25519 service-token verification. Defaults
|
|
192
|
+
* to `/.well-known/jwks.json` on this Oxy client's configured API origin.
|
|
193
|
+
*/
|
|
194
|
+
serviceTokenJwksUrl?: string;
|
|
195
|
+
/**
|
|
196
|
+
* Expected JWT issuer. Defaults to `'oxy-auth'`. Override only if you run
|
|
197
|
+
* a private fork of the Oxy auth server under a different `iss` claim.
|
|
198
|
+
*/
|
|
199
|
+
expectedIssuer?: string;
|
|
200
|
+
/**
|
|
201
|
+
* Expected JWT audience. Defaults to `'oxy-api'`. Override only if your
|
|
202
|
+
* private fork mints tokens for a different audience.
|
|
203
|
+
*/
|
|
204
|
+
expectedAudience?: string;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* What the middleware needs from the server it is mounted on. `OxyServer`
|
|
208
|
+
* builds it; every member is resolved at call time, so a test can spy on the
|
|
209
|
+
* server's own methods.
|
|
210
|
+
*/
|
|
211
|
+
export interface OxyMiddlewareHost {
|
|
212
|
+
readonly baseURL: string;
|
|
213
|
+
readonly jwksCache: ServiceTokenJwksCache;
|
|
214
|
+
validateSession(sessionId: string, options?: {
|
|
215
|
+
deviceFingerprint?: string;
|
|
216
|
+
useHeaderValidation?: boolean;
|
|
217
|
+
}): Promise<{
|
|
218
|
+
valid: boolean;
|
|
219
|
+
user?: User;
|
|
220
|
+
} | null>;
|
|
221
|
+
verifyActingAs(appId: string, userId: string): Promise<ServiceActingAsVerification | null>;
|
|
222
|
+
}
|
|
223
|
+
/** Build the middleware set for one server. See `OxyServer.middleware`. */
|
|
224
|
+
export declare function createOxyMiddleware(host: OxyMiddlewareHost): {
|
|
225
|
+
auth: (options?: AuthMiddlewareOptions) => (req: AuthReq, res: AuthRes, next: AuthNext) => Promise<unknown>;
|
|
226
|
+
socket: (options?: {
|
|
227
|
+
debug?: boolean;
|
|
228
|
+
}) => (socket: SocketLike, next: (err?: Error) => void) => Promise<void>;
|
|
229
|
+
service: (options?: {
|
|
230
|
+
debug?: boolean;
|
|
231
|
+
/** Observe refusals on the service lane; forwarded straight to `auth()`. */
|
|
232
|
+
onRefusal?: (refusal: OxyAuthRefusal) => void;
|
|
233
|
+
serviceTokenJwksUrl?: string;
|
|
234
|
+
expectedIssuer?: string;
|
|
235
|
+
expectedAudience?: string;
|
|
236
|
+
}) => (req: AuthReq, res: AuthRes, next: AuthNext) => Promise<void>;
|
|
237
|
+
requireScope: (scope: string) => (req: AuthReq, res: AuthRes, next: AuthNext) => void;
|
|
238
|
+
};
|
|
239
|
+
/** The middleware set `OxyServer.middleware` exposes. */
|
|
240
|
+
export type OxyMiddleware = ReturnType<typeof createOxyMiddleware>;
|
|
241
|
+
export interface ServiceTokenPublicJwk {
|
|
242
|
+
readonly kty: 'OKP';
|
|
243
|
+
readonly crv: 'Ed25519';
|
|
244
|
+
readonly x: string;
|
|
245
|
+
readonly use: 'sig';
|
|
246
|
+
readonly alg: 'EdDSA';
|
|
247
|
+
readonly kid: string;
|
|
248
|
+
}
|
|
249
|
+
export interface ServiceTokenJwksCache {
|
|
250
|
+
keys: Map<string, ServiceTokenPublicJwk>;
|
|
251
|
+
expiresAt: number;
|
|
252
|
+
lastAttemptAt: number;
|
|
253
|
+
pending?: Promise<void>;
|
|
254
|
+
}
|
|
255
|
+
export declare function parseJsonSegment(segment: string): Record<string, unknown>;
|
|
256
|
+
export declare function resolveServiceTokenPublicKey(kid: string, url: string, cache: ServiceTokenJwksCache): Promise<ServiceTokenPublicJwk>;
|
|
257
|
+
interface AuthReq {
|
|
258
|
+
method?: string;
|
|
259
|
+
path?: string;
|
|
260
|
+
headers: Record<string, string | string[] | undefined>;
|
|
261
|
+
query?: Record<string, unknown>;
|
|
262
|
+
userId?: string | null;
|
|
263
|
+
user?: User | null;
|
|
264
|
+
accessToken?: string;
|
|
265
|
+
sessionId?: string | null;
|
|
266
|
+
serviceApp?: ServiceApp;
|
|
267
|
+
serviceActingAs?: {
|
|
268
|
+
userId: string;
|
|
269
|
+
scopes: string[];
|
|
270
|
+
};
|
|
271
|
+
oxyAuthRefusal?: OxyAuthRefusal;
|
|
272
|
+
}
|
|
273
|
+
interface AuthRes {
|
|
274
|
+
status(code: number): AuthRes;
|
|
275
|
+
json(body: unknown): unknown;
|
|
276
|
+
}
|
|
277
|
+
type AuthNext = (err?: unknown) => void;
|
|
278
|
+
interface SocketLike {
|
|
279
|
+
handshake?: {
|
|
280
|
+
auth?: {
|
|
281
|
+
token?: string;
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
data?: Record<string, unknown>;
|
|
285
|
+
user?: {
|
|
286
|
+
id: string;
|
|
287
|
+
userId: string;
|
|
288
|
+
sessionId?: string | null;
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
export {};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The server-side halves of the namespaces: what exists only with a service
|
|
3
|
+
* credential. `OxyServer` returns these from its namespace getters, so
|
|
4
|
+
* `server.assets.metadataByIds(...)` sits beside every client method of
|
|
5
|
+
* `oxy.assets`.
|
|
6
|
+
*/
|
|
7
|
+
import type { CreateOxyNotificationRequest, AwardReputationInput, ReputationTransaction, ServiceLinkedAccountListResponse } from '@oxy.so/contracts';
|
|
8
|
+
import type { Notification, ServiceAssetMetadata, ServiceAssetMetadataBySha, ServiceLinkedDownloadUrl } from '../models/interfaces';
|
|
9
|
+
import { AssetsApi } from '../api/assets';
|
|
10
|
+
import { NotificationsApi } from '../api/notifications';
|
|
11
|
+
import { LinkedAccountsApi } from '../api/linkedAccounts';
|
|
12
|
+
import { AgencyApi, type RequesterAssertionGrant, type RequesterAssertionIntrospection } from '../api/agency';
|
|
13
|
+
import { ReputationApi } from '../api/reputation';
|
|
14
|
+
export declare class ServerAssetsApi extends AssetsApi {
|
|
15
|
+
/**
|
|
16
|
+
* Resolve many asset ids to their content-addressed metadata (`sha256`,
|
|
17
|
+
* `mime`, `size`, `status`) via `POST /assets/service/by-ids`, one call per
|
|
18
|
+
* chunk of 100. Service token with `files:read`.
|
|
19
|
+
*
|
|
20
|
+
* The server omits unknown/deleted ids, so a short result is normal — map by
|
|
21
|
+
* `id`. FAILURE IS NOT ABSENCE: a failed chunk throws
|
|
22
|
+
* {@link ServiceAssetMetadataError} carrying the ids it could not resolve,
|
|
23
|
+
* unless `{ partial: true }` asks for best-effort. Never cached.
|
|
24
|
+
*/
|
|
25
|
+
metadataByIds(ids: string[], options?: {
|
|
26
|
+
partial?: boolean;
|
|
27
|
+
}): Promise<ServiceAssetMetadata[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Mint short-lived direct download URLs for files the calling application's
|
|
30
|
+
* own users attached to it (`POST /assets/service/linked-url`, scope
|
|
31
|
+
* `files:linked:read`). The ONLY way a service token reaches file bytes.
|
|
32
|
+
*
|
|
33
|
+
* A URL comes back only for a file whose OWN OWNER linked it to this
|
|
34
|
+
* application; every other id is omitted, and the route answers identically
|
|
35
|
+
* for "no such file" and "not yours". ABSENCE IS A REFUSAL, not a fact about
|
|
36
|
+
* the file: decide what to tell your user from your own entitlement record.
|
|
37
|
+
* A failed chunk throws {@link ServiceLinkedDownloadUrlError}; there is no
|
|
38
|
+
* partial mode. Never cached — each URL is a live credential.
|
|
39
|
+
*/
|
|
40
|
+
linkedDownloadUrls(ids: string[]): Promise<ServiceLinkedDownloadUrl[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Reverse content-address lookup: resolve `sha256` digests to the servable
|
|
43
|
+
* asset holding each (`POST /assets/service/by-sha256`, scope `files:read`),
|
|
44
|
+
* with a public `url` for active public assets. Malformed hashes are dropped
|
|
45
|
+
* client-side; the server omits unknown ones, so map by `sha256`. A failed
|
|
46
|
+
* chunk is logged and skipped. Never cached.
|
|
47
|
+
*/
|
|
48
|
+
metadataBySha256(sha256s: string[]): Promise<ServiceAssetMetadataBySha[]>;
|
|
49
|
+
}
|
|
50
|
+
export declare class ServerNotificationsApi extends NotificationsApi {
|
|
51
|
+
/**
|
|
52
|
+
* Create a notification (`POST /notifications`; the application needs
|
|
53
|
+
* `notifications:write`). `type` is one of `OXY_NOTIFICATION_TYPES` from
|
|
54
|
+
* `@oxy.so/contracts` — `system` for a message from an Oxy service about the
|
|
55
|
+
* recipient's own account.
|
|
56
|
+
*/
|
|
57
|
+
create(data: CreateOxyNotificationRequest): Promise<Notification>;
|
|
58
|
+
}
|
|
59
|
+
export declare class ServerLinkedAccountsApi extends LinkedAccountsApi {
|
|
60
|
+
/**
|
|
61
|
+
* A user's live linked accounts, each with the federated shadow user Oxy holds
|
|
62
|
+
* for it (`federatedUserId`). Needs the privileged `linked-accounts:read`.
|
|
63
|
+
*/
|
|
64
|
+
forUser(userId: string): Promise<ServiceLinkedAccountListResponse>;
|
|
65
|
+
}
|
|
66
|
+
export declare class ServerAgencyApi extends AgencyApi {
|
|
67
|
+
/**
|
|
68
|
+
* Product backend → Oxy: trade the signed-in requester's access token for a
|
|
69
|
+
* one-use assertion naming `agentId` (ADR 0025), authenticated with this
|
|
70
|
+
* service's credential. `subjectToken` goes to Oxy only, in the body; never
|
|
71
|
+
* forward it anywhere else. Not retried: a refusal is an answer, and the
|
|
72
|
+
* caller mints per turn.
|
|
73
|
+
*/
|
|
74
|
+
mintRequesterAssertion(input: {
|
|
75
|
+
agentId: string;
|
|
76
|
+
subjectToken: string;
|
|
77
|
+
}): Promise<RequesterAssertionGrant>;
|
|
78
|
+
/**
|
|
79
|
+
* Audience → Oxy: verify, live-revalidate and CONSUME a present-requester
|
|
80
|
+
* assertion (ADR 0025). A second call with the same assertion answers
|
|
81
|
+
* `active: false`. Authenticated with the audience's own service credential.
|
|
82
|
+
*/
|
|
83
|
+
introspectRequesterAssertion(input: {
|
|
84
|
+
assertion: string;
|
|
85
|
+
presenter: {
|
|
86
|
+
applicationId: string;
|
|
87
|
+
credentialId: string;
|
|
88
|
+
};
|
|
89
|
+
}): Promise<RequesterAssertionIntrospection>;
|
|
90
|
+
}
|
|
91
|
+
export declare class ServerReputationApi extends ReputationApi {
|
|
92
|
+
/**
|
|
93
|
+
* Award (or penalise) reputation to a user by `actionType`. Service token with
|
|
94
|
+
* `reputation:write` only — people never award reputation, and nobody at Oxy
|
|
95
|
+
* moves it by hand. Invalidates cached reputation reads.
|
|
96
|
+
*/
|
|
97
|
+
award(input: AwardReputationInput): Promise<ReputationTransaction>;
|
|
98
|
+
}
|