@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
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Privacy Methods Mixin (Blocked & Restricted Users)
|
|
3
|
-
*/
|
|
4
|
-
import type { BlockedUser, RestrictedUser } from '../models/interfaces';
|
|
5
|
-
import type { OxyServicesBase } from '../OxyServices.base';
|
|
6
|
-
import { logger } from '../logger';
|
|
7
|
-
|
|
8
|
-
export function OxyServicesPrivacyMixin<T extends typeof OxyServicesBase>(Base: T) {
|
|
9
|
-
return class extends Base {
|
|
10
|
-
constructor(...args: any[]) {
|
|
11
|
-
super(...(args as [any]));
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Extract user ID from blocked/restricted user object
|
|
15
|
-
*/
|
|
16
|
-
public extractUserId(userIdField: string | { _id: string; username?: string; avatar?: string }): string {
|
|
17
|
-
return typeof userIdField === 'string' ? userIdField : userIdField._id;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Check if a user is in a list (blocked or restricted)
|
|
22
|
-
*/
|
|
23
|
-
public async isUserInList<T extends BlockedUser | RestrictedUser>(
|
|
24
|
-
userId: string,
|
|
25
|
-
getUserList: () => Promise<T[]>,
|
|
26
|
-
getIdField: (item: T) => string | { _id: string; username?: string; avatar?: string }
|
|
27
|
-
): Promise<boolean> {
|
|
28
|
-
try {
|
|
29
|
-
if (!userId) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const users = await getUserList();
|
|
33
|
-
return users.some(item => {
|
|
34
|
-
const itemId = this.extractUserId(getIdField(item));
|
|
35
|
-
return itemId === userId;
|
|
36
|
-
});
|
|
37
|
-
} catch (error) {
|
|
38
|
-
// If there's an error, assume not in list to avoid breaking functionality
|
|
39
|
-
logger.warn('Error checking user list', { component: 'OxyServices.privacy' }, error);
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// BLOCKED USERS METHODS
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Get list of blocked users
|
|
50
|
-
* @returns Array of blocked users
|
|
51
|
-
*/
|
|
52
|
-
async getBlockedUsers(): Promise<BlockedUser[]> {
|
|
53
|
-
try {
|
|
54
|
-
return await this.makeRequest<BlockedUser[]>('GET', '/privacy/blocked', undefined, {
|
|
55
|
-
cache: true,
|
|
56
|
-
cacheTTL: 1 * 60 * 1000, // 1 minute cache
|
|
57
|
-
});
|
|
58
|
-
} catch (error) {
|
|
59
|
-
throw this.handleError(error);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Block a user.
|
|
65
|
-
*
|
|
66
|
-
* Invalidates the cached `GET /privacy/blocked` response after the write.
|
|
67
|
-
* `getBlockedUsers` caches for ~1 minute (identity-scoped); without busting
|
|
68
|
-
* that entry, a consumer that re-reads the blocked list within the TTL
|
|
69
|
-
* window would not see the user it just blocked. `clearCacheEntry` deletes
|
|
70
|
-
* every identity-scoped variant of the key.
|
|
71
|
-
* @param userId - The user ID to block
|
|
72
|
-
* @returns Success message
|
|
73
|
-
*/
|
|
74
|
-
async blockUser(userId: string): Promise<{ message: string }> {
|
|
75
|
-
try {
|
|
76
|
-
if (!userId) {
|
|
77
|
-
throw new Error('User ID is required');
|
|
78
|
-
}
|
|
79
|
-
const result = await this.makeRequest<{ message: string }>('POST', `/privacy/blocked/${userId}`, undefined, {
|
|
80
|
-
cache: false,
|
|
81
|
-
});
|
|
82
|
-
this.clearCacheEntry('GET:/privacy/blocked');
|
|
83
|
-
// The block changed the viewer's graph (`blockedIds`) — bust the cached
|
|
84
|
-
// consolidated `GET /users/me/graph` so the next read reflects it.
|
|
85
|
-
this.clearCacheEntry('GET:/users/me/graph');
|
|
86
|
-
return result;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
throw this.handleError(error);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Unblock a user.
|
|
94
|
-
*
|
|
95
|
-
* Busts the cached `GET /privacy/blocked` response so a remount reads the
|
|
96
|
-
* fresh list without the just-unblocked user (see `blockUser`).
|
|
97
|
-
* @param userId - The user ID to unblock
|
|
98
|
-
* @returns Success message
|
|
99
|
-
*/
|
|
100
|
-
async unblockUser(userId: string): Promise<{ message: string }> {
|
|
101
|
-
try {
|
|
102
|
-
if (!userId) {
|
|
103
|
-
throw new Error('User ID is required');
|
|
104
|
-
}
|
|
105
|
-
const result = await this.makeRequest<{ message: string }>('DELETE', `/privacy/blocked/${userId}`, undefined, {
|
|
106
|
-
cache: false,
|
|
107
|
-
});
|
|
108
|
-
this.clearCacheEntry('GET:/privacy/blocked');
|
|
109
|
-
// Symmetric to blockUser: the unblock changed the viewer's `blockedIds`,
|
|
110
|
-
// so bust the consolidated `GET /users/me/graph` cache.
|
|
111
|
-
this.clearCacheEntry('GET:/users/me/graph');
|
|
112
|
-
return result;
|
|
113
|
-
} catch (error) {
|
|
114
|
-
throw this.handleError(error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Check if a user is blocked
|
|
120
|
-
* @param userId - The user ID to check
|
|
121
|
-
* @returns True if the user is blocked, false otherwise
|
|
122
|
-
*/
|
|
123
|
-
async isUserBlocked(userId: string): Promise<boolean> {
|
|
124
|
-
return this.isUserInList(
|
|
125
|
-
userId,
|
|
126
|
-
() => this.getBlockedUsers(),
|
|
127
|
-
(block) => block.blockedId
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ============================================================================
|
|
132
|
-
// RESTRICTED USERS METHODS
|
|
133
|
-
// ============================================================================
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Get list of restricted users
|
|
137
|
-
* @returns Array of restricted users
|
|
138
|
-
*/
|
|
139
|
-
async getRestrictedUsers(): Promise<RestrictedUser[]> {
|
|
140
|
-
try {
|
|
141
|
-
return await this.makeRequest<RestrictedUser[]>('GET', '/privacy/restricted', undefined, {
|
|
142
|
-
cache: true,
|
|
143
|
-
cacheTTL: 1 * 60 * 1000, // 1 minute cache
|
|
144
|
-
});
|
|
145
|
-
} catch (error) {
|
|
146
|
-
throw this.handleError(error);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Restrict a user (limit their interactions without fully blocking).
|
|
152
|
-
*
|
|
153
|
-
* Invalidates the cached `GET /privacy/restricted` response after the write.
|
|
154
|
-
* `getRestrictedUsers` caches for ~1 minute (identity-scoped); without
|
|
155
|
-
* busting that entry, a consumer that re-reads the restricted list within
|
|
156
|
-
* the TTL window would not see the user it just restricted.
|
|
157
|
-
* `clearCacheEntry` deletes every identity-scoped variant of the key.
|
|
158
|
-
* @param userId - The user ID to restrict
|
|
159
|
-
* @returns Success message
|
|
160
|
-
*/
|
|
161
|
-
async restrictUser(userId: string): Promise<{ message: string }> {
|
|
162
|
-
try {
|
|
163
|
-
if (!userId) {
|
|
164
|
-
throw new Error('User ID is required');
|
|
165
|
-
}
|
|
166
|
-
const result = await this.makeRequest<{ message: string }>('POST', `/privacy/restricted/${userId}`, undefined, {
|
|
167
|
-
cache: false,
|
|
168
|
-
});
|
|
169
|
-
this.clearCacheEntry('GET:/privacy/restricted');
|
|
170
|
-
// The restriction changed the viewer's graph (`restrictedIds`) — bust the
|
|
171
|
-
// cached consolidated `GET /users/me/graph` so the next read reflects it.
|
|
172
|
-
this.clearCacheEntry('GET:/users/me/graph');
|
|
173
|
-
return result;
|
|
174
|
-
} catch (error) {
|
|
175
|
-
throw this.handleError(error);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Unrestrict a user.
|
|
181
|
-
*
|
|
182
|
-
* Busts the cached `GET /privacy/restricted` response so a remount reads the
|
|
183
|
-
* fresh list without the just-unrestricted user (see `restrictUser`).
|
|
184
|
-
* @param userId - The user ID to unrestrict
|
|
185
|
-
* @returns Success message
|
|
186
|
-
*/
|
|
187
|
-
async unrestrictUser(userId: string): Promise<{ message: string }> {
|
|
188
|
-
try {
|
|
189
|
-
if (!userId) {
|
|
190
|
-
throw new Error('User ID is required');
|
|
191
|
-
}
|
|
192
|
-
const result = await this.makeRequest<{ message: string }>('DELETE', `/privacy/restricted/${userId}`, undefined, {
|
|
193
|
-
cache: false,
|
|
194
|
-
});
|
|
195
|
-
this.clearCacheEntry('GET:/privacy/restricted');
|
|
196
|
-
// Symmetric to restrictUser: the unrestrict changed the viewer's
|
|
197
|
-
// `restrictedIds`, so bust the consolidated `GET /users/me/graph` cache.
|
|
198
|
-
this.clearCacheEntry('GET:/users/me/graph');
|
|
199
|
-
return result;
|
|
200
|
-
} catch (error) {
|
|
201
|
-
throw this.handleError(error);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Check if a user is restricted
|
|
207
|
-
* @param userId - The user ID to check
|
|
208
|
-
* @returns True if the user is restricted, false otherwise
|
|
209
|
-
*/
|
|
210
|
-
async isUserRestricted(userId: string): Promise<boolean> {
|
|
211
|
-
return this.isUserInList(
|
|
212
|
-
userId,
|
|
213
|
-
() => this.getRestrictedUsers(),
|
|
214
|
-
(restrict) => restrict.restrictedId
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
|
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reputation Methods Mixin (Oxy Trust)
|
|
3
|
-
*
|
|
4
|
-
* Provides typed access to the reputation ledger (#217) and the derived
|
|
5
|
-
* trust-tier / capped-influence model (#219) via the `/reputation` API.
|
|
6
|
-
*
|
|
7
|
-
* The reputation ledger is append-only: transactions are NEVER deleted.
|
|
8
|
-
* A correction is expressed either as a compensating REVERSAL (the original is
|
|
9
|
-
* marked `reversed` and a new `active` transaction with negated points is
|
|
10
|
-
* appended) or a VOID (the original is marked `voided` and excluded from the
|
|
11
|
-
* balance). A user's `ReputationBalance` is a recomputable cache of the sum of
|
|
12
|
-
* their `active` transactions, augmented with a trust tier, capped influence
|
|
13
|
-
* weights, and reliability signals.
|
|
14
|
-
*
|
|
15
|
-
* A balance is served in TWO views (see `ReputationBalanceView`): the subject
|
|
16
|
-
* and platform staff get the whole thing, a third party gets the public trust
|
|
17
|
-
* signal only. The two are distinct types so a caller cannot read a field the
|
|
18
|
-
* server did not send them.
|
|
19
|
-
*
|
|
20
|
-
* EVERY type on this surface is owned by `@oxy.so/contracts`, which the API's
|
|
21
|
-
* serializers are annotated and validated against. This mixin declares none of
|
|
22
|
-
* them and re-exports none of them: consumers import the types straight from
|
|
23
|
-
* `@oxy.so/contracts`, so the wire shape has exactly one definition and a
|
|
24
|
-
* server-side change to a serializer cannot compile while the type still
|
|
25
|
-
* promises the old shape.
|
|
26
|
-
*
|
|
27
|
-
* Reference users by their Mongo `_id` (or publicKey, which the API resolves),
|
|
28
|
-
* transactions by their `id`, and disputes by their `id`.
|
|
29
|
-
*/
|
|
30
|
-
import type {
|
|
31
|
-
AwardReputationInput,
|
|
32
|
-
CreateReputationDisputeInput,
|
|
33
|
-
ReputationBalance,
|
|
34
|
-
ReputationBalanceView,
|
|
35
|
-
ReputationDispute,
|
|
36
|
-
ReputationInfluenceContext,
|
|
37
|
-
ReputationInfluenceResult,
|
|
38
|
-
ReputationLeaderboardEntry,
|
|
39
|
-
ReputationRule,
|
|
40
|
-
ReputationTransaction,
|
|
41
|
-
ResolveReputationDisputeInput,
|
|
42
|
-
ReverseReputationTransactionInput,
|
|
43
|
-
ReverseReputationTransactionResult,
|
|
44
|
-
UpsertReputationRuleInput,
|
|
45
|
-
} from '@oxy.so/contracts';
|
|
46
|
-
import { isFullReputationBalance } from '@oxy.so/contracts';
|
|
47
|
-
import type { OxyServicesBase } from '../OxyServices.base';
|
|
48
|
-
import { OxyAuthenticationError } from '../OxyServices.errors';
|
|
49
|
-
import { CACHE_TIMES } from './mixinHelpers';
|
|
50
|
-
|
|
51
|
-
/** Cache-key prefix for every cached `GET /reputation/...` response. */
|
|
52
|
-
const REPUTATION_CACHE_PREFIX = 'GET:/reputation/';
|
|
53
|
-
|
|
54
|
-
export function OxyServicesReputationMixin<T extends typeof OxyServicesBase>(Base: T) {
|
|
55
|
-
return class extends Base {
|
|
56
|
-
constructor(...args: any[]) {
|
|
57
|
-
super(...(args as [any]));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Get ANY user's reputation balance, in whichever view the server serves the
|
|
62
|
-
* caller.
|
|
63
|
-
*
|
|
64
|
-
* A third party gets `userId`, `total` and `trustTier` and nothing else, so
|
|
65
|
-
* the return type is a {@link ReputationBalanceView} union: narrow it with
|
|
66
|
-
* {@link isFullReputationBalance} before touching `breakdown`, `influence`
|
|
67
|
-
* or `reliability`. To read your OWN balance, call
|
|
68
|
-
* {@link getMyReputationBalance} instead — it returns the full shape with no
|
|
69
|
-
* narrowing.
|
|
70
|
-
*
|
|
71
|
-
* @param userId - The subject user's `_id` or publicKey.
|
|
72
|
-
*/
|
|
73
|
-
async getReputationBalance(userId: string): Promise<ReputationBalanceView> {
|
|
74
|
-
try {
|
|
75
|
-
return await this.makeRequest<ReputationBalanceView>(
|
|
76
|
-
'GET',
|
|
77
|
-
`/reputation/${encodeURIComponent(userId)}/balance`,
|
|
78
|
-
undefined,
|
|
79
|
-
{ cache: true, cacheTTL: CACHE_TIMES.MEDIUM },
|
|
80
|
-
);
|
|
81
|
-
} catch (error) {
|
|
82
|
-
throw this.handleError(error);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Get the SIGNED-IN user's own reputation balance, in full.
|
|
88
|
-
*
|
|
89
|
-
* The subject view is the only one carrying `breakdown`, `influence` and
|
|
90
|
-
* `reliability`, and the subject is the common caller, so this is the
|
|
91
|
-
* ergonomic path: no id to pass, no narrowing to do.
|
|
92
|
-
*
|
|
93
|
-
* Throws rather than returning a half-populated object when the request was
|
|
94
|
-
* not authenticated as the subject — with no signed-in user, and when the
|
|
95
|
-
* server answered `200` with the public view anyway (which it does for an
|
|
96
|
-
* absent or lapsed token, since the endpoint's auth is optional). Both mean
|
|
97
|
-
* the private blocks are simply absent, and a thrown error is the only
|
|
98
|
-
* honest report of that.
|
|
99
|
-
*/
|
|
100
|
-
async getMyReputationBalance(): Promise<ReputationBalance> {
|
|
101
|
-
const userId = this.getCurrentUserId();
|
|
102
|
-
if (!userId) {
|
|
103
|
-
throw new OxyAuthenticationError(
|
|
104
|
-
'Reading your own reputation balance requires a signed-in user',
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
let balance: ReputationBalanceView;
|
|
109
|
-
try {
|
|
110
|
-
balance = await this.makeRequest<ReputationBalanceView>(
|
|
111
|
-
'GET',
|
|
112
|
-
`/reputation/${encodeURIComponent(userId)}/balance`,
|
|
113
|
-
undefined,
|
|
114
|
-
{ cache: true, cacheTTL: CACHE_TIMES.MEDIUM },
|
|
115
|
-
);
|
|
116
|
-
} catch (error) {
|
|
117
|
-
throw this.handleError(error);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (!isFullReputationBalance(balance)) {
|
|
121
|
-
throw new OxyAuthenticationError(
|
|
122
|
-
'The reputation balance came back as the public view — the request was not authenticated as its subject',
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
return balance;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Get the reputation leaderboard, ordered by lifetime total descending.
|
|
130
|
-
* @param limit - Page size (server-capped).
|
|
131
|
-
* @param offset - Page offset.
|
|
132
|
-
*/
|
|
133
|
-
async getReputationLeaderboard(
|
|
134
|
-
limit?: number,
|
|
135
|
-
offset?: number,
|
|
136
|
-
): Promise<ReputationLeaderboardEntry[]> {
|
|
137
|
-
try {
|
|
138
|
-
const params: { limit?: number; offset?: number } = {};
|
|
139
|
-
if (limit !== undefined) params.limit = limit;
|
|
140
|
-
if (offset !== undefined) params.offset = offset;
|
|
141
|
-
const res = await this.makeRequest<{ data?: ReputationLeaderboardEntry[] }>(
|
|
142
|
-
'GET',
|
|
143
|
-
'/reputation/leaderboard',
|
|
144
|
-
Object.keys(params).length > 0 ? params : undefined,
|
|
145
|
-
{ cache: true, cacheTTL: CACHE_TIMES.LONG },
|
|
146
|
-
);
|
|
147
|
-
return res.data ?? [];
|
|
148
|
-
} catch (error) {
|
|
149
|
-
throw this.handleError(error);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* List the enabled reputation rules (for client display).
|
|
155
|
-
*/
|
|
156
|
-
async getReputationRules(): Promise<ReputationRule[]> {
|
|
157
|
-
try {
|
|
158
|
-
const res = await this.makeRequest<{ rules?: ReputationRule[] }>(
|
|
159
|
-
'GET',
|
|
160
|
-
'/reputation/rules',
|
|
161
|
-
undefined,
|
|
162
|
-
{ cache: true, cacheTTL: CACHE_TIMES.EXTRA_LONG },
|
|
163
|
-
);
|
|
164
|
-
return res.rules ?? [];
|
|
165
|
-
} catch (error) {
|
|
166
|
-
throw this.handleError(error);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Get a user's paginated reputation ledger, newest first (auth required).
|
|
172
|
-
* @param userId - The subject user's `_id` or publicKey.
|
|
173
|
-
* @param limit - Page size (server-capped).
|
|
174
|
-
* @param offset - Page offset.
|
|
175
|
-
*/
|
|
176
|
-
async getReputationTransactions(
|
|
177
|
-
userId: string,
|
|
178
|
-
limit?: number,
|
|
179
|
-
offset?: number,
|
|
180
|
-
): Promise<ReputationTransaction[]> {
|
|
181
|
-
try {
|
|
182
|
-
const params: { limit?: number; offset?: number } = {};
|
|
183
|
-
if (limit !== undefined) params.limit = limit;
|
|
184
|
-
if (offset !== undefined) params.offset = offset;
|
|
185
|
-
const res = await this.makeRequest<{ data?: ReputationTransaction[] }>(
|
|
186
|
-
'GET',
|
|
187
|
-
`/reputation/${encodeURIComponent(userId)}/transactions`,
|
|
188
|
-
Object.keys(params).length > 0 ? params : undefined,
|
|
189
|
-
{ cache: true, cacheTTL: CACHE_TIMES.SHORT },
|
|
190
|
-
);
|
|
191
|
-
return res.data ?? [];
|
|
192
|
-
} catch (error) {
|
|
193
|
-
throw this.handleError(error);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Get a user's capped influence weight for a given context (auth required).
|
|
199
|
-
* @param userId - The subject user's `_id` or publicKey.
|
|
200
|
-
* @param context - The weight axis to read (defaults server-side to `default`).
|
|
201
|
-
*/
|
|
202
|
-
async getReputationInfluence(
|
|
203
|
-
userId: string,
|
|
204
|
-
context?: ReputationInfluenceContext,
|
|
205
|
-
): Promise<ReputationInfluenceResult> {
|
|
206
|
-
try {
|
|
207
|
-
return await this.makeRequest<ReputationInfluenceResult>(
|
|
208
|
-
'GET',
|
|
209
|
-
`/reputation/${encodeURIComponent(userId)}/influence`,
|
|
210
|
-
context ? { context } : undefined,
|
|
211
|
-
{ cache: true, cacheTTL: CACHE_TIMES.MEDIUM },
|
|
212
|
-
);
|
|
213
|
-
} catch (error) {
|
|
214
|
-
throw this.handleError(error);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Award (or penalise) reputation to a user by `actionType`. Restricted to
|
|
220
|
-
* service tokens and platform staff. Invalidates cached reputation reads.
|
|
221
|
-
* @param input - The award payload (subject, action, source, target, etc.).
|
|
222
|
-
*/
|
|
223
|
-
async awardReputation(input: AwardReputationInput): Promise<ReputationTransaction> {
|
|
224
|
-
try {
|
|
225
|
-
const res = await this.makeRequest<{ transaction: ReputationTransaction }>(
|
|
226
|
-
'POST',
|
|
227
|
-
'/reputation/award',
|
|
228
|
-
input,
|
|
229
|
-
{ cache: false },
|
|
230
|
-
);
|
|
231
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
232
|
-
return res.transaction;
|
|
233
|
-
} catch (error) {
|
|
234
|
-
throw this.handleError(error);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Open a dispute against a transaction (auth required; the disputer is the
|
|
240
|
-
* authenticated user and must own the transaction).
|
|
241
|
-
* @param input - The transaction id, reason, and optional evidence.
|
|
242
|
-
*/
|
|
243
|
-
async createReputationDispute(
|
|
244
|
-
input: CreateReputationDisputeInput,
|
|
245
|
-
): Promise<ReputationDispute> {
|
|
246
|
-
try {
|
|
247
|
-
const res = await this.makeRequest<{ dispute: ReputationDispute }>(
|
|
248
|
-
'POST',
|
|
249
|
-
'/reputation/disputes',
|
|
250
|
-
input,
|
|
251
|
-
{ cache: false },
|
|
252
|
-
);
|
|
253
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
254
|
-
return res.dispute;
|
|
255
|
-
} catch (error) {
|
|
256
|
-
throw this.handleError(error);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* List a user's own reputation disputes (auth required; the caller must be
|
|
262
|
-
* the subject or platform staff).
|
|
263
|
-
* @param userId - The subject user's `_id` or publicKey.
|
|
264
|
-
* @param limit - Page size (server-capped).
|
|
265
|
-
* @param offset - Page offset.
|
|
266
|
-
*/
|
|
267
|
-
async getUserReputationDisputes(
|
|
268
|
-
userId: string,
|
|
269
|
-
limit?: number,
|
|
270
|
-
offset?: number,
|
|
271
|
-
): Promise<ReputationDispute[]> {
|
|
272
|
-
try {
|
|
273
|
-
const params: { limit?: number; offset?: number } = {};
|
|
274
|
-
if (limit !== undefined) params.limit = limit;
|
|
275
|
-
if (offset !== undefined) params.offset = offset;
|
|
276
|
-
const res = await this.makeRequest<{ data?: ReputationDispute[] }>(
|
|
277
|
-
'GET',
|
|
278
|
-
`/reputation/${encodeURIComponent(userId)}/disputes`,
|
|
279
|
-
Object.keys(params).length > 0 ? params : undefined,
|
|
280
|
-
{ cache: true, cacheTTL: CACHE_TIMES.SHORT },
|
|
281
|
-
);
|
|
282
|
-
return res.data ?? [];
|
|
283
|
-
} catch (error) {
|
|
284
|
-
throw this.handleError(error);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// =========================================================================
|
|
289
|
-
// STAFF / ADMIN METHODS (require staff privileges server-side)
|
|
290
|
-
// =========================================================================
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* Create or update a reputation rule, keyed by `actionType` (staff only).
|
|
294
|
-
* Invalidates the cached rule list.
|
|
295
|
-
* @param input - The rule definition.
|
|
296
|
-
*/
|
|
297
|
-
async upsertReputationRule(input: UpsertReputationRuleInput): Promise<ReputationRule> {
|
|
298
|
-
try {
|
|
299
|
-
const res = await this.makeRequest<{ rule: ReputationRule }>(
|
|
300
|
-
'POST',
|
|
301
|
-
'/reputation/rules',
|
|
302
|
-
input,
|
|
303
|
-
{ cache: false },
|
|
304
|
-
);
|
|
305
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
306
|
-
return res.rule;
|
|
307
|
-
} catch (error) {
|
|
308
|
-
throw this.handleError(error);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Reverse a transaction (staff only): mark the original `reversed` and append
|
|
314
|
-
* a compensating `active` reversal with negated points. Invalidates cached
|
|
315
|
-
* reputation reads.
|
|
316
|
-
* @param transactionId - The transaction's id.
|
|
317
|
-
* @param input - Optional reason for the reversal.
|
|
318
|
-
*/
|
|
319
|
-
async reverseReputationTransaction(
|
|
320
|
-
transactionId: string,
|
|
321
|
-
input?: ReverseReputationTransactionInput,
|
|
322
|
-
): Promise<ReverseReputationTransactionResult> {
|
|
323
|
-
try {
|
|
324
|
-
const res = await this.makeRequest<ReverseReputationTransactionResult>(
|
|
325
|
-
'POST',
|
|
326
|
-
`/reputation/transactions/${encodeURIComponent(transactionId)}/reverse`,
|
|
327
|
-
input ?? {},
|
|
328
|
-
{ cache: false },
|
|
329
|
-
);
|
|
330
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
331
|
-
return res;
|
|
332
|
-
} catch (error) {
|
|
333
|
-
throw this.handleError(error);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Void a transaction (staff only): mark it `voided` so it is excluded from
|
|
339
|
-
* the balance, with NO compensating entry. Invalidates cached reputation
|
|
340
|
-
* reads.
|
|
341
|
-
* @param transactionId - The transaction's id.
|
|
342
|
-
* @param input - Optional reason for the void.
|
|
343
|
-
*/
|
|
344
|
-
async voidReputationTransaction(
|
|
345
|
-
transactionId: string,
|
|
346
|
-
input?: ReverseReputationTransactionInput,
|
|
347
|
-
): Promise<ReputationTransaction> {
|
|
348
|
-
try {
|
|
349
|
-
const res = await this.makeRequest<{ transaction: ReputationTransaction }>(
|
|
350
|
-
'POST',
|
|
351
|
-
`/reputation/transactions/${encodeURIComponent(transactionId)}/void`,
|
|
352
|
-
input ?? {},
|
|
353
|
-
{ cache: false },
|
|
354
|
-
);
|
|
355
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
356
|
-
return res.transaction;
|
|
357
|
-
} catch (error) {
|
|
358
|
-
throw this.handleError(error);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Force a recompute of a user's balance snapshot from their active ledger
|
|
364
|
-
* (staff only). Invalidates cached reputation reads.
|
|
365
|
-
*
|
|
366
|
-
* Staff-gated, so the response is always the full subject view — no
|
|
367
|
-
* narrowing needed.
|
|
368
|
-
*
|
|
369
|
-
* @param userId - The subject user's `_id` or publicKey.
|
|
370
|
-
*/
|
|
371
|
-
async recalculateReputation(userId: string): Promise<ReputationBalance> {
|
|
372
|
-
try {
|
|
373
|
-
const res = await this.makeRequest<ReputationBalance>(
|
|
374
|
-
'POST',
|
|
375
|
-
`/reputation/${encodeURIComponent(userId)}/recalculate`,
|
|
376
|
-
undefined,
|
|
377
|
-
{ cache: false },
|
|
378
|
-
);
|
|
379
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
380
|
-
return res;
|
|
381
|
-
} catch (error) {
|
|
382
|
-
throw this.handleError(error);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
/**
|
|
387
|
-
* Get the open dispute queue across all users (staff only).
|
|
388
|
-
* @param limit - Page size (server-capped).
|
|
389
|
-
* @param offset - Page offset.
|
|
390
|
-
*/
|
|
391
|
-
async getReputationDisputeQueue(
|
|
392
|
-
limit?: number,
|
|
393
|
-
offset?: number,
|
|
394
|
-
): Promise<ReputationDispute[]> {
|
|
395
|
-
try {
|
|
396
|
-
const params: { limit?: number; offset?: number } = {};
|
|
397
|
-
if (limit !== undefined) params.limit = limit;
|
|
398
|
-
if (offset !== undefined) params.offset = offset;
|
|
399
|
-
const res = await this.makeRequest<{ data?: ReputationDispute[] }>(
|
|
400
|
-
'GET',
|
|
401
|
-
'/reputation/disputes',
|
|
402
|
-
Object.keys(params).length > 0 ? params : undefined,
|
|
403
|
-
{ cache: true, cacheTTL: CACHE_TIMES.SHORT },
|
|
404
|
-
);
|
|
405
|
-
return res.data ?? [];
|
|
406
|
-
} catch (error) {
|
|
407
|
-
throw this.handleError(error);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Resolve a dispute (staff only). Accepting reverses the disputed
|
|
413
|
-
* transaction; rejecting restores it to `active`. Invalidates cached
|
|
414
|
-
* reputation reads.
|
|
415
|
-
* @param disputeId - The dispute's id.
|
|
416
|
-
* @param input - The resolution (`accepted` or `rejected`).
|
|
417
|
-
*/
|
|
418
|
-
async resolveReputationDispute(
|
|
419
|
-
disputeId: string,
|
|
420
|
-
input: ResolveReputationDisputeInput,
|
|
421
|
-
): Promise<ReputationDispute> {
|
|
422
|
-
try {
|
|
423
|
-
const res = await this.makeRequest<{ dispute: ReputationDispute }>(
|
|
424
|
-
'POST',
|
|
425
|
-
`/reputation/disputes/${encodeURIComponent(disputeId)}/resolve`,
|
|
426
|
-
input,
|
|
427
|
-
{ cache: false },
|
|
428
|
-
);
|
|
429
|
-
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
430
|
-
return res.dispute;
|
|
431
|
-
} catch (error) {
|
|
432
|
-
throw this.handleError(error);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
};
|
|
436
|
-
}
|