@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,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authorization Code + PKCE helpers for "Sign in with Oxy" third-party
|
|
3
|
+
* sign-in.
|
|
4
|
+
*
|
|
5
|
+
* Third-party Relying Parties (SPAs, static sites, and native apps that are NOT
|
|
6
|
+
* Oxy first-party) authenticate through the standard OAuth flow against
|
|
7
|
+
* `auth.oxy.so/authorize` — never FedCM, SSO bounces, or Oxy session cookies.
|
|
8
|
+
* Public clients (no secret) prove possession of the authorization code with
|
|
9
|
+
* PKCE (RFC 7636, S256): the RP generates a random `code_verifier`, sends its
|
|
10
|
+
* `code_challenge = BASE64URL(SHA-256(code_verifier))` on the authorize
|
|
11
|
+
* redirect, and later replays the raw verifier on the token exchange.
|
|
12
|
+
*
|
|
13
|
+
* All cross-platform crypto (random bytes, SHA-256) is delegated to the shared
|
|
14
|
+
* `@oxy.so/protocol` platform loaders — the exact primitives the rest of core's
|
|
15
|
+
* crypto already uses — so these helpers run identically on web, Node, and
|
|
16
|
+
* React Native. No `require()`, so the ESM build stays bundler-clean.
|
|
17
|
+
*/
|
|
18
|
+
/** The central Oxy IdP authorization endpoint used by default. */
|
|
19
|
+
export declare const OXY_AUTHORIZE_URL = "https://auth.oxy.so/authorize";
|
|
20
|
+
/** Default OAuth scope requested for a "Sign in with Oxy" third-party flow. */
|
|
21
|
+
export declare const DEFAULT_OAUTH_SCOPE = "openid profile";
|
|
22
|
+
/** A generated PKCE verifier/challenge pair. */
|
|
23
|
+
export interface PkcePair {
|
|
24
|
+
/** The high-entropy secret replayed on the token exchange (kept client-side). */
|
|
25
|
+
codeVerifier: string;
|
|
26
|
+
/** `BASE64URL(SHA-256(codeVerifier))` — sent on the authorize redirect. */
|
|
27
|
+
codeChallenge: string;
|
|
28
|
+
/** The PKCE transformation method. Always `S256`. */
|
|
29
|
+
method: 'S256';
|
|
30
|
+
}
|
|
31
|
+
/** Parameters for {@link buildOAuthAuthorizeUrl}. */
|
|
32
|
+
export interface BuildOAuthAuthorizeUrlParams {
|
|
33
|
+
/** Authorize endpoint; defaults to {@link OXY_AUTHORIZE_URL}. */
|
|
34
|
+
authorizeBaseUrl?: string;
|
|
35
|
+
/** The registered `ApplicationCredential` public key (`oxy_dk_…`). */
|
|
36
|
+
clientId: string;
|
|
37
|
+
/** Exact registered redirect URI to return the authorization code to. */
|
|
38
|
+
redirectUri: string;
|
|
39
|
+
/** Requested scope; defaults to {@link DEFAULT_OAUTH_SCOPE}. */
|
|
40
|
+
scope?: string;
|
|
41
|
+
/** Opaque CSRF token from {@link generateOAuthState}. */
|
|
42
|
+
state: string;
|
|
43
|
+
/** The PKCE `codeChallenge` from {@link generatePkcePair}. */
|
|
44
|
+
codeChallenge: string;
|
|
45
|
+
/**
|
|
46
|
+
* OAuth `prompt` parameter — `login` forces a fresh authentication even when
|
|
47
|
+
* the IdP already has a session, `consent` forces the consent screen even for
|
|
48
|
+
* an already-granted scope. Both are ordinary OAuth/OIDC and are here for
|
|
49
|
+
* third-party relying parties building their own authorize link.
|
|
50
|
+
*
|
|
51
|
+
* `'none'` is deliberately NOT in this union. It is the silent-SSO value, and
|
|
52
|
+
* it was the only value this SDK ever sent — from the cold-boot cross-origin
|
|
53
|
+
* restore deleted in #691 phase 7b. Accepting it again would hand consumers a
|
|
54
|
+
* one-line rebuild of the automatic, gesture-less full-page bounce to the IdP
|
|
55
|
+
* that the popup transport exists to eliminate.
|
|
56
|
+
*/
|
|
57
|
+
prompt?: 'login' | 'consent';
|
|
58
|
+
/**
|
|
59
|
+
* How the IdP should deliver the authorization response. Omitted (the
|
|
60
|
+
* default) means the ordinary top-level redirect back to `redirectUri`.
|
|
61
|
+
*
|
|
62
|
+
* `web_message` asks the IdP to `postMessage` the result to its opener
|
|
63
|
+
* instead, so a popup sign-in never navigates the relying party's tab. It is
|
|
64
|
+
* a REQUEST, not a guarantee: an IdP with no opener still redirects, which is
|
|
65
|
+
* why the popup transport must handle both outcomes. Only the authorization
|
|
66
|
+
* code, the `state`, and a typed OAuth error ever cross that channel — never
|
|
67
|
+
* a token, device secret, or the PKCE verifier, which the opener keeps.
|
|
68
|
+
*/
|
|
69
|
+
responseMode?: 'web_message';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compute the PKCE S256 `code_challenge` for a given verifier:
|
|
73
|
+
* `BASE64URL(SHA-256(ASCII(codeVerifier)))` (RFC 7636 §4.2). The verifier is
|
|
74
|
+
* base64url (ASCII), so its UTF-8 and ASCII byte encodings are identical.
|
|
75
|
+
*
|
|
76
|
+
* Reuses `@oxy.so/protocol`'s cross-platform {@link sha256} (which returns
|
|
77
|
+
* lowercase hex); the digest bytes are recovered and re-encoded as base64url.
|
|
78
|
+
*/
|
|
79
|
+
export declare function computeCodeChallenge(codeVerifier: string): Promise<string>;
|
|
80
|
+
/**
|
|
81
|
+
* Generate a fresh PKCE verifier/challenge pair for an OAuth authorization-code
|
|
82
|
+
* flow. The verifier is 64 random bytes as base64url (86 chars, within RFC 7636
|
|
83
|
+
* §4.1's 43–128 range and drawn only from the unreserved set); the challenge is
|
|
84
|
+
* its S256 transform.
|
|
85
|
+
*/
|
|
86
|
+
export declare function generatePkcePair(): Promise<PkcePair>;
|
|
87
|
+
/**
|
|
88
|
+
* Generate an opaque, single-use OAuth `state` token (32 random bytes as
|
|
89
|
+
* base64url) for CSRF protection across the authorize redirect.
|
|
90
|
+
*/
|
|
91
|
+
export declare function generateOAuthState(): Promise<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Build the `auth.oxy.so/authorize` redirect URL for an OAuth authorization-code
|
|
94
|
+
* + PKCE (S256) flow. Built via the WHATWG `URL` API so a custom
|
|
95
|
+
* `authorizeBaseUrl` that already carries a query string keeps its existing
|
|
96
|
+
* params (the OAuth params are merged in, not clobbered by a naive `?` concat).
|
|
97
|
+
* All values are percent-encoded by `URL.searchParams`.
|
|
98
|
+
*/
|
|
99
|
+
export declare function buildOAuthAuthorizeUrl(params: BuildOAuthAuthorizeUrlParams): string;
|
|
100
|
+
/** `sessionStorage` key for the OAuth CSRF `state` across an authorize redirect. */
|
|
101
|
+
export declare const OXY_OAUTH_STATE_STORAGE_KEY = "oxy_oauth_state";
|
|
102
|
+
/** `sessionStorage` key for the PKCE `code_verifier` across an authorize redirect. */
|
|
103
|
+
export declare const OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY = "oxy_oauth_code_verifier";
|
|
104
|
+
/** `sessionStorage` key — the exact `redirect_uri` sent on the authorize request. */
|
|
105
|
+
export declare const OXY_OAUTH_REDIRECT_URI_STORAGE_KEY = "oxy.oauth_redirect_uri";
|
|
106
|
+
/**
|
|
107
|
+
* `sessionStorage` key for the in-app path to return to after an authorize
|
|
108
|
+
* round trip. See {@link persistOAuthReturnPath}.
|
|
109
|
+
*/
|
|
110
|
+
export declare const OXY_OAUTH_RETURN_PATH_STORAGE_KEY = "oxy.oauth_return_path";
|
|
111
|
+
/**
|
|
112
|
+
* Normalize a redirect URI to its origin. Official Oxy apps register apex
|
|
113
|
+
* origins (`https://inbox.oxy.so`) — never path-qualified URLs.
|
|
114
|
+
*
|
|
115
|
+
* This is why the path cannot ride along in `redirect_uri`, and why
|
|
116
|
+
* {@link persistOAuthReturnPath} exists: the authorize round trip always lands
|
|
117
|
+
* back on the bare origin, so the page the user was on has to be carried
|
|
118
|
+
* out-of-band and restored on return.
|
|
119
|
+
*/
|
|
120
|
+
export declare function normalizeOAuthRedirectUri(input: string): string;
|
|
121
|
+
/**
|
|
122
|
+
* Collapse `https://app.example/` → `https://app.example` for OAuth binding.
|
|
123
|
+
* Path-qualified redirect URIs are preserved — matches the API token exchange.
|
|
124
|
+
*/
|
|
125
|
+
export declare function canonicalizeOAuthRedirectUri(redirectUri: string): string;
|
|
126
|
+
/**
|
|
127
|
+
* Remember the page the user was on before a full-page authorize redirect.
|
|
128
|
+
*
|
|
129
|
+
* Silent cross-origin restore navigates the whole tab to the IdP and back, and
|
|
130
|
+
* `redirect_uri` must be a registered apex origin, so the browser returns to
|
|
131
|
+
* `/` no matter which page the visit started on. Without this, every deep link
|
|
132
|
+
* — a shared URL, a search result, an ad landing page — silently became the
|
|
133
|
+
* home page for signed-out visitors on their first navigation in a tab.
|
|
134
|
+
*
|
|
135
|
+
* Stored next to the PKCE handshake it belongs to, and cleared by
|
|
136
|
+
* {@link clearOAuthHandshake} so a stale entry can never be applied to an
|
|
137
|
+
* unrelated later navigation.
|
|
138
|
+
*/
|
|
139
|
+
export declare function persistOAuthReturnPath(path: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Read and remove the persisted return path, or `null` when there is none or
|
|
142
|
+
* it failed validation.
|
|
143
|
+
*
|
|
144
|
+
* Single-use by design: it is consumed on the first return so a leftover value
|
|
145
|
+
* cannot redirect a later navigation in the same tab.
|
|
146
|
+
*/
|
|
147
|
+
export declare function consumeOAuthReturnPath(): string | null;
|
|
148
|
+
/** Persist the OAuth handshake for a full-page redirect return (web only). */
|
|
149
|
+
export declare function persistOAuthHandshake(state: string, codeVerifier: string, redirectUri?: string): boolean;
|
|
150
|
+
/** Read the persisted OAuth handshake, or `null` when absent. */
|
|
151
|
+
export declare function readOAuthHandshake(): {
|
|
152
|
+
state: string;
|
|
153
|
+
codeVerifier: string;
|
|
154
|
+
redirectUri?: string;
|
|
155
|
+
} | null;
|
|
156
|
+
/** Drop persisted OAuth handshake keys after a successful or aborted return. */
|
|
157
|
+
export declare function clearOAuthHandshake(): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official first-party web origin allowlist — shared by OAuth redirect
|
|
3
|
+
* validation and the server-side trusted-origin checks.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Whether an origin is a loopback / local-dev origin (`localhost`, `127.0.0.1`,
|
|
7
|
+
* or `[::1]` on any port, http or https).
|
|
8
|
+
*/
|
|
9
|
+
export declare function isLoopbackOrigin(origin: string): boolean;
|
|
10
|
+
/** Whether an origin belongs to the official Oxy web ecosystem. */
|
|
11
|
+
export declare function isOfficialWebOrigin(origin: string): boolean;
|
|
12
|
+
/** @deprecated Use {@link isOfficialWebOrigin}. */
|
|
13
|
+
export declare const isAllowedDeviceJoinOrigin: typeof isOfficialWebOrigin;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment segregation for Oxy service-token JWTs (test/live isolation).
|
|
3
|
+
* Mirrors `ApplicationCredentialEnvironment` on the API's `ApplicationCredential`
|
|
4
|
+
* model (`packages/api/src/models/ApplicationCredential.ts`) as an INDEPENDENT
|
|
5
|
+
* literal union — `@oxy.so/core` has zero dependency on `@oxy.so/api`, so this is
|
|
6
|
+
* kept in sync by hand, not by import.
|
|
7
|
+
*
|
|
8
|
+
* Defined here (not in `server/auth.ts` or `mixins/OxyServices.utility.ts`
|
|
9
|
+
* directly) because BOTH of those files need it and neither may import from
|
|
10
|
+
* the other: `server/` types import `express` (Node-only, a peer dependency
|
|
11
|
+
* `mixins/` deliberately avoids so it stays safe to bundle into RN/browser
|
|
12
|
+
* consumers — see the "Local request/response/socket typing" comment in
|
|
13
|
+
* `OxyServices.utility.ts`). This file has zero imports, so both sides can
|
|
14
|
+
* depend on it without crossing that boundary.
|
|
15
|
+
*/
|
|
16
|
+
export declare const OXY_SERVICE_ENVIRONMENTS: readonly ["development", "staging", "production"];
|
|
17
|
+
export type OxyServiceEnvironment = (typeof OXY_SERVICE_ENVIRONMENTS)[number];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides platform detection WITHOUT importing from 'react-native'.
|
|
5
|
+
* This allows core modules to be used in web/Node.js environments
|
|
6
|
+
* without bundlers failing on react-native imports.
|
|
7
|
+
*/
|
|
8
|
+
export type PlatformOS = 'ios' | 'android' | 'web' | 'windows' | 'macos' | 'unknown';
|
|
9
|
+
/**
|
|
10
|
+
* Get the current platform OS
|
|
11
|
+
* Safe to call from any environment (web, Node.js, React Native)
|
|
12
|
+
*/
|
|
13
|
+
export declare function getPlatformOS(): PlatformOS;
|
|
14
|
+
/**
|
|
15
|
+
* Check if running on web platform (browser or Node.js)
|
|
16
|
+
*/
|
|
17
|
+
export declare function isWeb(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if running in a native app (iOS or Android)
|
|
20
|
+
*/
|
|
21
|
+
export declare function isNative(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Check if running on iOS
|
|
24
|
+
*/
|
|
25
|
+
export declare function isIOS(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if running on Android
|
|
28
|
+
*/
|
|
29
|
+
export declare function isAndroid(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Set the platform OS explicitly
|
|
32
|
+
* Called by React Native entry point to register the platform
|
|
33
|
+
* This allows lazy detection in environments where react-native is available
|
|
34
|
+
*/
|
|
35
|
+
export declare function setPlatformOS(os: PlatformOS): void;
|
|
36
|
+
/**
|
|
37
|
+
* True only in a real web browser (a DOM is present), false on React Native
|
|
38
|
+
* and Node/SSR.
|
|
39
|
+
*
|
|
40
|
+
* Native defines a global `window` but no `document`, so the DOM probe — not a
|
|
41
|
+
* bare `window` check — is the reliable discriminator. This is the single
|
|
42
|
+
* source of truth consumed by `@oxy.so/services` (which dropped
|
|
43
|
+
* their local copies), so every consumer shares the exact same predicate.
|
|
44
|
+
*
|
|
45
|
+
* NOTE: this is a live runtime probe (not the cached `getPlatformOS()` verdict)
|
|
46
|
+
* because it must reflect the actual DOM availability at call time in the
|
|
47
|
+
* consumer's bundle.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isWebBrowser(): boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalized profile link shape for display.
|
|
3
|
+
*
|
|
4
|
+
* `id` is a stable key for list rendering (the source entry's id when present,
|
|
5
|
+
* otherwise the source index as a string). `url` is always a non-empty string.
|
|
6
|
+
* `title`, `description`, and `image` are carried through from `linksMetadata`
|
|
7
|
+
* only when present; the legacy `links: string[]` path produces just
|
|
8
|
+
* `{ id, url }`.
|
|
9
|
+
*/
|
|
10
|
+
export interface ProfileLink {
|
|
11
|
+
id: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
url: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
image?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Source shape of a single `User.linksMetadata` entry. */
|
|
18
|
+
export interface ProfileLinkMetadata {
|
|
19
|
+
url: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
image?: string;
|
|
23
|
+
id?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes a user's profile links into a clean display shape.
|
|
27
|
+
*
|
|
28
|
+
* Pure, no side effects, no I/O.
|
|
29
|
+
*
|
|
30
|
+
* - Prefers `linksMetadata` when it is a non-empty array: maps each entry to
|
|
31
|
+
* `{ id, title, url, description, image }`, using `entry.id` when present and
|
|
32
|
+
* falling back to the entry index. `title`, `description`, and `image` are
|
|
33
|
+
* carried through only when they are present strings. Entries without a
|
|
34
|
+
* non-empty string `url` are dropped.
|
|
35
|
+
* - Otherwise falls back to the legacy `links` string array: maps each string to
|
|
36
|
+
* `{ id: <index>, url }` (no title/description/image). Empty/non-string values
|
|
37
|
+
* are dropped.
|
|
38
|
+
* - Returns `[]` when both are absent or empty (including when `linksMetadata`
|
|
39
|
+
* is present but every entry is dropped — it does NOT fall back to `links`).
|
|
40
|
+
*
|
|
41
|
+
* URLs are trimmed and blanks are filtered out. This does NOT add a scheme such
|
|
42
|
+
* as `https://`; prefixing is a display concern left to the caller.
|
|
43
|
+
*/
|
|
44
|
+
export declare function normalizeProfileLinks(linksMetadata?: ProfileLinkMetadata[], links?: string[]): ProfileLink[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL redaction for logging.
|
|
3
|
+
*
|
|
4
|
+
* Asset URLs the API hands back for private assets carry a scoped, short-lived
|
|
5
|
+
* media token (`mt=…`) in their query string. That token is a bearer credential
|
|
6
|
+
* for the underlying object, so it must never land in a log line, breadcrumb,
|
|
7
|
+
* or metric — a captured log would otherwise grant read access until the token
|
|
8
|
+
* expires. Query strings on API URLs can also carry other sensitive params, so
|
|
9
|
+
* we redact the whole query rather than allow-listing one key.
|
|
10
|
+
*
|
|
11
|
+
* `redactUrlQuery` returns the URL's path portion with a `?<redacted>` marker
|
|
12
|
+
* when a query string is present, and the input unchanged otherwise. It is
|
|
13
|
+
* defensive: any input that does not parse as a URL is passed through as-is,
|
|
14
|
+
* except that a bare `?query` tail is still stripped so a relative path with a
|
|
15
|
+
* query never leaks.
|
|
16
|
+
*/
|
|
17
|
+
export declare function redactUrlQuery(url: string): string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registrable-apex (eTLD+1) host kernel.
|
|
3
|
+
*
|
|
4
|
+
* The client FAPI auto-detection helper was removed in the device-first cutover
|
|
5
|
+
* (which is why this file is now named for what it actually is, not the old
|
|
6
|
+
* `fapiAutoDetect`). What survives is the pure registrable-domain kernel, still
|
|
7
|
+
* used by the `@oxy.so/core/server` CORS layer (the `*.oxy.so` same-apex trust
|
|
8
|
+
* check) and its re-export surface.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Compute the bare registrable apex (eTLD+1) of a hostname using the Public
|
|
12
|
+
* Suffix List, including private hosted suffixes.
|
|
13
|
+
*
|
|
14
|
+
* Performs NO protocol handling and builds NO URL — it only answers "what is
|
|
15
|
+
* the registrable domain of this host, or is that undefinable?".
|
|
16
|
+
*
|
|
17
|
+
* Returns `null` (apex undefinable) for:
|
|
18
|
+
* - empty input;
|
|
19
|
+
* - IPv4 literals (`192.168.1.10`);
|
|
20
|
+
* - IPv6 literals or any host carrying a port (`[::1]`, anything with `:`);
|
|
21
|
+
* - single-label hosts (`intranet`, `localhost`);
|
|
22
|
+
* - public suffixes without a registrable label (e.g. `co.uk`, `github.io`).
|
|
23
|
+
*
|
|
24
|
+
* @param hostname - A bare hostname (no scheme), e.g. `www.mention.earth`.
|
|
25
|
+
* @returns The eTLD+1 (`mention.earth`), or `null` when undefinable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function registrableApex(hostname: string): string | null;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request utilities for HTTP clients
|
|
3
|
+
*
|
|
4
|
+
* Provides reusable components for request deduplication, queuing, and logging
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Request deduplication - prevents duplicate concurrent requests
|
|
8
|
+
*
|
|
9
|
+
* When multiple requests with the same key are made simultaneously,
|
|
10
|
+
* only one request is executed and all callers receive the same result.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const deduplicator = new RequestDeduplicator();
|
|
15
|
+
*
|
|
16
|
+
* // Multiple calls with same key will share the same promise
|
|
17
|
+
* const promise1 = deduplicator.deduplicate('user-123', () => fetchUser('123'));
|
|
18
|
+
* const promise2 = deduplicator.deduplicate('user-123', () => fetchUser('123'));
|
|
19
|
+
* // promise1 === promise2, only one API call is made
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class RequestDeduplicator {
|
|
23
|
+
private pendingRequests;
|
|
24
|
+
/**
|
|
25
|
+
* Deduplicate a request by key
|
|
26
|
+
* @param key Unique key for the request
|
|
27
|
+
* @param requestFn Function that returns a promise
|
|
28
|
+
* @returns Promise that will be shared if key already exists
|
|
29
|
+
*/
|
|
30
|
+
deduplicate<T>(key: string, requestFn: () => Promise<T>): Promise<T>;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all pending requests
|
|
33
|
+
*/
|
|
34
|
+
clear(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get number of pending requests
|
|
37
|
+
*/
|
|
38
|
+
size(): number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Request queue with concurrency control
|
|
42
|
+
*
|
|
43
|
+
* Limits the number of concurrent requests and queues excess requests.
|
|
44
|
+
* Useful for rate limiting and preventing request flooding.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const queue = new RequestQueue(5, 100); // Max 5 concurrent, queue up to 100
|
|
49
|
+
*
|
|
50
|
+
* // All requests will be queued and processed with max 5 concurrent
|
|
51
|
+
* await queue.enqueue(() => fetchUser('1'));
|
|
52
|
+
* await queue.enqueue(() => fetchUser('2'));
|
|
53
|
+
* // ...
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare class RequestQueue {
|
|
57
|
+
private queue;
|
|
58
|
+
private running;
|
|
59
|
+
private maxConcurrent;
|
|
60
|
+
private maxQueueSize;
|
|
61
|
+
/**
|
|
62
|
+
* Create a new request queue
|
|
63
|
+
* @param maxConcurrent Maximum number of concurrent requests (default: 10)
|
|
64
|
+
* @param maxQueueSize Maximum queue size (default: 100)
|
|
65
|
+
*/
|
|
66
|
+
constructor(maxConcurrent?: number, maxQueueSize?: number);
|
|
67
|
+
/**
|
|
68
|
+
* Enqueue a request
|
|
69
|
+
* @param requestFn Function that returns a promise
|
|
70
|
+
* @returns Promise that resolves when request completes
|
|
71
|
+
*/
|
|
72
|
+
enqueue<T>(requestFn: () => Promise<T>): Promise<T>;
|
|
73
|
+
/**
|
|
74
|
+
* Process queued requests
|
|
75
|
+
*/
|
|
76
|
+
private process;
|
|
77
|
+
/**
|
|
78
|
+
* Clear all queued requests
|
|
79
|
+
*/
|
|
80
|
+
clear(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get queue size
|
|
83
|
+
*/
|
|
84
|
+
size(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Get number of currently running requests
|
|
87
|
+
*/
|
|
88
|
+
runningCount(): number;
|
|
89
|
+
}
|
|
90
|
+
/** Log level type for SimpleLogger */
|
|
91
|
+
export type LogLevel = 'none' | 'error' | 'warn' | 'info' | 'debug';
|
|
92
|
+
/**
|
|
93
|
+
* Simple logger with level support
|
|
94
|
+
*
|
|
95
|
+
* Lightweight logger for HTTP clients and utilities.
|
|
96
|
+
* For structured, namespaced, level-gated logging, use `@oxy.so/core/logger`.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const logger = new SimpleLogger(true, 'debug');
|
|
101
|
+
* logger.debug('Debug message');
|
|
102
|
+
* logger.info('Info message');
|
|
103
|
+
* logger.error('Error message');
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare class SimpleLogger {
|
|
107
|
+
private enabled;
|
|
108
|
+
private level;
|
|
109
|
+
private prefix;
|
|
110
|
+
/**
|
|
111
|
+
* Create a new simple logger
|
|
112
|
+
* @param enabled Whether logging is enabled
|
|
113
|
+
* @param level Minimum log level
|
|
114
|
+
* @param prefix Prefix for log messages (default: '')
|
|
115
|
+
*/
|
|
116
|
+
constructor(enabled?: boolean, level?: LogLevel, prefix?: string);
|
|
117
|
+
private shouldLog;
|
|
118
|
+
private formatMessage;
|
|
119
|
+
error(...args: any[]): void;
|
|
120
|
+
warn(...args: any[]): void;
|
|
121
|
+
info(...args: any[]): void;
|
|
122
|
+
debug(...args: any[]): void;
|
|
123
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent session normalization, deduplication, and sorting
|
|
5
|
+
* to ensure sessions are always displayed in a predictable order.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClientSession } from '../models/session';
|
|
8
|
+
/**
|
|
9
|
+
* Normalize a session to ensure all required fields are present
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeSession(session: Partial<ClientSession> & {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}): ClientSession;
|
|
14
|
+
/**
|
|
15
|
+
* Compare two sessions for equality
|
|
16
|
+
*/
|
|
17
|
+
export declare function sessionsEqual(a: ClientSession, b: ClientSession): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Sort sessions by lastActive (most recent first), then by sessionId for stability
|
|
20
|
+
*/
|
|
21
|
+
export declare function sortSessions(sessions: ClientSession[]): ClientSession[];
|
|
22
|
+
/**
|
|
23
|
+
* Deduplicate sessions by sessionId, keeping the most recent version
|
|
24
|
+
*/
|
|
25
|
+
export declare function deduplicateSessions(sessions: ClientSession[]): ClientSession[];
|
|
26
|
+
/**
|
|
27
|
+
* Deduplicate sessions by userId, keeping only one session per user
|
|
28
|
+
* Priority: 1) Active session (if provided), 2) Most recent session
|
|
29
|
+
* This prevents showing duplicate accounts for the same user
|
|
30
|
+
*/
|
|
31
|
+
export declare function deduplicateSessionsByUserId(sessions: ClientSession[], activeSessionId?: string | null): ClientSession[];
|
|
32
|
+
/**
|
|
33
|
+
* Normalize, deduplicate, and sort sessions
|
|
34
|
+
* This ensures consistent session ordering across the application
|
|
35
|
+
*
|
|
36
|
+
* @param sessions - Array of sessions to normalize
|
|
37
|
+
* @param activeSessionId - Optional active session ID to prioritize
|
|
38
|
+
* @param deduplicateByUserId - If true, deduplicate by userId (one account per user). Default: true
|
|
39
|
+
*/
|
|
40
|
+
export declare function normalizeAndSortSessions(sessions: ClientSession[], activeSessionId?: string | null, deduplicateByUserId?: boolean): ClientSession[];
|
|
41
|
+
/**
|
|
42
|
+
* Merge two session arrays, prioritizing newer data
|
|
43
|
+
* Returns normalized, deduplicated, and sorted sessions
|
|
44
|
+
*
|
|
45
|
+
* @param existing - Existing sessions array
|
|
46
|
+
* @param incoming - New sessions to merge in
|
|
47
|
+
* @param activeSessionId - Optional active session ID to prioritize
|
|
48
|
+
* @param deduplicateByUserId - If true, deduplicate by userId (one account per user). Default: true
|
|
49
|
+
*/
|
|
50
|
+
export declare function mergeSessions(existing: ClientSession[], incoming: ClientSession[], activeSessionId?: string | null, deduplicateByUserId?: boolean): ClientSession[];
|
|
51
|
+
/**
|
|
52
|
+
* Check if two session arrays are equal (same sessionIds in same order)
|
|
53
|
+
*/
|
|
54
|
+
export declare function sessionsArraysEqual(a: ClientSession[], b: ClientSession[]): boolean;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical text normalization for the Oxy ecosystem.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* Third-party text (federated actor display names, spoiler/CW text, image alt
|
|
7
|
+
* text, bios, `<title>` / `og:site_name` of scraped remote pages, …) arrives
|
|
8
|
+
* with the whitespace the remote author's markup happened to contain. A real
|
|
9
|
+
* bug: a remote page served
|
|
10
|
+
*
|
|
11
|
+
* <title>
|
|
12
|
+
* Mi título
|
|
13
|
+
* </title>
|
|
14
|
+
*
|
|
15
|
+
* and the extracted string — newlines and indentation included — was stored
|
|
16
|
+
* verbatim. Clients render text with React Native Web `Text`, which maps to
|
|
17
|
+
* CSS `white-space: pre-wrap`: unlike HTML, newlines and repeated spaces are
|
|
18
|
+
* NOT collapsed at render time, so the user saw a blank line and a six-space
|
|
19
|
+
* indent inside the link preview.
|
|
20
|
+
*
|
|
21
|
+
* Storage-time normalization is therefore the ONLY place this can be fixed:
|
|
22
|
+
* every renderer downstream is faithful by design.
|
|
23
|
+
*
|
|
24
|
+
* WHICH HELPER DO I USE?
|
|
25
|
+
* ----------------------
|
|
26
|
+
* - {@link normalizeInlineText} — the value is conceptually ONE LINE, and a
|
|
27
|
+
* line break in it is always an accident of the source markup: page titles,
|
|
28
|
+
* `siteName`, display names, image `alt`, handles, profile field labels.
|
|
29
|
+
* Every line break becomes a space.
|
|
30
|
+
*
|
|
31
|
+
* - {@link normalizeMultilineText} — the value is a BODY whose line breaks are
|
|
32
|
+
* the author's own paragraphs and must survive: post text, bios/summaries.
|
|
33
|
+
* Line breaks are preserved (capped at one blank line); only the surrounding
|
|
34
|
+
* whitespace noise is cleaned.
|
|
35
|
+
*
|
|
36
|
+
* Using the multiline helper on a title would keep the newlines and reproduce
|
|
37
|
+
* the original bug; using the inline helper on a post body would flatten the
|
|
38
|
+
* author's paragraphs into a single run-on line. Pick deliberately.
|
|
39
|
+
*
|
|
40
|
+
* Neither helper truncates, strips markup, or enforces a character policy —
|
|
41
|
+
* those are separate, product-specific concerns (see `isValidDisplayName` for
|
|
42
|
+
* the display-name character policy). These functions do exactly one thing:
|
|
43
|
+
* normalize whitespace and Unicode form.
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* Normalize a SINGLE-LINE text value: page/link-preview titles, `siteName`,
|
|
47
|
+
* display names, image alt text, handles, profile field labels.
|
|
48
|
+
*
|
|
49
|
+
* A line break in such a value is never meaningful — it is an artifact of the
|
|
50
|
+
* markup the value was extracted from (`<title>\n Título\n</title>`) — and it
|
|
51
|
+
* survives into the UI because RN Web renders `Text` with `white-space:
|
|
52
|
+
* pre-wrap`. So ALL whitespace, line breaks included, collapses to one space.
|
|
53
|
+
*
|
|
54
|
+
* 1. NFC-normalize, so visually identical strings store and compare
|
|
55
|
+
* identically (a decomposed `e`+◌́ recomposes into `é`).
|
|
56
|
+
* 2. Collapse every run of whitespace — spaces, tabs, `\n`, `\r`, and Unicode
|
|
57
|
+
* spaces such as NBSP — to a single plain space.
|
|
58
|
+
* 3. Trim both ends.
|
|
59
|
+
*
|
|
60
|
+
* Length is NOT capped: a maximum length is a product rule of the specific
|
|
61
|
+
* field (see `MAX_DISPLAY_NAME_LENGTH`), not a property of text normalization.
|
|
62
|
+
* Markup is NOT stripped: run the caller's sanitizer first if the source can
|
|
63
|
+
* contain HTML.
|
|
64
|
+
*
|
|
65
|
+
* A value that is empty or whitespace-only returns `''`. Callers decide whether
|
|
66
|
+
* that means "omit the field" (`|| undefined`) or "store an empty string".
|
|
67
|
+
*
|
|
68
|
+
* Idempotent: `f(f(x)) === f(x)`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function normalizeInlineText(value: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Normalize a MULTILINE text BODY: post text, bios, summaries — anywhere the
|
|
73
|
+
* line breaks are the author's paragraphs and must be preserved.
|
|
74
|
+
*
|
|
75
|
+
* Cleans the whitespace noise around those paragraphs without destroying them:
|
|
76
|
+
*
|
|
77
|
+
* 1. NFC-normalize (same rationale as {@link normalizeInlineText}).
|
|
78
|
+
* 2. Unify every line-break form (CRLF, lone CR, U+2028, U+2029) to `\n`.
|
|
79
|
+
* 3. Collapse runs of HORIZONTAL whitespace (spaces, tabs, NBSP and friends)
|
|
80
|
+
* to a single space. Line breaks are untouched.
|
|
81
|
+
* 4. Strip the horizontal whitespace at BOTH ends of every line.
|
|
82
|
+
* 5. Collapse three or more line breaks to exactly one blank line (`\n\n`).
|
|
83
|
+
* 6. Trim both ends of the value.
|
|
84
|
+
*
|
|
85
|
+
* STEP 4 MUST PRECEDE STEP 5 — this is the whole point of the function. A
|
|
86
|
+
* "blank" line that actually contains spaces (`"a\n \n \nb"`) breaks the
|
|
87
|
+
* run of `\n` characters, so a bare `\n{3,}` collapse (step 5 alone) never sees
|
|
88
|
+
* it and the extra blank lines survive into the UI. That is exactly the bug in
|
|
89
|
+
* federated post bodies. Trimming each line first turns those lines into real,
|
|
90
|
+
* empty lines, which step 5 then collapses.
|
|
91
|
+
*
|
|
92
|
+
* Every line is trimmed on BOTH sides, so a leading indent is removed outright
|
|
93
|
+
* rather than reduced to one space. Step 3 has already destroyed whatever indent
|
|
94
|
+
* the author wrote (`" Mundo"` → `" Mundo"`), so a surviving space would not
|
|
95
|
+
* be the author's intent — it would be an arbitrary remnant of exactly the
|
|
96
|
+
* source-markup indentation this function exists to erase, and `pre-wrap` renders
|
|
97
|
+
* it. Indentation is invisible in HTML by spec; it must be invisible here too.
|
|
98
|
+
*
|
|
99
|
+
* A value that is empty or whitespace-only returns `''`.
|
|
100
|
+
*
|
|
101
|
+
* Idempotent: `f(f(x)) === f(x)`.
|
|
102
|
+
*/
|
|
103
|
+
export declare function normalizeMultilineText(value: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface UserHandleInput {
|
|
2
|
+
username?: string | null;
|
|
3
|
+
handle?: string | null;
|
|
4
|
+
instance?: string | null;
|
|
5
|
+
isFederated?: boolean | null;
|
|
6
|
+
type?: string | null;
|
|
7
|
+
federation?: {
|
|
8
|
+
domain?: string | null;
|
|
9
|
+
} | null;
|
|
10
|
+
}
|
|
11
|
+
export type CanonicalUserHandleInput = UserHandleInput;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the normalized profile handle used by Oxy consumers for display and
|
|
14
|
+
* profile routing.
|
|
15
|
+
*
|
|
16
|
+
* Local users resolve to `username`. Federated users resolve to
|
|
17
|
+
* `username@instance` when the username does not already include an instance.
|
|
18
|
+
* Route-like values are rejected so callers do not accidentally turn paths or
|
|
19
|
+
* query strings into profile destinations.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getNormalizedUserHandle(user: UserHandleInput | null | undefined): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Compatibility alias for the first public name shipped with this helper.
|
|
24
|
+
* Prefer {@link getNormalizedUserHandle} in new code.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getCanonicalUserHandle(user: CanonicalUserHandleInput | null | undefined): string | null;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface UserIdentityInput {
|
|
2
|
+
id?: unknown;
|
|
3
|
+
_id?: unknown;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Returns the stable SDK user id from API payloads that may use either `id` or
|
|
7
|
+
* Mongo-style `_id`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getNormalizedUserId(user: UserIdentityInput | null | undefined): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Normalizes a user payload to always expose `id`. Throws when the payload does
|
|
12
|
+
* not contain a usable id, because SDK callers should never receive anonymous
|
|
13
|
+
* user objects from authenticated identity endpoints.
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeUserIdentity<T extends UserIdentityInput>(user: T): T & {
|
|
16
|
+
id: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function normalizeUserIdentityOrNull<T extends UserIdentityInput>(user: T | null | undefined): (T & {
|
|
19
|
+
id: string;
|
|
20
|
+
}) | null;
|
|
21
|
+
export {};
|