@oxy.so/core 1.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/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +221 -0
- package/dist/cjs/.tsbuildinfo +1 -0
- package/dist/cjs/HttpService.js +1270 -0
- package/dist/cjs/OxyServices.base.js +390 -0
- package/dist/cjs/OxyServices.errors.js +95 -0
- package/dist/cjs/OxyServices.js +72 -0
- package/dist/cjs/boot/sessionColdBoot.js +395 -0
- package/dist/cjs/constants/version.js +16 -0
- package/dist/cjs/crypto/aead.js +79 -0
- package/dist/cjs/crypto/ecdh.js +35 -0
- package/dist/cjs/crypto/identityMarker.js +255 -0
- package/dist/cjs/crypto/kdf.js +39 -0
- package/dist/cjs/crypto/keyManager.js +2234 -0
- package/dist/cjs/crypto/polyfill.js +131 -0
- package/dist/cjs/crypto/recoveryPhrase.js +242 -0
- package/dist/cjs/crypto/signatureService.js +273 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
- package/dist/cjs/i18n/accountRoleLabels.js +27 -0
- package/dist/cjs/i18n/index.js +90 -0
- package/dist/cjs/i18n/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
- package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
- package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
- package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/locales/pt-PT.json +282 -0
- package/dist/cjs/i18n/locales/zh-CN.json +282 -0
- package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
- package/dist/cjs/i18n/trustTierLabels.js +19 -0
- package/dist/cjs/index.js +498 -0
- package/dist/cjs/inference/OxyInferenceClient.js +544 -0
- package/dist/cjs/logger/index.js +149 -0
- package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
- package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
- package/dist/cjs/mixins/OxyServices.appData.js +108 -0
- package/dist/cjs/mixins/OxyServices.assets.js +764 -0
- package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
- package/dist/cjs/mixins/OxyServices.chains.js +73 -0
- package/dist/cjs/mixins/OxyServices.civic.js +611 -0
- package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
- package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
- package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
- package/dist/cjs/mixins/OxyServices.devices.js +116 -0
- package/dist/cjs/mixins/OxyServices.features.js +335 -0
- package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
- package/dist/cjs/mixins/OxyServices.identity.js +461 -0
- package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
- package/dist/cjs/mixins/OxyServices.inference.js +59 -0
- package/dist/cjs/mixins/OxyServices.language.js +125 -0
- package/dist/cjs/mixins/OxyServices.links.js +72 -0
- package/dist/cjs/mixins/OxyServices.location.js +43 -0
- package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
- package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
- package/dist/cjs/mixins/OxyServices.payment.js +158 -0
- package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
- package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
- package/dist/cjs/mixins/OxyServices.security.js +89 -0
- package/dist/cjs/mixins/OxyServices.store.js +266 -0
- package/dist/cjs/mixins/OxyServices.topics.js +137 -0
- package/dist/cjs/mixins/OxyServices.user.js +902 -0
- package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
- package/dist/cjs/mixins/index.js +135 -0
- package/dist/cjs/mixins/mixinHelpers.js +53 -0
- package/dist/cjs/models/Topic.js +16 -0
- package/dist/cjs/models/interfaces.js +20 -0
- package/dist/cjs/models/session.js +2 -0
- package/dist/cjs/server/auth.js +167 -0
- package/dist/cjs/server/capabilityTicket.js +192 -0
- package/dist/cjs/server/cors.js +225 -0
- package/dist/cjs/server/index.js +97 -0
- package/dist/cjs/server/rateLimit.js +207 -0
- package/dist/cjs/server/safeFetch.js +458 -0
- package/dist/cjs/server/securityHeaders.js +377 -0
- package/dist/cjs/server/userInvalidation.js +156 -0
- package/dist/cjs/server/verifySecret.js +50 -0
- package/dist/cjs/session/SessionClient.js +865 -0
- package/dist/cjs/session/accountDelegationAccess.js +48 -0
- package/dist/cjs/session/accountDialogController.js +1131 -0
- package/dist/cjs/session/accountSwitchTargets.js +81 -0
- package/dist/cjs/session/authStateStore.js +404 -0
- package/dist/cjs/session/createSessionClient.js +32 -0
- package/dist/cjs/session/deviceDirectory.js +143 -0
- package/dist/cjs/session/deviceSwitcherRows.js +76 -0
- package/dist/cjs/session/identityPin.js +256 -0
- package/dist/cjs/session/identitySession.js +135 -0
- package/dist/cjs/session/projectSessionState.js +121 -0
- package/dist/cjs/session/refresh.js +398 -0
- package/dist/cjs/session/sessionClientHost.js +34 -0
- package/dist/cjs/session/sharedDeviceCredential.js +247 -0
- package/dist/cjs/session/socketLoader.js +55 -0
- package/dist/cjs/shared/utils/colorUtils.js +153 -0
- package/dist/cjs/shared/utils/errorUtils.js +183 -0
- package/dist/cjs/shared/utils/index.js +49 -0
- package/dist/cjs/shared/utils/networkUtils.js +183 -0
- package/dist/cjs/shared/utils/themeUtils.js +106 -0
- package/dist/cjs/utils/accountCacheSweep.js +80 -0
- package/dist/cjs/utils/accountUtils.js +140 -0
- package/dist/cjs/utils/activityId.js +6 -0
- package/dist/cjs/utils/apiUtils.js +91 -0
- package/dist/cjs/utils/asyncUtils.js +222 -0
- package/dist/cjs/utils/authHelpers.js +120 -0
- package/dist/cjs/utils/authWebUrl.js +19 -0
- package/dist/cjs/utils/avatarUtils.js +29 -0
- package/dist/cjs/utils/cache.js +235 -0
- package/dist/cjs/utils/cacheKey.js +85 -0
- package/dist/cjs/utils/coldBoot.js +122 -0
- package/dist/cjs/utils/commonsApproval.js +31 -0
- package/dist/cjs/utils/commonsDelivery.js +59 -0
- package/dist/cjs/utils/deviceManager.js +174 -0
- package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
- package/dist/cjs/utils/edgeRegion.js +6 -0
- package/dist/cjs/utils/errorUtils.js +243 -0
- package/dist/cjs/utils/identityCacheSweep.js +97 -0
- package/dist/cjs/utils/languageUtils.js +224 -0
- package/dist/cjs/utils/oauthPkce.js +311 -0
- package/dist/cjs/utils/officialOrigins.js +64 -0
- package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
- package/dist/cjs/utils/platform.js +119 -0
- package/dist/cjs/utils/profileLinks.js +63 -0
- package/dist/cjs/utils/redactUrl.js +29 -0
- package/dist/cjs/utils/registrableApex.js +45 -0
- package/dist/cjs/utils/requestUtils.js +209 -0
- package/dist/cjs/utils/sessionUtils.js +181 -0
- package/dist/cjs/utils/textNormalization.js +158 -0
- package/dist/cjs/utils/userHandle.js +37 -0
- package/dist/cjs/utils/userIdentity.js +50 -0
- package/dist/cjs/utils/validationUtils.js +370 -0
- package/dist/cjs/utils/webauthnOrigin.js +51 -0
- package/dist/esm/.tsbuildinfo +1 -0
- package/dist/esm/HttpService.js +1266 -0
- package/dist/esm/OxyServices.base.js +386 -0
- package/dist/esm/OxyServices.errors.js +88 -0
- package/dist/esm/OxyServices.js +66 -0
- package/dist/esm/boot/sessionColdBoot.js +392 -0
- package/dist/esm/constants/version.js +13 -0
- package/dist/esm/crypto/aead.js +74 -0
- package/dist/esm/crypto/ecdh.js +32 -0
- package/dist/esm/crypto/identityMarker.js +248 -0
- package/dist/esm/crypto/kdf.js +36 -0
- package/dist/esm/crypto/keyManager.js +2227 -0
- package/dist/esm/crypto/polyfill.js +129 -0
- package/dist/esm/crypto/recoveryPhrase.js +238 -0
- package/dist/esm/crypto/signatureService.js +269 -0
- package/dist/esm/i18n/accountCategoryLabels.js +37 -0
- package/dist/esm/i18n/accountRoleLabels.js +20 -0
- package/dist/esm/i18n/index.js +83 -0
- package/dist/esm/i18n/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
- package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
- package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
- package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
- package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
- package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
- package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
- package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
- package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
- package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/locales/pt-PT.json +282 -0
- package/dist/esm/i18n/locales/zh-CN.json +282 -0
- package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
- package/dist/esm/i18n/trustTierLabels.js +12 -0
- package/dist/esm/index.js +254 -0
- package/dist/esm/inference/OxyInferenceClient.js +538 -0
- package/dist/esm/logger/index.js +140 -0
- package/dist/esm/mixins/OxyServices.accounts.js +543 -0
- package/dist/esm/mixins/OxyServices.analytics.js +46 -0
- package/dist/esm/mixins/OxyServices.appData.js +103 -0
- package/dist/esm/mixins/OxyServices.assets.js +761 -0
- package/dist/esm/mixins/OxyServices.auth.js +1247 -0
- package/dist/esm/mixins/OxyServices.chains.js +70 -0
- package/dist/esm/mixins/OxyServices.civic.js +605 -0
- package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
- package/dist/esm/mixins/OxyServices.contacts.js +47 -0
- package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
- package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
- package/dist/esm/mixins/OxyServices.devices.js +113 -0
- package/dist/esm/mixins/OxyServices.features.js +332 -0
- package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
- package/dist/esm/mixins/OxyServices.identity.js +457 -0
- package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
- package/dist/esm/mixins/OxyServices.inference.js +56 -0
- package/dist/esm/mixins/OxyServices.language.js +122 -0
- package/dist/esm/mixins/OxyServices.links.js +69 -0
- package/dist/esm/mixins/OxyServices.location.js +40 -0
- package/dist/esm/mixins/OxyServices.nodes.js +172 -0
- package/dist/esm/mixins/OxyServices.notifications.js +60 -0
- package/dist/esm/mixins/OxyServices.payment.js +155 -0
- package/dist/esm/mixins/OxyServices.privacy.js +196 -0
- package/dist/esm/mixins/OxyServices.reputation.js +286 -0
- package/dist/esm/mixins/OxyServices.security.js +86 -0
- package/dist/esm/mixins/OxyServices.store.js +263 -0
- package/dist/esm/mixins/OxyServices.topics.js +134 -0
- package/dist/esm/mixins/OxyServices.user.js +899 -0
- package/dist/esm/mixins/OxyServices.utility.js +1095 -0
- package/dist/esm/mixins/index.js +132 -0
- package/dist/esm/mixins/mixinHelpers.js +48 -0
- package/dist/esm/models/Topic.js +13 -0
- package/dist/esm/models/interfaces.js +17 -0
- package/dist/esm/models/session.js +1 -0
- package/dist/esm/server/auth.js +154 -0
- package/dist/esm/server/capabilityTicket.js +183 -0
- package/dist/esm/server/cors.js +220 -0
- package/dist/esm/server/index.js +47 -0
- package/dist/esm/server/rateLimit.js +201 -0
- package/dist/esm/server/safeFetch.js +447 -0
- package/dist/esm/server/securityHeaders.js +364 -0
- package/dist/esm/server/userInvalidation.js +152 -0
- package/dist/esm/server/verifySecret.js +47 -0
- package/dist/esm/session/SessionClient.js +861 -0
- package/dist/esm/session/accountDelegationAccess.js +45 -0
- package/dist/esm/session/accountDialogController.js +1126 -0
- package/dist/esm/session/accountSwitchTargets.js +77 -0
- package/dist/esm/session/authStateStore.js +398 -0
- package/dist/esm/session/createSessionClient.js +29 -0
- package/dist/esm/session/deviceDirectory.js +135 -0
- package/dist/esm/session/deviceSwitcherRows.js +72 -0
- package/dist/esm/session/identityPin.js +249 -0
- package/dist/esm/session/identitySession.js +131 -0
- package/dist/esm/session/projectSessionState.js +114 -0
- package/dist/esm/session/refresh.js +390 -0
- package/dist/esm/session/sessionClientHost.js +31 -0
- package/dist/esm/session/sharedDeviceCredential.js +239 -0
- package/dist/esm/session/socketLoader.js +19 -0
- package/dist/esm/shared/utils/colorUtils.js +143 -0
- package/dist/esm/shared/utils/errorUtils.js +170 -0
- package/dist/esm/shared/utils/index.js +15 -0
- package/dist/esm/shared/utils/networkUtils.js +173 -0
- package/dist/esm/shared/utils/themeUtils.js +98 -0
- package/dist/esm/utils/accountCacheSweep.js +75 -0
- package/dist/esm/utils/accountUtils.js +131 -0
- package/dist/esm/utils/activityId.js +2 -0
- package/dist/esm/utils/apiUtils.js +84 -0
- package/dist/esm/utils/asyncUtils.js +207 -0
- package/dist/esm/utils/authHelpers.js +111 -0
- package/dist/esm/utils/authWebUrl.js +16 -0
- package/dist/esm/utils/avatarUtils.js +26 -0
- package/dist/esm/utils/cache.js +227 -0
- package/dist/esm/utils/cacheKey.js +80 -0
- package/dist/esm/utils/coldBoot.js +119 -0
- package/dist/esm/utils/commonsApproval.js +27 -0
- package/dist/esm/utils/commonsDelivery.js +54 -0
- package/dist/esm/utils/deviceManager.js +170 -0
- package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
- package/dist/esm/utils/edgeRegion.js +2 -0
- package/dist/esm/utils/errorUtils.js +232 -0
- package/dist/esm/utils/identityCacheSweep.js +92 -0
- package/dist/esm/utils/languageUtils.js +212 -0
- package/dist/esm/utils/oauthPkce.js +297 -0
- package/dist/esm/utils/officialOrigins.js +59 -0
- package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
- package/dist/esm/utils/platform.js +110 -0
- package/dist/esm/utils/profileLinks.js +60 -0
- package/dist/esm/utils/redactUrl.js +26 -0
- package/dist/esm/utils/registrableApex.js +42 -0
- package/dist/esm/utils/requestUtils.js +203 -0
- package/dist/esm/utils/sessionUtils.js +171 -0
- package/dist/esm/utils/textNormalization.js +154 -0
- package/dist/esm/utils/userHandle.js +33 -0
- package/dist/esm/utils/userIdentity.js +45 -0
- package/dist/esm/utils/validationUtils.js +350 -0
- package/dist/esm/utils/webauthnOrigin.js +48 -0
- package/dist/types/.tsbuildinfo +1 -0
- package/dist/types/HttpService.d.ts +413 -0
- package/dist/types/OxyServices.base.d.ts +187 -0
- package/dist/types/OxyServices.d.ts +139 -0
- package/dist/types/OxyServices.errors.d.ts +84 -0
- package/dist/types/boot/sessionColdBoot.d.ts +140 -0
- package/dist/types/constants/version.d.ts +13 -0
- package/dist/types/crypto/aead.d.ts +56 -0
- package/dist/types/crypto/ecdh.d.ts +29 -0
- package/dist/types/crypto/identityMarker.d.ts +94 -0
- package/dist/types/crypto/kdf.d.ts +25 -0
- package/dist/types/crypto/keyManager.d.ts +582 -0
- package/dist/types/crypto/polyfill.d.ts +25 -0
- package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
- package/dist/types/crypto/signatureService.d.ts +136 -0
- package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
- package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
- package/dist/types/i18n/index.d.ts +3 -0
- package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
- package/dist/types/i18n/trustTierLabels.d.ts +9 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
- package/dist/types/logger/index.d.ts +104 -0
- package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
- package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
- package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
- package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
- package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
- package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
- package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
- package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
- package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
- package/dist/types/mixins/OxyServices.features.d.ts +250 -0
- package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
- package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
- package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
- package/dist/types/mixins/OxyServices.language.d.ts +87 -0
- package/dist/types/mixins/OxyServices.links.d.ts +104 -0
- package/dist/types/mixins/OxyServices.location.d.ts +70 -0
- package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
- package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
- package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
- package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
- package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
- package/dist/types/mixins/OxyServices.security.d.ts +84 -0
- package/dist/types/mixins/OxyServices.store.d.ts +334 -0
- package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
- package/dist/types/mixins/OxyServices.user.d.ts +558 -0
- package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
- package/dist/types/mixins/index.d.ts +87 -0
- package/dist/types/mixins/mixinHelpers.d.ts +31 -0
- package/dist/types/models/Topic.d.ts +42 -0
- package/dist/types/models/interfaces.d.ts +675 -0
- package/dist/types/models/session.d.ts +51 -0
- package/dist/types/server/auth.d.ts +130 -0
- package/dist/types/server/capabilityTicket.d.ts +41 -0
- package/dist/types/server/cors.d.ts +98 -0
- package/dist/types/server/index.d.ts +35 -0
- package/dist/types/server/rateLimit.d.ts +40 -0
- package/dist/types/server/safeFetch.d.ts +137 -0
- package/dist/types/server/securityHeaders.d.ts +221 -0
- package/dist/types/server/userInvalidation.d.ts +114 -0
- package/dist/types/server/verifySecret.d.ts +29 -0
- package/dist/types/session/SessionClient.d.ts +418 -0
- package/dist/types/session/accountDelegationAccess.d.ts +40 -0
- package/dist/types/session/accountDialogController.d.ts +648 -0
- package/dist/types/session/accountSwitchTargets.d.ts +70 -0
- package/dist/types/session/authStateStore.d.ts +153 -0
- package/dist/types/session/createSessionClient.d.ts +30 -0
- package/dist/types/session/deviceDirectory.d.ts +182 -0
- package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
- package/dist/types/session/identityPin.d.ts +87 -0
- package/dist/types/session/identitySession.d.ts +105 -0
- package/dist/types/session/projectSessionState.d.ts +74 -0
- package/dist/types/session/refresh.d.ts +179 -0
- package/dist/types/session/sessionClientHost.d.ts +18 -0
- package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
- package/dist/types/session/socketLoader.d.ts +11 -0
- package/dist/types/shared/utils/colorUtils.d.ts +104 -0
- package/dist/types/shared/utils/errorUtils.d.ts +97 -0
- package/dist/types/shared/utils/index.d.ts +13 -0
- package/dist/types/shared/utils/networkUtils.d.ts +139 -0
- package/dist/types/shared/utils/themeUtils.d.ts +90 -0
- package/dist/types/utils/accountCacheSweep.d.ts +75 -0
- package/dist/types/utils/accountUtils.d.ts +100 -0
- package/dist/types/utils/activityId.d.ts +2 -0
- package/dist/types/utils/apiUtils.d.ts +95 -0
- package/dist/types/utils/asyncUtils.d.ts +62 -0
- package/dist/types/utils/authHelpers.d.ts +58 -0
- package/dist/types/utils/authWebUrl.d.ts +16 -0
- package/dist/types/utils/avatarUtils.d.ts +16 -0
- package/dist/types/utils/cache.d.ts +130 -0
- package/dist/types/utils/cacheKey.d.ts +66 -0
- package/dist/types/utils/coldBoot.d.ts +131 -0
- package/dist/types/utils/commonsApproval.d.ts +13 -0
- package/dist/types/utils/commonsDelivery.d.ts +105 -0
- package/dist/types/utils/deviceManager.d.ts +65 -0
- package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
- package/dist/types/utils/edgeRegion.d.ts +2 -0
- package/dist/types/utils/errorUtils.d.ts +125 -0
- package/dist/types/utils/identityCacheSweep.d.ts +80 -0
- package/dist/types/utils/languageUtils.d.ts +100 -0
- package/dist/types/utils/oauthPkce.d.ts +157 -0
- package/dist/types/utils/officialOrigins.d.ts +13 -0
- package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
- package/dist/types/utils/platform.d.ts +49 -0
- package/dist/types/utils/profileLinks.d.ts +44 -0
- package/dist/types/utils/redactUrl.d.ts +17 -0
- package/dist/types/utils/registrableApex.d.ts +27 -0
- package/dist/types/utils/requestUtils.d.ts +123 -0
- package/dist/types/utils/sessionUtils.d.ts +54 -0
- package/dist/types/utils/textNormalization.d.ts +103 -0
- package/dist/types/utils/userHandle.d.ts +26 -0
- package/dist/types/utils/userIdentity.d.ts +21 -0
- package/dist/types/utils/validationUtils.d.ts +268 -0
- package/dist/types/utils/webauthnOrigin.d.ts +32 -0
- package/package.json +168 -0
- package/src/HttpService.ts +1553 -0
- package/src/OxyServices.base.ts +478 -0
- package/src/OxyServices.errors.ts +122 -0
- package/src/OxyServices.ts +172 -0
- package/src/__tests__/authSocket.test.ts +96 -0
- package/src/__tests__/httpServiceActivityId.test.ts +49 -0
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
- package/src/__tests__/httpServiceCache.test.ts +318 -0
- package/src/__tests__/httpServiceCsrf.test.ts +235 -0
- package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
- package/src/__tests__/inSessionRefresh.test.ts +260 -0
- package/src/__tests__/linkedClient.test.ts +370 -0
- package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
- package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
- package/src/__tests__/userIdentity.test.ts +143 -0
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
- package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
- package/src/boot/sessionColdBoot.ts +529 -0
- package/src/constants/version.ts +15 -0
- package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
- package/src/crypto/__tests__/identityMocks.ts +125 -0
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
- package/src/crypto/__tests__/keyManager.test.ts +329 -0
- package/src/crypto/__tests__/polyfill.test.ts +109 -0
- package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
- package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
- package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
- package/src/crypto/__tests__/signedRecord.test.ts +230 -0
- package/src/crypto/aead.ts +97 -0
- package/src/crypto/ecdh.ts +37 -0
- package/src/crypto/identityMarker.ts +291 -0
- package/src/crypto/kdf.ts +43 -0
- package/src/crypto/keyManager.ts +2607 -0
- package/src/crypto/polyfill.ts +143 -0
- package/src/crypto/recoveryPhrase.ts +337 -0
- package/src/crypto/signatureService.ts +350 -0
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
- package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
- package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
- package/src/i18n/accountCategoryLabels.ts +44 -0
- package/src/i18n/accountRoleLabels.ts +26 -0
- package/src/i18n/index.ts +88 -0
- package/src/i18n/locales/ar-SA.json +282 -0
- package/src/i18n/locales/ca-ES.json +282 -0
- package/src/i18n/locales/de-DE.json +282 -0
- package/src/i18n/locales/en-US.json +2161 -0
- package/src/i18n/locales/es-ES.json +2161 -0
- package/src/i18n/locales/fr-FR.json +282 -0
- package/src/i18n/locales/it-IT.json +282 -0
- package/src/i18n/locales/ja-JP.json +282 -0
- package/src/i18n/locales/ko-KR.json +282 -0
- package/src/i18n/locales/pt-PT.json +282 -0
- package/src/i18n/locales/zh-CN.json +282 -0
- package/src/i18n/reputationCategoryLabels.ts +20 -0
- package/src/i18n/trustTierLabels.ts +18 -0
- package/src/index.ts +881 -0
- package/src/inference/OxyInferenceClient.ts +888 -0
- package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
- package/src/logger/__tests__/logger.test.ts +207 -0
- package/src/logger/index.ts +217 -0
- package/src/mixins/OxyServices.accounts.ts +1330 -0
- package/src/mixins/OxyServices.analytics.ts +53 -0
- package/src/mixins/OxyServices.appData.ts +158 -0
- package/src/mixins/OxyServices.assets.ts +861 -0
- package/src/mixins/OxyServices.auth.ts +1858 -0
- package/src/mixins/OxyServices.chains.ts +134 -0
- package/src/mixins/OxyServices.civic.ts +945 -0
- package/src/mixins/OxyServices.connectedApps.ts +174 -0
- package/src/mixins/OxyServices.contacts.ts +73 -0
- package/src/mixins/OxyServices.deviceBoot.ts +210 -0
- package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
- package/src/mixins/OxyServices.devices.ts +120 -0
- package/src/mixins/OxyServices.features.ts +454 -0
- package/src/mixins/OxyServices.followGraph.ts +293 -0
- package/src/mixins/OxyServices.identity.ts +705 -0
- package/src/mixins/OxyServices.identityBackup.ts +250 -0
- package/src/mixins/OxyServices.inference.ts +57 -0
- package/src/mixins/OxyServices.language.ts +144 -0
- package/src/mixins/OxyServices.links.ts +107 -0
- package/src/mixins/OxyServices.location.ts +46 -0
- package/src/mixins/OxyServices.nodes.ts +337 -0
- package/src/mixins/OxyServices.notifications.ts +142 -0
- package/src/mixins/OxyServices.payment.ts +163 -0
- package/src/mixins/OxyServices.privacy.ts +219 -0
- package/src/mixins/OxyServices.reputation.ts +436 -0
- package/src/mixins/OxyServices.security.ts +110 -0
- package/src/mixins/OxyServices.store.ts +585 -0
- package/src/mixins/OxyServices.topics.ts +169 -0
- package/src/mixins/OxyServices.user.ts +1137 -0
- package/src/mixins/OxyServices.utility.ts +1370 -0
- package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
- package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
- package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
- package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
- package/src/mixins/__tests__/accounts.test.ts +727 -0
- package/src/mixins/__tests__/appData.test.ts +203 -0
- package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
- package/src/mixins/__tests__/assetUpload.test.ts +191 -0
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
- package/src/mixins/__tests__/chains.test.ts +113 -0
- package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
- package/src/mixins/__tests__/connectedApps.test.ts +123 -0
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
- package/src/mixins/__tests__/followGraph.test.ts +147 -0
- package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
- package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
- package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
- package/src/mixins/__tests__/identityBackup.test.ts +315 -0
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
- package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
- package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
- package/src/mixins/__tests__/reputation.test.ts +522 -0
- package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
- package/src/mixins/__tests__/store.test.ts +304 -0
- package/src/mixins/__tests__/topics.test.ts +156 -0
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
- package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
- package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
- package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
- package/src/mixins/index.ts +201 -0
- package/src/mixins/mixinHelpers.ts +69 -0
- package/src/models/Topic.ts +46 -0
- package/src/models/interfaces.ts +786 -0
- package/src/models/session.ts +55 -0
- package/src/server/__tests__/auth.test.ts +78 -0
- package/src/server/__tests__/capabilityTicket.test.ts +111 -0
- package/src/server/__tests__/cors.socket.test.ts +225 -0
- package/src/server/__tests__/cors.test.ts +158 -0
- package/src/server/__tests__/rateLimit.test.ts +257 -0
- package/src/server/__tests__/safeFetch.test.ts +232 -0
- package/src/server/__tests__/securityHeaders.test.ts +348 -0
- package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
- package/src/server/__tests__/userInvalidation.test.ts +203 -0
- package/src/server/__tests__/verifySecret.test.ts +40 -0
- package/src/server/auth.ts +271 -0
- package/src/server/capabilityTicket.ts +258 -0
- package/src/server/cors.ts +277 -0
- package/src/server/index.ts +136 -0
- package/src/server/rateLimit.ts +313 -0
- package/src/server/safeFetch.ts +586 -0
- package/src/server/securityHeaders.ts +467 -0
- package/src/server/userInvalidation.ts +199 -0
- package/src/server/verifySecret.ts +52 -0
- package/src/session/SessionClient.ts +1001 -0
- package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
- package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
- package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
- package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
- package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
- package/src/session/__tests__/SessionClient.state.test.ts +78 -0
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
- package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
- package/src/session/__tests__/accountDialogController.test.ts +1969 -0
- package/src/session/__tests__/accountDialogShape.test.ts +118 -0
- package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
- package/src/session/__tests__/authStateStore.test.ts +451 -0
- package/src/session/__tests__/deviceDirectory.test.ts +422 -0
- package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
- package/src/session/__tests__/identityPin.test.ts +131 -0
- package/src/session/__tests__/identitySession.test.ts +194 -0
- package/src/session/__tests__/projectSessionState.test.ts +105 -0
- package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
- package/src/session/__tests__/refresh.test.ts +443 -0
- package/src/session/__tests__/sessionIntegration.test.ts +209 -0
- package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
- package/src/session/accountDelegationAccess.ts +72 -0
- package/src/session/accountDialogController.ts +1494 -0
- package/src/session/accountSwitchTargets.ts +93 -0
- package/src/session/authStateStore.ts +502 -0
- package/src/session/createSessionClient.ts +39 -0
- package/src/session/deviceDirectory.ts +269 -0
- package/src/session/deviceSwitcherRows.ts +145 -0
- package/src/session/identityPin.ts +310 -0
- package/src/session/identitySession.ts +206 -0
- package/src/session/projectSessionState.ts +137 -0
- package/src/session/refresh.ts +517 -0
- package/src/session/sessionClientHost.ts +39 -0
- package/src/session/sharedDeviceCredential.ts +349 -0
- package/src/session/socketLoader.ts +30 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/types/buffer.d.ts +97 -0
- package/src/types/expo-crypto.d.ts +16 -0
- package/src/types/expo-secure-store.d.ts +17 -0
- package/src/utils/__tests__/accountUtils.test.ts +151 -0
- package/src/utils/__tests__/activityId.test.ts +45 -0
- package/src/utils/__tests__/asyncUtils.test.ts +187 -0
- package/src/utils/__tests__/authWebUrl.test.ts +15 -0
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/coldBoot.test.ts +496 -0
- package/src/utils/__tests__/commonsApproval.test.ts +60 -0
- package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
- package/src/utils/__tests__/languageUtils.test.ts +219 -0
- package/src/utils/__tests__/oauthPkce.test.ts +272 -0
- package/src/utils/__tests__/officialOrigins.test.ts +31 -0
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
- package/src/utils/__tests__/profileLinks.test.ts +180 -0
- package/src/utils/__tests__/redactUrl.test.ts +33 -0
- package/src/utils/__tests__/registrableApex.test.ts +62 -0
- package/src/utils/__tests__/textNormalization.test.ts +205 -0
- package/src/utils/__tests__/validationUtils.test.ts +703 -0
- package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
- package/src/utils/accountCacheSweep.ts +93 -0
- package/src/utils/accountUtils.ts +194 -0
- package/src/utils/activityId.ts +2 -0
- package/src/utils/apiUtils.ts +137 -0
- package/src/utils/asyncUtils.ts +280 -0
- package/src/utils/authHelpers.ts +148 -0
- package/src/utils/authWebUrl.ts +17 -0
- package/src/utils/avatarUtils.ts +39 -0
- package/src/utils/cache.ts +273 -0
- package/src/utils/cacheKey.ts +93 -0
- package/src/utils/coldBoot.ts +218 -0
- package/src/utils/commonsApproval.ts +39 -0
- package/src/utils/commonsDelivery.ts +132 -0
- package/src/utils/deviceManager.ts +203 -0
- package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
- package/src/utils/edgeRegion.ts +2 -0
- package/src/utils/errorUtils.ts +352 -0
- package/src/utils/identityCacheSweep.ts +104 -0
- package/src/utils/languageUtils.ts +256 -0
- package/src/utils/oauthPkce.ts +392 -0
- package/src/utils/officialOrigins.ts +62 -0
- package/src/utils/oxyServiceEnvironment.ts +17 -0
- package/src/utils/platform.ts +139 -0
- package/src/utils/profileLinks.ts +91 -0
- package/src/utils/redactUrl.ts +28 -0
- package/src/utils/registrableApex.ts +41 -0
- package/src/utils/requestUtils.ts +237 -0
- package/src/utils/sessionUtils.ts +206 -0
- package/src/utils/textNormalization.ts +162 -0
- package/src/utils/userHandle.ts +49 -0
- package/src/utils/userIdentity.ts +60 -0
- package/src/utils/validationUtils.ts +390 -0
- package/src/utils/webauthnOrigin.ts +52 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { logger } from '../logger/index.js';
|
|
2
|
+
export function OxyServicesPrivacyMixin(Base) {
|
|
3
|
+
return class extends Base {
|
|
4
|
+
constructor(...args) {
|
|
5
|
+
super(...args);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract user ID from blocked/restricted user object
|
|
9
|
+
*/
|
|
10
|
+
extractUserId(userIdField) {
|
|
11
|
+
return typeof userIdField === 'string' ? userIdField : userIdField._id;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if a user is in a list (blocked or restricted)
|
|
15
|
+
*/
|
|
16
|
+
async isUserInList(userId, getUserList, getIdField) {
|
|
17
|
+
try {
|
|
18
|
+
if (!userId) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const users = await getUserList();
|
|
22
|
+
return users.some(item => {
|
|
23
|
+
const itemId = this.extractUserId(getIdField(item));
|
|
24
|
+
return itemId === userId;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// If there's an error, assume not in list to avoid breaking functionality
|
|
29
|
+
logger.warn('Error checking user list', { component: 'OxyServices.privacy' }, error);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// BLOCKED USERS METHODS
|
|
35
|
+
// ============================================================================
|
|
36
|
+
/**
|
|
37
|
+
* Get list of blocked users
|
|
38
|
+
* @returns Array of blocked users
|
|
39
|
+
*/
|
|
40
|
+
async getBlockedUsers() {
|
|
41
|
+
try {
|
|
42
|
+
return await this.makeRequest('GET', '/privacy/blocked', undefined, {
|
|
43
|
+
cache: true,
|
|
44
|
+
cacheTTL: 1 * 60 * 1000, // 1 minute cache
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw this.handleError(error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Block a user.
|
|
53
|
+
*
|
|
54
|
+
* Invalidates the cached `GET /privacy/blocked` response after the write.
|
|
55
|
+
* `getBlockedUsers` caches for ~1 minute (identity-scoped); without busting
|
|
56
|
+
* that entry, a consumer that re-reads the blocked list within the TTL
|
|
57
|
+
* window would not see the user it just blocked. `clearCacheEntry` deletes
|
|
58
|
+
* every identity-scoped variant of the key.
|
|
59
|
+
* @param userId - The user ID to block
|
|
60
|
+
* @returns Success message
|
|
61
|
+
*/
|
|
62
|
+
async blockUser(userId) {
|
|
63
|
+
try {
|
|
64
|
+
if (!userId) {
|
|
65
|
+
throw new Error('User ID is required');
|
|
66
|
+
}
|
|
67
|
+
const result = await this.makeRequest('POST', `/privacy/blocked/${userId}`, undefined, {
|
|
68
|
+
cache: false,
|
|
69
|
+
});
|
|
70
|
+
this.clearCacheEntry('GET:/privacy/blocked');
|
|
71
|
+
// The block changed the viewer's graph (`blockedIds`) — bust the cached
|
|
72
|
+
// consolidated `GET /users/me/graph` so the next read reflects it.
|
|
73
|
+
this.clearCacheEntry('GET:/users/me/graph');
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw this.handleError(error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Unblock a user.
|
|
82
|
+
*
|
|
83
|
+
* Busts the cached `GET /privacy/blocked` response so a remount reads the
|
|
84
|
+
* fresh list without the just-unblocked user (see `blockUser`).
|
|
85
|
+
* @param userId - The user ID to unblock
|
|
86
|
+
* @returns Success message
|
|
87
|
+
*/
|
|
88
|
+
async unblockUser(userId) {
|
|
89
|
+
try {
|
|
90
|
+
if (!userId) {
|
|
91
|
+
throw new Error('User ID is required');
|
|
92
|
+
}
|
|
93
|
+
const result = await this.makeRequest('DELETE', `/privacy/blocked/${userId}`, undefined, {
|
|
94
|
+
cache: false,
|
|
95
|
+
});
|
|
96
|
+
this.clearCacheEntry('GET:/privacy/blocked');
|
|
97
|
+
// Symmetric to blockUser: the unblock changed the viewer's `blockedIds`,
|
|
98
|
+
// so bust the consolidated `GET /users/me/graph` cache.
|
|
99
|
+
this.clearCacheEntry('GET:/users/me/graph');
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
throw this.handleError(error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if a user is blocked
|
|
108
|
+
* @param userId - The user ID to check
|
|
109
|
+
* @returns True if the user is blocked, false otherwise
|
|
110
|
+
*/
|
|
111
|
+
async isUserBlocked(userId) {
|
|
112
|
+
return this.isUserInList(userId, () => this.getBlockedUsers(), (block) => block.blockedId);
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// RESTRICTED USERS METHODS
|
|
116
|
+
// ============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Get list of restricted users
|
|
119
|
+
* @returns Array of restricted users
|
|
120
|
+
*/
|
|
121
|
+
async getRestrictedUsers() {
|
|
122
|
+
try {
|
|
123
|
+
return await this.makeRequest('GET', '/privacy/restricted', undefined, {
|
|
124
|
+
cache: true,
|
|
125
|
+
cacheTTL: 1 * 60 * 1000, // 1 minute cache
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw this.handleError(error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Restrict a user (limit their interactions without fully blocking).
|
|
134
|
+
*
|
|
135
|
+
* Invalidates the cached `GET /privacy/restricted` response after the write.
|
|
136
|
+
* `getRestrictedUsers` caches for ~1 minute (identity-scoped); without
|
|
137
|
+
* busting that entry, a consumer that re-reads the restricted list within
|
|
138
|
+
* the TTL window would not see the user it just restricted.
|
|
139
|
+
* `clearCacheEntry` deletes every identity-scoped variant of the key.
|
|
140
|
+
* @param userId - The user ID to restrict
|
|
141
|
+
* @returns Success message
|
|
142
|
+
*/
|
|
143
|
+
async restrictUser(userId) {
|
|
144
|
+
try {
|
|
145
|
+
if (!userId) {
|
|
146
|
+
throw new Error('User ID is required');
|
|
147
|
+
}
|
|
148
|
+
const result = await this.makeRequest('POST', `/privacy/restricted/${userId}`, undefined, {
|
|
149
|
+
cache: false,
|
|
150
|
+
});
|
|
151
|
+
this.clearCacheEntry('GET:/privacy/restricted');
|
|
152
|
+
// The restriction changed the viewer's graph (`restrictedIds`) — bust the
|
|
153
|
+
// cached consolidated `GET /users/me/graph` so the next read reflects it.
|
|
154
|
+
this.clearCacheEntry('GET:/users/me/graph');
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
throw this.handleError(error);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Unrestrict a user.
|
|
163
|
+
*
|
|
164
|
+
* Busts the cached `GET /privacy/restricted` response so a remount reads the
|
|
165
|
+
* fresh list without the just-unrestricted user (see `restrictUser`).
|
|
166
|
+
* @param userId - The user ID to unrestrict
|
|
167
|
+
* @returns Success message
|
|
168
|
+
*/
|
|
169
|
+
async unrestrictUser(userId) {
|
|
170
|
+
try {
|
|
171
|
+
if (!userId) {
|
|
172
|
+
throw new Error('User ID is required');
|
|
173
|
+
}
|
|
174
|
+
const result = await this.makeRequest('DELETE', `/privacy/restricted/${userId}`, undefined, {
|
|
175
|
+
cache: false,
|
|
176
|
+
});
|
|
177
|
+
this.clearCacheEntry('GET:/privacy/restricted');
|
|
178
|
+
// Symmetric to restrictUser: the unrestrict changed the viewer's
|
|
179
|
+
// `restrictedIds`, so bust the consolidated `GET /users/me/graph` cache.
|
|
180
|
+
this.clearCacheEntry('GET:/users/me/graph');
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
throw this.handleError(error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if a user is restricted
|
|
189
|
+
* @param userId - The user ID to check
|
|
190
|
+
* @returns True if the user is restricted, false otherwise
|
|
191
|
+
*/
|
|
192
|
+
async isUserRestricted(userId) {
|
|
193
|
+
return this.isUserInList(userId, () => this.getRestrictedUsers(), (restrict) => restrict.restrictedId);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { isFullReputationBalance } from '@oxy.so/contracts';
|
|
2
|
+
import { OxyAuthenticationError } from '../OxyServices.errors.js';
|
|
3
|
+
import { CACHE_TIMES } from './mixinHelpers.js';
|
|
4
|
+
/** Cache-key prefix for every cached `GET /reputation/...` response. */
|
|
5
|
+
const REPUTATION_CACHE_PREFIX = 'GET:/reputation/';
|
|
6
|
+
export function OxyServicesReputationMixin(Base) {
|
|
7
|
+
return class extends Base {
|
|
8
|
+
constructor(...args) {
|
|
9
|
+
super(...args);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get ANY user's reputation balance, in whichever view the server serves the
|
|
13
|
+
* caller.
|
|
14
|
+
*
|
|
15
|
+
* A third party gets `userId`, `total` and `trustTier` and nothing else, so
|
|
16
|
+
* the return type is a {@link ReputationBalanceView} union: narrow it with
|
|
17
|
+
* {@link isFullReputationBalance} before touching `breakdown`, `influence`
|
|
18
|
+
* or `reliability`. To read your OWN balance, call
|
|
19
|
+
* {@link getMyReputationBalance} instead — it returns the full shape with no
|
|
20
|
+
* narrowing.
|
|
21
|
+
*
|
|
22
|
+
* @param userId - The subject user's `_id` or publicKey.
|
|
23
|
+
*/
|
|
24
|
+
async getReputationBalance(userId) {
|
|
25
|
+
try {
|
|
26
|
+
return await this.makeRequest('GET', `/reputation/${encodeURIComponent(userId)}/balance`, undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw this.handleError(error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the SIGNED-IN user's own reputation balance, in full.
|
|
34
|
+
*
|
|
35
|
+
* The subject view is the only one carrying `breakdown`, `influence` and
|
|
36
|
+
* `reliability`, and the subject is the common caller, so this is the
|
|
37
|
+
* ergonomic path: no id to pass, no narrowing to do.
|
|
38
|
+
*
|
|
39
|
+
* Throws rather than returning a half-populated object when the request was
|
|
40
|
+
* not authenticated as the subject — with no signed-in user, and when the
|
|
41
|
+
* server answered `200` with the public view anyway (which it does for an
|
|
42
|
+
* absent or lapsed token, since the endpoint's auth is optional). Both mean
|
|
43
|
+
* the private blocks are simply absent, and a thrown error is the only
|
|
44
|
+
* honest report of that.
|
|
45
|
+
*/
|
|
46
|
+
async getMyReputationBalance() {
|
|
47
|
+
const userId = this.getCurrentUserId();
|
|
48
|
+
if (!userId) {
|
|
49
|
+
throw new OxyAuthenticationError('Reading your own reputation balance requires a signed-in user');
|
|
50
|
+
}
|
|
51
|
+
let balance;
|
|
52
|
+
try {
|
|
53
|
+
balance = await this.makeRequest('GET', `/reputation/${encodeURIComponent(userId)}/balance`, undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw this.handleError(error);
|
|
57
|
+
}
|
|
58
|
+
if (!isFullReputationBalance(balance)) {
|
|
59
|
+
throw new OxyAuthenticationError('The reputation balance came back as the public view — the request was not authenticated as its subject');
|
|
60
|
+
}
|
|
61
|
+
return balance;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the reputation leaderboard, ordered by lifetime total descending.
|
|
65
|
+
* @param limit - Page size (server-capped).
|
|
66
|
+
* @param offset - Page offset.
|
|
67
|
+
*/
|
|
68
|
+
async getReputationLeaderboard(limit, offset) {
|
|
69
|
+
try {
|
|
70
|
+
const params = {};
|
|
71
|
+
if (limit !== undefined)
|
|
72
|
+
params.limit = limit;
|
|
73
|
+
if (offset !== undefined)
|
|
74
|
+
params.offset = offset;
|
|
75
|
+
const res = await this.makeRequest('GET', '/reputation/leaderboard', Object.keys(params).length > 0 ? params : undefined, { cache: true, cacheTTL: CACHE_TIMES.LONG });
|
|
76
|
+
return res.data ?? [];
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw this.handleError(error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* List the enabled reputation rules (for client display).
|
|
84
|
+
*/
|
|
85
|
+
async getReputationRules() {
|
|
86
|
+
try {
|
|
87
|
+
const res = await this.makeRequest('GET', '/reputation/rules', undefined, { cache: true, cacheTTL: CACHE_TIMES.EXTRA_LONG });
|
|
88
|
+
return res.rules ?? [];
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw this.handleError(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get a user's paginated reputation ledger, newest first (auth required).
|
|
96
|
+
* @param userId - The subject user's `_id` or publicKey.
|
|
97
|
+
* @param limit - Page size (server-capped).
|
|
98
|
+
* @param offset - Page offset.
|
|
99
|
+
*/
|
|
100
|
+
async getReputationTransactions(userId, limit, offset) {
|
|
101
|
+
try {
|
|
102
|
+
const params = {};
|
|
103
|
+
if (limit !== undefined)
|
|
104
|
+
params.limit = limit;
|
|
105
|
+
if (offset !== undefined)
|
|
106
|
+
params.offset = offset;
|
|
107
|
+
const res = await this.makeRequest('GET', `/reputation/${encodeURIComponent(userId)}/transactions`, Object.keys(params).length > 0 ? params : undefined, { cache: true, cacheTTL: CACHE_TIMES.SHORT });
|
|
108
|
+
return res.data ?? [];
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw this.handleError(error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get a user's capped influence weight for a given context (auth required).
|
|
116
|
+
* @param userId - The subject user's `_id` or publicKey.
|
|
117
|
+
* @param context - The weight axis to read (defaults server-side to `default`).
|
|
118
|
+
*/
|
|
119
|
+
async getReputationInfluence(userId, context) {
|
|
120
|
+
try {
|
|
121
|
+
return await this.makeRequest('GET', `/reputation/${encodeURIComponent(userId)}/influence`, context ? { context } : undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw this.handleError(error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Award (or penalise) reputation to a user by `actionType`. Restricted to
|
|
129
|
+
* service tokens and platform staff. Invalidates cached reputation reads.
|
|
130
|
+
* @param input - The award payload (subject, action, source, target, etc.).
|
|
131
|
+
*/
|
|
132
|
+
async awardReputation(input) {
|
|
133
|
+
try {
|
|
134
|
+
const res = await this.makeRequest('POST', '/reputation/award', input, { cache: false });
|
|
135
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
136
|
+
return res.transaction;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw this.handleError(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Open a dispute against a transaction (auth required; the disputer is the
|
|
144
|
+
* authenticated user and must own the transaction).
|
|
145
|
+
* @param input - The transaction id, reason, and optional evidence.
|
|
146
|
+
*/
|
|
147
|
+
async createReputationDispute(input) {
|
|
148
|
+
try {
|
|
149
|
+
const res = await this.makeRequest('POST', '/reputation/disputes', input, { cache: false });
|
|
150
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
151
|
+
return res.dispute;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw this.handleError(error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* List a user's own reputation disputes (auth required; the caller must be
|
|
159
|
+
* the subject or platform staff).
|
|
160
|
+
* @param userId - The subject user's `_id` or publicKey.
|
|
161
|
+
* @param limit - Page size (server-capped).
|
|
162
|
+
* @param offset - Page offset.
|
|
163
|
+
*/
|
|
164
|
+
async getUserReputationDisputes(userId, limit, offset) {
|
|
165
|
+
try {
|
|
166
|
+
const params = {};
|
|
167
|
+
if (limit !== undefined)
|
|
168
|
+
params.limit = limit;
|
|
169
|
+
if (offset !== undefined)
|
|
170
|
+
params.offset = offset;
|
|
171
|
+
const res = await this.makeRequest('GET', `/reputation/${encodeURIComponent(userId)}/disputes`, Object.keys(params).length > 0 ? params : undefined, { cache: true, cacheTTL: CACHE_TIMES.SHORT });
|
|
172
|
+
return res.data ?? [];
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw this.handleError(error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// =========================================================================
|
|
179
|
+
// STAFF / ADMIN METHODS (require staff privileges server-side)
|
|
180
|
+
// =========================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Create or update a reputation rule, keyed by `actionType` (staff only).
|
|
183
|
+
* Invalidates the cached rule list.
|
|
184
|
+
* @param input - The rule definition.
|
|
185
|
+
*/
|
|
186
|
+
async upsertReputationRule(input) {
|
|
187
|
+
try {
|
|
188
|
+
const res = await this.makeRequest('POST', '/reputation/rules', input, { cache: false });
|
|
189
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
190
|
+
return res.rule;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw this.handleError(error);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Reverse a transaction (staff only): mark the original `reversed` and append
|
|
198
|
+
* a compensating `active` reversal with negated points. Invalidates cached
|
|
199
|
+
* reputation reads.
|
|
200
|
+
* @param transactionId - The transaction's id.
|
|
201
|
+
* @param input - Optional reason for the reversal.
|
|
202
|
+
*/
|
|
203
|
+
async reverseReputationTransaction(transactionId, input) {
|
|
204
|
+
try {
|
|
205
|
+
const res = await this.makeRequest('POST', `/reputation/transactions/${encodeURIComponent(transactionId)}/reverse`, input ?? {}, { cache: false });
|
|
206
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
207
|
+
return res;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
throw this.handleError(error);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Void a transaction (staff only): mark it `voided` so it is excluded from
|
|
215
|
+
* the balance, with NO compensating entry. Invalidates cached reputation
|
|
216
|
+
* reads.
|
|
217
|
+
* @param transactionId - The transaction's id.
|
|
218
|
+
* @param input - Optional reason for the void.
|
|
219
|
+
*/
|
|
220
|
+
async voidReputationTransaction(transactionId, input) {
|
|
221
|
+
try {
|
|
222
|
+
const res = await this.makeRequest('POST', `/reputation/transactions/${encodeURIComponent(transactionId)}/void`, input ?? {}, { cache: false });
|
|
223
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
224
|
+
return res.transaction;
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
throw this.handleError(error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Force a recompute of a user's balance snapshot from their active ledger
|
|
232
|
+
* (staff only). Invalidates cached reputation reads.
|
|
233
|
+
*
|
|
234
|
+
* Staff-gated, so the response is always the full subject view — no
|
|
235
|
+
* narrowing needed.
|
|
236
|
+
*
|
|
237
|
+
* @param userId - The subject user's `_id` or publicKey.
|
|
238
|
+
*/
|
|
239
|
+
async recalculateReputation(userId) {
|
|
240
|
+
try {
|
|
241
|
+
const res = await this.makeRequest('POST', `/reputation/${encodeURIComponent(userId)}/recalculate`, undefined, { cache: false });
|
|
242
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
243
|
+
return res;
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
throw this.handleError(error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the open dispute queue across all users (staff only).
|
|
251
|
+
* @param limit - Page size (server-capped).
|
|
252
|
+
* @param offset - Page offset.
|
|
253
|
+
*/
|
|
254
|
+
async getReputationDisputeQueue(limit, offset) {
|
|
255
|
+
try {
|
|
256
|
+
const params = {};
|
|
257
|
+
if (limit !== undefined)
|
|
258
|
+
params.limit = limit;
|
|
259
|
+
if (offset !== undefined)
|
|
260
|
+
params.offset = offset;
|
|
261
|
+
const res = await this.makeRequest('GET', '/reputation/disputes', Object.keys(params).length > 0 ? params : undefined, { cache: true, cacheTTL: CACHE_TIMES.SHORT });
|
|
262
|
+
return res.data ?? [];
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
throw this.handleError(error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Resolve a dispute (staff only). Accepting reverses the disputed
|
|
270
|
+
* transaction; rejecting restores it to `active`. Invalidates cached
|
|
271
|
+
* reputation reads.
|
|
272
|
+
* @param disputeId - The dispute's id.
|
|
273
|
+
* @param input - The resolution (`accepted` or `rejected`).
|
|
274
|
+
*/
|
|
275
|
+
async resolveReputationDispute(disputeId, input) {
|
|
276
|
+
try {
|
|
277
|
+
const res = await this.makeRequest('POST', `/reputation/disputes/${encodeURIComponent(disputeId)}/resolve`, input, { cache: false });
|
|
278
|
+
this.clearCacheByPrefix(REPUTATION_CACHE_PREFIX);
|
|
279
|
+
return res.dispute;
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
throw this.handleError(error);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { logger } from '../logger/index.js';
|
|
2
|
+
export function OxyServicesSecurityMixin(Base) {
|
|
3
|
+
return class extends Base {
|
|
4
|
+
constructor(...args) {
|
|
5
|
+
super(...args);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Get user's security activity with pagination
|
|
9
|
+
* @param limit - Number of results (default: 50, max: 100)
|
|
10
|
+
* @param offset - Pagination offset (default: 0)
|
|
11
|
+
* @param eventType - Optional filter by event type
|
|
12
|
+
* @returns Security activity response with pagination
|
|
13
|
+
*/
|
|
14
|
+
async getSecurityActivity(limit, offset, eventType) {
|
|
15
|
+
try {
|
|
16
|
+
const params = {};
|
|
17
|
+
if (limit !== undefined)
|
|
18
|
+
params.limit = limit;
|
|
19
|
+
if (offset !== undefined)
|
|
20
|
+
params.offset = offset;
|
|
21
|
+
if (eventType)
|
|
22
|
+
params.eventType = eventType;
|
|
23
|
+
// The API responds with the standard paginated envelope:
|
|
24
|
+
// { data: SecurityActivity[], pagination: { total, limit, offset, hasMore } }
|
|
25
|
+
// SecurityActivityResponse is the flattened shape consumers expect.
|
|
26
|
+
const raw = await this.makeRequest('GET', '/security/activity', params, { cache: false });
|
|
27
|
+
const requestedLimit = typeof params.limit === 'number' ? params.limit : 0;
|
|
28
|
+
const requestedOffset = typeof params.offset === 'number' ? params.offset : 0;
|
|
29
|
+
return {
|
|
30
|
+
data: raw.data ?? [],
|
|
31
|
+
total: raw.pagination?.total ?? raw.data?.length ?? 0,
|
|
32
|
+
limit: raw.pagination?.limit ?? requestedLimit,
|
|
33
|
+
offset: raw.pagination?.offset ?? requestedOffset,
|
|
34
|
+
hasMore: raw.pagination?.hasMore ?? false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw this.handleError(error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get recent security activity (convenience method)
|
|
43
|
+
* @param limit - Number of recent events to fetch (default: 10)
|
|
44
|
+
* @returns Array of recent security activities
|
|
45
|
+
*/
|
|
46
|
+
async getRecentSecurityActivity(limit = 10) {
|
|
47
|
+
try {
|
|
48
|
+
const response = await this.getSecurityActivity(limit, 0);
|
|
49
|
+
return response.data || [];
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw this.handleError(error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Log private key exported event
|
|
57
|
+
* @param deviceId - Optional device ID for tracking
|
|
58
|
+
* @returns Promise that resolves when event is logged
|
|
59
|
+
*/
|
|
60
|
+
async logPrivateKeyExported(deviceId) {
|
|
61
|
+
try {
|
|
62
|
+
await this.makeRequest('POST', '/security/activity/private-key-exported', { deviceId }, { cache: false });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Don't throw - logging failures shouldn't break user flow, but surface
|
|
66
|
+
// for monitoring via the shared logger sink.
|
|
67
|
+
logger.warn('[OxyServices] Failed to log private key exported event', { component: 'OxyServices.security' }, error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Log backup created event
|
|
72
|
+
* @param deviceId - Optional device ID for tracking
|
|
73
|
+
* @returns Promise that resolves when event is logged
|
|
74
|
+
*/
|
|
75
|
+
async logBackupCreated(deviceId) {
|
|
76
|
+
try {
|
|
77
|
+
await this.makeRequest('POST', '/security/activity/backup-created', { deviceId }, { cache: false });
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Don't throw - logging failures shouldn't break user flow, but surface
|
|
81
|
+
// for monitoring via the shared logger sink.
|
|
82
|
+
logger.warn('[OxyServices] Failed to log backup created event', { component: 'OxyServices.security' }, error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|