@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,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Theme Utility Functions
|
|
4
|
+
*
|
|
5
|
+
* Consolidated theme utilities for normalizing and handling color schemes
|
|
6
|
+
* across the OxyServices ecosystem.
|
|
7
|
+
*
|
|
8
|
+
* @module shared/utils/themeUtils
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.getSystemColorScheme = exports.systemPrefersDarkMode = exports.getOppositeTheme = exports.normalizeColorScheme = exports.normalizeTheme = void 0;
|
|
12
|
+
/**
|
|
13
|
+
* Normalizes a theme value to ensure it's always 'light' or 'dark'.
|
|
14
|
+
*
|
|
15
|
+
* @param theme - Theme value (may be 'light' | 'dark' | string | undefined)
|
|
16
|
+
* @returns Normalized 'light' | 'dark' theme (defaults to 'light')
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* normalizeTheme('dark'); // 'dark'
|
|
21
|
+
* normalizeTheme('light'); // 'light'
|
|
22
|
+
* normalizeTheme('unknown'); // 'light'
|
|
23
|
+
* normalizeTheme(undefined); // 'light'
|
|
24
|
+
* normalizeTheme(null); // 'light'
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
const normalizeTheme = (theme) => theme === 'light' || theme === 'dark' ? theme : 'light';
|
|
28
|
+
exports.normalizeTheme = normalizeTheme;
|
|
29
|
+
/**
|
|
30
|
+
* Normalizes a color scheme value with optional fallback chain.
|
|
31
|
+
*
|
|
32
|
+
* Handles null/undefined cases from React Native's useColorScheme() hook
|
|
33
|
+
* with a proper fallback chain.
|
|
34
|
+
*
|
|
35
|
+
* @param colorScheme - The color scheme from useColorScheme() hook (may be null/undefined)
|
|
36
|
+
* @param theme - Optional theme prop as fallback
|
|
37
|
+
* @returns Normalized 'light' | 'dark' color scheme
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* // In a React Native component:
|
|
42
|
+
* const systemScheme = useColorScheme(); // might be null
|
|
43
|
+
* const colorScheme = normalizeColorScheme(systemScheme, props.theme);
|
|
44
|
+
*
|
|
45
|
+
* normalizeColorScheme('dark', 'light'); // 'dark'
|
|
46
|
+
* normalizeColorScheme(null, 'dark'); // 'dark'
|
|
47
|
+
* normalizeColorScheme(undefined, undefined); // 'light'
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
const normalizeColorScheme = (colorScheme, theme) => {
|
|
51
|
+
if (colorScheme === 'light' || colorScheme === 'dark') {
|
|
52
|
+
return colorScheme;
|
|
53
|
+
}
|
|
54
|
+
if (theme === 'light' || theme === 'dark') {
|
|
55
|
+
return theme;
|
|
56
|
+
}
|
|
57
|
+
return 'light';
|
|
58
|
+
};
|
|
59
|
+
exports.normalizeColorScheme = normalizeColorScheme;
|
|
60
|
+
/**
|
|
61
|
+
* Gets the opposite theme value.
|
|
62
|
+
*
|
|
63
|
+
* @param theme - Current theme value
|
|
64
|
+
* @returns The opposite theme ('light' → 'dark', 'dark' → 'light')
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* getOppositeTheme('light'); // 'dark'
|
|
69
|
+
* getOppositeTheme('dark'); // 'light'
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
const getOppositeTheme = (theme) => theme === 'light' ? 'dark' : 'light';
|
|
73
|
+
exports.getOppositeTheme = getOppositeTheme;
|
|
74
|
+
/**
|
|
75
|
+
* Checks if the system prefers dark mode.
|
|
76
|
+
*
|
|
77
|
+
* This function only works in browser environments.
|
|
78
|
+
* Returns false in non-browser environments (Node.js, React Native).
|
|
79
|
+
*
|
|
80
|
+
* @returns true if system prefers dark mode, false otherwise
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* if (systemPrefersDarkMode()) {
|
|
85
|
+
* setTheme('dark');
|
|
86
|
+
* }
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
const systemPrefersDarkMode = () => {
|
|
90
|
+
if (typeof window === 'undefined')
|
|
91
|
+
return false;
|
|
92
|
+
return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;
|
|
93
|
+
};
|
|
94
|
+
exports.systemPrefersDarkMode = systemPrefersDarkMode;
|
|
95
|
+
/**
|
|
96
|
+
* Gets the system's preferred color scheme.
|
|
97
|
+
*
|
|
98
|
+
* @returns 'dark' if system prefers dark mode, 'light' otherwise
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* const theme = getSystemColorScheme();
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
const getSystemColorScheme = () => (0, exports.systemPrefersDarkMode)() ? 'dark' : 'light';
|
|
106
|
+
exports.getSystemColorScheme = getSystemColorScheme;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* THE enumeration of `OxyServices` GET-cache keys that serve the ACCOUNT FOREST
|
|
4
|
+
* — the caller's accessible accounts, as lists and as individual detail rows —
|
|
5
|
+
* and the one sweep that clears them.
|
|
6
|
+
*
|
|
7
|
+
* WHY THIS IS NOT A METHOD ON THE ACCOUNTS MIXIN
|
|
8
|
+
* ---------------------------------------------
|
|
9
|
+
* `AccountNode.account` is a whole `User`, so a forest read embeds the very
|
|
10
|
+
* profile the identity reads serve. That makes an IDENTITY write a writer of
|
|
11
|
+
* these keys too: `updateProfile` edits the caller's own personal account,
|
|
12
|
+
* which is a row in `GET /accounts` and is its own `GET /accounts/<id>`. Leave
|
|
13
|
+
* those cached and the account switcher keeps drawing the pre-edit name and
|
|
14
|
+
* picture for the full TTL, against a perfectly healthy server.
|
|
15
|
+
*
|
|
16
|
+
* The mixins compose into one class at runtime but are typed one at a time, so
|
|
17
|
+
* the user mixin cannot call a method the accounts mixin owns. The key list
|
|
18
|
+
* therefore lives here, once, and every writer calls {@link
|
|
19
|
+
* evictOxyAccountForestCache} — exactly like the identity key list in
|
|
20
|
+
* `identityCacheSweep`, which the accounts mixin already calls for the
|
|
21
|
+
* mirror-image case (an account write staling the identity reads). The
|
|
22
|
+
* alternative — a second hand-written copy of these keys in the other mixin —
|
|
23
|
+
* is the drift that shipped the two stale-profile bugs `identityCacheSweep`
|
|
24
|
+
* documents.
|
|
25
|
+
*
|
|
26
|
+
* WHY THE LIST NEEDS A PREFIX AND THE DETAIL DOES NOT
|
|
27
|
+
* --------------------------------------------------
|
|
28
|
+
* `listAccounts({tree?})` keys the flat list as `GET:/accounts` and every
|
|
29
|
+
* option variant as `GET:/accounts?<query>` (the query string is part of the
|
|
30
|
+
* URL, hence of the key), and a writer cannot enumerate which variants a caller
|
|
31
|
+
* has read. The detail key, by contrast, is derivable from the account id the
|
|
32
|
+
* writer already holds.
|
|
33
|
+
*
|
|
34
|
+
* The `GET:/accounts?` prefix matches ONLY the query-string list variants —
|
|
35
|
+
* never `GET:/accounts/<id>` or its `…/members`, `…/credentials`, `…/children`
|
|
36
|
+
* sub-resources, which are the accounts mixin's own business and stay there.
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.OXY_ACCOUNT_PER_ACCOUNT_CACHE_PREFIX = exports.OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX = exports.OXY_ACCOUNT_LIST_CACHE_KEY = void 0;
|
|
40
|
+
exports.oxyAccountDetailCacheKey = oxyAccountDetailCacheKey;
|
|
41
|
+
exports.evictOxyAccountForestCache = evictOxyAccountForestCache;
|
|
42
|
+
/** The cache key `listAccounts()` reads under with no options. */
|
|
43
|
+
exports.OXY_ACCOUNT_LIST_CACHE_KEY = 'GET:/accounts';
|
|
44
|
+
/**
|
|
45
|
+
* The prefix covering every option-carrying `listAccounts(opts)` variant
|
|
46
|
+
* (`?tree=true`, …), none of which a writer can enumerate.
|
|
47
|
+
*/
|
|
48
|
+
exports.OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX = 'GET:/accounts?';
|
|
49
|
+
/**
|
|
50
|
+
* Prefix covering every per-account sub-resource cache key
|
|
51
|
+
* (`GET:/accounts/<id>`, `…/members`, `…/credentials`, `…/children`). A
|
|
52
|
+
* membership mutation on an ancestor must sweep ALL of these, not only the
|
|
53
|
+
* account named in the path: descendant member rosters embed inherited rows
|
|
54
|
+
* resolved from that ancestor, and the writer cannot enumerate which descendant
|
|
55
|
+
* ids a caller has already read. The trailing slash deliberately excludes the
|
|
56
|
+
* forest list keys (`GET:/accounts`, `GET:/accounts?…`) documented above.
|
|
57
|
+
*/
|
|
58
|
+
exports.OXY_ACCOUNT_PER_ACCOUNT_CACHE_PREFIX = 'GET:/accounts/';
|
|
59
|
+
/**
|
|
60
|
+
* Build the exact cache key `getAccount(accountId)` reads under.
|
|
61
|
+
*/
|
|
62
|
+
function oxyAccountDetailCacheKey(accountId) {
|
|
63
|
+
return `GET:/accounts/${encodeURIComponent(accountId)}`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sweep an `OxyServices` GET response cache of the account forest.
|
|
67
|
+
*
|
|
68
|
+
* @param oxy - Anything exposing the SDK's two eviction methods.
|
|
69
|
+
* @param accountId - The account whose detail row to drop as well. Optional: a
|
|
70
|
+
* writer that changed the SHAPE of the forest rather than one
|
|
71
|
+
* account in it (create, archive, ownership transfer) has no
|
|
72
|
+
* detail row to name, and clears only the lists.
|
|
73
|
+
*/
|
|
74
|
+
function evictOxyAccountForestCache(oxy, accountId) {
|
|
75
|
+
oxy.clearCacheEntry(exports.OXY_ACCOUNT_LIST_CACHE_KEY);
|
|
76
|
+
oxy.clearCacheByPrefix(exports.OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX);
|
|
77
|
+
if (accountId) {
|
|
78
|
+
oxy.clearCacheEntry(oxyAccountDetailCacheKey(accountId));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared account types and pure helper functions.
|
|
4
|
+
* Used by the @oxy.so/services account stores (Expo/RN and RN-Web).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getAccountColor = exports.createQuickAccount = exports.buildAccountsArray = exports.getAccountFallbackHandle = exports.getAccountDisplayName = exports.formatPublicKeyHandle = void 0;
|
|
8
|
+
const i18n_1 = require("../i18n");
|
|
9
|
+
const userHandle_1 = require("./userHandle");
|
|
10
|
+
/**
|
|
11
|
+
* Truncate a long public key for display, e.g. `0x12345678…`.
|
|
12
|
+
* Falls back to the raw key if it's too short to truncate.
|
|
13
|
+
*/
|
|
14
|
+
const formatPublicKeyHandle = (publicKey) => {
|
|
15
|
+
const cleaned = publicKey.startsWith('0x') ? publicKey.slice(2) : publicKey;
|
|
16
|
+
if (cleaned.length <= 8)
|
|
17
|
+
return `0x${cleaned}`;
|
|
18
|
+
return `0x${cleaned.slice(0, 8)}…`;
|
|
19
|
+
};
|
|
20
|
+
exports.formatPublicKeyHandle = formatPublicKeyHandle;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve a friendly display name for a user.
|
|
23
|
+
*
|
|
24
|
+
* Order of preference:
|
|
25
|
+
* 1. `name.displayName` from the API user contract.
|
|
26
|
+
* 2. `name.full`, or composed `name.first name.last` for local unsaved shapes.
|
|
27
|
+
* 3. `name` when passed as a plain string by local non-DTO call sites.
|
|
28
|
+
* 4. pre-normalized account-row `displayName`.
|
|
29
|
+
* 5. `username`
|
|
30
|
+
* 6. `Account 0x12345678…` (derived from publicKey, when present)
|
|
31
|
+
* 7. Translated fallback (e.g. "Unnamed")
|
|
32
|
+
*
|
|
33
|
+
* The translation key `common.unnamed` is used for the final fallback. If the
|
|
34
|
+
* caller does not pass a locale, the default English translation is used.
|
|
35
|
+
*/
|
|
36
|
+
const getAccountDisplayName = (user, locale) => {
|
|
37
|
+
if (!user)
|
|
38
|
+
return (0, i18n_1.translate)(locale, 'common.unnamed');
|
|
39
|
+
const { name, displayName, username, publicKey } = user;
|
|
40
|
+
if (name && typeof name === 'object') {
|
|
41
|
+
if (typeof name.displayName === 'string' && name.displayName.trim()) {
|
|
42
|
+
return name.displayName.trim();
|
|
43
|
+
}
|
|
44
|
+
if (typeof name.full === 'string' && name.full.trim())
|
|
45
|
+
return name.full.trim();
|
|
46
|
+
const first = typeof name.first === 'string' ? name.first.trim() : '';
|
|
47
|
+
const last = typeof name.last === 'string' ? name.last.trim() : '';
|
|
48
|
+
const composed = [first, last].filter(Boolean).join(' ').trim();
|
|
49
|
+
if (composed)
|
|
50
|
+
return composed;
|
|
51
|
+
}
|
|
52
|
+
else if (typeof name === 'string' && name.trim()) {
|
|
53
|
+
return name.trim();
|
|
54
|
+
}
|
|
55
|
+
if (typeof displayName === 'string' && displayName.trim())
|
|
56
|
+
return displayName.trim();
|
|
57
|
+
if (typeof username === 'string' && username.trim())
|
|
58
|
+
return username.trim();
|
|
59
|
+
if (typeof publicKey === 'string' && publicKey.length > 0) {
|
|
60
|
+
return (0, i18n_1.translate)(locale, 'common.accountFallback', {
|
|
61
|
+
handle: (0, exports.formatPublicKeyHandle)(publicKey),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return (0, i18n_1.translate)(locale, 'common.unnamed');
|
|
65
|
+
};
|
|
66
|
+
exports.getAccountDisplayName = getAccountDisplayName;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve a `@handle` style identifier for a user.
|
|
69
|
+
*
|
|
70
|
+
* Returns the bare username when present (without the `@`), otherwise a
|
|
71
|
+
* truncated public-key handle (`0x12345678…`), or `undefined` when neither is
|
|
72
|
+
* available — callers can decide whether to hide the line entirely.
|
|
73
|
+
*/
|
|
74
|
+
const getAccountFallbackHandle = (user) => {
|
|
75
|
+
if (!user)
|
|
76
|
+
return undefined;
|
|
77
|
+
if (typeof user.username === 'string' && user.username.trim())
|
|
78
|
+
return user.username.trim();
|
|
79
|
+
if (typeof user.publicKey === 'string' && user.publicKey.length > 0) {
|
|
80
|
+
return (0, exports.formatPublicKeyHandle)(user.publicKey);
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
};
|
|
84
|
+
exports.getAccountFallbackHandle = getAccountFallbackHandle;
|
|
85
|
+
/**
|
|
86
|
+
* Build an ordered array of QuickAccounts from a map and order list.
|
|
87
|
+
*/
|
|
88
|
+
const buildAccountsArray = (accounts, order) => {
|
|
89
|
+
const result = [];
|
|
90
|
+
for (const id of order) {
|
|
91
|
+
const account = accounts[id];
|
|
92
|
+
if (account)
|
|
93
|
+
result.push(account);
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
};
|
|
97
|
+
exports.buildAccountsArray = buildAccountsArray;
|
|
98
|
+
/**
|
|
99
|
+
* Create a QuickAccount from user data returned by the API.
|
|
100
|
+
*
|
|
101
|
+
* @param sessionId - Session identifier
|
|
102
|
+
* @param userData - Raw user object from the API
|
|
103
|
+
* @param existingAccount - Previously cached account (to preserve avatarUrl if unchanged)
|
|
104
|
+
* @param getFileDownloadUrl - Function to generate avatar download URL from file ID
|
|
105
|
+
*/
|
|
106
|
+
const createQuickAccount = (sessionId, userData, existingAccount, getFileDownloadUrl) => {
|
|
107
|
+
const nameObj = userData.name && typeof userData.name === 'object' ? userData.name : undefined;
|
|
108
|
+
const apiDisplayName = typeof nameObj?.displayName === 'string' ? nameObj.displayName.trim() : '';
|
|
109
|
+
const displayName = apiDisplayName ||
|
|
110
|
+
(0, userHandle_1.getNormalizedUserHandle)(userData) ||
|
|
111
|
+
(0, exports.getAccountDisplayName)(null);
|
|
112
|
+
const userId = userData.id || (typeof userData._id === 'string' ? userData._id : userData._id?.toString());
|
|
113
|
+
// Preserve existing avatarUrl if avatar hasn't changed (prevents image reload)
|
|
114
|
+
let avatarUrl;
|
|
115
|
+
const avatar = userData.avatar ?? undefined;
|
|
116
|
+
if (existingAccount && existingAccount.avatar === avatar && existingAccount.avatarUrl) {
|
|
117
|
+
avatarUrl = existingAccount.avatarUrl;
|
|
118
|
+
}
|
|
119
|
+
else if (avatar && getFileDownloadUrl) {
|
|
120
|
+
avatarUrl = getFileDownloadUrl(avatar, 'thumb');
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
sessionId,
|
|
124
|
+
userId,
|
|
125
|
+
username: userData.username || '',
|
|
126
|
+
displayName,
|
|
127
|
+
avatar,
|
|
128
|
+
avatarUrl,
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
exports.createQuickAccount = createQuickAccount;
|
|
132
|
+
/**
|
|
133
|
+
* Return the account's preferred Bloom color preset, or `null` if it has no
|
|
134
|
+
* preference. Centralises the `color ?? null` normalisation so consumers can
|
|
135
|
+
* drive per-account theming without duplicating the nullish-handling.
|
|
136
|
+
*/
|
|
137
|
+
const getAccountColor = (account) => {
|
|
138
|
+
return account.color ?? null;
|
|
139
|
+
};
|
|
140
|
+
exports.getAccountColor = getAccountColor;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBrowserActivityIdHeader = void 0;
|
|
4
|
+
/** @deprecated Import from `@oxy.so/telemetry/browser` in new code. */
|
|
5
|
+
var browser_1 = require("@oxy.so/telemetry/browser");
|
|
6
|
+
Object.defineProperty(exports, "getBrowserActivityIdHeader", { enumerable: true, get: function () { return browser_1.getBrowserActivityIdHeader; } });
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for common API patterns
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildQueryParams = buildQueryParams;
|
|
7
|
+
exports.buildSearchParams = buildSearchParams;
|
|
8
|
+
exports.buildUrl = buildUrl;
|
|
9
|
+
exports.buildPaginationParams = buildPaginationParams;
|
|
10
|
+
exports.safeJsonParse = safeJsonParse;
|
|
11
|
+
/**
|
|
12
|
+
* Build a plain query-parameter record from an object, stringifying values and
|
|
13
|
+
* dropping `undefined`/`null` entries.
|
|
14
|
+
*
|
|
15
|
+
* This is the shape `OxyServices.makeRequest` expects for a GET's `params`:
|
|
16
|
+
* `HttpService` inspects it with `Object.keys(...)` (both to decide whether to
|
|
17
|
+
* append a query string and to build the request's cache key), and
|
|
18
|
+
* `Object.keys(new URLSearchParams({ limit: '20' }))` is `[]` — a
|
|
19
|
+
* `URLSearchParams` exposes its entries through iterator methods, never as own
|
|
20
|
+
* enumerable properties. Passing one to `makeRequest` therefore silently drops
|
|
21
|
+
* the whole query string. Always hand `makeRequest` a plain record.
|
|
22
|
+
*
|
|
23
|
+
* Generic over the input object rather than taking `Record<string, unknown>`,
|
|
24
|
+
* because a TypeScript `interface` (`PaginationParams`, `FollowGraphParams`, …)
|
|
25
|
+
* has no implicit index signature and so is not assignable to that type.
|
|
26
|
+
*/
|
|
27
|
+
function buildQueryParams(params) {
|
|
28
|
+
const query = {};
|
|
29
|
+
// Widening the value to `unknown` is always sound; the default overload of
|
|
30
|
+
// `Object.entries` would otherwise infer `any` here.
|
|
31
|
+
for (const [key, value] of Object.entries(params)) {
|
|
32
|
+
if (value !== undefined && value !== null) {
|
|
33
|
+
query[key] = String(value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return query;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build URL search parameters from an object.
|
|
40
|
+
*
|
|
41
|
+
* For building a URL string only — see {@link buildQueryParams} for the shape
|
|
42
|
+
* `makeRequest` needs.
|
|
43
|
+
*
|
|
44
|
+
* @param params Object with parameter key-value pairs
|
|
45
|
+
* @returns URLSearchParams instance
|
|
46
|
+
*/
|
|
47
|
+
function buildSearchParams(params) {
|
|
48
|
+
return new URLSearchParams(buildQueryParams(params));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build URL with search parameters
|
|
52
|
+
* @param baseUrl Base URL
|
|
53
|
+
* @param params Object with parameter key-value pairs
|
|
54
|
+
* @returns Complete URL with search parameters
|
|
55
|
+
*/
|
|
56
|
+
function buildUrl(baseUrl, params) {
|
|
57
|
+
if (!params)
|
|
58
|
+
return baseUrl;
|
|
59
|
+
const searchParams = buildSearchParams(params);
|
|
60
|
+
const queryString = searchParams.toString();
|
|
61
|
+
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build pagination query parameters.
|
|
65
|
+
*
|
|
66
|
+
* Returns a plain record — NOT a `URLSearchParams` — because that is the only
|
|
67
|
+
* shape `makeRequest`/`HttpService` can read. See {@link buildQueryParams}.
|
|
68
|
+
*
|
|
69
|
+
* @param params Pagination parameters
|
|
70
|
+
* @returns Query record with pagination
|
|
71
|
+
*/
|
|
72
|
+
function buildPaginationParams(params) {
|
|
73
|
+
return buildQueryParams(params);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Safe JSON parsing with error handling
|
|
77
|
+
* @param data Data to parse
|
|
78
|
+
* @param fallback Fallback value if parsing fails
|
|
79
|
+
* @returns Parsed data or fallback
|
|
80
|
+
*/
|
|
81
|
+
function safeJsonParse(data, fallback) {
|
|
82
|
+
if (typeof data === 'string') {
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(data);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return fallback;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async utilities for common asynchronous patterns and error handling
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.delay = void 0;
|
|
7
|
+
exports.withErrorHandling = withErrorHandling;
|
|
8
|
+
exports.parallelWithErrorHandling = parallelWithErrorHandling;
|
|
9
|
+
exports.retryAsync = retryAsync;
|
|
10
|
+
exports.debounceAsync = debounceAsync;
|
|
11
|
+
exports.throttleAsync = throttleAsync;
|
|
12
|
+
exports.sequentialWithProgress = sequentialWithProgress;
|
|
13
|
+
exports.batchAsync = batchAsync;
|
|
14
|
+
exports.createCancellableAsync = createCancellableAsync;
|
|
15
|
+
exports.withTimeout = withTimeout;
|
|
16
|
+
exports.withLoadingState = withLoadingState;
|
|
17
|
+
exports.retryOnError = retryOnError;
|
|
18
|
+
const logger_1 = require("../logger");
|
|
19
|
+
/**
|
|
20
|
+
* Wrapper for async operations with automatic error handling
|
|
21
|
+
* Returns null on error instead of throwing
|
|
22
|
+
*/
|
|
23
|
+
async function withErrorHandling(operation, errorHandler, context) {
|
|
24
|
+
try {
|
|
25
|
+
return await operation();
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (errorHandler) {
|
|
29
|
+
errorHandler(error);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
logger_1.logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
|
|
33
|
+
component: 'asyncUtils',
|
|
34
|
+
method: 'withErrorHandling',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Execute multiple async operations in parallel with error handling
|
|
42
|
+
*/
|
|
43
|
+
async function parallelWithErrorHandling(operations, errorHandler) {
|
|
44
|
+
const results = await Promise.allSettled(operations.map((op, index) => withErrorHandling(op, error => errorHandler?.(error, index))));
|
|
45
|
+
return results.map(result => result.status === 'fulfilled' ? result.value : null);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract an HTTP status code from an error value, tolerating both the
|
|
49
|
+
* axios-style nested shape (`error.response.status`) and the flat shape
|
|
50
|
+
* produced by {@link handleHttpError} / fetch-based clients (`error.status`).
|
|
51
|
+
*
|
|
52
|
+
* Centralising this lookup prevents retry predicates from silently falling
|
|
53
|
+
* through when one of the two shapes is missing, which previously caused
|
|
54
|
+
* @oxy.so/core to retry 4xx responses and turn sub-10ms failures into
|
|
55
|
+
* multi-second stalls for every missing-resource lookup.
|
|
56
|
+
*/
|
|
57
|
+
function extractHttpStatus(error) {
|
|
58
|
+
if (!error || typeof error !== 'object')
|
|
59
|
+
return undefined;
|
|
60
|
+
const candidate = error;
|
|
61
|
+
const flat = candidate.status;
|
|
62
|
+
if (typeof flat === 'number' && Number.isFinite(flat))
|
|
63
|
+
return flat;
|
|
64
|
+
const nested = candidate.response?.status;
|
|
65
|
+
if (typeof nested === 'number' && Number.isFinite(nested))
|
|
66
|
+
return nested;
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Retry an async operation with exponential backoff
|
|
71
|
+
*
|
|
72
|
+
* By default, does not retry on 4xx errors (client errors). The default
|
|
73
|
+
* predicate accepts both the axios-style `error.response.status` and the
|
|
74
|
+
* flat `error.status` shape produced by {@link handleHttpError}, so callers
|
|
75
|
+
* never accidentally retry a deterministic client failure.
|
|
76
|
+
*
|
|
77
|
+
* Use the `shouldRetry` callback to customize retry behavior.
|
|
78
|
+
*/
|
|
79
|
+
async function retryAsync(operation, maxRetries = 3, baseDelay = 1000, shouldRetry) {
|
|
80
|
+
let lastError;
|
|
81
|
+
// Default shouldRetry: don't retry on 4xx errors (client errors).
|
|
82
|
+
// Checks BOTH `error.status` (flat shape from handleHttpError / fetch
|
|
83
|
+
// clients) AND `error.response.status` (axios-style shape) so neither
|
|
84
|
+
// representation can leak a client error into the retry loop.
|
|
85
|
+
const defaultShouldRetry = (error) => {
|
|
86
|
+
const status = extractHttpStatus(error);
|
|
87
|
+
if (status !== undefined && status >= 400 && status < 500) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
};
|
|
92
|
+
const retryCheck = shouldRetry || defaultShouldRetry;
|
|
93
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
94
|
+
try {
|
|
95
|
+
return await operation();
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
lastError = error;
|
|
99
|
+
if (attempt === maxRetries) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
if (!retryCheck(error)) {
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
// Calculate delay with exponential backoff and jitter
|
|
106
|
+
const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
|
|
107
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw lastError;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Debounce async function calls
|
|
114
|
+
*/
|
|
115
|
+
function debounceAsync(func, delay) {
|
|
116
|
+
let timeoutId;
|
|
117
|
+
return (...args) => {
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
clearTimeout(timeoutId);
|
|
120
|
+
timeoutId = setTimeout(async () => {
|
|
121
|
+
try {
|
|
122
|
+
const result = await func(...args);
|
|
123
|
+
resolve(result);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
reject(error);
|
|
127
|
+
}
|
|
128
|
+
}, delay);
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Throttle async function calls
|
|
134
|
+
*/
|
|
135
|
+
function throttleAsync(func, limit, interval) {
|
|
136
|
+
let inThrottle = false;
|
|
137
|
+
let lastPromise = null;
|
|
138
|
+
return (...args) => {
|
|
139
|
+
if (inThrottle) {
|
|
140
|
+
return lastPromise;
|
|
141
|
+
}
|
|
142
|
+
inThrottle = true;
|
|
143
|
+
lastPromise = func(...args);
|
|
144
|
+
setTimeout(() => {
|
|
145
|
+
inThrottle = false;
|
|
146
|
+
}, interval);
|
|
147
|
+
return lastPromise;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Execute async operations sequentially with progress tracking
|
|
152
|
+
*/
|
|
153
|
+
async function sequentialWithProgress(operations, onProgress) {
|
|
154
|
+
const results = [];
|
|
155
|
+
for (let i = 0; i < operations.length; i++) {
|
|
156
|
+
const result = await operations[i]();
|
|
157
|
+
results.push(result);
|
|
158
|
+
onProgress?.(i + 1, operations.length);
|
|
159
|
+
}
|
|
160
|
+
return results;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Batch async operations
|
|
164
|
+
*/
|
|
165
|
+
async function batchAsync(items, batchSize, processor) {
|
|
166
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
167
|
+
const batch = items.slice(i, i + batchSize);
|
|
168
|
+
await processor(batch);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a cancellable async operation
|
|
173
|
+
*/
|
|
174
|
+
function createCancellableAsync(operation) {
|
|
175
|
+
let abortController = null;
|
|
176
|
+
return {
|
|
177
|
+
execute: async () => {
|
|
178
|
+
abortController = new AbortController();
|
|
179
|
+
return await operation(abortController.signal);
|
|
180
|
+
},
|
|
181
|
+
cancel: () => {
|
|
182
|
+
abortController?.abort();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Timeout wrapper for async operations
|
|
188
|
+
*/
|
|
189
|
+
async function withTimeout(operation, timeoutMs, timeoutMessage) {
|
|
190
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
191
|
+
setTimeout(() => {
|
|
192
|
+
reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));
|
|
193
|
+
}, timeoutMs);
|
|
194
|
+
});
|
|
195
|
+
return Promise.race([operation, timeoutPromise]);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Execute async operation with loading state
|
|
199
|
+
*/
|
|
200
|
+
async function withLoadingState(operation, setLoading) {
|
|
201
|
+
setLoading(true);
|
|
202
|
+
try {
|
|
203
|
+
return await operation();
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
setLoading(false);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Create a promise that resolves after a delay
|
|
211
|
+
*/
|
|
212
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
213
|
+
exports.delay = delay;
|
|
214
|
+
/**
|
|
215
|
+
* Execute async operation with retry on specific errors
|
|
216
|
+
*/
|
|
217
|
+
async function retryOnError(operation, retryableErrors, maxRetries = 3) {
|
|
218
|
+
return retryAsync(operation, maxRetries, 1000, (error) => {
|
|
219
|
+
const errorCode = error?.code || error?.status || error?.message;
|
|
220
|
+
return retryableErrors.includes(errorCode);
|
|
221
|
+
});
|
|
222
|
+
}
|