@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,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two questions an account chooser asks of an account-graph node: is this
|
|
3
|
+
* kind switchable at all, and may THIS caller become it.
|
|
4
|
+
*
|
|
5
|
+
* Pure and I/O-free. They live here rather than beside the surfaces that ask
|
|
6
|
+
* them because there is more than one such surface — the Console's workspace
|
|
7
|
+
* tree, the Accounts app's managed-account rows — and a second enumeration of
|
|
8
|
+
* switch targets is a second place for the rule to go missing, which is
|
|
9
|
+
* precisely how the Console went on offering `channel` rows after the rule
|
|
10
|
+
* learned to drop them.
|
|
11
|
+
*
|
|
12
|
+
* The DEVICE switcher no longer asks anything here: it renders the server's
|
|
13
|
+
* device directory (ADR 0002, `deviceDirectory.ts`), whose `available` field is
|
|
14
|
+
* the server's own authorization verdict. These predicates answer a different
|
|
15
|
+
* question — one about the caller's account GRAPH, which is a list of accounts
|
|
16
|
+
* to manage, not a list of identities the device can become.
|
|
17
|
+
*/
|
|
18
|
+
import type { AccountRelationship, AccountKind, AccountMember } from '../mixins/OxyServices.accounts';
|
|
19
|
+
/**
|
|
20
|
+
* Whether the caller can BECOME this account — the one question every account
|
|
21
|
+
* switcher asks, answered here so no surface has to re-derive it.
|
|
22
|
+
*
|
|
23
|
+
* Two independent grounds, either of which suffices:
|
|
24
|
+
*
|
|
25
|
+
* - **It is already the caller's own identity** (`relationship: 'self'`).
|
|
26
|
+
* `GET /accounts` resolves its caller through `resolveOperatorId`, so `self`
|
|
27
|
+
* is the HUMAN operator's personal account even while they are operating an
|
|
28
|
+
* org — never the operated account. Kind is irrelevant on this ground: the
|
|
29
|
+
* caller IS that account, so returning to it asks the server for nothing.
|
|
30
|
+
* - **The server will mint a session for it** — `isOperatorSwitchTargetKind(kind)`
|
|
31
|
+
* is the exact predicate `POST /accounts/:id/switch` enforces, so a row
|
|
32
|
+
* offered on this ground is never a dead button.
|
|
33
|
+
*
|
|
34
|
+
* `isOperatorSwitchTargetKind` ALONE is not this question, and reaching for it
|
|
35
|
+
* directly is the mistake this function exists to prevent: it is false for
|
|
36
|
+
* `personal` as well as `channel`, so a switcher gated on it alone renders an
|
|
37
|
+
* empty list rather than a filtered one. Equally, `kind !== 'channel'` is not
|
|
38
|
+
* this question either — it silently admits every kind invented after it was
|
|
39
|
+
* written, which is the same trap the kind predicates were introduced to close
|
|
40
|
+
* on the server.
|
|
41
|
+
*
|
|
42
|
+
* And it is the OPERATOR predicate, never `isDelegatedActAsEligibleKind`. The
|
|
43
|
+
* two differ only on `bot`, so the delegated one produces a list that looks
|
|
44
|
+
* right and contains one row too many — a seat inside the identity that exists
|
|
45
|
+
* to act while nobody is present. That is not a hypothetical: it put a live bot
|
|
46
|
+
* session on a person's own device, beside their personal login.
|
|
47
|
+
*
|
|
48
|
+
* Takes a structural subset rather than a whole {@link AccountNode} so a caller
|
|
49
|
+
* holding an already-projected row can ask it too.
|
|
50
|
+
*/
|
|
51
|
+
export declare function isSwitchTargetAccount(node: {
|
|
52
|
+
kind?: AccountKind | null;
|
|
53
|
+
relationship?: AccountRelationship;
|
|
54
|
+
}): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Whether the caller may switch INTO this account — the server-side
|
|
57
|
+
* `account:act_as` gate plus the structural {@link isSwitchTargetAccount} rule.
|
|
58
|
+
*
|
|
59
|
+
* `relationship: 'self'` always passes (returning to the caller's own personal
|
|
60
|
+
* account). Every other ground requires a switch-eligible kind AND
|
|
61
|
+
* `account:act_as` in the resolved membership permissions. When permissions are
|
|
62
|
+
* absent but the relationship is `owner`, the owner baseline is assumed — the
|
|
63
|
+
* API always resolves effective permissions for owned accounts, but test
|
|
64
|
+
* fixtures and stale rows may omit the membership blob.
|
|
65
|
+
*/
|
|
66
|
+
export declare function canSwitchIntoAccount(node: {
|
|
67
|
+
kind?: AccountKind | null;
|
|
68
|
+
relationship?: AccountRelationship;
|
|
69
|
+
callerMembership?: AccountMember | null;
|
|
70
|
+
}): boolean;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted auth state — ONE shape, web + native.
|
|
3
|
+
*
|
|
4
|
+
* The zero-cookie device transport persists the device credential per ORIGIN so
|
|
5
|
+
* a reload restores the session locally without a redirect: `deviceId` +
|
|
6
|
+
* `deviceSecret` mint a fresh access token via `POST /session/device/token`.
|
|
7
|
+
* This module is the storage seam: a tiny `load / save / clear` interface plus
|
|
8
|
+
* platform factories, so the cold boot (`sessionColdBoot`) and the unified re-mint
|
|
9
|
+
* handler (`refresh.ts`) never touch a platform storage API directly.
|
|
10
|
+
*
|
|
11
|
+
* Platform-agnostic — the native factory takes an INJECTED key/value store
|
|
12
|
+
* (`@oxy.so/services` passes a SecureStore-backed adapter) so `@oxy.so/core`
|
|
13
|
+
* never imports `expo-secure-store`. The web factory is self-contained
|
|
14
|
+
* (`localStorage`) and degrades to in-memory when storage is unavailable
|
|
15
|
+
* (sandboxed iframe `SecurityError`, private-mode quota, SSR).
|
|
16
|
+
*
|
|
17
|
+
* ESM-safe (no `require()`).
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* The persisted session credential set for a single origin.
|
|
21
|
+
*
|
|
22
|
+
* `sessionId` + `userId` identify the owning device session and active account.
|
|
23
|
+
* `deviceId` + `deviceSecret` are the zero-cookie mint credential: the client
|
|
24
|
+
* presents BOTH at `POST /session/device/token` — the secret is the proof, the
|
|
25
|
+
* deviceId selects the device doc. The secret is rotated in-use: the mint returns
|
|
26
|
+
* `nextDeviceSecret`, which the cold boot / re-mint handler persist BEFORE
|
|
27
|
+
* planting the minted access token (multi-tab anti-loss).
|
|
28
|
+
*
|
|
29
|
+
* `accessToken` + `expiresAt` are OPTIONAL warm-boot fields. Persisting them lets
|
|
30
|
+
* the cold boot plant a still-valid access token on the very first paint WITHOUT
|
|
31
|
+
* a blocking mint round-trip — the proactive scheduler then rotates it in the
|
|
32
|
+
* background. They are a strict optimization: the store is fully functional (via
|
|
33
|
+
* `deviceSecret`) when they are absent or stale, and the access token is
|
|
34
|
+
* short-lived, so persisting it adds no exposure the already-persisted
|
|
35
|
+
* `deviceSecret` does not.
|
|
36
|
+
*/
|
|
37
|
+
export interface PersistedAuthState {
|
|
38
|
+
sessionId: string;
|
|
39
|
+
userId: string;
|
|
40
|
+
/**
|
|
41
|
+
* The stable device identifier this session is bound to (zero-cookie
|
|
42
|
+
* transport). Persisted alongside {@link deviceSecret} because the
|
|
43
|
+
* `POST /session/device/token` mint presents BOTH. Sourced from every login
|
|
44
|
+
* lane (password / 2FA / QR claim / challenge verify) via the response's
|
|
45
|
+
* `deviceId`.
|
|
46
|
+
*/
|
|
47
|
+
deviceId?: string;
|
|
48
|
+
/**
|
|
49
|
+
* The rotating device secret (zero-cookie transport). Possession of it mints a
|
|
50
|
+
* short access token for the device's active account via
|
|
51
|
+
* `POST /session/device/token`. Rotated in-use.
|
|
52
|
+
*/
|
|
53
|
+
deviceSecret?: string;
|
|
54
|
+
/** Optional warm-boot access token (short-lived; see interface docs). */
|
|
55
|
+
accessToken?: string;
|
|
56
|
+
/** Optional warm-boot access-token expiry, ISO-8601. */
|
|
57
|
+
expiresAt?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The storage seam consumed by the cold boot and the re-mint handler. Async
|
|
61
|
+
* throughout so one interface fits both synchronous web `localStorage` and
|
|
62
|
+
* asynchronous native SecureStore/AsyncStorage. `clear()` (sign-out) wipes the
|
|
63
|
+
* per-sign-in credential blob.
|
|
64
|
+
*/
|
|
65
|
+
export interface AuthStateStore {
|
|
66
|
+
load(): Promise<PersistedAuthState | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Persist the credential blob and report whether it durably landed.
|
|
69
|
+
*
|
|
70
|
+
* Resolves `true` when the state is retained consistent with this store's
|
|
71
|
+
* durability guarantee — a durable backing whose read-back matched, or a
|
|
72
|
+
* degraded/in-memory store that held it in memory. Resolves `false` when a
|
|
73
|
+
* DURABLE backing was expected but the write did NOT land (read-back mismatch
|
|
74
|
+
* or a thrown write); the in-memory mirror still keeps the session live for
|
|
75
|
+
* this process, but it will be lost on reload.
|
|
76
|
+
*
|
|
77
|
+
* A lane persisting a ROTATED device secret (the mint's `nextDeviceSecret`)
|
|
78
|
+
* MUST treat `false` as fatal for that mint: it must NOT plant/advertise a
|
|
79
|
+
* session built on a secret that will not survive a reload.
|
|
80
|
+
*/
|
|
81
|
+
save(state: PersistedAuthState): Promise<boolean>;
|
|
82
|
+
clear(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The minimal async key/value surface a native store must provide. Matches
|
|
86
|
+
* both `expo-secure-store` (wrapped) and `@react-native-async-storage`.
|
|
87
|
+
*/
|
|
88
|
+
export interface NativeKeyValueStorage {
|
|
89
|
+
getItem(key: string): Promise<string | null>;
|
|
90
|
+
setItem(key: string, value: string): Promise<void>;
|
|
91
|
+
removeItem(key: string): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Versioned DURABLE storage key. Holds ONLY the small, re-mint-critical fields
|
|
95
|
+
* (`sessionId`, `userId`, `deviceId`, `deviceSecret`) — never the large JWT
|
|
96
|
+
* `accessToken`. Keeping this blob small (<2KB) matters on Android
|
|
97
|
+
* `expo-secure-store`, whose backing store can silently fail to persist an
|
|
98
|
+
* oversize value; bundling the token here previously took the mint credential
|
|
99
|
+
* down with it on every write, losing the session on cold restart.
|
|
100
|
+
*
|
|
101
|
+
* The `.v1` suffix lets a future shape change ship a `.v2` key without reading a
|
|
102
|
+
* stale/incompatible `.v1` blob. Distinct from the `oxy_shared_*` keychain keys
|
|
103
|
+
* in `KeyManager`, so it never collides.
|
|
104
|
+
*
|
|
105
|
+
* BACK-COMPAT: pre-split builds wrote the WHOLE state (including `accessToken` /
|
|
106
|
+
* `expiresAt`) into this single key. `load()` still reads those token fields
|
|
107
|
+
* from here when the warm key ({@link AUTH_STATE_TOKEN_STORAGE_KEY}) is absent,
|
|
108
|
+
* so upgrading users are not signed out; the next `save()` splits them apart.
|
|
109
|
+
*/
|
|
110
|
+
export declare const AUTH_STATE_STORAGE_KEY = "oxy.auth.v1";
|
|
111
|
+
/**
|
|
112
|
+
* Versioned BEST-EFFORT warm-token storage key. Holds the short-lived
|
|
113
|
+
* `{ accessToken, expiresAt }` pair only. Its write is genuinely non-fatal — a
|
|
114
|
+
* failure (quota / oversize keychain value) is swallowed because the session is
|
|
115
|
+
* fully re-mintable from the durable `deviceSecret`. Kept separate from
|
|
116
|
+
* {@link AUTH_STATE_STORAGE_KEY} so a failed token write can NEVER abort or
|
|
117
|
+
* corrupt the durable credential write.
|
|
118
|
+
*/
|
|
119
|
+
export declare const AUTH_STATE_TOKEN_STORAGE_KEY = "oxy.auth.token.v1";
|
|
120
|
+
/**
|
|
121
|
+
* A process-lifetime, in-memory {@link AuthStateStore}. Used directly for
|
|
122
|
+
* tests/SSR and as the degraded fallback of the web store when `localStorage`
|
|
123
|
+
* is unreachable. Not durable across reloads — that is acceptable for the
|
|
124
|
+
* fallback because the alternative (throwing) would break cold boot entirely.
|
|
125
|
+
*/
|
|
126
|
+
export declare function createMemoryAuthStateStore(): AuthStateStore;
|
|
127
|
+
/**
|
|
128
|
+
* A `localStorage`-backed {@link AuthStateStore} split across the durable
|
|
129
|
+
* {@link AUTH_STATE_STORAGE_KEY} (mint credential) and the best-effort
|
|
130
|
+
* {@link AUTH_STATE_TOKEN_STORAGE_KEY} (warm access token).
|
|
131
|
+
*
|
|
132
|
+
* Resilience:
|
|
133
|
+
* - If `localStorage` is unreachable (sandboxed-iframe `SecurityError`, SSR),
|
|
134
|
+
* the whole store degrades to an in-memory {@link createMemoryAuthStateStore}
|
|
135
|
+
* for this page's lifetime — never throws on construction.
|
|
136
|
+
* - Individual `getItem`/`setItem`/`removeItem` are each wrapped: a read that
|
|
137
|
+
* throws yields `null`; a write that throws (quota, private mode) is
|
|
138
|
+
* swallowed. The re-mint lane treats a failed persist as "no durable state"
|
|
139
|
+
* rather than crashing.
|
|
140
|
+
*/
|
|
141
|
+
export declare function createWebAuthStateStore(): AuthStateStore;
|
|
142
|
+
/**
|
|
143
|
+
* A native {@link AuthStateStore} over an injected async key/value store.
|
|
144
|
+
*
|
|
145
|
+
* `@oxy.so/core` never imports `expo-secure-store`; `@oxy.so/services` constructs
|
|
146
|
+
* the SecureStore-backed adapter and passes it here. Persistence is split across
|
|
147
|
+
* the durable {@link AUTH_STATE_STORAGE_KEY} (mint credential) and the
|
|
148
|
+
* best-effort {@link AUTH_STATE_TOKEN_STORAGE_KEY} (warm access token) — the
|
|
149
|
+
* durable write is read-back-verified and its failure surfaced (not swallowed),
|
|
150
|
+
* while the warm-token write and all reads degrade gracefully exactly like the
|
|
151
|
+
* web store.
|
|
152
|
+
*/
|
|
153
|
+
export declare function createNativeAuthStateStore(storage: NativeKeyValueStorage): AuthStateStore;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { OxyServices } from '../OxyServices';
|
|
2
|
+
import { SessionClient, type TokenTransport } from './SessionClient';
|
|
3
|
+
import type { SocketIOFactory } from './socketLoader';
|
|
4
|
+
import { createSessionClientHost } from './sessionClientHost';
|
|
5
|
+
/**
|
|
6
|
+
* Wires a `SessionClient` over the given `OxyServices` instance: builds the
|
|
7
|
+
* `SessionClientHost` adapter and passes it through together with a
|
|
8
|
+
* caller-supplied `TokenTransport`.
|
|
9
|
+
*
|
|
10
|
+
* The transport is a required parameter (not constructed here) because it is
|
|
11
|
+
* the one piece of this integration that is NOT platform-agnostic: `services`
|
|
12
|
+
* branches native (shared-keychain sign-in) vs. web (silent sign-in), while
|
|
13
|
+
* `auth-sdk` is web-only. Each consumer builds its own transport and passes
|
|
14
|
+
* it in; this factory only wires the platform-agnostic parts (host + client)
|
|
15
|
+
* so neither consumer re-implements them.
|
|
16
|
+
*
|
|
17
|
+
* The host is returned alongside the client (not just the client) so the
|
|
18
|
+
* caller can call `host.setCurrentAccountId(...)` as the active account
|
|
19
|
+
* changes.
|
|
20
|
+
*
|
|
21
|
+
* `socketFactory` is the statically-injected `socket.io-client` `io` export.
|
|
22
|
+
* Consumers that bundle socket.io-client as a real dependency pass it so
|
|
23
|
+
* realtime sync never depends on core's lazy dynamic import of a bare
|
|
24
|
+
* specifier (bundler-fragile in Metro/Expo-web and Vite against the published
|
|
25
|
+
* dist). When omitted, the client falls back to the lazy loader.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSessionClient(oxyServices: OxyServices, transport: TokenTransport, socketFactory?: SocketIOFactory): {
|
|
28
|
+
client: SessionClient;
|
|
29
|
+
host: ReturnType<typeof createSessionClientHost>;
|
|
30
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import type { AccountKind, DeviceContextRelationship, DeviceDirectory, DeviceDirectoryProfile } from '@oxy.so/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Pure projections over the device directory (`GET /session/device/directory`,
|
|
4
|
+
* ADR 0002). No I/O — the caller holds the directory `SessionClient` fetched.
|
|
5
|
+
*
|
|
6
|
+
* These exist to say the one thing the flat `DeviceSessionState` projection
|
|
7
|
+
* structurally cannot: WHO an account is being reached through.
|
|
8
|
+
* `DeviceSessionState.accounts[]` has carried `operatedByUserId` on the wire all
|
|
9
|
+
* along and nothing in this SDK ever read it, so "signed in as The Oxy
|
|
10
|
+
* Collective" and "Nate operating The Oxy Collective" render identically today —
|
|
11
|
+
* two different audit actors, two different revocation paths, one row. The
|
|
12
|
+
* directory keeps the two facts apart, and so does everything below.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The human whose authentication backs a context — the audit actor.
|
|
16
|
+
*
|
|
17
|
+
* Always a person (ADR 0001: a principal is never an organization, project,
|
|
18
|
+
* channel or bot) and the owner of the `authuser` slot. An organization in the
|
|
19
|
+
* switcher consumes no slot of its own; it is a SUBJECT under some principal.
|
|
20
|
+
*/
|
|
21
|
+
export interface DeviceContextActor {
|
|
22
|
+
/** Identifies the principal row — the id `POST /session/device/signout { principalId }` takes. */
|
|
23
|
+
principalId: string;
|
|
24
|
+
/** The person's own account id. */
|
|
25
|
+
userId: string;
|
|
26
|
+
/** Google-style signed-in-human slot, allocated per person. */
|
|
27
|
+
authuser: number;
|
|
28
|
+
profile: DeviceDirectoryProfile;
|
|
29
|
+
}
|
|
30
|
+
/** The account a context acts AS — what a profile header renders. */
|
|
31
|
+
export interface DeviceContextSubject {
|
|
32
|
+
accountId: string;
|
|
33
|
+
kind: AccountKind;
|
|
34
|
+
relationship: DeviceContextRelationship;
|
|
35
|
+
profile: DeviceDirectoryProfile;
|
|
36
|
+
/**
|
|
37
|
+
* `false` for a context the principal may act as but has never activated here.
|
|
38
|
+
*
|
|
39
|
+
* NOT a synonym for activatable, in either direction — see
|
|
40
|
+
* {@link canActivateContext}.
|
|
41
|
+
*/
|
|
42
|
+
onDevice: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether this context can be activated right now — the server's whole verdict,
|
|
45
|
+
* returned as a row rather than omitted so the UI can explain a row going away.
|
|
46
|
+
*
|
|
47
|
+
* It is STRICTER than the old `/switch` gate, and stricter than the name
|
|
48
|
+
* suggests: it is the live `account:act_as` check AND the PRINCIPAL's own
|
|
49
|
+
* personal session being live. Activation has no proof of who is acting once
|
|
50
|
+
* the human's own session is gone, so a dead principal makes every one of
|
|
51
|
+
* their contexts unavailable — the delegated ones whose own sessions are
|
|
52
|
+
* perfectly alive included.
|
|
53
|
+
*/
|
|
54
|
+
available: boolean;
|
|
55
|
+
lastUsedAt: number | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* One resolved `principal acting as account` pair — the globally switchable
|
|
59
|
+
* unit, with its two halves named.
|
|
60
|
+
*/
|
|
61
|
+
export interface DeviceContext {
|
|
62
|
+
/**
|
|
63
|
+
* The identifier `POST /session/device/activate` takes. Names the PAIR, never
|
|
64
|
+
* the account.
|
|
65
|
+
*
|
|
66
|
+
* NOT STABLE ACROSS A REMOVAL, and therefore never something to persist or to
|
|
67
|
+
* hold across a read. Removing a delegated context is not permanent while the
|
|
68
|
+
* membership lives: the server rematerializes the pair on the next directory
|
|
69
|
+
* read, as `onDevice: false` under a NEW id — and it does so WITHOUT bumping
|
|
70
|
+
* `revision`, so "the device has not changed" is not evidence the id has not.
|
|
71
|
+
* Re-resolve from the directory in hand every time, and read an id that no
|
|
72
|
+
* longer resolves as gone rather than as an error.
|
|
73
|
+
*/
|
|
74
|
+
contextId: string;
|
|
75
|
+
actor: DeviceContextActor;
|
|
76
|
+
subject: DeviceContextSubject;
|
|
77
|
+
/**
|
|
78
|
+
* Whether the actor and the subject are different accounts — "Nate operating
|
|
79
|
+
* The Oxy Collective" rather than "Nate". Compared by id rather than read off
|
|
80
|
+
* `relationship`, so it stays true if the vocabulary ever grows a fourth term.
|
|
81
|
+
*/
|
|
82
|
+
isDelegated: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve one context by its id.
|
|
86
|
+
*
|
|
87
|
+
* The search is over `(principal, context)` PAIRS, not over accounts: the same
|
|
88
|
+
* `accountId` legitimately appears under two principals on a shared device, and
|
|
89
|
+
* matching on the account would hand back whichever person happened to be
|
|
90
|
+
* enumerated first.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveDeviceContext(directory: DeviceDirectory | null, contextId: string): DeviceContext | null;
|
|
93
|
+
/**
|
|
94
|
+
* One person on the device, with every account they can act as beneath them.
|
|
95
|
+
*
|
|
96
|
+
* This is the switcher's shape, and it is grouped rather than flat because the
|
|
97
|
+
* flat one cannot state the fact the whole model exists for: the same
|
|
98
|
+
* organization reachable through two people is TWO rows, under two different
|
|
99
|
+
* humans, and a list keyed by account can only ever show one of them.
|
|
100
|
+
*/
|
|
101
|
+
export interface DevicePrincipalGroup {
|
|
102
|
+
/** The id `POST /session/device/signout { principalId }` takes. */
|
|
103
|
+
principalId: string;
|
|
104
|
+
/** The person's own account id. */
|
|
105
|
+
userId: string;
|
|
106
|
+
/** Google-style signed-in-human slot. An organization consumes none. */
|
|
107
|
+
authuser: number;
|
|
108
|
+
profile: DeviceDirectoryProfile;
|
|
109
|
+
/**
|
|
110
|
+
* Every context this person can reach, in the server's order (their personal
|
|
111
|
+
* account first, then the accounts they act as, by account id). Not re-sorted
|
|
112
|
+
* here: the server's order is already total and revision-stable, and a second
|
|
113
|
+
* ordering rule on the client would be a second thing to keep in agreement.
|
|
114
|
+
*/
|
|
115
|
+
contexts: DeviceContext[];
|
|
116
|
+
/** Whether the device's ACTIVE context belongs to this person. */
|
|
117
|
+
isActive: boolean;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The directory as the switcher renders it: people, each with what they may
|
|
121
|
+
* become.
|
|
122
|
+
*
|
|
123
|
+
* A principal with no contexts is kept rather than dropped. It is a real state
|
|
124
|
+
* — a person whose every context was removed while they remain on the device —
|
|
125
|
+
* and rendering them with nothing under them is how "sign out of this person"
|
|
126
|
+
* stays reachable. Silently omitting them would strand the row.
|
|
127
|
+
*/
|
|
128
|
+
export declare function projectDevicePrincipals(directory: DeviceDirectory | null): DevicePrincipalGroup[];
|
|
129
|
+
/**
|
|
130
|
+
* The device's active context, or `null`.
|
|
131
|
+
*
|
|
132
|
+
* `null` is a real state, not an error: a device with every context removed, or
|
|
133
|
+
* one whose active context was healed away, has none. It is also the answer when
|
|
134
|
+
* `activeContextId` names a row no principal holds — a directory that
|
|
135
|
+
* disagreed with itself, which resolves to "nothing is active" rather than to a
|
|
136
|
+
* guess.
|
|
137
|
+
*/
|
|
138
|
+
export declare function resolveActiveContext(directory: DeviceDirectory | null): DeviceContext | null;
|
|
139
|
+
/**
|
|
140
|
+
* The name a directory row renders: the API's `displayName` when it has one,
|
|
141
|
+
* otherwise the normalized handle, otherwise the localized unnamed sentinel.
|
|
142
|
+
*
|
|
143
|
+
* The identity contract's `displayName ?? handle`, and deliberately not
|
|
144
|
+
* `getAccountDisplayName`'s multi-field chain — that one is for LOCAL account
|
|
145
|
+
* surfaces, and the directory profile is an API DTO whose `name.displayName`
|
|
146
|
+
* the server already composed or deliberately omitted. `getAccountDisplayName`
|
|
147
|
+
* appears here only for its `null` case, which is the sentinel.
|
|
148
|
+
*/
|
|
149
|
+
export declare function directoryDisplayName(profile: DeviceDirectoryProfile, locale?: string): string;
|
|
150
|
+
/**
|
|
151
|
+
* A directory row's `@handle`, or `null` when the profile carries no usable
|
|
152
|
+
* username.
|
|
153
|
+
*
|
|
154
|
+
* The directory profile has no email — by design, it is the minimum that
|
|
155
|
+
* renders a row — so the handle is the secondary line, never a synthesized
|
|
156
|
+
* `username@oxy.so` address.
|
|
157
|
+
*/
|
|
158
|
+
export declare function directoryHandle(profile: DeviceDirectoryProfile): string | null;
|
|
159
|
+
/**
|
|
160
|
+
* Whether a switcher may offer this row — the one question it asks, answered
|
|
161
|
+
* here so no surface has to re-derive it.
|
|
162
|
+
*
|
|
163
|
+
* It is deliberately a single field. `available` is the server's complete
|
|
164
|
+
* verdict (see {@link DeviceContextSubject.available}), and switchability is an
|
|
165
|
+
* authorization question the client must READ, never recompute; this exists to
|
|
166
|
+
* name the field that answers it, not to combine several.
|
|
167
|
+
*
|
|
168
|
+
* `onDevice` is NOT part of the question and composing the two is the mistake
|
|
169
|
+
* this function exists to prevent, in both directions. `onDevice: false` is an
|
|
170
|
+
* ordinary reachable context whose session is minted on first activation, so
|
|
171
|
+
* requiring it hides every organization the person has not used here yet.
|
|
172
|
+
* `onDevice: true` does not imply activatable either: when a principal's own
|
|
173
|
+
* personal session dies, their delegated contexts keep live sessions of their
|
|
174
|
+
* own and still cannot be activated, so `available || onDevice` would render a
|
|
175
|
+
* row the server answers with 403 and then heals away.
|
|
176
|
+
*
|
|
177
|
+
* Takes a structural subset so a caller holding a raw `DeviceAccountContext`
|
|
178
|
+
* from the wire can ask it without resolving the pair first.
|
|
179
|
+
*/
|
|
180
|
+
export declare function canActivateContext(context: {
|
|
181
|
+
available: boolean;
|
|
182
|
+
}): boolean;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The device switcher's RENDER model: the directory's people and contexts with
|
|
3
|
+
* their names, handles and avatar URLs already resolved.
|
|
4
|
+
*
|
|
5
|
+
* Pure. It takes the projection {@link projectDevicePrincipals} produces from
|
|
6
|
+
* the directory and answers the five questions a row asks —
|
|
7
|
+
* what is it called, what is its handle, where is its avatar, what accent is it
|
|
8
|
+
* drawn in, may it be activated — so the views stay presentational and neither
|
|
9
|
+
* of them re-derives a display rule.
|
|
10
|
+
*
|
|
11
|
+
* One thing the flat account rows this replaced carried is deliberately absent,
|
|
12
|
+
* because the directory does not carry it and inventing it would mean going back
|
|
13
|
+
* to fetching another person's profiles: **email**. The directory profile is the
|
|
14
|
+
* minimum that renders a row, so the secondary line is the `@handle` — never a
|
|
15
|
+
* synthesized `username@oxy.so`.
|
|
16
|
+
*
|
|
17
|
+
* The accent is NOT in that category. It was, briefly, and it was wrong: an
|
|
18
|
+
* accent is part of drawing the row rather than profile data about its owner,
|
|
19
|
+
* and without it every non-active row falls back to the ambient theme accent, so
|
|
20
|
+
* a device holding two people draws them identically (issue #961). The server
|
|
21
|
+
* carries it on the directory profile, so no client has to guess or fetch.
|
|
22
|
+
*
|
|
23
|
+
* It lives here rather than in a UI package because there is more than one
|
|
24
|
+
* switcher — the SDK's account dialog and the `auth.oxy.so` chooser — and the
|
|
25
|
+
* whole point of ADR 0002 is that they render ONE list, built once.
|
|
26
|
+
*/
|
|
27
|
+
import { type DevicePrincipalGroup } from './deviceDirectory';
|
|
28
|
+
/** One `principal acting as account` row. */
|
|
29
|
+
export interface SwitcherContextRow {
|
|
30
|
+
/**
|
|
31
|
+
* The id `activateContext` / `signOutContext` take. Names the PAIR.
|
|
32
|
+
*
|
|
33
|
+
* Not stable across a removal, so it is read out of the directory in hand on
|
|
34
|
+
* every render and never held across one.
|
|
35
|
+
*/
|
|
36
|
+
contextId: string;
|
|
37
|
+
accountId: string;
|
|
38
|
+
displayName: string;
|
|
39
|
+
/** The `@handle` secondary line, or `null` when the profile has no username. */
|
|
40
|
+
handle: string | null;
|
|
41
|
+
avatarUrl: string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* The SUBJECT account's own accent — a named Bloom preset, or `null` when it
|
|
44
|
+
* has none and the renderer should use the ambient theme accent.
|
|
45
|
+
*
|
|
46
|
+
* Forwarded verbatim, never resolved to a colour here: mapping a preset name
|
|
47
|
+
* to a hex is Bloom's job, and `@oxy.so/core` cannot import a UI package.
|
|
48
|
+
*/
|
|
49
|
+
color: string | null;
|
|
50
|
+
/** Whether this pair is the device's active context. */
|
|
51
|
+
isActive: boolean;
|
|
52
|
+
/** Whether the actor and the subject are different accounts. */
|
|
53
|
+
isDelegated: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Whether the row may be pressed — the server's `available`, read and never
|
|
56
|
+
* recomputed. Composing it with `onDevice` is wrong in both directions (see
|
|
57
|
+
* `canActivateContext`), so this is one field forwarded, not a derivation.
|
|
58
|
+
*/
|
|
59
|
+
canActivate: boolean;
|
|
60
|
+
}
|
|
61
|
+
/** One person on this device, with the accounts they can act as beneath them. */
|
|
62
|
+
export interface SwitcherPrincipalRow {
|
|
63
|
+
/** The id `signOutPrincipal` takes. */
|
|
64
|
+
principalId: string;
|
|
65
|
+
displayName: string;
|
|
66
|
+
handle: string | null;
|
|
67
|
+
avatarUrl: string | undefined;
|
|
68
|
+
/** The PERSON's own accent, on the same terms as a context row's. */
|
|
69
|
+
color: string | null;
|
|
70
|
+
/** Whether the device's ACTIVE context belongs to this person. */
|
|
71
|
+
isActive: boolean;
|
|
72
|
+
contexts: SwitcherContextRow[];
|
|
73
|
+
}
|
|
74
|
+
/** Resolves an avatar file id to a thumbnail URL. Bind to `getFileDownloadUrl`. */
|
|
75
|
+
export type ResolveAvatarUrl = (avatar: string | null | undefined) => string | undefined;
|
|
76
|
+
/** The directory's people and their contexts, ready to render. */
|
|
77
|
+
export declare function buildSwitcherRows(groups: DevicePrincipalGroup[], activeContextId: string | null, resolveAvatarUrl: ResolveAvatarUrl, locale?: string): SwitcherPrincipalRow[];
|
|
78
|
+
/**
|
|
79
|
+
* Whether the switcher should name the person above each block.
|
|
80
|
+
*
|
|
81
|
+
* The question a header answers is "who is operating this account", and that is
|
|
82
|
+
* only a question worth printing once somebody holds MORE THAN ONE account
|
|
83
|
+
* here. Two people with one personal account each is the flat list again — every
|
|
84
|
+
* row already IS a person, and a header would just print each name twice.
|
|
85
|
+
*
|
|
86
|
+
* The moment any one of them can act as a second account, every group gets a
|
|
87
|
+
* header, including the single-context ones: an inconsistent list is harder to
|
|
88
|
+
* read than a slightly redundant one, and it is exactly then that "The Oxy
|
|
89
|
+
* Collective, under Nate" and "The Oxy Collective, under Alice" become two
|
|
90
|
+
* different rows that must be told apart.
|
|
91
|
+
*/
|
|
92
|
+
export declare function showsPrincipalHeaders(rows: SwitcherPrincipalRow[]): boolean;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity pin — the durable binding between THIS device's PRIMARY identity key
|
|
3
|
+
* and the account that key authenticates as.
|
|
4
|
+
*
|
|
5
|
+
* An identity-bound client (Commons, the identity vault) must always act as the
|
|
6
|
+
* owner of the local signing key — permanently. The `DeviceSession` it shares
|
|
7
|
+
* with every other Oxy app on the same device tracks a MUTABLE `activeAccountId`
|
|
8
|
+
* that any sibling app can switch; following it silently changes both the user
|
|
9
|
+
* such a client renders and the bearer it sends. The pin is the client-side
|
|
10
|
+
* record that breaks that coupling: `{ publicKey, accountId }`, written when an
|
|
11
|
+
* identity-mode session is established (the only moment both facts are known
|
|
12
|
+
* first-hand), read on every boot, and reconciled against the live
|
|
13
|
+
* `KeyManager.getPublicKey()` before it is trusted (see
|
|
14
|
+
* `resolveIdentityPin` in `identitySession.ts`).
|
|
15
|
+
*
|
|
16
|
+
* It holds NO secret — a public key and an account id, both already known to the
|
|
17
|
+
* server — so it lives in the same per-origin storage as {@link PersistedAuthState}
|
|
18
|
+
* (`authStateStore.ts`) rather than the keychain, and mirrors that module's
|
|
19
|
+
* store shape: `load / save / clear`, an in-memory mirror, a read-back-verified
|
|
20
|
+
* durable write, and graceful degradation when storage is unavailable.
|
|
21
|
+
*
|
|
22
|
+
* ESM-safe (no `require()`); no react/react-native/expo imports.
|
|
23
|
+
*/
|
|
24
|
+
import type { NativeKeyValueStorage } from './authStateStore';
|
|
25
|
+
/**
|
|
26
|
+
* The persisted identity binding.
|
|
27
|
+
*
|
|
28
|
+
* `publicKey` is the device's PRIMARY identity public key (lower-case hex, as
|
|
29
|
+
* `KeyManager` stores it) — never the cross-app shared-slot key, which may hold
|
|
30
|
+
* a different identity. `accountId` is the account the server resolved for that
|
|
31
|
+
* key when the session was established.
|
|
32
|
+
*/
|
|
33
|
+
export interface IdentityPin {
|
|
34
|
+
publicKey: string;
|
|
35
|
+
accountId: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The storage seam for {@link IdentityPin}. Async throughout so one interface
|
|
39
|
+
* fits both synchronous web `localStorage` and asynchronous native
|
|
40
|
+
* SecureStore/AsyncStorage.
|
|
41
|
+
*/
|
|
42
|
+
export interface IdentityPinStore {
|
|
43
|
+
load(): Promise<IdentityPin | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Persist the pin and report whether it durably landed.
|
|
46
|
+
*
|
|
47
|
+
* `true` means the value is retained consistent with this store's durability
|
|
48
|
+
* guarantee (a durable backing whose read-back matched, or a degraded/in-memory
|
|
49
|
+
* store that held it in memory). `false` means a DURABLE backing was expected
|
|
50
|
+
* but the write did not land — the in-memory mirror keeps this process pinned,
|
|
51
|
+
* but the next cold boot will have to re-establish the identity session (which
|
|
52
|
+
* rewrites the pin) instead of taking the fast pinned-mint lane.
|
|
53
|
+
*/
|
|
54
|
+
save(pin: IdentityPin): Promise<boolean>;
|
|
55
|
+
clear(): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Versioned storage key. Deliberately distinct from the `oxy.auth.*` keys so a
|
|
59
|
+
* session sign-out (which clears the auth blob) and an identity change (which
|
|
60
|
+
* clears the pin) can never take each other down.
|
|
61
|
+
*/
|
|
62
|
+
export declare const IDENTITY_PIN_STORAGE_KEY = "oxy.identity.pin.v1";
|
|
63
|
+
/**
|
|
64
|
+
* Whether `pin` still describes the identity currently on this device.
|
|
65
|
+
*
|
|
66
|
+
* `publicKey` comparison is case-insensitive (hex). A `null` local key is a
|
|
67
|
+
* definitive "no identity here" and therefore never a match — the caller clears
|
|
68
|
+
* the pin rather than binding to an account whose key is gone.
|
|
69
|
+
*/
|
|
70
|
+
export declare function identityPinMatches(pin: IdentityPin | null, localPublicKey: string | null): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* A process-lifetime, in-memory {@link IdentityPinStore}. Used directly for
|
|
73
|
+
* tests/SSR and as the degraded fallback of the web store.
|
|
74
|
+
*/
|
|
75
|
+
export declare function createMemoryIdentityPinStore(): IdentityPinStore;
|
|
76
|
+
/**
|
|
77
|
+
* A `localStorage`-backed {@link IdentityPinStore}. Degrades to an in-memory
|
|
78
|
+
* store when `localStorage` is unreachable, and keeps an in-memory mirror so a
|
|
79
|
+
* failed persist still pins THIS page's lifetime.
|
|
80
|
+
*/
|
|
81
|
+
export declare function createWebIdentityPinStore(): IdentityPinStore;
|
|
82
|
+
/**
|
|
83
|
+
* A native {@link IdentityPinStore} over an injected async key/value store —
|
|
84
|
+
* the same seam `createNativeAuthStateStore` uses, so `@oxy.so/core` never
|
|
85
|
+
* imports `expo-secure-store`.
|
|
86
|
+
*/
|
|
87
|
+
export declare function createNativeIdentityPinStore(storage: NativeKeyValueStorage): IdentityPinStore;
|