@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,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The inference API, reached with whatever bearer this session already holds
|
|
4
|
+
* (issue #972, workstream 15).
|
|
5
|
+
*
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const models = await oxyServices.inference().listModels();
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* One method, and it is a FACTORY rather than a set of inference methods on
|
|
11
|
+
* `OxyServices`. The calls themselves live once, in
|
|
12
|
+
* {@link OxyInferenceClient} — which an external developer holding only an
|
|
13
|
+
* `oxy_sk_…` machine key constructs directly, with no Oxy session anywhere in
|
|
14
|
+
* the picture. Declaring the same calls a second time here would give the
|
|
15
|
+
* ecosystem two spellings of one request, and only one of them would stay
|
|
16
|
+
* correct.
|
|
17
|
+
*
|
|
18
|
+
* This is the reasoning `createLinkedClient` is already built on: the plumbing
|
|
19
|
+
* that binds an Oxy bearer to a client belongs in core, once, rather than in
|
|
20
|
+
* each app.
|
|
21
|
+
*
|
|
22
|
+
* The credential is a FUNCTION, not the current token: a session bearer rotates
|
|
23
|
+
* on refresh and on account switch, and a client that captured one at
|
|
24
|
+
* construction would start answering 401 an hour into the process's life.
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.OxyServicesInferenceMixin = OxyServicesInferenceMixin;
|
|
28
|
+
const OxyInferenceClient_1 = require("../inference/OxyInferenceClient");
|
|
29
|
+
function OxyServicesInferenceMixin(Base) {
|
|
30
|
+
return class extends Base {
|
|
31
|
+
constructor() {
|
|
32
|
+
super(...arguments);
|
|
33
|
+
/** @internal Memoized so repeated calls return one object identity. */
|
|
34
|
+
this._inferenceClient = null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The inference client for this session.
|
|
38
|
+
*
|
|
39
|
+
* Bound to this instance's base URL and to `getAccessToken()`, so it
|
|
40
|
+
* follows every refresh, sign-in and account switch without being
|
|
41
|
+
* rebuilt.
|
|
42
|
+
*
|
|
43
|
+
* A service-authenticated process wants a different credential and
|
|
44
|
+
* builds {@link OxyInferenceClient} directly:
|
|
45
|
+
* `new OxyInferenceClient({ credential: () => oxy.getServiceToken() })`.
|
|
46
|
+
* The mint is asynchronous and cached, which is exactly what a
|
|
47
|
+
* credential function is for.
|
|
48
|
+
*/
|
|
49
|
+
inference() {
|
|
50
|
+
if (this._inferenceClient === null) {
|
|
51
|
+
this._inferenceClient = new OxyInferenceClient_1.OxyInferenceClient({
|
|
52
|
+
baseURL: this.getBaseURL(),
|
|
53
|
+
credential: () => this.getAccessToken(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return this._inferenceClient;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OxyServicesLanguageMixin = OxyServicesLanguageMixin;
|
|
4
|
+
/**
|
|
5
|
+
* Language Methods Mixin
|
|
6
|
+
*/
|
|
7
|
+
const languageUtils_1 = require("../utils/languageUtils");
|
|
8
|
+
const protocol_1 = require("@oxy.so/protocol");
|
|
9
|
+
const logger_1 = require("../logger");
|
|
10
|
+
function OxyServicesLanguageMixin(Base) {
|
|
11
|
+
return class extends Base {
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get appropriate storage for the platform (similar to DeviceManager)
|
|
17
|
+
*/
|
|
18
|
+
async getStorage() {
|
|
19
|
+
const isReactNative = typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
|
|
20
|
+
if (isReactNative) {
|
|
21
|
+
try {
|
|
22
|
+
// `loadAsyncStorage` is per-platform: the RN variant statically imports
|
|
23
|
+
// @react-native-async-storage/async-storage, the default variant throws
|
|
24
|
+
// (never called outside RN because of the `isReactNative` gate above).
|
|
25
|
+
const asyncStorageModule = await (0, protocol_1.loadAsyncStorage)();
|
|
26
|
+
const storage = asyncStorageModule.default;
|
|
27
|
+
return {
|
|
28
|
+
getItem: storage.getItem.bind(storage),
|
|
29
|
+
setItem: storage.setItem.bind(storage),
|
|
30
|
+
removeItem: storage.removeItem.bind(storage),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger_1.logger.error('AsyncStorage not available in React Native', error, { component: 'OxyServices.language' });
|
|
35
|
+
throw new Error('AsyncStorage is required in React Native environment');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Use localStorage for web
|
|
40
|
+
return {
|
|
41
|
+
getItem: async (key) => {
|
|
42
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
43
|
+
return localStorage.getItem(key);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
},
|
|
47
|
+
setItem: async (key, value) => {
|
|
48
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
49
|
+
localStorage.setItem(key, value);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
removeItem: async (key) => {
|
|
53
|
+
if (typeof window !== 'undefined' && window.localStorage) {
|
|
54
|
+
localStorage.removeItem(key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the current locale from the user profile or local storage.
|
|
62
|
+
* @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')
|
|
63
|
+
* @returns The current BCP-47 locale (e.g., 'en-US') or null if not set
|
|
64
|
+
*/
|
|
65
|
+
async getCurrentLanguage(storageKeyPrefix = 'oxy_session') {
|
|
66
|
+
try {
|
|
67
|
+
// First try the authenticated user's primary account locale.
|
|
68
|
+
try {
|
|
69
|
+
const user = await this.getCurrentUser();
|
|
70
|
+
const primary = (0, languageUtils_1.getPrimaryLanguage)(user);
|
|
71
|
+
if (primary) {
|
|
72
|
+
return primary;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Not authenticated or the profile fetch failed — fall through to the
|
|
77
|
+
// locally stored preference below.
|
|
78
|
+
}
|
|
79
|
+
// Fall back to the locally stored locale preference.
|
|
80
|
+
const storage = await this.getStorage();
|
|
81
|
+
const storageKey = `${storageKeyPrefix}_language`;
|
|
82
|
+
const storedLanguage = await storage.getItem(storageKey);
|
|
83
|
+
if (storedLanguage) {
|
|
84
|
+
return (0, languageUtils_1.normalizeLocale)(storedLanguage) ?? storedLanguage;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger_1.logger.warn('Failed to get current language', { component: 'OxyServices.language' }, error);
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the current language with metadata (name, nativeName, etc.)
|
|
95
|
+
* @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')
|
|
96
|
+
* @returns Language metadata object or null if not set
|
|
97
|
+
*/
|
|
98
|
+
async getCurrentLanguageMetadata(storageKeyPrefix = 'oxy_session') {
|
|
99
|
+
const languageCode = await this.getCurrentLanguage(storageKeyPrefix);
|
|
100
|
+
return (0, languageUtils_1.getLanguageMetadata)(languageCode);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the current language name (e.g., 'English')
|
|
104
|
+
* @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')
|
|
105
|
+
* @returns Language name or null if not set
|
|
106
|
+
*/
|
|
107
|
+
async getCurrentLanguageName(storageKeyPrefix = 'oxy_session') {
|
|
108
|
+
const languageCode = await this.getCurrentLanguage(storageKeyPrefix);
|
|
109
|
+
if (!languageCode)
|
|
110
|
+
return null;
|
|
111
|
+
return (0, languageUtils_1.getLanguageName)(languageCode);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get the current native language name (e.g., 'Español')
|
|
115
|
+
* @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')
|
|
116
|
+
* @returns Native language name or null if not set
|
|
117
|
+
*/
|
|
118
|
+
async getCurrentNativeLanguageName(storageKeyPrefix = 'oxy_session') {
|
|
119
|
+
const languageCode = await this.getCurrentLanguage(storageKeyPrefix);
|
|
120
|
+
if (!languageCode)
|
|
121
|
+
return null;
|
|
122
|
+
return (0, languageUtils_1.getNativeLanguageName)(languageCode);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OxyServicesLinksMixin = OxyServicesLinksMixin;
|
|
4
|
+
const apiUtils_1 = require("../utils/apiUtils");
|
|
5
|
+
/**
|
|
6
|
+
* Maximum number of URLs sent per `POST /links/previews` request. Matches the
|
|
7
|
+
* server-side batch cap (`linkPreviewBatchRequestSchema`'s `.max(50)`); larger
|
|
8
|
+
* inputs are split into multiple chunked calls and the result maps merged,
|
|
9
|
+
* mirroring how `getUsersByIds` chunks at 100.
|
|
10
|
+
*/
|
|
11
|
+
const LINK_PREVIEWS_CHUNK_SIZE = 50;
|
|
12
|
+
function OxyServicesLinksMixin(Base) {
|
|
13
|
+
return class extends Base {
|
|
14
|
+
constructor(...args) {
|
|
15
|
+
super(...args);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a single link preview via `GET /links/preview?url=<encoded>&wait=0|1`.
|
|
19
|
+
*
|
|
20
|
+
* @param url - The URL to unfurl. Sent percent-encoded in the query string.
|
|
21
|
+
* @param opts.wait - When `true`, asks the server to resolve synchronously
|
|
22
|
+
* (`wait=1`) instead of returning a `'pending'` placeholder for a
|
|
23
|
+
* first-seen URL. Defaults to `false` (`wait=0`).
|
|
24
|
+
*
|
|
25
|
+
* Not cached at the SDK layer: a `'pending'` result can become `'resolved'`
|
|
26
|
+
* on a later read, so caching here would serve the stale placeholder.
|
|
27
|
+
*/
|
|
28
|
+
async getLinkPreview(url, opts) {
|
|
29
|
+
try {
|
|
30
|
+
const path = (0, apiUtils_1.buildUrl)('/links/preview', { url, wait: opts?.wait ? 1 : 0 });
|
|
31
|
+
return await this.makeRequest('GET', path, undefined, { cache: false });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw this.handleError(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve multiple link previews via `POST /links/previews` (body `{ urls }`).
|
|
39
|
+
*
|
|
40
|
+
* Inputs are de-duplicated and split into chunks of {@link LINK_PREVIEWS_CHUNK_SIZE}
|
|
41
|
+
* (the server-side cap). Chunks run concurrently and their result maps are
|
|
42
|
+
* merged into a single result keyed by the REQUESTED url (the exact string
|
|
43
|
+
* passed in `urls`) — matching the batch contract — so a caller can always
|
|
44
|
+
* look its own input back up.
|
|
45
|
+
*
|
|
46
|
+
* `makeRequest` unwraps the API's top-level `{ data }` envelope (same as
|
|
47
|
+
* `getUsersByIds`'s `makeServiceRequest<User[]>`), so each chunk response is
|
|
48
|
+
* already the `Record<url, LinkPreview>` map — merge it directly.
|
|
49
|
+
*
|
|
50
|
+
* An empty / whitespace-only input resolves immediately with `{}` and
|
|
51
|
+
* performs no network call. A failure in any chunk surfaces (via
|
|
52
|
+
* `handleError`) rather than being swallowed.
|
|
53
|
+
*/
|
|
54
|
+
async getLinkPreviews(urls) {
|
|
55
|
+
const uniqueUrls = Array.from(new Set(urls.filter((u) => typeof u === 'string' && u.trim().length > 0)));
|
|
56
|
+
if (uniqueUrls.length === 0) {
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
const chunks = [];
|
|
60
|
+
for (let i = 0; i < uniqueUrls.length; i += LINK_PREVIEWS_CHUNK_SIZE) {
|
|
61
|
+
chunks.push(uniqueUrls.slice(i, i + LINK_PREVIEWS_CHUNK_SIZE));
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const responses = await Promise.all(chunks.map((chunk) => this.makeRequest('POST', '/links/previews', { urls: chunk }, { cache: false })));
|
|
65
|
+
return responses.reduce((merged, response) => Object.assign(merged, response ?? {}), {});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw this.handleError(error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OxyServicesLocationMixin = OxyServicesLocationMixin;
|
|
4
|
+
function OxyServicesLocationMixin(Base) {
|
|
5
|
+
return class extends Base {
|
|
6
|
+
constructor(...args) {
|
|
7
|
+
super(...args);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Update user location
|
|
11
|
+
* @param latitude - Latitude coordinate
|
|
12
|
+
* @param longitude - Longitude coordinate
|
|
13
|
+
* @returns Location update result
|
|
14
|
+
*/
|
|
15
|
+
async updateLocation(latitude, longitude) {
|
|
16
|
+
try {
|
|
17
|
+
return await this.makeRequest('POST', '/location', {
|
|
18
|
+
latitude,
|
|
19
|
+
longitude
|
|
20
|
+
}, { cache: false });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
throw this.handleError(error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get nearby users
|
|
28
|
+
* @param radius - Optional search radius in meters
|
|
29
|
+
* @returns Array of nearby users
|
|
30
|
+
*/
|
|
31
|
+
async getNearbyUsers(radius) {
|
|
32
|
+
try {
|
|
33
|
+
const params = radius ? { radius } : undefined;
|
|
34
|
+
return await this.makeRequest('GET', '/location/nearby', params, {
|
|
35
|
+
cache: false, // Don't cache location data - always get fresh data
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw this.handleError(error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OxyServicesNodesMixin = OxyServicesNodesMixin;
|
|
4
|
+
const signatureService_1 = require("../crypto/signatureService");
|
|
5
|
+
const OxyServices_identity_1 = require("./OxyServices.identity");
|
|
6
|
+
const mixinHelpers_1 = require("./mixinHelpers");
|
|
7
|
+
/**
|
|
8
|
+
* AtProto-style collection (NSID) for a user-node registration record — matches
|
|
9
|
+
* the server's `NODE_COLLECTION`. A user has exactly one node, so the record is
|
|
10
|
+
* keyed by the constant {@link NODE_RKEY} (last-writer-wins): re-registering
|
|
11
|
+
* over-writes the single `self` record rather than appending a second node.
|
|
12
|
+
*/
|
|
13
|
+
const NODE_COLLECTION = 'app.oxy.node';
|
|
14
|
+
/**
|
|
15
|
+
* The AtProto-style record key for the single node registration — matches the
|
|
16
|
+
* server's `NODE_RKEY`. Constant (`'self'`) because a user has one node.
|
|
17
|
+
*/
|
|
18
|
+
const NODE_RKEY = 'self';
|
|
19
|
+
/**
|
|
20
|
+
* Cache-key prefix of every node read (`GET /nodes/me`). Swept after a
|
|
21
|
+
* register / revoke / managed-provision so a re-read reflects the new node
|
|
22
|
+
* (or its absence) instead of a stale cached one. The identity tag is a key
|
|
23
|
+
* SUFFIX, so this prefix invalidates the resource for every cached identity.
|
|
24
|
+
*/
|
|
25
|
+
const NODES_CACHE_PREFIX = 'GET:/nodes/';
|
|
26
|
+
/**
|
|
27
|
+
* Cache-key prefix of the current user's `GET /users/me`. Swept alongside the
|
|
28
|
+
* node caches because the user's derived DID document embeds an `#oxy-node`
|
|
29
|
+
* service entry derived from the node row, so registering / revoking / managing
|
|
30
|
+
* a node changes user-facing identity state.
|
|
31
|
+
*/
|
|
32
|
+
const USERS_ME_CACHE_PREFIX = 'GET:/users/me';
|
|
33
|
+
function OxyServicesNodesMixin(Base) {
|
|
34
|
+
return class extends Base {
|
|
35
|
+
constructor(...args) {
|
|
36
|
+
super(...args);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register (or re-register) the caller's SELF-HOSTED personal data node.
|
|
40
|
+
*
|
|
41
|
+
* Builds the `{ endpoint, nodePublicKey, mode }` node record, signs a v2
|
|
42
|
+
* envelope on the caller's own per-subject hash chain (fetching the current
|
|
43
|
+
* chain head first so `seq`/`prev` are never stale), and publishes it through
|
|
44
|
+
* the EXISTING `POST /identity/records` path — which verifies the signature
|
|
45
|
+
* and materializes the operational node cache as a side effect. The signed
|
|
46
|
+
* record (not this call) is the authority; re-registering over-writes the
|
|
47
|
+
* single `self` record (last-writer-wins).
|
|
48
|
+
*
|
|
49
|
+
* NATIVE-ONLY: signs with the on-device identity key (throws on web / when no
|
|
50
|
+
* identity or no authenticated user — the guard fires before any network).
|
|
51
|
+
* `mode` defaults to `'pull'`. After a successful publish the node + `/users/me`
|
|
52
|
+
* GET caches are swept, then the freshly-materialized status is returned.
|
|
53
|
+
*
|
|
54
|
+
* Throws if the chain record stored but the server skipped materialization
|
|
55
|
+
* (e.g. a malformed endpoint the server rejected) — an unexpected state rather
|
|
56
|
+
* than a silent `null`.
|
|
57
|
+
*
|
|
58
|
+
* @param input - The node's endpoint, public key, and optional transport mode.
|
|
59
|
+
*/
|
|
60
|
+
async registerNode(input) {
|
|
61
|
+
try {
|
|
62
|
+
const userId = this.getCurrentUserId();
|
|
63
|
+
if (!userId) {
|
|
64
|
+
throw new Error('No authenticated user — sign in before registering a node.');
|
|
65
|
+
}
|
|
66
|
+
const subject = (0, OxyServices_identity_1.buildUserDid)(userId);
|
|
67
|
+
const record = {
|
|
68
|
+
endpoint: input.endpoint,
|
|
69
|
+
nodePublicKey: input.nodePublicKey,
|
|
70
|
+
mode: input.mode ?? 'pull',
|
|
71
|
+
};
|
|
72
|
+
// Fetch the caller's chain head fresh (uncached) so seq/prev are correct
|
|
73
|
+
// → no bad_seq / chain_fork — exactly as the identity/civic signers do.
|
|
74
|
+
const head = await this.makeRequest('GET', `/identity/records/${encodeURIComponent(userId)}/chain/head`, undefined, { cache: false });
|
|
75
|
+
const envelope = await signatureService_1.SignatureService.signRecordV2('node', subject, record, {
|
|
76
|
+
seq: head.seq + 1,
|
|
77
|
+
prev: head.headRecordId,
|
|
78
|
+
collection: NODE_COLLECTION,
|
|
79
|
+
rkey: NODE_RKEY,
|
|
80
|
+
});
|
|
81
|
+
await this.makeRequest('POST', '/identity/records', envelope, { cache: false });
|
|
82
|
+
this._sweepNodeCaches();
|
|
83
|
+
const node = await this.getMyNode();
|
|
84
|
+
if (!node) {
|
|
85
|
+
throw new Error('Node registration stored but the node could not be materialized.');
|
|
86
|
+
}
|
|
87
|
+
return node;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
throw this.handleError(error);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Read the caller's registered node status (`GET /nodes/me`), or `null` when
|
|
95
|
+
* the caller has no node. Auth required; short-TTL cached (the liveness badge
|
|
96
|
+
* is background-maintained) and swept after the caller's own
|
|
97
|
+
* register / revoke / managed-provision.
|
|
98
|
+
*/
|
|
99
|
+
async getMyNode() {
|
|
100
|
+
try {
|
|
101
|
+
const res = await this.makeRequest('GET', '/nodes/me', undefined, { cache: true, cacheTTL: mixinHelpers_1.CACHE_TIMES.SHORT });
|
|
102
|
+
return res.node ?? null;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw this.handleError(error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Revoke the caller's node registration (`DELETE /nodes/me`). The node flips
|
|
110
|
+
* to `revoked` server-side (leaving the DID document and liveness sweeps).
|
|
111
|
+
* Auth required; the node + `/users/me` GET caches are swept on success.
|
|
112
|
+
*
|
|
113
|
+
* Maps the server's `{ success }` to the SDK's `{ revoked }` semantic.
|
|
114
|
+
*/
|
|
115
|
+
async removeMyNode() {
|
|
116
|
+
try {
|
|
117
|
+
const res = await this.makeRequest('DELETE', '/nodes/me', undefined, { cache: false });
|
|
118
|
+
this._sweepNodeCaches();
|
|
119
|
+
return { revoked: res.success === true };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw this.handleError(error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Provision (or refresh) an Oxy-operated MANAGED vault for the caller
|
|
127
|
+
* (`POST /nodes/managed`) — the "Create your vault" convenience for
|
|
128
|
+
* non-technical users. Oxy custodial-signs the node registration onto the
|
|
129
|
+
* caller's chain and returns the materialized node (`managed:true,
|
|
130
|
+
* controller:'oxy'`). Idempotent server-side. Auth required; the owner id is
|
|
131
|
+
* resolved from the session, never the body. The node + `/users/me` GET caches
|
|
132
|
+
* are swept on success.
|
|
133
|
+
*/
|
|
134
|
+
async provisionManagedVault() {
|
|
135
|
+
try {
|
|
136
|
+
const res = await this.makeRequest('POST', '/nodes/managed', undefined, { cache: false });
|
|
137
|
+
this._sweepNodeCaches();
|
|
138
|
+
return res.node;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
throw this.handleError(error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Send an ingest HINT that a user's node has new records
|
|
146
|
+
* (`POST /nodes/ingest/notify/:userId`). Unauthenticated by design and
|
|
147
|
+
* fire-and-forget on the server (it only schedules a background re-pull of the
|
|
148
|
+
* named user's OWN node, then fully re-verifies — a notify can never inject
|
|
149
|
+
* data), so this resolves once the 202 hint is accepted and returns nothing.
|
|
150
|
+
*
|
|
151
|
+
* @param userId - The user whose node may have new records. URL-encoded.
|
|
152
|
+
*/
|
|
153
|
+
async notifyNodeIngest(userId) {
|
|
154
|
+
try {
|
|
155
|
+
await this.makeRequest('POST', `/nodes/ingest/notify/${encodeURIComponent(userId)}`, undefined, { cache: false });
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
throw this.handleError(error);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Sweep the GET caches a node mutation invalidates: every node read
|
|
163
|
+
* (`GET:/nodes/`) so a re-read reflects the new node / its absence, and
|
|
164
|
+
* `/users/me` because the user's derived DID document embeds an `#oxy-node`
|
|
165
|
+
* service entry that changes on register / revoke / manage. Public rather
|
|
166
|
+
* than `private` because mixins compose into an exported anonymous class
|
|
167
|
+
* where TypeScript cannot represent a private member in the emitted
|
|
168
|
+
* declaration file (TS4094) — mirrors the civic / identity cache sweepers.
|
|
169
|
+
*/
|
|
170
|
+
_sweepNodeCaches() {
|
|
171
|
+
this.clearCacheByPrefix(NODES_CACHE_PREFIX);
|
|
172
|
+
this.clearCacheByPrefix(USERS_ME_CACHE_PREFIX);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OxyServicesNotificationsMixin = OxyServicesNotificationsMixin;
|
|
4
|
+
/**
|
|
5
|
+
* Shape of an Expo push token: `ExponentPushToken[…]` (what
|
|
6
|
+
* `getExpoPushTokenAsync()` returns today) or the equivalent `ExpoPushToken[…]`
|
|
7
|
+
* spelling. Deliberately plain ASCII — `@oxy.so/core` ships to Hermes, where
|
|
8
|
+
* Unicode property escapes throw at runtime.
|
|
9
|
+
*/
|
|
10
|
+
const EXPO_PUSH_TOKEN_PATTERN = /^Expo(nent)?PushToken\[[^[\]\s]+\]$/;
|
|
11
|
+
function OxyServicesNotificationsMixin(Base) {
|
|
12
|
+
return class extends Base {
|
|
13
|
+
/**
|
|
14
|
+
* Register this installation's **Expo** push token for the authenticated
|
|
15
|
+
* identity (`POST /notifications/push-token`, bearer required).
|
|
16
|
+
*
|
|
17
|
+
* Idempotent server-side: re-registering the same token for the same
|
|
18
|
+
* identity refreshes the existing row rather than creating a duplicate, so
|
|
19
|
+
* callers can safely re-register on every cold boot.
|
|
20
|
+
*
|
|
21
|
+
* @throws When `expoPushToken` is not an Expo push token — a raw APNs/FCM
|
|
22
|
+
* device token fails here rather than becoming a silently undeliverable
|
|
23
|
+
* registration.
|
|
24
|
+
*/
|
|
25
|
+
async registerPushToken(input) {
|
|
26
|
+
try {
|
|
27
|
+
if (!EXPO_PUSH_TOKEN_PATTERN.test(input.expoPushToken)) {
|
|
28
|
+
throw new Error('registerPushToken expects an Expo push token ("ExponentPushToken[...]", from getExpoPushTokenAsync). ' +
|
|
29
|
+
'A raw APNs/FCM device token from getDevicePushTokenAsync cannot be delivered to.');
|
|
30
|
+
}
|
|
31
|
+
await this.makeRequest('POST', '/notifications/push-token', {
|
|
32
|
+
token: input.expoPushToken,
|
|
33
|
+
platform: input.platform,
|
|
34
|
+
// Omitted entirely when absent so the body stays exactly what the
|
|
35
|
+
// endpoint has always received (the server reads presence).
|
|
36
|
+
...(input.deviceId ? { deviceId: input.deviceId } : {}),
|
|
37
|
+
...(input.clientId ? { clientId: input.clientId } : {}),
|
|
38
|
+
}, { cache: false });
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw this.handleError(error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Retire an **Expo** push token for the authenticated identity
|
|
46
|
+
* (`DELETE /notifications/push-token`, bearer required).
|
|
47
|
+
*
|
|
48
|
+
* Call it when the user turns notifications off, when the vault identity is
|
|
49
|
+
* replaced, and on sign-out — otherwise the installation keeps receiving
|
|
50
|
+
* approval requests for an identity it no longer holds.
|
|
51
|
+
*
|
|
52
|
+
* @param expoPushToken - The exact token previously registered.
|
|
53
|
+
*/
|
|
54
|
+
async unregisterPushToken(expoPushToken) {
|
|
55
|
+
try {
|
|
56
|
+
await this.makeRequest('DELETE', '/notifications/push-token', { token: expoPushToken }, { cache: false });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
throw this.handleError(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|