@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,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared account types and pure helper functions.
|
|
3
|
+
* Used by the @oxy.so/services account stores (Expo/RN and RN-Web).
|
|
4
|
+
*/
|
|
5
|
+
import { translate } from '../i18n/index.js';
|
|
6
|
+
import { getNormalizedUserHandle } from './userHandle.js';
|
|
7
|
+
/**
|
|
8
|
+
* Truncate a long public key for display, e.g. `0x12345678…`.
|
|
9
|
+
* Falls back to the raw key if it's too short to truncate.
|
|
10
|
+
*/
|
|
11
|
+
export const formatPublicKeyHandle = (publicKey) => {
|
|
12
|
+
const cleaned = publicKey.startsWith('0x') ? publicKey.slice(2) : publicKey;
|
|
13
|
+
if (cleaned.length <= 8)
|
|
14
|
+
return `0x${cleaned}`;
|
|
15
|
+
return `0x${cleaned.slice(0, 8)}…`;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a friendly display name for a user.
|
|
19
|
+
*
|
|
20
|
+
* Order of preference:
|
|
21
|
+
* 1. `name.displayName` from the API user contract.
|
|
22
|
+
* 2. `name.full`, or composed `name.first name.last` for local unsaved shapes.
|
|
23
|
+
* 3. `name` when passed as a plain string by local non-DTO call sites.
|
|
24
|
+
* 4. pre-normalized account-row `displayName`.
|
|
25
|
+
* 5. `username`
|
|
26
|
+
* 6. `Account 0x12345678…` (derived from publicKey, when present)
|
|
27
|
+
* 7. Translated fallback (e.g. "Unnamed")
|
|
28
|
+
*
|
|
29
|
+
* The translation key `common.unnamed` is used for the final fallback. If the
|
|
30
|
+
* caller does not pass a locale, the default English translation is used.
|
|
31
|
+
*/
|
|
32
|
+
export const getAccountDisplayName = (user, locale) => {
|
|
33
|
+
if (!user)
|
|
34
|
+
return translate(locale, 'common.unnamed');
|
|
35
|
+
const { name, displayName, username, publicKey } = user;
|
|
36
|
+
if (name && typeof name === 'object') {
|
|
37
|
+
if (typeof name.displayName === 'string' && name.displayName.trim()) {
|
|
38
|
+
return name.displayName.trim();
|
|
39
|
+
}
|
|
40
|
+
if (typeof name.full === 'string' && name.full.trim())
|
|
41
|
+
return name.full.trim();
|
|
42
|
+
const first = typeof name.first === 'string' ? name.first.trim() : '';
|
|
43
|
+
const last = typeof name.last === 'string' ? name.last.trim() : '';
|
|
44
|
+
const composed = [first, last].filter(Boolean).join(' ').trim();
|
|
45
|
+
if (composed)
|
|
46
|
+
return composed;
|
|
47
|
+
}
|
|
48
|
+
else if (typeof name === 'string' && name.trim()) {
|
|
49
|
+
return name.trim();
|
|
50
|
+
}
|
|
51
|
+
if (typeof displayName === 'string' && displayName.trim())
|
|
52
|
+
return displayName.trim();
|
|
53
|
+
if (typeof username === 'string' && username.trim())
|
|
54
|
+
return username.trim();
|
|
55
|
+
if (typeof publicKey === 'string' && publicKey.length > 0) {
|
|
56
|
+
return translate(locale, 'common.accountFallback', {
|
|
57
|
+
handle: formatPublicKeyHandle(publicKey),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return translate(locale, 'common.unnamed');
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Resolve a `@handle` style identifier for a user.
|
|
64
|
+
*
|
|
65
|
+
* Returns the bare username when present (without the `@`), otherwise a
|
|
66
|
+
* truncated public-key handle (`0x12345678…`), or `undefined` when neither is
|
|
67
|
+
* available — callers can decide whether to hide the line entirely.
|
|
68
|
+
*/
|
|
69
|
+
export const getAccountFallbackHandle = (user) => {
|
|
70
|
+
if (!user)
|
|
71
|
+
return undefined;
|
|
72
|
+
if (typeof user.username === 'string' && user.username.trim())
|
|
73
|
+
return user.username.trim();
|
|
74
|
+
if (typeof user.publicKey === 'string' && user.publicKey.length > 0) {
|
|
75
|
+
return formatPublicKeyHandle(user.publicKey);
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Build an ordered array of QuickAccounts from a map and order list.
|
|
81
|
+
*/
|
|
82
|
+
export const buildAccountsArray = (accounts, order) => {
|
|
83
|
+
const result = [];
|
|
84
|
+
for (const id of order) {
|
|
85
|
+
const account = accounts[id];
|
|
86
|
+
if (account)
|
|
87
|
+
result.push(account);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Create a QuickAccount from user data returned by the API.
|
|
93
|
+
*
|
|
94
|
+
* @param sessionId - Session identifier
|
|
95
|
+
* @param userData - Raw user object from the API
|
|
96
|
+
* @param existingAccount - Previously cached account (to preserve avatarUrl if unchanged)
|
|
97
|
+
* @param getFileDownloadUrl - Function to generate avatar download URL from file ID
|
|
98
|
+
*/
|
|
99
|
+
export const createQuickAccount = (sessionId, userData, existingAccount, getFileDownloadUrl) => {
|
|
100
|
+
const nameObj = userData.name && typeof userData.name === 'object' ? userData.name : undefined;
|
|
101
|
+
const apiDisplayName = typeof nameObj?.displayName === 'string' ? nameObj.displayName.trim() : '';
|
|
102
|
+
const displayName = apiDisplayName ||
|
|
103
|
+
getNormalizedUserHandle(userData) ||
|
|
104
|
+
getAccountDisplayName(null);
|
|
105
|
+
const userId = userData.id || (typeof userData._id === 'string' ? userData._id : userData._id?.toString());
|
|
106
|
+
// Preserve existing avatarUrl if avatar hasn't changed (prevents image reload)
|
|
107
|
+
let avatarUrl;
|
|
108
|
+
const avatar = userData.avatar ?? undefined;
|
|
109
|
+
if (existingAccount && existingAccount.avatar === avatar && existingAccount.avatarUrl) {
|
|
110
|
+
avatarUrl = existingAccount.avatarUrl;
|
|
111
|
+
}
|
|
112
|
+
else if (avatar && getFileDownloadUrl) {
|
|
113
|
+
avatarUrl = getFileDownloadUrl(avatar, 'thumb');
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
sessionId,
|
|
117
|
+
userId,
|
|
118
|
+
username: userData.username || '',
|
|
119
|
+
displayName,
|
|
120
|
+
avatar,
|
|
121
|
+
avatarUrl,
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Return the account's preferred Bloom color preset, or `null` if it has no
|
|
126
|
+
* preference. Centralises the `color ?? null` normalisation so consumers can
|
|
127
|
+
* drive per-account theming without duplicating the nullish-handling.
|
|
128
|
+
*/
|
|
129
|
+
export const getAccountColor = (account) => {
|
|
130
|
+
return account.color ?? null;
|
|
131
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for common API patterns
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Build a plain query-parameter record from an object, stringifying values and
|
|
6
|
+
* dropping `undefined`/`null` entries.
|
|
7
|
+
*
|
|
8
|
+
* This is the shape `OxyServices.makeRequest` expects for a GET's `params`:
|
|
9
|
+
* `HttpService` inspects it with `Object.keys(...)` (both to decide whether to
|
|
10
|
+
* append a query string and to build the request's cache key), and
|
|
11
|
+
* `Object.keys(new URLSearchParams({ limit: '20' }))` is `[]` — a
|
|
12
|
+
* `URLSearchParams` exposes its entries through iterator methods, never as own
|
|
13
|
+
* enumerable properties. Passing one to `makeRequest` therefore silently drops
|
|
14
|
+
* the whole query string. Always hand `makeRequest` a plain record.
|
|
15
|
+
*
|
|
16
|
+
* Generic over the input object rather than taking `Record<string, unknown>`,
|
|
17
|
+
* because a TypeScript `interface` (`PaginationParams`, `FollowGraphParams`, …)
|
|
18
|
+
* has no implicit index signature and so is not assignable to that type.
|
|
19
|
+
*/
|
|
20
|
+
export function buildQueryParams(params) {
|
|
21
|
+
const query = {};
|
|
22
|
+
// Widening the value to `unknown` is always sound; the default overload of
|
|
23
|
+
// `Object.entries` would otherwise infer `any` here.
|
|
24
|
+
for (const [key, value] of Object.entries(params)) {
|
|
25
|
+
if (value !== undefined && value !== null) {
|
|
26
|
+
query[key] = String(value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return query;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build URL search parameters from an object.
|
|
33
|
+
*
|
|
34
|
+
* For building a URL string only — see {@link buildQueryParams} for the shape
|
|
35
|
+
* `makeRequest` needs.
|
|
36
|
+
*
|
|
37
|
+
* @param params Object with parameter key-value pairs
|
|
38
|
+
* @returns URLSearchParams instance
|
|
39
|
+
*/
|
|
40
|
+
export function buildSearchParams(params) {
|
|
41
|
+
return new URLSearchParams(buildQueryParams(params));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build URL with search parameters
|
|
45
|
+
* @param baseUrl Base URL
|
|
46
|
+
* @param params Object with parameter key-value pairs
|
|
47
|
+
* @returns Complete URL with search parameters
|
|
48
|
+
*/
|
|
49
|
+
export function buildUrl(baseUrl, params) {
|
|
50
|
+
if (!params)
|
|
51
|
+
return baseUrl;
|
|
52
|
+
const searchParams = buildSearchParams(params);
|
|
53
|
+
const queryString = searchParams.toString();
|
|
54
|
+
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build pagination query parameters.
|
|
58
|
+
*
|
|
59
|
+
* Returns a plain record — NOT a `URLSearchParams` — because that is the only
|
|
60
|
+
* shape `makeRequest`/`HttpService` can read. See {@link buildQueryParams}.
|
|
61
|
+
*
|
|
62
|
+
* @param params Pagination parameters
|
|
63
|
+
* @returns Query record with pagination
|
|
64
|
+
*/
|
|
65
|
+
export function buildPaginationParams(params) {
|
|
66
|
+
return buildQueryParams(params);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Safe JSON parsing with error handling
|
|
70
|
+
* @param data Data to parse
|
|
71
|
+
* @param fallback Fallback value if parsing fails
|
|
72
|
+
* @returns Parsed data or fallback
|
|
73
|
+
*/
|
|
74
|
+
export function safeJsonParse(data, fallback) {
|
|
75
|
+
if (typeof data === 'string') {
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(data);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return fallback;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async utilities for common asynchronous patterns and error handling
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '../logger/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper for async operations with automatic error handling
|
|
7
|
+
* Returns null on error instead of throwing
|
|
8
|
+
*/
|
|
9
|
+
export async function withErrorHandling(operation, errorHandler, context) {
|
|
10
|
+
try {
|
|
11
|
+
return await operation();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (errorHandler) {
|
|
15
|
+
errorHandler(error);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
|
|
19
|
+
component: 'asyncUtils',
|
|
20
|
+
method: 'withErrorHandling',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Execute multiple async operations in parallel with error handling
|
|
28
|
+
*/
|
|
29
|
+
export async function parallelWithErrorHandling(operations, errorHandler) {
|
|
30
|
+
const results = await Promise.allSettled(operations.map((op, index) => withErrorHandling(op, error => errorHandler?.(error, index))));
|
|
31
|
+
return results.map(result => result.status === 'fulfilled' ? result.value : null);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract an HTTP status code from an error value, tolerating both the
|
|
35
|
+
* axios-style nested shape (`error.response.status`) and the flat shape
|
|
36
|
+
* produced by {@link handleHttpError} / fetch-based clients (`error.status`).
|
|
37
|
+
*
|
|
38
|
+
* Centralising this lookup prevents retry predicates from silently falling
|
|
39
|
+
* through when one of the two shapes is missing, which previously caused
|
|
40
|
+
* @oxy.so/core to retry 4xx responses and turn sub-10ms failures into
|
|
41
|
+
* multi-second stalls for every missing-resource lookup.
|
|
42
|
+
*/
|
|
43
|
+
function extractHttpStatus(error) {
|
|
44
|
+
if (!error || typeof error !== 'object')
|
|
45
|
+
return undefined;
|
|
46
|
+
const candidate = error;
|
|
47
|
+
const flat = candidate.status;
|
|
48
|
+
if (typeof flat === 'number' && Number.isFinite(flat))
|
|
49
|
+
return flat;
|
|
50
|
+
const nested = candidate.response?.status;
|
|
51
|
+
if (typeof nested === 'number' && Number.isFinite(nested))
|
|
52
|
+
return nested;
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Retry an async operation with exponential backoff
|
|
57
|
+
*
|
|
58
|
+
* By default, does not retry on 4xx errors (client errors). The default
|
|
59
|
+
* predicate accepts both the axios-style `error.response.status` and the
|
|
60
|
+
* flat `error.status` shape produced by {@link handleHttpError}, so callers
|
|
61
|
+
* never accidentally retry a deterministic client failure.
|
|
62
|
+
*
|
|
63
|
+
* Use the `shouldRetry` callback to customize retry behavior.
|
|
64
|
+
*/
|
|
65
|
+
export async function retryAsync(operation, maxRetries = 3, baseDelay = 1000, shouldRetry) {
|
|
66
|
+
let lastError;
|
|
67
|
+
// Default shouldRetry: don't retry on 4xx errors (client errors).
|
|
68
|
+
// Checks BOTH `error.status` (flat shape from handleHttpError / fetch
|
|
69
|
+
// clients) AND `error.response.status` (axios-style shape) so neither
|
|
70
|
+
// representation can leak a client error into the retry loop.
|
|
71
|
+
const defaultShouldRetry = (error) => {
|
|
72
|
+
const status = extractHttpStatus(error);
|
|
73
|
+
if (status !== undefined && status >= 400 && status < 500) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
};
|
|
78
|
+
const retryCheck = shouldRetry || defaultShouldRetry;
|
|
79
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
80
|
+
try {
|
|
81
|
+
return await operation();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
lastError = error;
|
|
85
|
+
if (attempt === maxRetries) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (!retryCheck(error)) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
// Calculate delay with exponential backoff and jitter
|
|
92
|
+
const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
|
|
93
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
throw lastError;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Debounce async function calls
|
|
100
|
+
*/
|
|
101
|
+
export function debounceAsync(func, delay) {
|
|
102
|
+
let timeoutId;
|
|
103
|
+
return (...args) => {
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
clearTimeout(timeoutId);
|
|
106
|
+
timeoutId = setTimeout(async () => {
|
|
107
|
+
try {
|
|
108
|
+
const result = await func(...args);
|
|
109
|
+
resolve(result);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
reject(error);
|
|
113
|
+
}
|
|
114
|
+
}, delay);
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Throttle async function calls
|
|
120
|
+
*/
|
|
121
|
+
export function throttleAsync(func, limit, interval) {
|
|
122
|
+
let inThrottle = false;
|
|
123
|
+
let lastPromise = null;
|
|
124
|
+
return (...args) => {
|
|
125
|
+
if (inThrottle) {
|
|
126
|
+
return lastPromise;
|
|
127
|
+
}
|
|
128
|
+
inThrottle = true;
|
|
129
|
+
lastPromise = func(...args);
|
|
130
|
+
setTimeout(() => {
|
|
131
|
+
inThrottle = false;
|
|
132
|
+
}, interval);
|
|
133
|
+
return lastPromise;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Execute async operations sequentially with progress tracking
|
|
138
|
+
*/
|
|
139
|
+
export async function sequentialWithProgress(operations, onProgress) {
|
|
140
|
+
const results = [];
|
|
141
|
+
for (let i = 0; i < operations.length; i++) {
|
|
142
|
+
const result = await operations[i]();
|
|
143
|
+
results.push(result);
|
|
144
|
+
onProgress?.(i + 1, operations.length);
|
|
145
|
+
}
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Batch async operations
|
|
150
|
+
*/
|
|
151
|
+
export async function batchAsync(items, batchSize, processor) {
|
|
152
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
153
|
+
const batch = items.slice(i, i + batchSize);
|
|
154
|
+
await processor(batch);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create a cancellable async operation
|
|
159
|
+
*/
|
|
160
|
+
export function createCancellableAsync(operation) {
|
|
161
|
+
let abortController = null;
|
|
162
|
+
return {
|
|
163
|
+
execute: async () => {
|
|
164
|
+
abortController = new AbortController();
|
|
165
|
+
return await operation(abortController.signal);
|
|
166
|
+
},
|
|
167
|
+
cancel: () => {
|
|
168
|
+
abortController?.abort();
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Timeout wrapper for async operations
|
|
174
|
+
*/
|
|
175
|
+
export async function withTimeout(operation, timeoutMs, timeoutMessage) {
|
|
176
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
177
|
+
setTimeout(() => {
|
|
178
|
+
reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));
|
|
179
|
+
}, timeoutMs);
|
|
180
|
+
});
|
|
181
|
+
return Promise.race([operation, timeoutPromise]);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Execute async operation with loading state
|
|
185
|
+
*/
|
|
186
|
+
export async function withLoadingState(operation, setLoading) {
|
|
187
|
+
setLoading(true);
|
|
188
|
+
try {
|
|
189
|
+
return await operation();
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
setLoading(false);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a promise that resolves after a delay
|
|
197
|
+
*/
|
|
198
|
+
export const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
199
|
+
/**
|
|
200
|
+
* Execute async operation with retry on specific errors
|
|
201
|
+
*/
|
|
202
|
+
export async function retryOnError(operation, retryableErrors, maxRetries = 3) {
|
|
203
|
+
return retryAsync(operation, maxRetries, 1000, (error) => {
|
|
204
|
+
const errorCode = error?.code || error?.status || error?.message;
|
|
205
|
+
return retryableErrors.includes(errorCode);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication helper utilities for common token validation
|
|
3
|
+
* and authentication error handling patterns.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when session sync is required
|
|
7
|
+
*/
|
|
8
|
+
export class SessionSyncRequiredError extends Error {
|
|
9
|
+
constructor(message = 'Session needs to be synced. Please try again.') {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = 'SessionSyncRequiredError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when authentication fails
|
|
16
|
+
*/
|
|
17
|
+
export class AuthenticationFailedError extends Error {
|
|
18
|
+
constructor(message = 'Authentication failed. Please sign in again.') {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = 'AuthenticationFailedError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Ensures a valid token exists before making authenticated API calls.
|
|
25
|
+
* If no valid token exists, callers may provide a session synchronizer that
|
|
26
|
+
* uses the platform-appropriate new flow (cookie restore, device claim, or
|
|
27
|
+
* native secure restore). This helper never exchanges a session id for a token.
|
|
28
|
+
*
|
|
29
|
+
* @throws {SessionSyncRequiredError} If the session needs to be synced (offline session)
|
|
30
|
+
*/
|
|
31
|
+
export async function ensureValidToken(oxyServices, _activeSessionId, syncSession) {
|
|
32
|
+
if (oxyServices.hasValidToken()) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (syncSession) {
|
|
36
|
+
try {
|
|
37
|
+
await syncSession();
|
|
38
|
+
if (oxyServices.hasValidToken()) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (syncError) {
|
|
43
|
+
const errorMessage = syncError instanceof Error ? syncError.message : String(syncError);
|
|
44
|
+
if (errorMessage.includes('AUTH_REQUIRED_OFFLINE_SESSION') || errorMessage.includes('offline')) {
|
|
45
|
+
throw new SessionSyncRequiredError();
|
|
46
|
+
}
|
|
47
|
+
throw syncError;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new SessionSyncRequiredError('No active access token is available. Sync the session before calling authenticated APIs.');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Checks if an error is an authentication error (401 or auth-related message)
|
|
54
|
+
*/
|
|
55
|
+
export function isAuthenticationError(error) {
|
|
56
|
+
if (!error || typeof error !== 'object') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const errorObj = error;
|
|
60
|
+
const errorMessage = errorObj.message || '';
|
|
61
|
+
const status = errorObj.status || errorObj.response?.status;
|
|
62
|
+
return (status === 401 ||
|
|
63
|
+
errorMessage.includes('Authentication required') ||
|
|
64
|
+
errorMessage.includes('Invalid or missing authorization header'));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Wraps an API call with authentication error handling.
|
|
68
|
+
* On auth failure, optionally attempts to sync the session and retry.
|
|
69
|
+
*
|
|
70
|
+
* @throws {AuthenticationFailedError} If authentication fails and cannot be recovered
|
|
71
|
+
*/
|
|
72
|
+
export async function withAuthErrorHandling(apiCall, options) {
|
|
73
|
+
try {
|
|
74
|
+
return await apiCall();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (!isAuthenticationError(error)) {
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
if (options?.syncSession && options?.oxyServices) {
|
|
81
|
+
try {
|
|
82
|
+
await options.syncSession();
|
|
83
|
+
return await apiCall();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new AuthenticationFailedError();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw new AuthenticationFailedError();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Combines token validation and auth error handling for a complete authenticated API call.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* return await authenticatedApiCall(
|
|
98
|
+
* oxyServices,
|
|
99
|
+
* activeSessionId,
|
|
100
|
+
* () => oxyServices.updateProfile(updates)
|
|
101
|
+
* );
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export async function authenticatedApiCall(oxyServices, activeSessionId, apiCall, syncSession) {
|
|
105
|
+
await ensureValidToken(oxyServices, activeSessionId, syncSession);
|
|
106
|
+
return withAuthErrorHandling(apiCall, {
|
|
107
|
+
syncSession,
|
|
108
|
+
activeSessionId,
|
|
109
|
+
oxyServices,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central IdP apex constant.
|
|
3
|
+
*
|
|
4
|
+
* The client SSO/FedCM resolvers (`resolveCentralAuthUrl`, `CENTRAL_AUTH_URL`)
|
|
5
|
+
* were removed in the device-first / legacy-final cutovers. The lone survivor is
|
|
6
|
+
* `CENTRAL_IDP_APEX`, kept because it has a LIVE consumer —
|
|
7
|
+
* `@oxy.so/core/server`'s CORS helper (`server/cors.ts`'s `createOxyCors`)
|
|
8
|
+
* auto-allows `*.oxy.so` from it. That CORS use is permanent, so this stays
|
|
9
|
+
* past the SSO/FedCM teardown.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The registrable apex (eTLD+1) of the Oxy ecosystem's central Identity
|
|
13
|
+
* Provider, reachable at `auth.${CENTRAL_IDP_APEX}`. Single source of truth so
|
|
14
|
+
* the CORS helper (and anything else that needs the central apex) never drifts.
|
|
15
|
+
*/
|
|
16
|
+
export const CENTRAL_IDP_APEX = 'oxy.so';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { logger } from '../logger/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Updates file visibility to public for avatar use.
|
|
4
|
+
* Logs non-404 errors to help debug upload issues.
|
|
5
|
+
*
|
|
6
|
+
* @param fileId - The file ID to update visibility for
|
|
7
|
+
* @param oxyServices - OxyServices instance (or any object with assetUpdateVisibility)
|
|
8
|
+
* @param contextName - Context name for error logging
|
|
9
|
+
*/
|
|
10
|
+
export async function updateAvatarVisibility(fileId, oxyServices, contextName = 'AvatarUtils') {
|
|
11
|
+
if (!fileId || fileId.startsWith('temp-')) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
await oxyServices.assetUpdateVisibility(fileId, 'public');
|
|
16
|
+
}
|
|
17
|
+
catch (visError) {
|
|
18
|
+
// 404 is expected when asset doesn't exist yet — skip logging
|
|
19
|
+
const status = (visError instanceof Error && 'status' in visError)
|
|
20
|
+
? visError.status
|
|
21
|
+
: undefined;
|
|
22
|
+
if (status !== 404) {
|
|
23
|
+
logger.error(`[${contextName}] Failed to update avatar visibility for ${fileId}`, visError, { component: contextName });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|