@oxy.so/core 1.18.1 → 3.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/README.md +13 -7
- package/dist/cjs/HttpService.js +159 -111
- package/dist/cjs/OxyServices.errors.js +48 -1
- package/dist/cjs/OxyServices.js +263 -60
- package/dist/cjs/api/accounts.js +231 -0
- package/dist/cjs/api/agency.js +102 -0
- package/dist/cjs/api/appData.js +45 -0
- package/dist/cjs/api/apps.js +197 -0
- package/dist/cjs/api/assets.js +329 -0
- package/dist/cjs/api/auth.js +900 -0
- package/dist/cjs/api/billing.js +44 -0
- package/dist/cjs/api/civic.js +289 -0
- package/dist/cjs/api/contacts.js +16 -0
- package/dist/cjs/api/devices.js +351 -0
- package/dist/cjs/api/follows.js +240 -0
- package/dist/cjs/api/identity.js +569 -0
- package/dist/cjs/api/linkedAccounts.js +48 -0
- package/dist/cjs/api/nodes.js +75 -0
- package/dist/cjs/api/notifications.js +75 -0
- package/dist/cjs/api/privacy.js +105 -0
- package/dist/cjs/api/reputation.js +74 -0
- package/dist/cjs/api/session.js +177 -0
- package/dist/cjs/api/store.js +199 -0
- package/dist/cjs/api/topics.js +66 -0
- package/dist/cjs/api/users.js +309 -0
- package/dist/cjs/boot/sessionColdBoot.js +4 -4
- package/dist/cjs/civic/index.js +16 -0
- package/dist/cjs/civic/payloads.js +156 -0
- package/dist/cjs/client/context.js +2 -0
- package/dist/cjs/crypto/identityLink.js +5 -5
- package/dist/cjs/crypto/index.js +44 -0
- package/dist/cjs/crypto/internal.js +37 -0
- package/dist/cjs/crypto/keyManager.js +2 -2
- package/dist/cjs/crypto/polyfill.js +9 -80
- package/dist/cjs/crypto/recoveryPhrase.js +1 -0
- package/dist/cjs/crypto/registrationPow.js +1 -1
- package/dist/cjs/crypto/signatureService.js +1 -0
- package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
- package/dist/cjs/i18n/accountRoleLabels.js +7 -7
- package/dist/cjs/i18n/index.js +130 -52
- package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
- package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
- package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
- package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
- package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
- package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
- package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
- package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
- package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
- package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
- package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
- package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
- package/dist/cjs/i18n/trustTierLabels.js +2 -2
- package/dist/cjs/index.js +55 -263
- package/dist/cjs/inference/index.js +21 -0
- package/dist/cjs/server/OxyServer.js +521 -0
- package/dist/cjs/server/auth.js +2 -2
- package/dist/cjs/server/index.js +23 -6
- package/dist/cjs/server/middleware.js +1154 -0
- package/dist/cjs/server/namespaces.js +214 -0
- package/dist/cjs/server/rateLimit.js +2 -2
- package/dist/cjs/server/requesterAssertion.js +5 -5
- package/dist/cjs/server/securityHeaders.js +3 -3
- package/dist/cjs/server/traffic.js +7 -6
- package/dist/cjs/server/trafficNodeHttp.js +9 -3
- package/dist/cjs/server/userInvalidation.js +5 -5
- package/dist/cjs/session/accountDialogController.js +23 -23
- package/dist/cjs/session/authStateStore.js +2 -2
- package/dist/cjs/session/identitySession.js +3 -3
- package/dist/cjs/session/index.js +131 -0
- package/dist/cjs/session/refresh.js +37 -30
- package/dist/cjs/session/sessionClientHost.js +5 -5
- package/dist/cjs/session/sharedDeviceCredential.js +3 -2
- package/dist/cjs/shared/utils/networkUtils.js +2 -2
- package/dist/cjs/utils/accountCacheSweep.js +11 -15
- package/dist/cjs/utils/asyncUtils.js +22 -163
- package/dist/cjs/utils/authHelpers.js +2 -2
- package/dist/cjs/utils/authWebUrl.js +3 -4
- package/dist/cjs/utils/avatarUtils.js +2 -2
- package/dist/cjs/utils/cache.js +32 -2
- package/dist/cjs/utils/cacheKey.js +5 -10
- package/dist/cjs/utils/deviceManager.js +17 -16
- package/dist/cjs/utils/edgeRegion.js +2 -3
- package/dist/cjs/utils/identityCacheSweep.js +6 -10
- package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
- package/dist/cjs/utils/requestUtils.js +40 -33
- package/dist/cjs/utils/sessionUtils.js +0 -2
- package/dist/cjs/utils/tokenClaims.js +34 -0
- package/dist/esm/HttpService.js +160 -112
- package/dist/esm/OxyServices.errors.js +45 -0
- package/dist/esm/OxyServices.js +262 -57
- package/dist/esm/api/accounts.js +218 -0
- package/dist/esm/api/agency.js +95 -0
- package/dist/esm/api/appData.js +40 -0
- package/dist/esm/api/apps.js +191 -0
- package/dist/esm/api/assets.js +324 -0
- package/dist/esm/api/auth.js +858 -0
- package/dist/esm/api/billing.js +40 -0
- package/dist/esm/api/civic.js +250 -0
- package/dist/esm/api/contacts.js +12 -0
- package/dist/esm/api/devices.js +346 -0
- package/dist/esm/api/follows.js +236 -0
- package/dist/esm/api/identity.js +527 -0
- package/dist/esm/api/linkedAccounts.js +44 -0
- package/dist/esm/api/nodes.js +71 -0
- package/dist/esm/api/notifications.js +71 -0
- package/dist/esm/api/privacy.js +101 -0
- package/dist/esm/api/reputation.js +70 -0
- package/dist/esm/api/session.js +173 -0
- package/dist/esm/api/store.js +192 -0
- package/dist/esm/api/topics.js +62 -0
- package/dist/esm/api/users.js +272 -0
- package/dist/esm/boot/sessionColdBoot.js +4 -4
- package/dist/esm/civic/index.js +10 -0
- package/dist/esm/civic/payloads.js +118 -0
- package/dist/esm/client/context.js +1 -0
- package/dist/esm/crypto/identityLink.js +5 -5
- package/dist/esm/crypto/index.js +24 -0
- package/dist/esm/crypto/internal.js +19 -0
- package/dist/esm/crypto/keyManager.js +2 -2
- package/dist/esm/crypto/polyfill.js +10 -81
- package/dist/esm/crypto/recoveryPhrase.js +1 -0
- package/dist/esm/crypto/registrationPow.js +1 -1
- package/dist/esm/crypto/signatureService.js +1 -0
- package/dist/esm/i18n/accountCategoryLabels.js +2 -2
- package/dist/esm/i18n/accountRoleLabels.js +1 -1
- package/dist/esm/i18n/index.js +93 -52
- package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
- package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
- package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
- package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
- package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
- package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
- package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
- package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
- package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
- package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
- package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
- package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
- package/dist/esm/i18n/trustTierLabels.js +1 -1
- package/dist/esm/index.js +30 -166
- package/dist/esm/inference/index.js +13 -0
- package/dist/esm/server/OxyServer.js +516 -0
- package/dist/esm/server/auth.js +2 -2
- package/dist/esm/server/index.js +10 -5
- package/dist/esm/server/middleware.js +1147 -0
- package/dist/esm/server/namespaces.js +206 -0
- package/dist/esm/server/rateLimit.js +2 -2
- package/dist/esm/server/requesterAssertion.js +5 -5
- package/dist/esm/server/securityHeaders.js +3 -3
- package/dist/esm/server/traffic.js +7 -6
- package/dist/esm/server/trafficNodeHttp.js +9 -3
- package/dist/esm/server/userInvalidation.js +5 -5
- package/dist/esm/session/accountDialogController.js +23 -23
- package/dist/esm/session/authStateStore.js +2 -2
- package/dist/esm/session/identitySession.js +3 -3
- package/dist/esm/session/index.js +82 -0
- package/dist/esm/session/refresh.js +37 -30
- package/dist/esm/session/sessionClientHost.js +5 -5
- package/dist/esm/session/sharedDeviceCredential.js +3 -2
- package/dist/esm/shared/utils/networkUtils.js +2 -2
- package/dist/esm/utils/accountCacheSweep.js +11 -15
- package/dist/esm/utils/asyncUtils.js +22 -151
- package/dist/esm/utils/authHelpers.js +2 -2
- package/dist/esm/utils/authWebUrl.js +3 -4
- package/dist/esm/utils/avatarUtils.js +2 -2
- package/dist/esm/utils/cache.js +32 -2
- package/dist/esm/utils/cacheKey.js +5 -10
- package/dist/esm/utils/deviceManager.js +17 -16
- package/dist/esm/utils/edgeRegion.js +1 -2
- package/dist/esm/utils/identityCacheSweep.js +6 -10
- package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
- package/dist/esm/utils/requestUtils.js +40 -33
- package/dist/esm/utils/sessionUtils.js +0 -2
- package/dist/esm/utils/tokenClaims.js +31 -0
- package/dist/types/HttpService.d.ts +26 -9
- package/dist/types/OxyServices.d.ts +160 -131
- package/dist/types/OxyServices.errors.d.ts +42 -0
- package/dist/types/api/accounts.d.ts +415 -0
- package/dist/types/api/agency.d.ts +135 -0
- package/dist/types/api/appData.d.ts +27 -0
- package/dist/types/api/apps.d.ts +433 -0
- package/dist/types/api/assets.d.ts +174 -0
- package/dist/types/api/auth.d.ts +766 -0
- package/dist/types/api/billing.d.ts +113 -0
- package/dist/types/api/civic.d.ts +203 -0
- package/dist/types/api/contacts.d.ts +31 -0
- package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
- package/dist/types/api/follows.d.ts +236 -0
- package/dist/types/api/identity.d.ts +275 -0
- package/dist/types/api/linkedAccounts.d.ts +48 -0
- package/dist/types/api/nodes.d.ts +102 -0
- package/dist/types/api/notifications.d.ts +77 -0
- package/dist/types/api/privacy.d.ts +43 -0
- package/dist/types/api/reputation.d.ts +50 -0
- package/dist/types/api/session.d.ts +85 -0
- package/dist/types/api/store.d.ts +278 -0
- package/dist/types/api/topics.d.ts +34 -0
- package/dist/types/api/users.d.ts +134 -0
- package/dist/types/boot/sessionColdBoot.d.ts +1 -1
- package/dist/types/civic/index.d.ts +10 -0
- package/dist/types/civic/payloads.d.ts +83 -0
- package/dist/types/client/context.d.ts +33 -0
- package/dist/types/crypto/identityLink.d.ts +5 -5
- package/dist/types/crypto/index.d.ts +24 -0
- package/dist/types/crypto/internal.d.ts +19 -0
- package/dist/types/crypto/polyfill.d.ts +6 -9
- package/dist/types/crypto/registrationPow.d.ts +1 -1
- package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
- package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
- package/dist/types/i18n/index.d.ts +20 -1
- package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
- package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
- package/dist/types/i18n/locales/de-DE.d.ts +386 -0
- package/dist/types/i18n/locales/en-US.d.ts +2034 -0
- package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
- package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
- package/dist/types/i18n/locales/it-IT.d.ts +386 -0
- package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
- package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
- package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
- package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
- package/dist/types/index.d.ts +46 -95
- package/dist/types/inference/index.d.ts +22 -0
- package/dist/types/models/interfaces.d.ts +1 -22
- package/dist/types/server/OxyServer.d.ts +183 -0
- package/dist/types/server/auth.d.ts +10 -7
- package/dist/types/server/index.d.ts +10 -4
- package/dist/types/server/middleware.d.ts +291 -0
- package/dist/types/server/namespaces.d.ts +98 -0
- package/dist/types/server/rateLimit.d.ts +7 -5
- package/dist/types/server/requesterAssertion.d.ts +14 -11
- package/dist/types/server/securityHeaders.d.ts +4 -5
- package/dist/types/server/userInvalidation.d.ts +10 -8
- package/dist/types/session/accountDelegationAccess.d.ts +1 -1
- package/dist/types/session/accountDialogController.d.ts +8 -8
- package/dist/types/session/accountSwitchTargets.d.ts +1 -1
- package/dist/types/session/authStateStore.d.ts +7 -6
- package/dist/types/session/index.d.ts +40 -0
- package/dist/types/utils/accountCacheSweep.d.ts +7 -10
- package/dist/types/utils/apiUtils.d.ts +3 -3
- package/dist/types/utils/asyncUtils.d.ts +11 -58
- package/dist/types/utils/authWebUrl.d.ts +3 -4
- package/dist/types/utils/avatarUtils.d.ts +5 -6
- package/dist/types/utils/cache.d.ts +11 -3
- package/dist/types/utils/commonsApproval.d.ts +1 -1
- package/dist/types/utils/edgeRegion.d.ts +1 -2
- package/dist/types/utils/identityCacheSweep.d.ts +6 -4
- package/dist/types/utils/oauthPkce.d.ts +2 -2
- package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
- package/dist/types/utils/requestUtils.d.ts +18 -14
- package/dist/types/utils/tokenClaims.d.ts +9 -0
- package/package.json +68 -7
- package/src/HttpService.ts +166 -131
- package/src/OxyServices.errors.ts +73 -0
- package/src/OxyServices.ts +289 -164
- package/src/api/accounts.ts +579 -0
- package/src/api/agency.ts +277 -0
- package/src/api/appData.ts +63 -0
- package/src/api/apps.ts +596 -0
- package/src/api/assets.ts +416 -0
- package/src/api/auth.ts +1457 -0
- package/src/api/billing.ts +144 -0
- package/src/api/civic.ts +428 -0
- package/src/api/contacts.ts +41 -0
- package/src/api/devices.ts +438 -0
- package/src/api/follows.ts +414 -0
- package/src/api/identity.ts +727 -0
- package/src/api/linkedAccounts.ts +78 -0
- package/src/api/nodes.ts +169 -0
- package/src/api/notifications.ts +135 -0
- package/src/api/privacy.ts +120 -0
- package/src/api/reputation.ts +134 -0
- package/src/api/session.ts +210 -0
- package/src/api/store.ts +435 -0
- package/src/api/topics.ts +83 -0
- package/src/api/users.ts +357 -0
- package/src/boot/sessionColdBoot.ts +4 -4
- package/src/civic/index.ts +12 -0
- package/src/civic/payloads.ts +175 -0
- package/src/client/context.ts +34 -0
- package/src/crypto/identityLink.ts +5 -5
- package/src/crypto/index.ts +39 -0
- package/src/crypto/internal.ts +20 -0
- package/src/crypto/keyManager.ts +2 -2
- package/src/crypto/polyfill.ts +9 -89
- package/src/crypto/recoveryPhrase.ts +1 -0
- package/src/crypto/registrationPow.ts +1 -1
- package/src/crypto/signatureService.ts +1 -0
- package/src/i18n/accountCategoryLabels.ts +2 -2
- package/src/i18n/accountRoleLabels.ts +2 -2
- package/src/i18n/index.ts +105 -54
- package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
- package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
- package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
- package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
- package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
- package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
- package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
- package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
- package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
- package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
- package/src/i18n/reputationCategoryLabels.ts +1 -1
- package/src/i18n/trustTierLabels.ts +1 -1
- package/src/index.ts +170 -501
- package/src/inference/index.ts +48 -0
- package/src/models/interfaces.ts +1 -22
- package/src/server/OxyServer.ts +637 -0
- package/src/server/auth.ts +12 -8
- package/src/server/index.ts +28 -5
- package/src/server/middleware.ts +1520 -0
- package/src/server/namespaces.ts +257 -0
- package/src/server/rateLimit.ts +10 -9
- package/src/server/requesterAssertion.ts +13 -10
- package/src/server/securityHeaders.ts +7 -8
- package/src/server/traffic.ts +6 -6
- package/src/server/trafficNodeHttp.ts +7 -3
- package/src/server/userInvalidation.ts +9 -9
- package/src/session/accountDelegationAccess.ts +1 -1
- package/src/session/accountDialogController.ts +24 -24
- package/src/session/accountSwitchTargets.ts +1 -1
- package/src/session/authStateStore.ts +9 -8
- package/src/session/identitySession.ts +3 -3
- package/src/session/index.ts +210 -0
- package/src/session/refresh.ts +36 -30
- package/src/session/sessionClientHost.ts +5 -5
- package/src/session/sharedDeviceCredential.ts +3 -2
- package/src/shared/utils/networkUtils.ts +2 -2
- package/src/utils/accountCacheSweep.ts +11 -15
- package/src/utils/apiUtils.ts +3 -3
- package/src/utils/asyncUtils.ts +38 -235
- package/src/utils/authHelpers.ts +2 -2
- package/src/utils/authWebUrl.ts +3 -4
- package/src/utils/avatarUtils.ts +4 -7
- package/src/utils/cache.ts +36 -5
- package/src/utils/cacheKey.ts +5 -9
- package/src/utils/commonsApproval.ts +1 -1
- package/src/utils/deviceManager.ts +17 -16
- package/src/utils/edgeRegion.ts +1 -2
- package/src/utils/identityCacheSweep.ts +7 -12
- package/src/utils/oauthPkce.ts +2 -2
- package/src/utils/oxyServiceEnvironment.ts +3 -7
- package/src/utils/requestUtils.ts +48 -44
- package/src/utils/sessionUtils.ts +0 -2
- package/src/utils/tokenClaims.ts +38 -0
- package/dist/cjs/.tsbuildinfo +0 -1
- package/dist/cjs/OxyServices.base.js +0 -392
- package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
- package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
- package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
- package/dist/cjs/mixins/OxyServices.agency.js +0 -154
- package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
- package/dist/cjs/mixins/OxyServices.appData.js +0 -108
- package/dist/cjs/mixins/OxyServices.assets.js +0 -854
- package/dist/cjs/mixins/OxyServices.auth.js +0 -1495
- package/dist/cjs/mixins/OxyServices.chains.js +0 -73
- package/dist/cjs/mixins/OxyServices.civic.js +0 -611
- package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
- package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
- package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
- package/dist/cjs/mixins/OxyServices.devices.js +0 -116
- package/dist/cjs/mixins/OxyServices.features.js +0 -335
- package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
- package/dist/cjs/mixins/OxyServices.identity.js +0 -562
- package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
- package/dist/cjs/mixins/OxyServices.inference.js +0 -59
- package/dist/cjs/mixins/OxyServices.language.js +0 -125
- package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
- package/dist/cjs/mixins/OxyServices.location.js +0 -43
- package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
- package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
- package/dist/cjs/mixins/OxyServices.payment.js +0 -158
- package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
- package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
- package/dist/cjs/mixins/OxyServices.security.js +0 -89
- package/dist/cjs/mixins/OxyServices.store.js +0 -266
- package/dist/cjs/mixins/OxyServices.topics.js +0 -137
- package/dist/cjs/mixins/OxyServices.user.js +0 -954
- package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
- package/dist/cjs/mixins/index.js +0 -136
- package/dist/cjs/mixins/mixinHelpers.js +0 -53
- package/dist/cjs/utils/webauthnOrigin.js +0 -51
- package/dist/esm/.tsbuildinfo +0 -1
- package/dist/esm/OxyServices.base.js +0 -388
- package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
- package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
- package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
- package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
- package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
- package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
- package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
- package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
- package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
- package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
- package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
- package/dist/esm/mixins/OxyServices.accounts.js +0 -543
- package/dist/esm/mixins/OxyServices.agency.js +0 -151
- package/dist/esm/mixins/OxyServices.analytics.js +0 -46
- package/dist/esm/mixins/OxyServices.appData.js +0 -103
- package/dist/esm/mixins/OxyServices.assets.js +0 -851
- package/dist/esm/mixins/OxyServices.auth.js +0 -1455
- package/dist/esm/mixins/OxyServices.chains.js +0 -70
- package/dist/esm/mixins/OxyServices.civic.js +0 -605
- package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
- package/dist/esm/mixins/OxyServices.contacts.js +0 -47
- package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
- package/dist/esm/mixins/OxyServices.devices.js +0 -113
- package/dist/esm/mixins/OxyServices.features.js +0 -332
- package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
- package/dist/esm/mixins/OxyServices.identity.js +0 -558
- package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
- package/dist/esm/mixins/OxyServices.inference.js +0 -56
- package/dist/esm/mixins/OxyServices.language.js +0 -122
- package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
- package/dist/esm/mixins/OxyServices.location.js +0 -40
- package/dist/esm/mixins/OxyServices.nodes.js +0 -172
- package/dist/esm/mixins/OxyServices.notifications.js +0 -60
- package/dist/esm/mixins/OxyServices.payment.js +0 -155
- package/dist/esm/mixins/OxyServices.privacy.js +0 -196
- package/dist/esm/mixins/OxyServices.reputation.js +0 -286
- package/dist/esm/mixins/OxyServices.security.js +0 -86
- package/dist/esm/mixins/OxyServices.store.js +0 -263
- package/dist/esm/mixins/OxyServices.topics.js +0 -134
- package/dist/esm/mixins/OxyServices.user.js +0 -951
- package/dist/esm/mixins/OxyServices.utility.js +0 -1397
- package/dist/esm/mixins/index.js +0 -133
- package/dist/esm/mixins/mixinHelpers.js +0 -48
- package/dist/esm/utils/webauthnOrigin.js +0 -48
- package/dist/types/.tsbuildinfo +0 -1
- package/dist/types/OxyServices.base.d.ts +0 -189
- package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
- package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
- package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
- package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
- package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
- package/dist/types/mixins/OxyServices.auth.d.ts +0 -998
- package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
- package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
- package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
- package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
- package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
- package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
- package/dist/types/mixins/OxyServices.features.d.ts +0 -250
- package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
- package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
- package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
- package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
- package/dist/types/mixins/OxyServices.language.d.ts +0 -87
- package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
- package/dist/types/mixins/OxyServices.location.d.ts +0 -70
- package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
- package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
- package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
- package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
- package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
- package/dist/types/mixins/OxyServices.security.d.ts +0 -84
- package/dist/types/mixins/OxyServices.store.d.ts +0 -334
- package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
- package/dist/types/mixins/OxyServices.user.d.ts +0 -600
- package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
- package/dist/types/mixins/index.d.ts +0 -87
- package/dist/types/mixins/mixinHelpers.d.ts +0 -31
- package/dist/types/utils/webauthnOrigin.d.ts +0 -32
- package/src/OxyServices.base.ts +0 -480
- package/src/__tests__/authSocket.test.ts +0 -96
- package/src/__tests__/fixEsmImports.test.ts +0 -132
- package/src/__tests__/httpServiceAbort.test.ts +0 -308
- package/src/__tests__/httpServiceActivityId.test.ts +0 -49
- package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
- package/src/__tests__/httpServiceCache.test.ts +0 -318
- package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
- package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
- package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
- package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
- package/src/__tests__/httpServiceWrites.test.ts +0 -175
- package/src/__tests__/inSessionRefresh.test.ts +0 -313
- package/src/__tests__/linkedClient.test.ts +0 -363
- package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
- package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
- package/src/__tests__/publicInterfaceParity.test.ts +0 -75
- package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
- package/src/__tests__/serviceIdentityWhenAnonymous.test.ts +0 -159
- package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
- package/src/__tests__/userIdentity.test.ts +0 -143
- package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
- package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
- package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
- package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
- package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
- package/src/crypto/__tests__/identityLink.test.ts +0 -18
- package/src/crypto/__tests__/identityMocks.ts +0 -125
- package/src/crypto/__tests__/identityProof.test.ts +0 -81
- package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
- package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
- package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
- package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
- package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
- package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
- package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
- package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
- package/src/crypto/__tests__/keyManager.test.ts +0 -329
- package/src/crypto/__tests__/polyfill.test.ts +0 -109
- package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
- package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
- package/src/crypto/__tests__/registrationPow.test.ts +0 -61
- package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
- package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
- package/src/crypto/__tests__/signedRecord.test.ts +0 -230
- package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
- package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
- package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
- package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
- package/src/i18n/locales/de-DE.json +0 -306
- package/src/i18n/locales/es-ES.json +0 -2127
- package/src/i18n/locales/ja-JP.json +0 -306
- package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
- package/src/logger/__tests__/logger.test.ts +0 -207
- package/src/mixins/OxyServices.accounts.ts +0 -1330
- package/src/mixins/OxyServices.agency.ts +0 -353
- package/src/mixins/OxyServices.analytics.ts +0 -53
- package/src/mixins/OxyServices.appData.ts +0 -158
- package/src/mixins/OxyServices.assets.ts +0 -964
- package/src/mixins/OxyServices.auth.ts +0 -2083
- package/src/mixins/OxyServices.chains.ts +0 -134
- package/src/mixins/OxyServices.civic.ts +0 -945
- package/src/mixins/OxyServices.connectedApps.ts +0 -212
- package/src/mixins/OxyServices.contacts.ts +0 -73
- package/src/mixins/OxyServices.devices.ts +0 -120
- package/src/mixins/OxyServices.features.ts +0 -454
- package/src/mixins/OxyServices.followGraph.ts +0 -293
- package/src/mixins/OxyServices.identity.ts +0 -787
- package/src/mixins/OxyServices.identityBackup.ts +0 -250
- package/src/mixins/OxyServices.inference.ts +0 -57
- package/src/mixins/OxyServices.language.ts +0 -144
- package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
- package/src/mixins/OxyServices.location.ts +0 -46
- package/src/mixins/OxyServices.nodes.ts +0 -337
- package/src/mixins/OxyServices.notifications.ts +0 -142
- package/src/mixins/OxyServices.payment.ts +0 -163
- package/src/mixins/OxyServices.privacy.ts +0 -219
- package/src/mixins/OxyServices.reputation.ts +0 -436
- package/src/mixins/OxyServices.security.ts +0 -110
- package/src/mixins/OxyServices.store.ts +0 -585
- package/src/mixins/OxyServices.topics.ts +0 -169
- package/src/mixins/OxyServices.user.ts +0 -1208
- package/src/mixins/OxyServices.utility.ts +0 -1803
- package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
- package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
- package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
- package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
- package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
- package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
- package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
- package/src/mixins/__tests__/accountEvents.test.ts +0 -158
- package/src/mixins/__tests__/accounts.test.ts +0 -727
- package/src/mixins/__tests__/agency.test.ts +0 -120
- package/src/mixins/__tests__/appData.test.ts +0 -203
- package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
- package/src/mixins/__tests__/assetUpload.test.ts +0 -191
- package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
- package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
- package/src/mixins/__tests__/chains.test.ts +0 -113
- package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
- package/src/mixins/__tests__/connectedApps.test.ts +0 -146
- package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
- package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
- package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
- package/src/mixins/__tests__/followGraph.test.ts +0 -147
- package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
- package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
- package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
- package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
- package/src/mixins/__tests__/identityBackup.test.ts +0 -315
- package/src/mixins/__tests__/identityLink.test.ts +0 -89
- package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
- package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
- package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
- package/src/mixins/__tests__/notifications.read.test.ts +0 -82
- package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
- package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
- package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
- package/src/mixins/__tests__/reputation.test.ts +0 -522
- package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
- package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
- package/src/mixins/__tests__/store.test.ts +0 -304
- package/src/mixins/__tests__/topics.test.ts +0 -155
- package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
- package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
- package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
- package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
- package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
- package/src/mixins/index.ts +0 -203
- package/src/mixins/mixinHelpers.ts +0 -69
- package/src/server/__tests__/auth.test.ts +0 -78
- package/src/server/__tests__/capabilityTicket.test.ts +0 -111
- package/src/server/__tests__/cors.socket.test.ts +0 -225
- package/src/server/__tests__/cors.test.ts +0 -158
- package/src/server/__tests__/rateLimit.test.ts +0 -257
- package/src/server/__tests__/requesterAssertion.test.ts +0 -359
- package/src/server/__tests__/safeFetch.test.ts +0 -232
- package/src/server/__tests__/securityHeaders.test.ts +0 -387
- package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
- package/src/server/__tests__/traffic.test.ts +0 -180
- package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
- package/src/server/__tests__/userInvalidation.test.ts +0 -203
- package/src/server/__tests__/verifySecret.test.ts +0 -40
- package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
- package/src/server/__tests__/workloadIdentity.test.ts +0 -128
- package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
- package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
- package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
- package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
- package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
- package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
- package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
- package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
- package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
- package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
- package/src/session/__tests__/SessionClient.state.test.ts +0 -78
- package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
- package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
- package/src/session/__tests__/accountDialogController.test.ts +0 -2502
- package/src/session/__tests__/accountDialogShape.test.ts +0 -120
- package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
- package/src/session/__tests__/authStateStore.test.ts +0 -451
- package/src/session/__tests__/deviceDirectory.test.ts +0 -422
- package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
- package/src/session/__tests__/identityPin.test.ts +0 -131
- package/src/session/__tests__/identitySession.test.ts +0 -194
- package/src/session/__tests__/projectSessionState.test.ts +0 -105
- package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
- package/src/session/__tests__/refresh.test.ts +0 -606
- package/src/session/__tests__/sessionIntegration.test.ts +0 -209
- package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
- package/src/utils/__tests__/accountUtils.test.ts +0 -151
- package/src/utils/__tests__/activityId.test.ts +0 -45
- package/src/utils/__tests__/asyncUtils.test.ts +0 -279
- package/src/utils/__tests__/authWebUrl.test.ts +0 -15
- package/src/utils/__tests__/cacheKey.test.ts +0 -0
- package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
- package/src/utils/__tests__/coldBoot.test.ts +0 -496
- package/src/utils/__tests__/commonsApproval.test.ts +0 -60
- package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
- package/src/utils/__tests__/languageUtils.test.ts +0 -244
- package/src/utils/__tests__/oauthPkce.test.ts +0 -303
- package/src/utils/__tests__/officialOrigins.test.ts +0 -31
- package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
- package/src/utils/__tests__/profileLinks.test.ts +0 -180
- package/src/utils/__tests__/redactUrl.test.ts +0 -33
- package/src/utils/__tests__/registrableApex.test.ts +0 -62
- package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
- package/src/utils/__tests__/textNormalization.test.ts +0 -205
- package/src/utils/__tests__/validationUtils.test.ts +0 -703
- package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
- package/src/utils/webauthnOrigin.ts +0 -52
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every API namespace is built on.
|
|
3
|
+
*
|
|
4
|
+
* `OxyServices` creates ONE context and hands it to each namespace it creates
|
|
5
|
+
* (lazily, on first access). It is the namespaces' only way into the client, so
|
|
6
|
+
* the plumbing they share — the transport, the service-token lane, cross-cache
|
|
7
|
+
* invalidation — never becomes public surface on `OxyServices` itself.
|
|
8
|
+
*/
|
|
9
|
+
import type { HttpService, RequestOptions } from '../HttpService';
|
|
10
|
+
import type { OxyServices } from '../OxyServices';
|
|
11
|
+
|
|
12
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The service-token lane. Installed only by `OxyServer`
|
|
16
|
+
* (`@oxy.so/core/server`); `null` on every client. A namespace whose route
|
|
17
|
+
* accepts a service token as well as a user session (e.g. `users.getMany`)
|
|
18
|
+
* prefers it when present.
|
|
19
|
+
*/
|
|
20
|
+
export interface ServiceLane {
|
|
21
|
+
/** Whether a service token can be minted here (a key pair, or workload identity). */
|
|
22
|
+
readonly available: boolean;
|
|
23
|
+
request<T>(method: HttpMethod, url: string, data?: unknown, options?: RequestOptions & { actAs?: string }): Promise<T>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface OxyContext {
|
|
27
|
+
/** The client this context belongs to — for calls into other namespaces. */
|
|
28
|
+
readonly oxy: OxyServices;
|
|
29
|
+
readonly http: HttpService;
|
|
30
|
+
/** `oxy.request`: user bearer, rejects with `OxyApiError`. */
|
|
31
|
+
request<T>(method: HttpMethod, url: string, data?: unknown, options?: RequestOptions): Promise<T>;
|
|
32
|
+
/** The service-token lane, or `null` outside a server. */
|
|
33
|
+
service: ServiceLane | null;
|
|
34
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The code both screens show while Commons is being linked to
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Commons from its own; the person checks they match before the
|
|
6
|
-
*
|
|
2
|
+
* The code both screens show while Commons is being linked to an account
|
|
3
|
+
* (ADR 0029 D3): 6 digits derived from the link request and the key Commons
|
|
4
|
+
* signed with. The linking panel derives it from the key the API relayed,
|
|
5
|
+
* Commons from its own; the person checks they match before the link is
|
|
6
|
+
* confirmed, so a photographed QR cannot slip another key in.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { sha256 } from '@noble/hashes/sha256';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@oxy.so/core/crypto` — the self-custody identity: keys, signatures, the
|
|
3
|
+
* recovery phrase, and the primitives under them.
|
|
4
|
+
*
|
|
5
|
+
* Its own entry so an app that never holds a key never ships secp256k1, bip39
|
|
6
|
+
* or the AEAD cipher. The `oxy.identity` / `oxy.civic` namespaces load what they
|
|
7
|
+
* need from here on first use.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// MUST stay the first import: `@noble/hashes` captures `globalThis.crypto` when
|
|
11
|
+
// it is evaluated, so the shim has to exist before anything below reaches it.
|
|
12
|
+
import './polyfill';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
KeyManager,
|
|
16
|
+
IdentityAlreadyExistsError,
|
|
17
|
+
IdentityPersistError,
|
|
18
|
+
IdentityUnavailableError,
|
|
19
|
+
} from './keyManager';
|
|
20
|
+
export type { KeyPair, IdentityStatus, IdentityRecoveryResult } from './keyManager';
|
|
21
|
+
export { readIdentityMarker, updateIdentityMarker } from './identityMarker';
|
|
22
|
+
export type { IdentityMarker } from './identityMarker';
|
|
23
|
+
export type { IdentityDeviceBackupStore } from './deviceBackup';
|
|
24
|
+
export { SignatureService } from './signatureService';
|
|
25
|
+
export type { SignedMessage, AuthChallenge } from './signatureService';
|
|
26
|
+
export { RecoveryPhraseService } from './recoveryPhrase';
|
|
27
|
+
export type { RecoveryPhraseResult, PendingIdentityResult, BackupMaterial } from './recoveryPhrase';
|
|
28
|
+
|
|
29
|
+
// Low-level primitives (encrypted backup, device transfer)
|
|
30
|
+
export { hkdfSha256 } from './kdf';
|
|
31
|
+
export { encryptAead, decryptAead, AEAD_KEY_LENGTH, AEAD_NONCE_LENGTH } from './aead';
|
|
32
|
+
export type { AeadResult } from './aead';
|
|
33
|
+
export { deriveSharedSecret } from './ecdh';
|
|
34
|
+
|
|
35
|
+
// Identity proofs — the one signed format for operations on a personal root
|
|
36
|
+
// (docs/adr/0024-one-oxy-account-root-holders.md D7)
|
|
37
|
+
export { digestIdentityPayload, signIdentityProof } from './identityProof';
|
|
38
|
+
// Linking Commons to an account: the code both screens compare (ADR 0029 D3)
|
|
39
|
+
export { deriveIdentityLinkCode } from './identityLink';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one module the API namespaces load crypto through, with `import()`.
|
|
3
|
+
*
|
|
4
|
+
* It installs the polyfill FIRST: on Hermes `@noble/hashes` captures
|
|
5
|
+
* `globalThis.crypto` when it is evaluated, so a namespace that dynamically
|
|
6
|
+
* imported `./keyManager` directly — before anything installed the shim —
|
|
7
|
+
* would hand noble `undefined` and every random draw would throw. Loading
|
|
8
|
+
* through here makes the order a property of the module graph, not of which
|
|
9
|
+
* entry an app happened to import first.
|
|
10
|
+
*/
|
|
11
|
+
import './polyfill';
|
|
12
|
+
|
|
13
|
+
export { KeyManager } from './keyManager';
|
|
14
|
+
export { SignatureService } from './signatureService';
|
|
15
|
+
export { RecoveryPhraseService, BACKUP_KDF_ENCRYPTION_INFO } from './recoveryPhrase';
|
|
16
|
+
export { encryptAead, decryptAead, AEAD_KEY_LENGTH, AEAD_NONCE_LENGTH } from './aead';
|
|
17
|
+
export { digestIdentityPayload, signIdentityProof } from './identityProof';
|
|
18
|
+
export { deriveIdentityLinkCode } from './identityLink';
|
|
19
|
+
export { solveRegistrationPow } from './registrationPow';
|
|
20
|
+
export { canonicalize, signMessage, verifySignature } from '@oxy.so/protocol';
|
package/src/crypto/keyManager.ts
CHANGED
|
@@ -317,8 +317,7 @@ async function initSecureStore(): Promise<ExpoSecureStoreLike> {
|
|
|
317
317
|
} catch (error) {
|
|
318
318
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
319
319
|
throw new Error(
|
|
320
|
-
`Failed to load expo-secure-store: ${errorMessage}.
|
|
321
|
-
'Make sure expo-secure-store is installed and properly configured.',
|
|
320
|
+
`Failed to load expo-secure-store: ${errorMessage}. Make sure expo-secure-store is installed and properly configured.`,
|
|
322
321
|
);
|
|
323
322
|
}
|
|
324
323
|
}
|
|
@@ -378,6 +377,7 @@ export interface KeyPair {
|
|
|
378
377
|
privateKey: string;
|
|
379
378
|
}
|
|
380
379
|
|
|
380
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: a public, static-only API surface (`X.method()`) that consumers and tests call and spy on by name.
|
|
381
381
|
export class KeyManager {
|
|
382
382
|
// In-memory cache for identity state (invalidated on identity changes)
|
|
383
383
|
private static cachedPublicKey: string | null = null;
|
package/src/crypto/polyfill.ts
CHANGED
|
@@ -7,15 +7,16 @@
|
|
|
7
7
|
* Guard order when installing a `getRandomValues` shim (see bottom of file and
|
|
8
8
|
* {@link cryptoPolyfill}):
|
|
9
9
|
*
|
|
10
|
-
* 1. A REAL `globalThis.crypto.getRandomValues` — used as-is (
|
|
10
|
+
* 1. A REAL `globalThis.crypto.getRandomValues` — used as-is (browsers, Node
|
|
11
11
|
* >= 20, modern Hermes). The shim below is only installed when the host is
|
|
12
12
|
* missing it, so this branch is the install-time gate.
|
|
13
|
-
* 2.
|
|
14
|
-
* `randomFillSync`). This is what a Node runtime WITHOUT a global WebCrypto
|
|
15
|
-
* (Node 18 script entrypoints, some embedded hosts) falls back to.
|
|
16
|
-
* 3. React Native — `expo-crypto.getRandomBytes`, through the dependency-free
|
|
13
|
+
* 2. React Native — `expo-crypto.getRandomBytes`, through the dependency-free
|
|
17
14
|
* `@oxy.so/protocol/random` entry.
|
|
18
15
|
*
|
|
16
|
+
* There is deliberately no `node:crypto` branch: every supported Node has a
|
|
17
|
+
* global WebCrypto, and a `require('node:crypto')` here made web bundlers ship
|
|
18
|
+
* Node's crypto, stream and buffer polyfills (~600 KB) to every browser.
|
|
19
|
+
*
|
|
19
20
|
* # Evaluation order — this module must import NOTHING that can capture the global
|
|
20
21
|
*
|
|
21
22
|
* `@noble/hashes` 1.x reads `globalThis.crypto` exactly once, when its
|
|
@@ -31,14 +32,10 @@
|
|
|
31
32
|
* and `index.ts` imports this file first. `__tests__/polyfillOrder.test.ts`
|
|
32
33
|
* guards both halves.
|
|
33
34
|
*
|
|
34
|
-
* Historically step (2) delegated to `@oxy.so/protocol`'s RN-only
|
|
35
|
-
* `getRandomBytesRN`, which THROWS on Node — so any Node host lacking a global
|
|
36
|
-
* WebCrypto crashed here instead of getting randomness. It is now a proper
|
|
37
|
-
* Node-backed implementation.
|
|
38
35
|
*/
|
|
39
36
|
|
|
40
37
|
import { Buffer } from 'buffer';
|
|
41
|
-
import { getRandomBytesRN
|
|
38
|
+
import { getRandomBytesRN } from '@oxy.so/protocol/random';
|
|
42
39
|
|
|
43
40
|
const getGlobalObject = (): typeof globalThis => {
|
|
44
41
|
if (typeof globalThis !== 'undefined') return globalThis;
|
|
@@ -60,87 +57,10 @@ type CryptoLike = {
|
|
|
60
57
|
};
|
|
61
58
|
|
|
62
59
|
/** Minimal structural shape of the parts of `node:crypto` this polyfill uses. */
|
|
63
|
-
interface NodeCryptoLike {
|
|
64
|
-
webcrypto?: {
|
|
65
|
-
getRandomValues?: <T extends ArrayBufferView>(array: T) => T;
|
|
66
|
-
};
|
|
67
|
-
randomFillSync?: <T extends ArrayBufferView>(buffer: T) => T;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Lazily-resolved `node:crypto` module, cached after the first attempt.
|
|
72
|
-
* `undefined` = not tried yet; `null` = tried and unavailable (non-Node host).
|
|
73
|
-
*/
|
|
74
|
-
let cachedNodeCrypto: NodeCryptoLike | null | undefined;
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Synchronously load `node:crypto` on a Node runtime, or `null` elsewhere.
|
|
78
|
-
*
|
|
79
|
-
* Uses a guarded, Node-only `require`. Every runtime that actually reaches this
|
|
80
|
-
* branch has a working CommonJS `require`: `@oxy.so/core` publishes no
|
|
81
|
-
* `"type": "module"`, so Node loads it as CommonJS and the `require` free
|
|
82
|
-
* variable is present. Browsers never reach here (they own `globalThis.crypto`,
|
|
83
|
-
* so this polyfill is never installed) and React Native takes the
|
|
84
|
-
* `getRandomBytesRN` branch — so the `node:crypto` reference is dead code in
|
|
85
|
-
* those bundles, and Expo's Metro resolver shims `node:*` builtins, keeping
|
|
86
|
-
* web/native bundles green.
|
|
87
|
-
*/
|
|
88
|
-
function loadNodeCryptoSync(): NodeCryptoLike | null {
|
|
89
|
-
if (cachedNodeCrypto !== undefined) {
|
|
90
|
-
return cachedNodeCrypto;
|
|
91
|
-
}
|
|
92
|
-
if (typeof require !== 'function') {
|
|
93
|
-
cachedNodeCrypto = null;
|
|
94
|
-
return cachedNodeCrypto;
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
cachedNodeCrypto = require('node:crypto') as NodeCryptoLike;
|
|
98
|
-
} catch {
|
|
99
|
-
// No Node crypto (unexpected on a real Node host) — degrade to the next
|
|
100
|
-
// mechanism rather than crash.
|
|
101
|
-
cachedNodeCrypto = null;
|
|
102
|
-
}
|
|
103
|
-
return cachedNodeCrypto;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Fill `array` with cryptographically-secure random bytes from `node:crypto`.
|
|
108
|
-
* Prefers `webcrypto.getRandomValues`; falls back to `randomFillSync`. Returns
|
|
109
|
-
* `false` when Node crypto is unavailable so the caller can try the next
|
|
110
|
-
* mechanism.
|
|
111
|
-
*/
|
|
112
|
-
function fillFromNodeCrypto(array: ArrayBufferView): boolean {
|
|
113
|
-
const nodeCrypto = loadNodeCryptoSync();
|
|
114
|
-
if (!nodeCrypto) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
const webcrypto = nodeCrypto.webcrypto;
|
|
118
|
-
if (webcrypto && typeof webcrypto.getRandomValues === 'function') {
|
|
119
|
-
try {
|
|
120
|
-
webcrypto.getRandomValues(array);
|
|
121
|
-
return true;
|
|
122
|
-
} catch {
|
|
123
|
-
// `webcrypto.getRandomValues` rejects non-integer views (Float*Array,
|
|
124
|
-
// DataView); fall through to `randomFillSync`, which accepts any view.
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (typeof nodeCrypto.randomFillSync === 'function') {
|
|
128
|
-
nodeCrypto.randomFillSync(array);
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
60
|
const cryptoPolyfill: CryptoLike = {
|
|
135
61
|
getRandomValues<T extends ArrayBufferView>(array: T): T {
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
// the RN-only expo-crypto stub would throw.
|
|
139
|
-
if (isNodeJS() && fillFromNodeCrypto(array)) {
|
|
140
|
-
return array;
|
|
141
|
-
}
|
|
142
|
-
// React Native (and any non-Node host without WebCrypto): synchronous
|
|
143
|
-
// expo-crypto via @oxy.so/protocol's RN `platform/random` variant.
|
|
62
|
+
// React Native / Hermes (the one supported host without WebCrypto):
|
|
63
|
+
// synchronous expo-crypto via @oxy.so/protocol's RN `platform/random`.
|
|
144
64
|
const bytes = getRandomBytesRN(array.byteLength);
|
|
145
65
|
const uint8View = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);
|
|
146
66
|
uint8View.set(bytes);
|
|
@@ -101,6 +101,7 @@ export interface GenerateIdentityOptions {
|
|
|
101
101
|
overwrite?: boolean;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: a public, static-only API surface (`X.method()`) that consumers and tests call and spy on by name.
|
|
104
105
|
export class RecoveryPhraseService {
|
|
105
106
|
/**
|
|
106
107
|
* Generate a new identity with a recovery phrase.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Registration proof-of-work — the CLIENT half of the anti-automation nonce
|
|
3
|
-
* `
|
|
3
|
+
* `auth.registerKey()` (`api/auth.ts`) submits alongside the
|
|
4
4
|
* registration signature. The message format, difficulty and the full design
|
|
5
5
|
* rationale (why 16 bits, why sequential nonces are fine, what this is and
|
|
6
6
|
* isn't a defense against) live in `@oxy.so/protocol`'s
|
|
@@ -35,6 +35,7 @@ export interface AuthChallenge {
|
|
|
35
35
|
timestamp: number;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: a public, static-only API surface (`X.method()`) that consumers and tests call and spy on by name.
|
|
38
39
|
export class SignatureService {
|
|
39
40
|
/**
|
|
40
41
|
* Generate a random challenge string (for offline use)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { AccountCategoryId } from '@oxy.so/contracts';
|
|
2
|
-
import enUS from './locales/en-US
|
|
2
|
+
import enUS from './locales/en-US';
|
|
3
3
|
import { translate } from './index';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Every account category's English name, keyed by its stable id.
|
|
7
7
|
*
|
|
8
8
|
* **The annotation is the point.** The vocabulary lives in `@oxy.so/contracts`
|
|
9
|
-
* and the names live in `locales/en-US.
|
|
9
|
+
* and the names live in `locales/en-US.ts`, so they are two lists that must
|
|
10
10
|
* agree and nothing but a type can make them. Declaring the JSON node as a
|
|
11
11
|
* TOTAL `Record<AccountCategoryId, string>` turns "somebody added a category at
|
|
12
12
|
* Oxy and nobody wrote its English" into a `TS2741` naming the missing id, at
|
package/src/i18n/index.ts
CHANGED
|
@@ -1,65 +1,116 @@
|
|
|
1
|
-
import enUS from './locales/en-US
|
|
2
|
-
import esES from './locales/es-ES.json';
|
|
3
|
-
import caES from './locales/ca-ES.json';
|
|
4
|
-
import frFR from './locales/fr-FR.json';
|
|
5
|
-
import deDE from './locales/de-DE.json';
|
|
6
|
-
import itIT from './locales/it-IT.json';
|
|
7
|
-
import ptPT from './locales/pt-PT.json';
|
|
8
|
-
import jaJP from './locales/ja-JP.json';
|
|
9
|
-
import koKR from './locales/ko-KR.json';
|
|
10
|
-
import zhCN from './locales/zh-CN.json';
|
|
11
|
-
import arSA from './locales/ar-SA.json';
|
|
1
|
+
import enUS from './locales/en-US';
|
|
12
2
|
import { getBaseLanguage } from '../utils/languageUtils';
|
|
13
3
|
|
|
14
|
-
|
|
4
|
+
/** A nested dictionary of strings. */
|
|
5
|
+
export interface LocaleDict {
|
|
6
|
+
[key: string]: string | LocaleDict | LocaleDict[] | string[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const FALLBACK = 'en-US';
|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
'
|
|
23
|
-
'
|
|
24
|
-
'fr-FR':
|
|
25
|
-
'de':
|
|
26
|
-
'
|
|
27
|
-
'
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'
|
|
32
|
-
'ja-JP': jaJP,
|
|
33
|
-
'ko': koKR,
|
|
34
|
-
'ko-KR': koKR,
|
|
35
|
-
'zh': zhCN,
|
|
36
|
-
'zh-CN': zhCN,
|
|
37
|
-
'ar': arSA,
|
|
38
|
-
'ar-SA': arSA,
|
|
11
|
+
/**
|
|
12
|
+
* Every dictionary but English loads on demand: an app ships only the languages
|
|
13
|
+
* its people actually use (~200 KB of the ~285 KB total is non-English). English
|
|
14
|
+
* is the fallback for every missing key, so it is always present.
|
|
15
|
+
*/
|
|
16
|
+
const LOADERS: Record<string, () => Promise<{ default: LocaleDict }>> = {
|
|
17
|
+
'es-ES': () => import('./locales/es-ES'),
|
|
18
|
+
'ca-ES': () => import('./locales/ca-ES'),
|
|
19
|
+
'fr-FR': () => import('./locales/fr-FR'),
|
|
20
|
+
'de-DE': () => import('./locales/de-DE'),
|
|
21
|
+
'it-IT': () => import('./locales/it-IT'),
|
|
22
|
+
'pt-PT': () => import('./locales/pt-PT'),
|
|
23
|
+
'ja-JP': () => import('./locales/ja-JP'),
|
|
24
|
+
'ko-KR': () => import('./locales/ko-KR'),
|
|
25
|
+
'zh-CN': () => import('./locales/zh-CN'),
|
|
26
|
+
'ar-SA': () => import('./locales/ar-SA'),
|
|
39
27
|
};
|
|
40
28
|
|
|
41
|
-
|
|
29
|
+
/** Base subtag → the dictionary that serves it. */
|
|
30
|
+
const ALIASES: Record<string, string> = {
|
|
31
|
+
en: 'en-US', es: 'es-ES', ca: 'ca-ES', fr: 'fr-FR', de: 'de-DE', it: 'it-IT',
|
|
32
|
+
pt: 'pt-PT', ja: 'ja-JP', ko: 'ko-KR', zh: 'zh-CN', ar: 'ar-SA',
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const DICTS: Record<string, LocaleDict> = { [FALLBACK]: enUS };
|
|
36
|
+
const pending = new Map<string, Promise<boolean>>();
|
|
37
|
+
const listeners = new Set<() => void>();
|
|
38
|
+
let version = 0;
|
|
39
|
+
|
|
40
|
+
/** The dictionary key serving `locale`, whether or not it is loaded yet. */
|
|
41
|
+
function dictionaryFor(locale: string | undefined): string {
|
|
42
|
+
if (locale) {
|
|
43
|
+
if (locale === FALLBACK || LOADERS[locale]) return locale;
|
|
44
|
+
const base = ALIASES[getBaseLanguage(locale)];
|
|
45
|
+
if (base) return base;
|
|
46
|
+
}
|
|
47
|
+
return FALLBACK;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Load the dictionary serving `locale`. Resolves `true` once it is available
|
|
52
|
+
* (immediately for English or one already loaded), `false` if it failed to load
|
|
53
|
+
* — `translate` then keeps serving English.
|
|
54
|
+
*/
|
|
55
|
+
export function loadLocale(locale: string | undefined): Promise<boolean> {
|
|
56
|
+
const key = dictionaryFor(locale);
|
|
57
|
+
if (DICTS[key]) return Promise.resolve(true);
|
|
58
|
+
let load = pending.get(key);
|
|
59
|
+
if (!load) {
|
|
60
|
+
load = LOADERS[key]()
|
|
61
|
+
.then((mod) => {
|
|
62
|
+
DICTS[key] = mod.default;
|
|
63
|
+
version++;
|
|
64
|
+
for (const listener of listeners) listener();
|
|
65
|
+
return true;
|
|
66
|
+
})
|
|
67
|
+
.catch(() => false)
|
|
68
|
+
.finally(() => pending.delete(key));
|
|
69
|
+
pending.set(key, load);
|
|
70
|
+
}
|
|
71
|
+
return load;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Whether the dictionary serving `locale` is loaded (English always is). */
|
|
75
|
+
export function isLocaleLoaded(locale: string | undefined): boolean {
|
|
76
|
+
return Boolean(DICTS[dictionaryFor(locale)]);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Subscribe to dictionaries finishing loading (for re-rendering once a
|
|
81
|
+
* language arrives). Returns the unsubscribe. Pair with {@link getLocalesVersion}
|
|
82
|
+
* in `useSyncExternalStore`.
|
|
83
|
+
*/
|
|
84
|
+
export function subscribeLocales(listener: () => void): () => void {
|
|
85
|
+
listeners.add(listener);
|
|
86
|
+
return () => listeners.delete(listener);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Bumps each time a dictionary loads. */
|
|
90
|
+
export function getLocalesVersion(): number {
|
|
91
|
+
return version;
|
|
92
|
+
}
|
|
42
93
|
|
|
43
94
|
/**
|
|
44
|
-
* Resolve a locale tag to the
|
|
95
|
+
* Resolve a locale tag to the LOADED dictionary that should serve it.
|
|
45
96
|
*
|
|
46
|
-
* Account locales are full BCP-47 tags (e.g. `es-MX`, `pt-BR
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* 3. The English fallback.
|
|
97
|
+
* Account locales are full BCP-47 tags (e.g. `es-MX`, `pt-BR`), but a
|
|
98
|
+
* dictionary is shipped per language: the exact tag, else its base subtag,
|
|
99
|
+
* else English. A dictionary not loaded yet serves English for now and starts
|
|
100
|
+
* loading — `subscribeLocales` announces its arrival.
|
|
51
101
|
*/
|
|
52
102
|
function resolveLang(locale: string | undefined): string {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (DICTS[base]) return base;
|
|
57
|
-
}
|
|
103
|
+
const key = dictionaryFor(locale);
|
|
104
|
+
if (DICTS[key]) return key;
|
|
105
|
+
void loadLocale(key);
|
|
58
106
|
return FALLBACK;
|
|
59
107
|
}
|
|
60
108
|
|
|
61
|
-
function getNested(obj:
|
|
62
|
-
return path.split('.').reduce(
|
|
109
|
+
function getNested(obj: unknown, path: string): unknown {
|
|
110
|
+
return path.split('.').reduce<unknown>(
|
|
111
|
+
(acc, key) => (acc && typeof acc === 'object' && (acc as Record<string, unknown>)[key] != null ? (acc as Record<string, unknown>)[key] : undefined),
|
|
112
|
+
obj,
|
|
113
|
+
);
|
|
63
114
|
}
|
|
64
115
|
|
|
65
116
|
export function translate(locale: string | undefined, key: string, vars?: Record<string, string | number>): string {
|
|
@@ -73,13 +124,13 @@ export function translate(locale: string | undefined, key: string, vars?: Record
|
|
|
73
124
|
val = getNested(DICTS[FALLBACK], key);
|
|
74
125
|
}
|
|
75
126
|
if (typeof val !== 'string') return key; // last resort: echo the key when truly absent everywhere
|
|
127
|
+
let text = val;
|
|
76
128
|
if (vars) {
|
|
77
|
-
Object.keys(vars)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
129
|
+
for (const k of Object.keys(vars)) {
|
|
130
|
+
text = text.split(`{{${k}}}`).join(String(vars[k]));
|
|
131
|
+
}
|
|
81
132
|
}
|
|
82
|
-
return
|
|
133
|
+
return text;
|
|
83
134
|
}
|
|
84
135
|
|
|
85
136
|
export function hasKey(locale: string | undefined, key: string): boolean {
|