@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,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified HTTP Service
|
|
3
|
+
*
|
|
4
|
+
* Consolidates HttpClient + RequestManager into a single efficient class.
|
|
5
|
+
* Uses native fetch instead of axios for smaller bundle size.
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - Authentication (token management, auto-refresh)
|
|
9
|
+
* - Caching (TTL-based)
|
|
10
|
+
* - Deduplication (concurrent requests)
|
|
11
|
+
* - Retry logic
|
|
12
|
+
* - Error handling
|
|
13
|
+
* - Request queuing
|
|
14
|
+
*/
|
|
15
|
+
import type { OxyConfig } from './models/interfaces';
|
|
16
|
+
import type { DeviceSecretMintOutcome } from './session/refresh';
|
|
17
|
+
export type AuthRefreshReason = 'preflight' | 'response-401';
|
|
18
|
+
export type AuthRefreshHandler = (reason: AuthRefreshReason) => Promise<string | null>;
|
|
19
|
+
export type AccessTokenProvider = () => string | null;
|
|
20
|
+
/**
|
|
21
|
+
* A low-level authenticated request whose response body remains unread.
|
|
22
|
+
*
|
|
23
|
+
* This is intended for streaming protocols such as SSE. The body must already
|
|
24
|
+
* be serialised so it can be replayed once after an access-token refresh.
|
|
25
|
+
*/
|
|
26
|
+
export interface AuthenticatedResponseRequest {
|
|
27
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
28
|
+
url: string;
|
|
29
|
+
body?: string;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
}
|
|
33
|
+
export interface RequestOptions {
|
|
34
|
+
cache?: boolean;
|
|
35
|
+
cacheTTL?: number;
|
|
36
|
+
deduplicate?: boolean;
|
|
37
|
+
retry?: boolean;
|
|
38
|
+
maxRetries?: number;
|
|
39
|
+
timeout?: number;
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
headers?: Record<string, string>;
|
|
42
|
+
responseType?: 'blob';
|
|
43
|
+
/**
|
|
44
|
+
* Skip BOTH the bearer auth header (and its near-expiry preflight refresh)
|
|
45
|
+
* AND the 401-driven auto-refresh/retry for this request.
|
|
46
|
+
*
|
|
47
|
+
* Required for the body-authenticated device-secret mint (`POST
|
|
48
|
+
* /session/device/token`): it does not need a bearer, and — critically — it is
|
|
49
|
+
* itself invoked from inside the registered `AuthRefreshHandler`. If it went
|
|
50
|
+
* through the normal preflight, `getAuthHeader` would call
|
|
51
|
+
* `refreshAccessToken` while the handler-owning `tokenRefreshPromise` is
|
|
52
|
+
* still in flight and await ITSELF (deadlock). Skipping auth makes the
|
|
53
|
+
* mint call fully independent of the current (near-expired) bearer.
|
|
54
|
+
*/
|
|
55
|
+
skipAuth?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Execute this request WITHOUT taking a `RequestQueue` slot — run it directly.
|
|
58
|
+
*
|
|
59
|
+
* A queue slot represents network occupancy for ordinary DATA requests. The
|
|
60
|
+
* CONTROL-PLANE calls the auth lane depends on (the device-secret mint, `POST
|
|
61
|
+
* /session/device/token`, reached from `getAuthHeader` → `refreshAccessToken`)
|
|
62
|
+
* must never compete for a slot: when `maxConcurrentRequests` requests are all
|
|
63
|
+
* parked awaiting that very mint, a queued mint could never acquire a slot to
|
|
64
|
+
* run — a systemic deadlock. `bypassQueue` lets the mint run even when the
|
|
65
|
+
* queue is saturated. (The auth preflight is also resolved OUTSIDE the slot in
|
|
66
|
+
* `request()`, so ordinary requests never hold a slot while awaiting the mint;
|
|
67
|
+
* this flag is the explicit guarantee for the mint itself.)
|
|
68
|
+
*/
|
|
69
|
+
bypassQueue?: boolean;
|
|
70
|
+
}
|
|
71
|
+
interface RequestConfig extends RequestOptions {
|
|
72
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
73
|
+
url: string;
|
|
74
|
+
data?: unknown;
|
|
75
|
+
params?: Record<string, unknown>;
|
|
76
|
+
/** @internal Used to prevent infinite auth retry loops */
|
|
77
|
+
_isAuthRetry?: boolean;
|
|
78
|
+
/** @internal Used to prevent infinite CSRF retry loops */
|
|
79
|
+
_isCsrfRetry?: boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Unified HTTP Service
|
|
83
|
+
*
|
|
84
|
+
* Consolidates HttpClient + RequestManager into a single efficient class.
|
|
85
|
+
* Uses native fetch instead of axios for smaller bundle size.
|
|
86
|
+
*/
|
|
87
|
+
export declare class HttpService {
|
|
88
|
+
private baseURL;
|
|
89
|
+
private tokenStore;
|
|
90
|
+
private cache;
|
|
91
|
+
/**
|
|
92
|
+
* When true, the per-instance GET response cache is OFF: GET responses are
|
|
93
|
+
* never read from nor written to {@link cache}, so every request hits the
|
|
94
|
+
* network. Set from `config.enableCache === false` OR `config.cacheTTL <= 0`.
|
|
95
|
+
* A disabled instance does not register its cache for the global cleanup
|
|
96
|
+
* interval (nothing ever lands in it). Request deduplication is unaffected —
|
|
97
|
+
* concurrent identical in-flight requests still collapse into one.
|
|
98
|
+
*/
|
|
99
|
+
private readonly cacheDisabled;
|
|
100
|
+
private deduplicator;
|
|
101
|
+
private requestQueue;
|
|
102
|
+
private logger;
|
|
103
|
+
private config;
|
|
104
|
+
private tokenRefreshPromise;
|
|
105
|
+
/**
|
|
106
|
+
* Epoch ms of the last FAILED refresh (0 = none since the last success). The
|
|
107
|
+
* post-failure cooldown is measured from here; its length depends on whether
|
|
108
|
+
* the current token is still valid ({@link TOKEN_REFRESH_COOLDOWN_MS}) or
|
|
109
|
+
* already expired ({@link EXPIRED_TOKEN_REFRESH_COOLDOWN_MS}), so an expired
|
|
110
|
+
* token recovers promptly the instant it crosses `exp` — without storing a
|
|
111
|
+
* fixed deadline that could not shrink once the token expired mid-cooldown.
|
|
112
|
+
*/
|
|
113
|
+
private lastRefreshFailureAt;
|
|
114
|
+
private authRefreshHandler;
|
|
115
|
+
private accessTokenProvider;
|
|
116
|
+
private deviceSecretMintInFlight;
|
|
117
|
+
/**
|
|
118
|
+
* Epoch (ms) before which a cache-size telemetry warning must not be
|
|
119
|
+
* re-emitted. Throttles the {@link CACHE_SOFT_MAX_ENTRIES} warning to at most
|
|
120
|
+
* one per {@link CACHE_SIZE_WARNING_THROTTLE_MS} window.
|
|
121
|
+
*/
|
|
122
|
+
private cacheSizeWarningSilentUntil;
|
|
123
|
+
/**
|
|
124
|
+
* Fan-out listeners notified on EVERY access-token change on this instance:
|
|
125
|
+
* explicit `setTokens`, `clearTokens`, a refresh-handler rotation, and the
|
|
126
|
+
* internal 401-driven clear. This is a Set so multiple independent observers
|
|
127
|
+
* can mirror token state without clobbering each other.
|
|
128
|
+
*
|
|
129
|
+
* Each listener receives the resulting access token, or `null` when cleared.
|
|
130
|
+
*/
|
|
131
|
+
private _tokenChangeListeners;
|
|
132
|
+
private requestMetrics;
|
|
133
|
+
constructor(config: OxyConfig);
|
|
134
|
+
private syncAccessTokenFromProvider;
|
|
135
|
+
/**
|
|
136
|
+
* Robust FormData detection that works in browser, React Native, and
|
|
137
|
+
* Node.js polyfill environments.
|
|
138
|
+
*
|
|
139
|
+
* Why we don't use `instanceof FormData` alone:
|
|
140
|
+
* - React Native's FormData is a separate class, not the browser one —
|
|
141
|
+
* `instanceof FormData` is true only inside the JS runtime that
|
|
142
|
+
* instantiated the value (browser-side polyfills also have their own).
|
|
143
|
+
* - The Node.js `form-data` polyfill ships its own constructor.
|
|
144
|
+
*
|
|
145
|
+
* Why we explicitly reject `URLSearchParams`:
|
|
146
|
+
* - `URLSearchParams` ALSO exposes `append` / `get` / `has`, so the
|
|
147
|
+
* duck-type fallback below would have misidentified it as FormData and
|
|
148
|
+
* sent an empty multipart body.
|
|
149
|
+
* - It has its own encoding path instead — see {@link isUrlSearchParams}.
|
|
150
|
+
*/
|
|
151
|
+
private isFormData;
|
|
152
|
+
/**
|
|
153
|
+
* True for an `application/x-www-form-urlencoded` payload.
|
|
154
|
+
*
|
|
155
|
+
* Needed because a handful of endpoints are defined by a standard that fixes
|
|
156
|
+
* their request encoding rather than by our own JSON conventions — today
|
|
157
|
+
* `POST /auth/oauth/token`, whose encoding RFC 6749 §4.1.3 mandates. Passing
|
|
158
|
+
* a `URLSearchParams` as `data` selects that encoding; everything else is
|
|
159
|
+
* still JSON.
|
|
160
|
+
*/
|
|
161
|
+
private isUrlSearchParams;
|
|
162
|
+
/**
|
|
163
|
+
* Main request method - handles everything in one place
|
|
164
|
+
*/
|
|
165
|
+
request<T = unknown>(config: RequestConfig): Promise<T>;
|
|
166
|
+
/**
|
|
167
|
+
* Soft cache-size guard. Emits a single throttled telemetry warning when the
|
|
168
|
+
* identity-scoped response cache grows past {@link CACHE_SOFT_MAX_ENTRIES}.
|
|
169
|
+
*
|
|
170
|
+
* This intentionally does NOT evict: the {@link TTLCache} already bounds
|
|
171
|
+
* memory by TTL (and the global cleanup interval sweeps expired entries), so
|
|
172
|
+
* an LRU here would only risk thrashing a legitimately warm cache. The point
|
|
173
|
+
* is observability — if entry count climbs and stays high, an identity tag or
|
|
174
|
+
* cache key is folding in volatile data (a per-request nonce, an undecodable
|
|
175
|
+
* rotating token) and the cache is no longer doing its job. Surfacing that via
|
|
176
|
+
* the logger lets a consumer with `enableLogging` catch the regression in the
|
|
177
|
+
* field instead of debugging silent memory growth.
|
|
178
|
+
*/
|
|
179
|
+
private warnIfCacheOversized;
|
|
180
|
+
/**
|
|
181
|
+
* Upload via XMLHttpRequest (React Native FormData workaround).
|
|
182
|
+
*
|
|
183
|
+
* Expo SDK 56's "winter fetch" cannot serialize RN file descriptors
|
|
184
|
+
* (`{uri, type, name}`) — `convertFormDataAsync` rejects them as
|
|
185
|
+
* `Unsupported FormDataPart implementation`. RN's native XHR streams
|
|
186
|
+
* the file from disk correctly, so multipart uploads go through XHR
|
|
187
|
+
* on RN only.
|
|
188
|
+
*
|
|
189
|
+
* Returns a standard `Response` so downstream parsing in `request()`
|
|
190
|
+
* (status checks, 401/403 retries, JSON/blob/text parsing) is identical
|
|
191
|
+
* to the fetch path.
|
|
192
|
+
*/
|
|
193
|
+
private uploadViaXHR;
|
|
194
|
+
/**
|
|
195
|
+
* Parse raw header string from `XMLHttpRequest.getAllResponseHeaders()`
|
|
196
|
+
* into a `Headers`-compatible object.
|
|
197
|
+
*/
|
|
198
|
+
private static parseXHRHeaders;
|
|
199
|
+
/**
|
|
200
|
+
* Delimiter that separates the logical `method:url[:data]` portion of a
|
|
201
|
+
* cache key from its identity suffix. Always APPENDED, never used to parse
|
|
202
|
+
* a key apart, so the `method:url` prefix stays intact for
|
|
203
|
+
* `clearCacheByPrefix` sweeps and `clearCacheEntry` base-key matching.
|
|
204
|
+
* The `clearCacheEntry` callsites all pass fixed, dataless logical keys
|
|
205
|
+
* (`GET:/users/<id>`, `GET:/session/user/<sessionId>`,
|
|
206
|
+
* `GET:/auth/grants`), so this readable suffix can never be
|
|
207
|
+
* ambiguous with a serialized request body.
|
|
208
|
+
*/
|
|
209
|
+
private static readonly CACHE_IDENTITY_DELIM;
|
|
210
|
+
/**
|
|
211
|
+
* The keys whose presence beside `data` makes a body a PAGE rather than a
|
|
212
|
+
* payload — see {@link unwrapResponse} for why this list is narrow.
|
|
213
|
+
*
|
|
214
|
+
* - `pagination` — the offset-paginated house envelope (`sendPaginated`).
|
|
215
|
+
* - `nextCursor` — the keyset-paginated one (the account audit trails).
|
|
216
|
+
*
|
|
217
|
+
* Membership is decided by key PRESENCE, never by value: the last page sends
|
|
218
|
+
* `nextCursor: null`, and an envelope that collapsed into a bare payload
|
|
219
|
+
* exactly when the stream ended would be a worse bug than the one this fixes.
|
|
220
|
+
*/
|
|
221
|
+
private static readonly PAGE_ENVELOPE_KEYS;
|
|
222
|
+
/**
|
|
223
|
+
* Derive a stable, non-sensitive identity discriminator for cache scoping.
|
|
224
|
+
*
|
|
225
|
+
* Thin instance wrapper over the pure {@link computeIdentityTag} helper —
|
|
226
|
+
* binds it to this instance's live access token. See that function's docs for
|
|
227
|
+
* the full resolution contract (anon fallback, decoded `userId || id`,
|
|
228
|
+
* token-hash fallback for undecodable tokens).
|
|
229
|
+
*/
|
|
230
|
+
private computeIdentityTag;
|
|
231
|
+
/**
|
|
232
|
+
* Generate cache key efficiently
|
|
233
|
+
* Uses a content-addressed hash for large payloads so two requests with
|
|
234
|
+
* the same shape but different values never collide on the same key
|
|
235
|
+
* (which would silently serve stale data — e.g. paginated search results,
|
|
236
|
+
* large object updates).
|
|
237
|
+
*
|
|
238
|
+
* The key is identity-scoped: the logical `method:url[:data]` portion is
|
|
239
|
+
* suffixed with ` id=<identityTag>` so two callers with different
|
|
240
|
+
* identities (anon vs authed, or two different users) never share an entry.
|
|
241
|
+
* The identity tag is placed at the END so the key still STARTS with
|
|
242
|
+
* `method:url`, preserving the prefix-based invalidation in
|
|
243
|
+
* `clearCacheByPrefix` (e.g. `GET:/session/user/`) and the base-key matching
|
|
244
|
+
* in `clearCacheEntry`.
|
|
245
|
+
*/
|
|
246
|
+
private generateCacheKey;
|
|
247
|
+
/**
|
|
248
|
+
* Build the identity-agnostic portion of a cache key (`method:url[:data]`).
|
|
249
|
+
* Kept separate so identity scoping is applied in exactly one place
|
|
250
|
+
* (`generateCacheKey`) and cannot drift between the cache and dedupe paths.
|
|
251
|
+
*/
|
|
252
|
+
private generateBaseCacheKey;
|
|
253
|
+
/**
|
|
254
|
+
* Build full URL with query params
|
|
255
|
+
*/
|
|
256
|
+
private buildURL;
|
|
257
|
+
private getCredentialsMode;
|
|
258
|
+
private shouldSendCredentials;
|
|
259
|
+
/**
|
|
260
|
+
* Fetch CSRF token from server (with deduplication)
|
|
261
|
+
* Required for state-changing requests (POST, PUT, PATCH, DELETE)
|
|
262
|
+
*/
|
|
263
|
+
private fetchCsrfToken;
|
|
264
|
+
/**
|
|
265
|
+
* Get auth header with automatic token refresh
|
|
266
|
+
*/
|
|
267
|
+
private getAuthHeader;
|
|
268
|
+
refreshAccessToken(reason: AuthRefreshReason): Promise<string | null>;
|
|
269
|
+
/**
|
|
270
|
+
* Whether the CURRENT stored access token is already past its `exp`. Drives
|
|
271
|
+
* the shorter post-failure refresh cooldown ({@link EXPIRED_TOKEN_REFRESH_COOLDOWN_MS}):
|
|
272
|
+
* a still-valid (near-expiry) token can wait out the full cooldown, but an
|
|
273
|
+
* expired one must re-mint promptly. Returns `false` for an absent or
|
|
274
|
+
* opaque/no-`exp` token — no proof it is expired, so keep the conservative
|
|
275
|
+
* (longer) cooldown and avoid an unnecessary retry loop.
|
|
276
|
+
*/
|
|
277
|
+
private isAccessTokenExpired;
|
|
278
|
+
/**
|
|
279
|
+
* PROCESS-WIDE single-flight for the rotating device-secret mint
|
|
280
|
+
* (`POST /session/device/token`).
|
|
281
|
+
*
|
|
282
|
+
* The server rotates the presented `deviceSecret` on every successful mint, so
|
|
283
|
+
* two concurrent mints would double-rotate and the durable store could end up
|
|
284
|
+
* holding a superseded secret → a later cold-boot mint 401s → the user is
|
|
285
|
+
* signed out. Every mint lane (the re-mint handler behind `refreshAccessToken`,
|
|
286
|
+
* the device-first cold boot, the socket token transport, the tab-focus
|
|
287
|
+
* reconcile) funnels its `refreshDeviceSecretArm` call through here, so
|
|
288
|
+
* concurrent callers await the SAME in-flight mint and all receive its result —
|
|
289
|
+
* exactly one server rotation.
|
|
290
|
+
*
|
|
291
|
+
* Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
|
|
292
|
+
* handler incl. the native shared-key arm + the failure cooldown): this inner
|
|
293
|
+
* guard serializes the rotation itself across BOTH the handler and the
|
|
294
|
+
* handler-independent cold boot, which never runs through `refreshAccessToken`.
|
|
295
|
+
*/
|
|
296
|
+
runSingleFlightDeviceSecretMint(mint: () => Promise<DeviceSecretMintOutcome>): Promise<DeviceSecretMintOutcome>;
|
|
297
|
+
/**
|
|
298
|
+
* Unwrap the standardized API response envelope — EXCEPT when the envelope is
|
|
299
|
+
* a page, in which case it travels whole.
|
|
300
|
+
*
|
|
301
|
+
* `{ data: <payload> }` is the house success envelope (`sendSuccess`), and
|
|
302
|
+
* reducing it to `<payload>` is what every call site in the SDK expects. But
|
|
303
|
+
* the reduction DISCARDS every sibling key, silently, and a page's siblings
|
|
304
|
+
* are the only thing that says where the next page starts. That is how
|
|
305
|
+
* `GET /accounts/:id/audit` lost its `nextCursor`: the caller received a bare
|
|
306
|
+
* array, `getNextPageParam` read `undefined`, and pagination was dead past the
|
|
307
|
+
* first page with nothing to show that it was.
|
|
308
|
+
*
|
|
309
|
+
* ## Why the rule is narrow, and not "any sibling key survives"
|
|
310
|
+
*
|
|
311
|
+
* "An object carrying `data` plus anything else is not an envelope" is the
|
|
312
|
+
* tempting general rule, and it is wrong here: this API already answers
|
|
313
|
+
* `{ data, count }` on ~15 routes, plus `{ data, source }`, `{ data, reason }`
|
|
314
|
+
* and `{ data, credentialRevoked }`, and a dozen measured Console call sites
|
|
315
|
+
* type those as the bare payload (`Array<ProviderConnection>`,
|
|
316
|
+
* `AccountBillingState | null`, …). Preserving those envelopes would hand every
|
|
317
|
+
* one of them an object where it expects its payload — at runtime only, since
|
|
318
|
+
* the response type is a call-site assertion. So the rule names PAGINATION
|
|
319
|
+
* specifically: `data` beside {@link PAGE_ENVELOPE_KEYS} is a page.
|
|
320
|
+
*
|
|
321
|
+
* A route whose sibling key genuinely matters to its caller belongs in that
|
|
322
|
+
* list, or should not be a sibling of `data` at all — the cursor-paginated
|
|
323
|
+
* surfaces already in the SDK (`{ follows, nextCursor }`,
|
|
324
|
+
* `{ records, nextCursor }`) sidestep this by never using `data`.
|
|
325
|
+
*/
|
|
326
|
+
private unwrapResponse;
|
|
327
|
+
/**
|
|
328
|
+
* Update request metrics
|
|
329
|
+
*/
|
|
330
|
+
private updateMetrics;
|
|
331
|
+
/**
|
|
332
|
+
* Send an authenticated request without consuming its response body.
|
|
333
|
+
*
|
|
334
|
+
* Regular {@link request} calls parse the body before returning. Streaming
|
|
335
|
+
* consumers instead need the original `Response`, while retaining the same
|
|
336
|
+
* token ownership and one-time 401 refresh behaviour as every SDK request.
|
|
337
|
+
* No SDK timeout is installed after the connection opens: the caller-owned
|
|
338
|
+
* abort signal defines the lifetime of a healthy stream.
|
|
339
|
+
*/
|
|
340
|
+
requestAuthenticatedResponse(config: AuthenticatedResponseRequest): Promise<Response>;
|
|
341
|
+
private requestAuthenticatedResponseAttempt;
|
|
342
|
+
get<T = unknown>(url: string, config?: Omit<RequestConfig, 'method' | 'url'>): Promise<T>;
|
|
343
|
+
post<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<T>;
|
|
344
|
+
put<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<T>;
|
|
345
|
+
patch<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<T>;
|
|
346
|
+
delete<T = unknown>(url: string, config?: Omit<RequestConfig, 'method' | 'url'>): Promise<T>;
|
|
347
|
+
setTokens(accessToken: string): void;
|
|
348
|
+
setAuthRefreshHandler(handler: AuthRefreshHandler | null): void;
|
|
349
|
+
setAccessTokenProvider(provider: AccessTokenProvider | null): void;
|
|
350
|
+
clearTokens(): void;
|
|
351
|
+
/**
|
|
352
|
+
* Subscribe to access-token changes on this instance.
|
|
353
|
+
*
|
|
354
|
+
* Fires on every mutation of the access token — `setTokens`, `clearTokens`,
|
|
355
|
+
* a successful silent refresh, and the internal 401-driven clear — passing
|
|
356
|
+
* the resulting token (or `null` when cleared). Returns an unsubscribe
|
|
357
|
+
* function; call it on teardown to avoid leaks.
|
|
358
|
+
*
|
|
359
|
+
* This is the single hook downstream code (e.g. @oxy.so/services' OxyProvider)
|
|
360
|
+
* uses to keep an external token sink — such as the shared `oxyClient`
|
|
361
|
+
* singleton — in lockstep with the active session, regardless of which code
|
|
362
|
+
* path mutated the token.
|
|
363
|
+
*/
|
|
364
|
+
addTokenChangeListener(listener: (accessToken: string | null) => void): () => void;
|
|
365
|
+
/**
|
|
366
|
+
* Notify all token-change listeners with the current access token.
|
|
367
|
+
* Listener exceptions are isolated so one bad subscriber cannot break token
|
|
368
|
+
* propagation to the others or to the calling auth flow.
|
|
369
|
+
* @internal
|
|
370
|
+
*/
|
|
371
|
+
private notifyTokenChange;
|
|
372
|
+
getAccessToken(): string | null;
|
|
373
|
+
hasAccessToken(): boolean;
|
|
374
|
+
getBaseURL(): string;
|
|
375
|
+
clearCache(): void;
|
|
376
|
+
/**
|
|
377
|
+
* Delete a cache entry by its LOGICAL key (`method:url[:data]`).
|
|
378
|
+
*
|
|
379
|
+
* Because the response cache is identity-scoped — stored keys carry an
|
|
380
|
+
* ` id=<identityTag>` suffix — a caller passing the logical key
|
|
381
|
+
* `GET:/users/<id>` must invalidate that resource for EVERY identity that
|
|
382
|
+
* cached it (e.g. `updateProfile` busting a user representation that may be
|
|
383
|
+
* cached under both the owner's id and a viewer's id). We therefore delete
|
|
384
|
+
* the exact key (for any pre-existing un-suffixed entries) AND every
|
|
385
|
+
* identity-scoped variant `<key> id=*`.
|
|
386
|
+
*/
|
|
387
|
+
clearCacheEntry(key: string): void;
|
|
388
|
+
/**
|
|
389
|
+
* Delete every cache entry whose key starts with `prefix`.
|
|
390
|
+
*
|
|
391
|
+
* Used by mutations that don't know the exact downstream cache keys —
|
|
392
|
+
* e.g. `updateProfile` invalidating all `GET:/session/user/*` entries
|
|
393
|
+
* without having to track every active session ID. Returns the number of
|
|
394
|
+
* deleted entries (for observability in tests).
|
|
395
|
+
*/
|
|
396
|
+
clearCacheByPrefix(prefix: string): number;
|
|
397
|
+
getCacheStats(): {
|
|
398
|
+
size: number;
|
|
399
|
+
hits: number;
|
|
400
|
+
misses: number;
|
|
401
|
+
hitRate: number;
|
|
402
|
+
};
|
|
403
|
+
getMetrics(): {
|
|
404
|
+
totalRequests: number;
|
|
405
|
+
successfulRequests: number;
|
|
406
|
+
failedRequests: number;
|
|
407
|
+
cacheHits: number;
|
|
408
|
+
cacheMisses: number;
|
|
409
|
+
averageResponseTime: number;
|
|
410
|
+
};
|
|
411
|
+
__resetTokensForTests(): void;
|
|
412
|
+
}
|
|
413
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { OxyConfig as OxyConfigBase } from './models/interfaces';
|
|
2
|
+
import { HttpService, type RequestOptions } from './HttpService';
|
|
3
|
+
export interface OxyConfig extends OxyConfigBase {
|
|
4
|
+
cloudURL?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface LinkedHttpClient {
|
|
7
|
+
client: HttpService;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Base class for OxyServices with core infrastructure
|
|
12
|
+
*/
|
|
13
|
+
export declare class OxyServicesBase {
|
|
14
|
+
httpService: HttpService;
|
|
15
|
+
cloudURL: string;
|
|
16
|
+
config: OxyConfig;
|
|
17
|
+
constructor(...args: any[]);
|
|
18
|
+
__resetTokensForTests(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Make a request with all performance optimizations
|
|
21
|
+
* This is the main method for all API calls - ensures authentication and performance features
|
|
22
|
+
*/
|
|
23
|
+
makeRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', url: string, data?: any, options?: RequestOptions): Promise<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the configured Oxy API base URL
|
|
26
|
+
*/
|
|
27
|
+
getBaseURL(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get the HTTP service instance
|
|
30
|
+
* Useful for advanced use cases where direct access to the HTTP service is needed
|
|
31
|
+
*/
|
|
32
|
+
getClient(): HttpService;
|
|
33
|
+
/**
|
|
34
|
+
* Create an app/backend HTTP client linked to this Oxy session.
|
|
35
|
+
*
|
|
36
|
+
* Use this when an app has its own API origin (for example
|
|
37
|
+
* `https://api.syra.fm`) but authentication is owned by the canonical
|
|
38
|
+
* OxyServices instance mounted in OxyProvider. The returned client has its own
|
|
39
|
+
* base URL, cache and request queue, but its bearer token is kept in lockstep
|
|
40
|
+
* with this session and its 401 refresh path delegates back to this session.
|
|
41
|
+
*
|
|
42
|
+
* **GET response caching is OFF by default for linked clients.** The SDK's
|
|
43
|
+
* per-instance GET cache is only safe where the SDK OWNS invalidation: on the
|
|
44
|
+
* canonical OxyServices client, every mutation (`updateProfile`, `followUser`,
|
|
45
|
+
* `blockUser`, …) busts the matching cached GET. A linked client targets the
|
|
46
|
+
* consuming app's OWN backend (`api.mention.earth`, `api.syra.fm`, …), whose
|
|
47
|
+
* resources and write endpoints the SDK has no knowledge of — so it cannot
|
|
48
|
+
* invalidate them, and a cached GET there would silently serve stale data
|
|
49
|
+
* after the app mutates its own data. Caching is therefore unsafe-by-construction
|
|
50
|
+
* here and is left to the consumer's own layer (React Query / stores), which
|
|
51
|
+
* owns its invalidation. Pass `createLinkedClient({ baseURL, enableCache: true })`
|
|
52
|
+
* to explicitly opt back in when the consumer accepts that responsibility.
|
|
53
|
+
*/
|
|
54
|
+
createLinkedClient(config: OxyConfig): LinkedHttpClient;
|
|
55
|
+
/**
|
|
56
|
+
* Get performance metrics
|
|
57
|
+
*/
|
|
58
|
+
getMetrics(): {
|
|
59
|
+
totalRequests: number;
|
|
60
|
+
successfulRequests: number;
|
|
61
|
+
failedRequests: number;
|
|
62
|
+
cacheHits: number;
|
|
63
|
+
cacheMisses: number;
|
|
64
|
+
averageResponseTime: number;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Clear request cache
|
|
68
|
+
*/
|
|
69
|
+
clearCache(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Clear specific cache entry
|
|
72
|
+
*/
|
|
73
|
+
clearCacheEntry(key: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Clear every cache entry whose key starts with `prefix`.
|
|
76
|
+
* Useful for mutations that invalidate a family of GET responses
|
|
77
|
+
* without enumerating each one (e.g. all session-user lookups after
|
|
78
|
+
* a profile update).
|
|
79
|
+
*/
|
|
80
|
+
clearCacheByPrefix(prefix: string): number;
|
|
81
|
+
/**
|
|
82
|
+
* Get cache statistics
|
|
83
|
+
*/
|
|
84
|
+
getCacheStats(): {
|
|
85
|
+
size: number;
|
|
86
|
+
hits: number;
|
|
87
|
+
misses: number;
|
|
88
|
+
hitRate: number;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Get the configured Oxy Cloud (file storage/CDN) URL
|
|
92
|
+
*/
|
|
93
|
+
getCloudURL(): string;
|
|
94
|
+
/**
|
|
95
|
+
* Set authentication tokens
|
|
96
|
+
*/
|
|
97
|
+
setTokens(accessToken: string): void;
|
|
98
|
+
/**
|
|
99
|
+
* Clear stored authentication tokens
|
|
100
|
+
*/
|
|
101
|
+
clearTokens(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Subscribe to access-token changes on this client.
|
|
104
|
+
*
|
|
105
|
+
* The listener fires on every access-token mutation — explicit
|
|
106
|
+
* `setTokens`/`clearTokens`, a successful silent refresh, and the internal
|
|
107
|
+
* 401-driven clear — receiving the resulting token, or `null` when cleared.
|
|
108
|
+
* Returns an unsubscribe function.
|
|
109
|
+
*
|
|
110
|
+
* Primary use: keeping an external token sink (e.g. the shared `oxyClient`
|
|
111
|
+
* singleton) in lockstep with whichever `OxyServices` instance actually owns
|
|
112
|
+
* the session, so imperative consumers reading the singleton always observe
|
|
113
|
+
* the live token regardless of the code path that changed it.
|
|
114
|
+
*/
|
|
115
|
+
onTokensChanged(listener: (accessToken: string | null) => void): () => void;
|
|
116
|
+
/** @internal */ _cachedUserId: string | null | undefined;
|
|
117
|
+
/** @internal */ _cachedAccessToken: string | null;
|
|
118
|
+
/**
|
|
119
|
+
* Get the current user ID from the access token.
|
|
120
|
+
* Caches the decoded value and invalidates when the token changes.
|
|
121
|
+
*/
|
|
122
|
+
getCurrentUserId(): string | null;
|
|
123
|
+
/**
|
|
124
|
+
* Check if the client has a valid access token (public method)
|
|
125
|
+
*/
|
|
126
|
+
hasValidToken(): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Get the raw access token (for constructing anchor URLs when needed)
|
|
129
|
+
*/
|
|
130
|
+
getAccessToken(): string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Decode the current access token and return its `exp` claim in SECONDS since
|
|
133
|
+
* the Unix epoch (the raw JWT `exp` unit), or `null` when there is no token,
|
|
134
|
+
* the token is opaque/undecodable, or it carries no numeric `exp`.
|
|
135
|
+
*
|
|
136
|
+
* Exposed so `@oxy.so/services` can schedule a PROACTIVE in-session refresh a
|
|
137
|
+
* fixed lead before expiry without re-importing a JWT decoder (and without
|
|
138
|
+
* duplicating the `jwt-decode` dependency in the RN bundle). HttpService keeps
|
|
139
|
+
* the per-request preflight refresh; this powers the idle/background timer.
|
|
140
|
+
*/
|
|
141
|
+
getAccessTokenExpiry(): number | null;
|
|
142
|
+
/**
|
|
143
|
+
* Wait for authentication to be ready
|
|
144
|
+
*
|
|
145
|
+
* Optimized for high-scale usage with immediate synchronous check and adaptive polling.
|
|
146
|
+
* Returns immediately if token is already available (0ms delay), otherwise uses
|
|
147
|
+
* adaptive polling that starts fast (50ms) and gradually increases to reduce CPU usage.
|
|
148
|
+
*
|
|
149
|
+
* @param timeoutMs Maximum time to wait in milliseconds (default: 5000ms)
|
|
150
|
+
* @returns Promise that resolves to true if authentication is ready, false if timeout
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* const isReady = await oxyServices.waitForAuth(3000);
|
|
155
|
+
* if (isReady) {
|
|
156
|
+
* // Proceed with authenticated operations
|
|
157
|
+
* }
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
waitForAuth(timeoutMs?: number): Promise<boolean>;
|
|
161
|
+
/**
|
|
162
|
+
* Execute a function with automatic authentication retry logic
|
|
163
|
+
* This handles the common case where API calls are made before authentication completes
|
|
164
|
+
*/
|
|
165
|
+
withAuthRetry<T>(operation: () => Promise<T>, operationName: string, options?: {
|
|
166
|
+
maxRetries?: number;
|
|
167
|
+
retryDelay?: number;
|
|
168
|
+
authTimeoutMs?: number;
|
|
169
|
+
}): Promise<T>;
|
|
170
|
+
/**
|
|
171
|
+
* Validate the current access token with the server
|
|
172
|
+
*/
|
|
173
|
+
validate(): Promise<boolean>;
|
|
174
|
+
/**
|
|
175
|
+
* Centralized error handling
|
|
176
|
+
*/
|
|
177
|
+
handleError(error: unknown): Error;
|
|
178
|
+
/**
|
|
179
|
+
* Health check endpoint
|
|
180
|
+
*/
|
|
181
|
+
healthCheck(): Promise<{
|
|
182
|
+
status: string;
|
|
183
|
+
users?: number;
|
|
184
|
+
timestamp?: string;
|
|
185
|
+
[key: string]: any;
|
|
186
|
+
}>;
|
|
187
|
+
}
|