@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
|
@@ -0,0 +1,257 @@
|
|
|
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 { OxyContext, ServiceLane } from '../client/context';
|
|
9
|
+
import type {
|
|
10
|
+
Notification,
|
|
11
|
+
ServiceAssetMetadata,
|
|
12
|
+
ServiceAssetMetadataBySha,
|
|
13
|
+
ServiceLinkedDownloadUrl,
|
|
14
|
+
} from '../models/interfaces';
|
|
15
|
+
import { AssetsApi } from '../api/assets';
|
|
16
|
+
import { NotificationsApi } from '../api/notifications';
|
|
17
|
+
import { LinkedAccountsApi } from '../api/linkedAccounts';
|
|
18
|
+
import { AgencyApi, type RequesterAssertionGrant, type RequesterAssertionIntrospection } from '../api/agency';
|
|
19
|
+
import { ReputationApi } from '../api/reputation';
|
|
20
|
+
import { ServiceAssetMetadataError, ServiceLinkedDownloadUrlError } from '../OxyServices.errors';
|
|
21
|
+
import { extractErrorStatus } from '../utils/errorUtils';
|
|
22
|
+
import { logger } from '../logger';
|
|
23
|
+
|
|
24
|
+
/** Server-side cap of `POST /assets/service/by-ids`. */
|
|
25
|
+
const SERVICE_ASSET_METADATA_CHUNK_SIZE = 100;
|
|
26
|
+
/** Server-side cap of `POST /assets/service/by-sha256`. */
|
|
27
|
+
const SERVICE_ASSET_METADATA_BY_SHA_CHUNK_SIZE = 100;
|
|
28
|
+
/** Server-side cap of `POST /assets/service/linked-url`. */
|
|
29
|
+
const SERVICE_LINKED_DOWNLOAD_URL_CHUNK_SIZE = 25;
|
|
30
|
+
const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/;
|
|
31
|
+
|
|
32
|
+
const REPUTATION_CACHE_PREFIX = 'GET:/reputation/';
|
|
33
|
+
|
|
34
|
+
function lane(ctx: OxyContext): ServiceLane {
|
|
35
|
+
if (!ctx.service) {
|
|
36
|
+
throw new Error('This call needs a service credential (OxyServer from @oxy.so/core/server)');
|
|
37
|
+
}
|
|
38
|
+
return ctx.service;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function chunk<T>(items: T[], size: number): T[][] {
|
|
42
|
+
const chunks: T[][] = [];
|
|
43
|
+
for (let i = 0; i < items.length; i += size) chunks.push(items.slice(i, i + size));
|
|
44
|
+
return chunks;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function uniqueIds(ids: string[]): string[] {
|
|
48
|
+
return Array.from(new Set(ids.filter((id): id is string => typeof id === 'string' && id.trim().length > 0)));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export class ServerAssetsApi extends AssetsApi {
|
|
52
|
+
/**
|
|
53
|
+
* Resolve many asset ids to their content-addressed metadata (`sha256`,
|
|
54
|
+
* `mime`, `size`, `status`) via `POST /assets/service/by-ids`, one call per
|
|
55
|
+
* chunk of 100. Service token with `files:read`.
|
|
56
|
+
*
|
|
57
|
+
* The server omits unknown/deleted ids, so a short result is normal — map by
|
|
58
|
+
* `id`. FAILURE IS NOT ABSENCE: a failed chunk throws
|
|
59
|
+
* {@link ServiceAssetMetadataError} carrying the ids it could not resolve,
|
|
60
|
+
* unless `{ partial: true }` asks for best-effort. Never cached.
|
|
61
|
+
*/
|
|
62
|
+
async metadataByIds(ids: string[], options: { partial?: boolean } = {}): Promise<ServiceAssetMetadata[]> {
|
|
63
|
+
const unique = uniqueIds(ids);
|
|
64
|
+
if (unique.length === 0) return [];
|
|
65
|
+
|
|
66
|
+
const unresolvedIds: string[] = [];
|
|
67
|
+
const statuses: number[] = [];
|
|
68
|
+
let firstError: unknown;
|
|
69
|
+
|
|
70
|
+
const settled = await Promise.all(
|
|
71
|
+
chunk(unique, SERVICE_ASSET_METADATA_CHUNK_SIZE).map(async (part): Promise<ServiceAssetMetadata[]> => {
|
|
72
|
+
try {
|
|
73
|
+
const entries = await lane(this.ctx).request<ServiceAssetMetadata[]>('POST', '/assets/service/by-ids', { ids: part });
|
|
74
|
+
return Array.isArray(entries) ? entries : [];
|
|
75
|
+
} catch (error: unknown) {
|
|
76
|
+
const status = extractErrorStatus(error);
|
|
77
|
+
logger.warn('assets.metadataByIds: chunk failed', {
|
|
78
|
+
method: 'assets.metadataByIds',
|
|
79
|
+
chunkSize: part.length,
|
|
80
|
+
status,
|
|
81
|
+
partial: options.partial === true,
|
|
82
|
+
error: error instanceof Error ? error.message : String(error),
|
|
83
|
+
});
|
|
84
|
+
unresolvedIds.push(...part);
|
|
85
|
+
if (typeof status === 'number') statuses.push(status);
|
|
86
|
+
firstError ??= error;
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}),
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
if (unresolvedIds.length > 0 && options.partial !== true) {
|
|
93
|
+
throw new ServiceAssetMetadataError(unresolvedIds, statuses, firstError);
|
|
94
|
+
}
|
|
95
|
+
return settled.flat();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Mint short-lived direct download URLs for files the calling application's
|
|
100
|
+
* own users attached to it (`POST /assets/service/linked-url`, scope
|
|
101
|
+
* `files:linked:read`). The ONLY way a service token reaches file bytes.
|
|
102
|
+
*
|
|
103
|
+
* A URL comes back only for a file whose OWN OWNER linked it to this
|
|
104
|
+
* application; every other id is omitted, and the route answers identically
|
|
105
|
+
* for "no such file" and "not yours". ABSENCE IS A REFUSAL, not a fact about
|
|
106
|
+
* the file: decide what to tell your user from your own entitlement record.
|
|
107
|
+
* A failed chunk throws {@link ServiceLinkedDownloadUrlError}; there is no
|
|
108
|
+
* partial mode. Never cached — each URL is a live credential.
|
|
109
|
+
*/
|
|
110
|
+
async linkedDownloadUrls(ids: string[]): Promise<ServiceLinkedDownloadUrl[]> {
|
|
111
|
+
const unique = uniqueIds(ids);
|
|
112
|
+
if (unique.length === 0) return [];
|
|
113
|
+
|
|
114
|
+
const unresolvedIds: string[] = [];
|
|
115
|
+
const statuses: number[] = [];
|
|
116
|
+
let firstError: unknown;
|
|
117
|
+
|
|
118
|
+
const settled = await Promise.all(
|
|
119
|
+
chunk(unique, SERVICE_LINKED_DOWNLOAD_URL_CHUNK_SIZE).map(async (part): Promise<ServiceLinkedDownloadUrl[]> => {
|
|
120
|
+
try {
|
|
121
|
+
const entries = await lane(this.ctx).request<ServiceLinkedDownloadUrl[]>('POST', '/assets/service/linked-url', { ids: part });
|
|
122
|
+
return Array.isArray(entries) ? entries : [];
|
|
123
|
+
} catch (error: unknown) {
|
|
124
|
+
const status = extractErrorStatus(error);
|
|
125
|
+
// `chunkSize` and `status`, never the ids and never a `url`: a minted
|
|
126
|
+
// URL in a log line is a credential in a log line.
|
|
127
|
+
logger.warn('assets.linkedDownloadUrls: chunk failed', {
|
|
128
|
+
method: 'assets.linkedDownloadUrls',
|
|
129
|
+
chunkSize: part.length,
|
|
130
|
+
status,
|
|
131
|
+
error: error instanceof Error ? error.message : String(error),
|
|
132
|
+
});
|
|
133
|
+
unresolvedIds.push(...part);
|
|
134
|
+
if (typeof status === 'number') statuses.push(status);
|
|
135
|
+
firstError ??= error;
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
}),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
if (unresolvedIds.length > 0) {
|
|
142
|
+
throw new ServiceLinkedDownloadUrlError(unresolvedIds, statuses, firstError);
|
|
143
|
+
}
|
|
144
|
+
return settled.flat();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Reverse content-address lookup: resolve `sha256` digests to the servable
|
|
149
|
+
* asset holding each (`POST /assets/service/by-sha256`, scope `files:read`),
|
|
150
|
+
* with a public `url` for active public assets. Malformed hashes are dropped
|
|
151
|
+
* client-side; the server omits unknown ones, so map by `sha256`. A failed
|
|
152
|
+
* chunk is logged and skipped. Never cached.
|
|
153
|
+
*/
|
|
154
|
+
async metadataBySha256(sha256s: string[]): Promise<ServiceAssetMetadataBySha[]> {
|
|
155
|
+
const unique = Array.from(
|
|
156
|
+
new Set(
|
|
157
|
+
sha256s
|
|
158
|
+
.filter((sha): sha is string => typeof sha === 'string')
|
|
159
|
+
.map((sha) => sha.trim().toLowerCase())
|
|
160
|
+
.filter((sha) => SHA256_HEX_PATTERN.test(sha)),
|
|
161
|
+
),
|
|
162
|
+
);
|
|
163
|
+
if (unique.length === 0) return [];
|
|
164
|
+
|
|
165
|
+
const settled = await Promise.all(
|
|
166
|
+
chunk(unique, SERVICE_ASSET_METADATA_BY_SHA_CHUNK_SIZE).map(async (part): Promise<ServiceAssetMetadataBySha[]> => {
|
|
167
|
+
try {
|
|
168
|
+
const entries = await lane(this.ctx).request<ServiceAssetMetadataBySha[]>('POST', '/assets/service/by-sha256', { sha256s: part });
|
|
169
|
+
return Array.isArray(entries) ? entries : [];
|
|
170
|
+
} catch (error: unknown) {
|
|
171
|
+
logger.warn('assets.metadataBySha256: chunk failed, continuing with remaining chunks', {
|
|
172
|
+
method: 'assets.metadataBySha256',
|
|
173
|
+
chunkSize: part.length,
|
|
174
|
+
status: extractErrorStatus(error),
|
|
175
|
+
error: error instanceof Error ? error.message : String(error),
|
|
176
|
+
});
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
}),
|
|
180
|
+
);
|
|
181
|
+
return settled.flat();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export class ServerNotificationsApi extends NotificationsApi {
|
|
186
|
+
/**
|
|
187
|
+
* Create a notification (`POST /notifications`; the application needs
|
|
188
|
+
* `notifications:write`). `type` is one of `OXY_NOTIFICATION_TYPES` from
|
|
189
|
+
* `@oxy.so/contracts` — `system` for a message from an Oxy service about the
|
|
190
|
+
* recipient's own account.
|
|
191
|
+
*/
|
|
192
|
+
async create(data: CreateOxyNotificationRequest): Promise<Notification> {
|
|
193
|
+
const res = await lane(this.ctx).request<{ notification: Notification }>('POST', '/notifications', data);
|
|
194
|
+
return res.notification;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export class ServerLinkedAccountsApi extends LinkedAccountsApi {
|
|
199
|
+
/**
|
|
200
|
+
* A user's live linked accounts, each with the federated shadow user Oxy holds
|
|
201
|
+
* for it (`federatedUserId`). Needs the privileged `linked-accounts:read`.
|
|
202
|
+
*/
|
|
203
|
+
async forUser(userId: string): Promise<ServiceLinkedAccountListResponse> {
|
|
204
|
+
return lane(this.ctx).request<ServiceLinkedAccountListResponse>(
|
|
205
|
+
'GET',
|
|
206
|
+
`/linked-accounts/by-user/${encodeURIComponent(userId)}`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export class ServerAgencyApi extends AgencyApi {
|
|
212
|
+
/**
|
|
213
|
+
* Product backend → Oxy: trade the signed-in requester's access token for a
|
|
214
|
+
* one-use assertion naming `agentId` (ADR 0025), authenticated with this
|
|
215
|
+
* service's credential. `subjectToken` goes to Oxy only, in the body; never
|
|
216
|
+
* forward it anywhere else. Not retried: a refusal is an answer, and the
|
|
217
|
+
* caller mints per turn.
|
|
218
|
+
*/
|
|
219
|
+
async mintRequesterAssertion(input: { agentId: string; subjectToken: string }): Promise<RequesterAssertionGrant> {
|
|
220
|
+
return lane(this.ctx).request<RequesterAssertionGrant>(
|
|
221
|
+
'POST',
|
|
222
|
+
'/internal/native-agents/requester-assertions',
|
|
223
|
+
{ agentId: input.agentId, subjectToken: input.subjectToken },
|
|
224
|
+
{ retry: false, timeout: 5000 },
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Audience → Oxy: verify, live-revalidate and CONSUME a present-requester
|
|
230
|
+
* assertion (ADR 0025). A second call with the same assertion answers
|
|
231
|
+
* `active: false`. Authenticated with the audience's own service credential.
|
|
232
|
+
*/
|
|
233
|
+
async introspectRequesterAssertion(input: {
|
|
234
|
+
assertion: string;
|
|
235
|
+
presenter: { applicationId: string; credentialId: string };
|
|
236
|
+
}): Promise<RequesterAssertionIntrospection> {
|
|
237
|
+
return lane(this.ctx).request<RequesterAssertionIntrospection>(
|
|
238
|
+
'POST',
|
|
239
|
+
'/internal/native-agents/requester-assertions/introspect',
|
|
240
|
+
{ assertion: input.assertion, presenter: input.presenter },
|
|
241
|
+
{ retry: false, timeout: 5000 },
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export class ServerReputationApi extends ReputationApi {
|
|
247
|
+
/**
|
|
248
|
+
* Award (or penalise) reputation to a user by `actionType`. Service token with
|
|
249
|
+
* `reputation:write` only — people never award reputation, and nobody at Oxy
|
|
250
|
+
* moves it by hand. Invalidates cached reputation reads.
|
|
251
|
+
*/
|
|
252
|
+
async award(input: AwardReputationInput): Promise<ReputationTransaction> {
|
|
253
|
+
const res = await lane(this.ctx).request<{ transaction: ReputationTransaction }>('POST', '/reputation/award', input);
|
|
254
|
+
this.ctx.oxy.cache.deletePrefix(REPUTATION_CACHE_PREFIX);
|
|
255
|
+
return res.transaction;
|
|
256
|
+
}
|
|
257
|
+
}
|
package/src/server/rateLimit.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { createHmac } from 'node:crypto';
|
|
|
2
2
|
import { isIPv4, isIPv6 } from 'node:net';
|
|
3
3
|
import type { Request, RequestHandler } from 'express';
|
|
4
4
|
import rateLimit, { type Store } from 'express-rate-limit';
|
|
5
|
-
import type {
|
|
6
|
-
import { createOptionalOxyAuth } from './auth';
|
|
5
|
+
import type { AuthMiddlewareOptions } from './middleware';
|
|
6
|
+
import { createOptionalOxyAuth, type OxyAuthHost } from './auth';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Server-only rate limiting for Oxy backends.
|
|
@@ -19,7 +19,7 @@ import { createOptionalOxyAuth } from './auth';
|
|
|
19
19
|
* ALB) many users share one egress IP, so a single bucket was split across
|
|
20
20
|
* all of them → frequent, spurious HTTP 429s.
|
|
21
21
|
*
|
|
22
|
-
* `@oxy.so/core` already owns the session: `
|
|
22
|
+
* `@oxy.so/core` already owns the session: `server.middleware.auth()` resolves `req.user` /
|
|
23
23
|
* `req.userId`. Per-user rate limiting is the same concern (session identity),
|
|
24
24
|
* so it belongs here — once — instead of being re-implemented per app.
|
|
25
25
|
*
|
|
@@ -78,10 +78,11 @@ export interface OxyRateLimitOptions {
|
|
|
78
78
|
/** Response message body sent with a 429. */
|
|
79
79
|
message?: string;
|
|
80
80
|
/**
|
|
81
|
-
* Options forwarded to the internal `
|
|
82
|
-
* (e.g. `{
|
|
81
|
+
* Options forwarded to the internal `server.middleware.auth({ optional: true })` resolver
|
|
82
|
+
* (e.g. `{ serviceTokenJwksUrl }` to verify service tokens against a
|
|
83
|
+
* non-default JWKS). `optional` is forced true.
|
|
83
84
|
*/
|
|
84
|
-
auth?:
|
|
85
|
+
auth?: AuthMiddlewareOptions;
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/**
|
|
@@ -207,7 +208,7 @@ function hashAnonymousIp(ip: string): string {
|
|
|
207
208
|
*
|
|
208
209
|
* Only identities that came from a server-validated session or a verified
|
|
209
210
|
* service token/delegation may pick a bucket. `req.sessionId` is the marker
|
|
210
|
-
* for the former: `
|
|
211
|
+
* for the former: `server.middleware.auth()` sets it only after `session.validate()` came
|
|
211
212
|
* back valid, so requiring it here means an identity written by some OTHER
|
|
212
213
|
* middleware — which this package cannot vouch for — shares the anonymous
|
|
213
214
|
* per-IP bucket rather than getting the authenticated quota.
|
|
@@ -248,7 +249,7 @@ function resolveKey(req: OxyAuthedRequest): string {
|
|
|
248
249
|
* Build the composed Oxy rate-limit middleware. See module docs for rationale.
|
|
249
250
|
*/
|
|
250
251
|
export function createOxyRateLimit(
|
|
251
|
-
oxy:
|
|
252
|
+
oxy: OxyAuthHost,
|
|
252
253
|
options: OxyRateLimitOptions = {},
|
|
253
254
|
): RequestHandler {
|
|
254
255
|
const {
|
|
@@ -264,7 +265,7 @@ export function createOxyRateLimit(
|
|
|
264
265
|
// Idempotent optional-auth resolver. Reuses the SAME session resolution as
|
|
265
266
|
// every protected route, so the limiter keys by the real user identity.
|
|
266
267
|
//
|
|
267
|
-
// `createOptionalOxyAuth` — NOT the raw `
|
|
268
|
+
// `createOptionalOxyAuth` — NOT the raw `server.middleware.auth({ optional: true })` —
|
|
268
269
|
// because only the former skips resolution when a preceding middleware has
|
|
269
270
|
// already resolved a user. The raw middleware writes `req.userId = null` on
|
|
270
271
|
// every request it cannot authenticate, and because it mutates the shared
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Present-requester assertions (ADR 0025).
|
|
3
3
|
*
|
|
4
4
|
* A first-party product backend holding a signed-in person's live Oxy session
|
|
5
|
-
* trades it with Oxy (`
|
|
5
|
+
* trades it with Oxy (`server.agency.mintRequesterAssertion`) for a one-use,
|
|
6
6
|
* short-lived `OXY-REQUESTER+JWT`, and sends that — never the person's bearer —
|
|
7
7
|
* to the audience service (Alia) beside its own service token. The audience
|
|
8
8
|
* mounts {@link createOxyRequesterAssertionAuth} after `createOxyAuthMiddleware`
|
|
@@ -291,12 +291,15 @@ export interface OxyRequesterAssertionIntrospection {
|
|
|
291
291
|
readonly expiresAt?: string;
|
|
292
292
|
}
|
|
293
293
|
|
|
294
|
+
/** What the audience middleware needs of its `OxyServer`. */
|
|
294
295
|
export interface OxyRequesterAssertionIntrospector {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
296
|
+
readonly baseURL: string;
|
|
297
|
+
readonly agency: {
|
|
298
|
+
introspectRequesterAssertion(input: {
|
|
299
|
+
assertion: string;
|
|
300
|
+
presenter: { applicationId: string; credentialId: string };
|
|
301
|
+
}): Promise<OxyRequesterAssertionIntrospection>;
|
|
302
|
+
};
|
|
300
303
|
}
|
|
301
304
|
|
|
302
305
|
/** What the audience learns about the present requester. */
|
|
@@ -358,8 +361,8 @@ function singleHeader(req: Request, name: string): string | null | 'invalid' {
|
|
|
358
361
|
* token. Mount it after `createOxyAuthMiddleware`. Without the header it does
|
|
359
362
|
* nothing, so it composes with every other lane.
|
|
360
363
|
*
|
|
361
|
-
* `introspector`
|
|
362
|
-
* credential
|
|
364
|
+
* `introspector` is this service's `OxyServer`, holding THIS service's own
|
|
365
|
+
* credential: Oxy only lets the audience's application
|
|
363
366
|
* consume an assertion.
|
|
364
367
|
*/
|
|
365
368
|
export function createOxyRequesterAssertionAuth(
|
|
@@ -371,7 +374,7 @@ export function createOxyRequesterAssertionAuth(
|
|
|
371
374
|
const resolver = (): ((keyId: string) => Promise<KeyObject | undefined>) => {
|
|
372
375
|
resolvePublicKey ??= createOxyJwksKeyResolver({
|
|
373
376
|
jwksUrl: options.jwksUrl
|
|
374
|
-
?? new URL('/capabilities/.well-known/jwks.json', introspector.
|
|
377
|
+
?? new URL('/capabilities/.well-known/jwks.json', introspector.baseURL).toString(),
|
|
375
378
|
});
|
|
376
379
|
return resolvePublicKey;
|
|
377
380
|
};
|
|
@@ -429,7 +432,7 @@ export function createOxyRequesterAssertionAuth(
|
|
|
429
432
|
|
|
430
433
|
let introspection: OxyRequesterAssertionIntrospection;
|
|
431
434
|
try {
|
|
432
|
-
introspection = await introspector.introspectRequesterAssertion({
|
|
435
|
+
introspection = await introspector.agency.introspectRequesterAssertion({
|
|
433
436
|
assertion,
|
|
434
437
|
presenter: { applicationId: serviceApp.appId, credentialId: serviceApp.credentialId },
|
|
435
438
|
});
|
|
@@ -372,11 +372,10 @@ export interface OxyPagesHeadersOptions {
|
|
|
372
372
|
* violation for a script we never asked for. The rest of the value is Pages'
|
|
373
373
|
* own default, so caching is unchanged.
|
|
374
374
|
*
|
|
375
|
-
* And, because this origin is where
|
|
376
|
-
*
|
|
377
|
-
*
|
|
378
|
-
*
|
|
379
|
-
* with every other powerful feature off (`Permissions-Policy`), and its
|
|
375
|
+
* And, because this origin is where people sign in and approve third-party
|
|
376
|
+
* access (ADR 0028, ADR 0029, ADR 0030) — the rest of the holder policy: no
|
|
377
|
+
* `<base>` and no form posts (`base-uri` / `form-action 'none'`), no Referer
|
|
378
|
+
* to anyone, every powerful feature off (`Permissions-Policy`), and its
|
|
380
379
|
* responses readable by no other origin (`Cross-Origin-Resource-Policy`).
|
|
381
380
|
* Never `Cross-Origin-Opener-Policy`: the third-party OAuth popup reports
|
|
382
381
|
* its code to the app that opened it, and COOP severs `window.opener`.
|
|
@@ -411,10 +410,10 @@ export interface OxyPagesHeadersOptions {
|
|
|
411
410
|
* react-native-web's runtime stylesheet, and a style hash would silently switch
|
|
412
411
|
* that off and render every Oxy web app unstyled.)
|
|
413
412
|
*/
|
|
414
|
-
/**
|
|
413
|
+
/** Every powerful feature off, WebAuthn included: Oxy has no passkeys (ADR 0030). */
|
|
415
414
|
const SENSITIVE_PERMISSIONS_POLICY = [
|
|
416
|
-
'publickey-credentials-get=(
|
|
417
|
-
'publickey-credentials-create=(
|
|
415
|
+
'publickey-credentials-get=()',
|
|
416
|
+
'publickey-credentials-create=()',
|
|
418
417
|
'camera=()',
|
|
419
418
|
'microphone=()',
|
|
420
419
|
'geolocation=()',
|
package/src/server/traffic.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { observeNodeHttp, withoutNodeHttpObservation } from './trafficNodeHttp';
|
|
|
2
2
|
import { observeTrafficSocket, observeTrafficWebSocket, type TrafficWebSocket, type TrafficSocket } from '@oxy.so/telemetry/socket';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import type { RequestHandler } from 'express';
|
|
5
|
-
import {
|
|
6
|
-
// Static,
|
|
5
|
+
import { OxyServer } from './OxyServer';
|
|
6
|
+
// Static, like `OxyServer`'s own import: this module is
|
|
7
7
|
// reachable from the root barrel, which ships to React Native, so pulling
|
|
8
8
|
// `node:crypto` in eagerly there would cost every mobile bundle. This file is
|
|
9
9
|
// server-only and the server barrel already exports `./workloadIdentity`, so
|
|
@@ -65,11 +65,11 @@ export function createEcosystemTraffic(options: EcosystemTrafficOptions): {
|
|
|
65
65
|
'Ecosystem activity needs one of: an OXY_ACTIVITY_API_KEY and OXY_ACTIVITY_API_SECRET pair, an OXY_SERVICE_API_KEY and OXY_SERVICE_API_SECRET pair, or a workload identity this process can attest (ADR 0026).',
|
|
66
66
|
);
|
|
67
67
|
}
|
|
68
|
-
const oxy = new
|
|
69
|
-
// Left unconfigured when there is no pair on purpose: `
|
|
68
|
+
const oxy = new OxyServer({ baseURL });
|
|
69
|
+
// Left unconfigured when there is no pair on purpose: `serviceToken()`
|
|
70
70
|
// attests instead of being handed half a credential to fail on.
|
|
71
71
|
if (apiKey && apiSecret) oxy.configureServiceAuth(apiKey, apiSecret);
|
|
72
|
-
const credential = options.credential ?? (() => oxy.
|
|
72
|
+
const credential = options.credential ?? (() => oxy.serviceToken());
|
|
73
73
|
const fetcher = globalThis.fetch.bind(globalThis);
|
|
74
74
|
const instanceId = randomUUID();
|
|
75
75
|
const location = options.location ?? infrastructureLocation(region);
|
|
@@ -141,6 +141,6 @@ export function createEcosystemTraffic(options: EcosystemTrafficOptions): {
|
|
|
141
141
|
cleanups.add(cleanup);
|
|
142
142
|
return cleanup;
|
|
143
143
|
},
|
|
144
|
-
async stop() { if (stopped) return; stopped = true;
|
|
144
|
+
async stop() { if (stopped) return; stopped = true; for (const cleanup of cleanups) cleanup(); cleanups.clear(); clearInterval(timer); clearInterval(heartbeatTimer); await flush(); await heartbeat(true); },
|
|
145
145
|
};
|
|
146
146
|
}
|
|
@@ -55,8 +55,8 @@ export function observeNodeHttp(
|
|
|
55
55
|
const patches = [http, https].map(module => {
|
|
56
56
|
const request = module.request;
|
|
57
57
|
const get = module.get;
|
|
58
|
-
const wrappedRequest =
|
|
59
|
-
const wrappedGet =
|
|
58
|
+
const wrappedRequest = ((...args: Parameters<typeof request>) => safelyObserve(request.apply(module, args))) as typeof request;
|
|
59
|
+
const wrappedGet = ((...args: Parameters<typeof get>) => safelyObserve(get.apply(module, args))) as typeof get;
|
|
60
60
|
module.request = wrappedRequest;
|
|
61
61
|
module.get = wrappedGet;
|
|
62
62
|
return () => {
|
|
@@ -65,5 +65,9 @@ export function observeNodeHttp(
|
|
|
65
65
|
};
|
|
66
66
|
});
|
|
67
67
|
syncBuiltinESMExports();
|
|
68
|
-
return () => {
|
|
68
|
+
return () => {
|
|
69
|
+
for (const restore of patches) restore();
|
|
70
|
+
for (const restore of restoreRequests) restore();
|
|
71
|
+
syncBuiltinESMExports();
|
|
72
|
+
};
|
|
69
73
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* Every Oxy backend caches Oxy identity, and none of them find out when it
|
|
7
7
|
* changes. The `OxyServices` GET response cache holds `GET /users/:id` and
|
|
8
8
|
* `GET /profiles/username/:name` for five minutes; it is swept when THIS process
|
|
9
|
-
* writes the profile (the `evictOxyIdentityCache` calls in the
|
|
10
|
-
*
|
|
9
|
+
* writes the profile (the `evictOxyIdentityCache` calls in the `users` and
|
|
10
|
+
* `accounts` namespaces) and never when somebody else does — which is the normal case, since
|
|
11
11
|
* profiles are edited in Oxy's own apps. So an avatar or display-name change is
|
|
12
12
|
* invisible to every consuming backend for up to five minutes, per process.
|
|
13
13
|
*
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
* // node-redis
|
|
35
35
|
* await subscriber.subscribe(
|
|
36
36
|
* OXY_USER_INVALIDATION_CHANNEL,
|
|
37
|
-
* createOxyUserInvalidationHandler({ oxy:
|
|
37
|
+
* createOxyUserInvalidationHandler({ oxy: server }),
|
|
38
38
|
* );
|
|
39
39
|
*
|
|
40
40
|
* // ioredis
|
|
41
|
-
* const handle = createOxyUserInvalidationHandler({ oxy:
|
|
41
|
+
* const handle = createOxyUserInvalidationHandler({ oxy: server });
|
|
42
42
|
* await subscriber.subscribe(OXY_USER_INVALIDATION_CHANNEL);
|
|
43
43
|
* subscriber.on('message', (_channel, raw) => handle(raw));
|
|
44
44
|
*
|
|
@@ -130,11 +130,11 @@ function isPromiseLike(value: unknown): value is PromiseLike<unknown> {
|
|
|
130
130
|
/** Options for {@link createOxyUserInvalidationHandler}. */
|
|
131
131
|
export interface OxyUserInvalidationHandlerOptions {
|
|
132
132
|
/**
|
|
133
|
-
* The backend's `OxyServices`
|
|
134
|
-
* is swept for the invalidated user — this is the whole reason
|
|
135
|
-
* has no cache of its own still benefits from subscribing.
|
|
133
|
+
* The backend's `OxyServer` (or any `OxyServices`). When supplied, its GET
|
|
134
|
+
* response cache is swept for the invalidated user — this is the whole reason
|
|
135
|
+
* a backend that has no cache of its own still benefits from subscribing.
|
|
136
136
|
*/
|
|
137
|
-
oxy?: OxyIdentityCacheEvictor;
|
|
137
|
+
oxy?: { readonly http: OxyIdentityCacheEvictor };
|
|
138
138
|
/**
|
|
139
139
|
* App-specific eviction (e.g. a Redis identity cache the app maintains itself).
|
|
140
140
|
* May be async; a rejection is routed to `onError` and never escapes.
|
|
@@ -179,7 +179,7 @@ export function createOxyUserInvalidationHandler(
|
|
|
179
179
|
|
|
180
180
|
if (oxy) {
|
|
181
181
|
try {
|
|
182
|
-
evictOxyIdentityCache(oxy, event.userId);
|
|
182
|
+
evictOxyIdentityCache(oxy.http, event.userId);
|
|
183
183
|
} catch (error) {
|
|
184
184
|
// A cache sweep must never cost us the app-specific eviction below.
|
|
185
185
|
onError?.(error, raw);
|
|
@@ -19,7 +19,7 @@ import type {
|
|
|
19
19
|
AccountKind,
|
|
20
20
|
AccountMember,
|
|
21
21
|
AccountRelationship,
|
|
22
|
-
} from "../
|
|
22
|
+
} from "../api/accounts";
|
|
23
23
|
|
|
24
24
|
export interface AccountDelegationAccess {
|
|
25
25
|
/** The caller owns the account or has a live membership in it. */
|