@oxy.so/core 1.18.0 → 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 +189 -112
- 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 +190 -113
- 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 +47 -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 -1
- 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 +201 -132
- 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 -1
- 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 -1440
- 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 -1400
- 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 -965
- 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__/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 -2028
- 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,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StoreApi = exports.StoreListingApi = exports.ListingScreenshotsApi = exports.StoreReviewsApi = void 0;
|
|
4
|
+
const SHORT_TTL = 60 * 1000;
|
|
5
|
+
const MEDIUM_TTL = 2 * 60 * 1000;
|
|
6
|
+
const enc = encodeURIComponent;
|
|
7
|
+
/** Read one page out of that envelope. */
|
|
8
|
+
function pageOf(res) {
|
|
9
|
+
return {
|
|
10
|
+
items: res.data ?? [],
|
|
11
|
+
total: res.pagination?.total ?? 0,
|
|
12
|
+
hasMore: res.pagination?.hasMore ?? false,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build a query string from the options that were actually supplied.
|
|
17
|
+
*
|
|
18
|
+
* Generic over the options object rather than taking a `Record`: an interface
|
|
19
|
+
* has no implicit index signature in TypeScript, so `StoreReviewsOptions` would
|
|
20
|
+
* not be assignable to one and every call site would need a cast.
|
|
21
|
+
*/
|
|
22
|
+
function queryOf(params) {
|
|
23
|
+
const search = new URLSearchParams();
|
|
24
|
+
for (const [key, value] of Object.entries(params)) {
|
|
25
|
+
if (value !== undefined)
|
|
26
|
+
search.set(key, String(value));
|
|
27
|
+
}
|
|
28
|
+
const rendered = search.toString();
|
|
29
|
+
return rendered ? `?${rendered}` : '';
|
|
30
|
+
}
|
|
31
|
+
/** `oxy.store.reviews` — what people say about an app, and the caller's own review. */
|
|
32
|
+
class StoreReviewsApi {
|
|
33
|
+
constructor(ctx) {
|
|
34
|
+
this.ctx = ctx;
|
|
35
|
+
}
|
|
36
|
+
/** Visible reviews for a published app, each with the publisher's reply. */
|
|
37
|
+
async list(slug, options = {}) {
|
|
38
|
+
const res = await this.ctx.request('GET', `/store/apps/${enc(slug)}/reviews${queryOf(options)}`, undefined, { cache: true, cacheTTL: SHORT_TTL });
|
|
39
|
+
return pageOf(res);
|
|
40
|
+
}
|
|
41
|
+
/** The caller's own review of an app, or `null` if they have not written one. */
|
|
42
|
+
async mine(slug) {
|
|
43
|
+
const res = await this.ctx.request('GET', reviewPath(slug), undefined, {
|
|
44
|
+
cache: false,
|
|
45
|
+
});
|
|
46
|
+
return res.data ?? null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Write the caller's review, or replace what they said before.
|
|
50
|
+
*
|
|
51
|
+
* A person has one review per app, so this sets it rather than adding one.
|
|
52
|
+
* Rewriting does not clear a moderator's decision: a hidden review stays
|
|
53
|
+
* hidden when its author edits it.
|
|
54
|
+
*/
|
|
55
|
+
async write(slug, input) {
|
|
56
|
+
const res = await this.ctx.request('PUT', reviewPath(slug), input, { cache: false });
|
|
57
|
+
return res.data;
|
|
58
|
+
}
|
|
59
|
+
/** Withdraw the caller's own review. A real delete — the words were theirs. */
|
|
60
|
+
async deleteMine(slug) {
|
|
61
|
+
await this.ctx.request('DELETE', reviewPath(slug), undefined, { cache: false });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.StoreReviewsApi = StoreReviewsApi;
|
|
65
|
+
/** `oxy.store.listing.screenshots` — the pictures on a listing. */
|
|
66
|
+
class ListingScreenshotsApi {
|
|
67
|
+
constructor(ctx) {
|
|
68
|
+
this.ctx = ctx;
|
|
69
|
+
}
|
|
70
|
+
/** Every picture on the listing, in the author's order. */
|
|
71
|
+
async list(applicationId) {
|
|
72
|
+
return this.ctx.request('GET', screenshotsPath(applicationId), undefined, { cache: false });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Attach an already-uploaded image, appended to the end.
|
|
76
|
+
*
|
|
77
|
+
* Upload through `oxy.assets` first; the store keeps a reference rather than
|
|
78
|
+
* a second copy of the asset pipeline. The file must be live, an image, and
|
|
79
|
+
* one the caller is entitled to.
|
|
80
|
+
*/
|
|
81
|
+
async add(applicationId, input) {
|
|
82
|
+
return this.ctx.request('POST', screenshotsPath(applicationId), input, { cache: false });
|
|
83
|
+
}
|
|
84
|
+
/** Edit a picture's caption or the frame it was taken in. Order is `reorder`. */
|
|
85
|
+
async update(applicationId, screenshotId, input) {
|
|
86
|
+
return this.ctx.request('PATCH', `${screenshotsPath(applicationId)}/${enc(screenshotId)}`, input, { cache: false });
|
|
87
|
+
}
|
|
88
|
+
/** Remove a picture. The uploaded file stays — it may be in use elsewhere. */
|
|
89
|
+
async delete(applicationId, screenshotId) {
|
|
90
|
+
await this.ctx.request('DELETE', `${screenshotsPath(applicationId)}/${enc(screenshotId)}`, undefined, {
|
|
91
|
+
cache: false,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set the order of every picture at once.
|
|
96
|
+
*
|
|
97
|
+
* Send EVERY id on the listing, exactly once, in the order they should
|
|
98
|
+
* appear. A partial list is rejected rather than applied: it would leave the
|
|
99
|
+
* pictures it omits at their old positions, interleaved with the new ones.
|
|
100
|
+
*/
|
|
101
|
+
async reorder(applicationId, screenshotIds) {
|
|
102
|
+
return this.ctx.request('PUT', `${screenshotsPath(applicationId)}/order`, { screenshotIds }, {
|
|
103
|
+
cache: false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ListingScreenshotsApi = ListingScreenshotsApi;
|
|
108
|
+
/** `oxy.store.listing` — the page a publisher edits for an application they own. */
|
|
109
|
+
class StoreListingApi {
|
|
110
|
+
constructor(ctx) {
|
|
111
|
+
this.ctx = ctx;
|
|
112
|
+
this.screenshots = new ListingScreenshotsApi(ctx);
|
|
113
|
+
}
|
|
114
|
+
/** The application's store page in whatever state, or `null` if it has none. */
|
|
115
|
+
async get(applicationId) {
|
|
116
|
+
return this.ctx.request('GET', listingPath(applicationId), undefined, { cache: false });
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create the page or replace its content. Never its status.
|
|
120
|
+
*
|
|
121
|
+
* Editing does not move a page: correcting a typo on a live listing leaves
|
|
122
|
+
* it live, and fixing a rejected one does not re-submit it.
|
|
123
|
+
*/
|
|
124
|
+
async write(applicationId, input) {
|
|
125
|
+
return this.ctx.request('PUT', listingPath(applicationId), input, { cache: false });
|
|
126
|
+
}
|
|
127
|
+
/** Hand the page to the store for review. From a draft, or a rejected page once fixed. */
|
|
128
|
+
async submit(applicationId) {
|
|
129
|
+
return this.ctx.request('POST', `${listingPath(applicationId)}/submit`, undefined, {
|
|
130
|
+
cache: false,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Take the page down, or withdraw it from the queue.
|
|
135
|
+
*
|
|
136
|
+
* Back to a draft, never deleted: the slug, the words and the screenshots are
|
|
137
|
+
* the publisher's work, and the reviews were never the listing's to take with
|
|
138
|
+
* them.
|
|
139
|
+
*/
|
|
140
|
+
async unpublish(applicationId) {
|
|
141
|
+
return this.ctx.request('POST', `${listingPath(applicationId)}/unpublish`, undefined, {
|
|
142
|
+
cache: false,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.StoreListingApi = StoreListingApi;
|
|
147
|
+
class StoreApi {
|
|
148
|
+
constructor(ctx) {
|
|
149
|
+
this.ctx = ctx;
|
|
150
|
+
this.reviews = new StoreReviewsApi(ctx);
|
|
151
|
+
this.listing = new StoreListingApi(ctx);
|
|
152
|
+
}
|
|
153
|
+
// The storefront is public: everything served here needs no session.
|
|
154
|
+
/** The shelves, in the order the store curates them. */
|
|
155
|
+
async categories() {
|
|
156
|
+
const res = await this.ctx.request('GET', '/store/categories', undefined, {
|
|
157
|
+
cache: true,
|
|
158
|
+
cacheTTL: MEDIUM_TTL,
|
|
159
|
+
});
|
|
160
|
+
return res.data ?? [];
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Published listings, newest first, optionally one shelf.
|
|
164
|
+
*
|
|
165
|
+
* An unknown category slug is an EMPTY shelf, not every app on the store —
|
|
166
|
+
* so a typo shows nothing rather than showing everything.
|
|
167
|
+
*
|
|
168
|
+
* @param options - `category` is a category slug; `limit` defaults to 24.
|
|
169
|
+
*/
|
|
170
|
+
async apps(options = {}) {
|
|
171
|
+
const res = await this.ctx.request('GET', `/store/apps${queryOf(options)}`, undefined, { cache: true, cacheTTL: SHORT_TTL });
|
|
172
|
+
return pageOf(res);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* One store page.
|
|
176
|
+
*
|
|
177
|
+
* A draft answers 404 exactly as an unknown slug does: whether an unpublished
|
|
178
|
+
* page exists under a name is not something a visitor learns.
|
|
179
|
+
*
|
|
180
|
+
* @param slug - The listing's public slug, not an application id.
|
|
181
|
+
*/
|
|
182
|
+
async app(slug) {
|
|
183
|
+
const res = await this.ctx.request('GET', `/store/apps/${enc(slug)}`, undefined, {
|
|
184
|
+
cache: true,
|
|
185
|
+
cacheTTL: SHORT_TTL,
|
|
186
|
+
});
|
|
187
|
+
return res.data;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.StoreApi = StoreApi;
|
|
191
|
+
function reviewPath(slug) {
|
|
192
|
+
return `/store/apps/${enc(slug)}/review`;
|
|
193
|
+
}
|
|
194
|
+
function listingPath(applicationId) {
|
|
195
|
+
return `/applications/${enc(applicationId)}/listing`;
|
|
196
|
+
}
|
|
197
|
+
function screenshotsPath(applicationId) {
|
|
198
|
+
return `${listingPath(applicationId)}/screenshots`;
|
|
199
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TopicsApi = void 0;
|
|
4
|
+
const SHORT = 60 * 1000;
|
|
5
|
+
const LONG = 5 * 60 * 1000;
|
|
6
|
+
const EXTRA_LONG = 30 * 60 * 1000;
|
|
7
|
+
class TopicsApi {
|
|
8
|
+
constructor(ctx) {
|
|
9
|
+
this.ctx = ctx;
|
|
10
|
+
}
|
|
11
|
+
/** Topics, filtered and paginated; returns the page with `total`/`limit`/`offset`. */
|
|
12
|
+
async list(options = {}) {
|
|
13
|
+
const params = {};
|
|
14
|
+
if (options.type)
|
|
15
|
+
params.type = options.type;
|
|
16
|
+
if (options.q)
|
|
17
|
+
params.q = options.q;
|
|
18
|
+
if (options.limit)
|
|
19
|
+
params.limit = options.limit;
|
|
20
|
+
if (options.offset)
|
|
21
|
+
params.offset = options.offset;
|
|
22
|
+
if (options.locale)
|
|
23
|
+
params.locale = options.locale;
|
|
24
|
+
const res = await this.ctx.request('GET', '/topics', params, {
|
|
25
|
+
cache: true,
|
|
26
|
+
cacheTTL: SHORT,
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
topics: res.topics ?? [],
|
|
30
|
+
total: res.total ?? res.topics?.length ?? 0,
|
|
31
|
+
limit: res.limit ?? options.limit ?? 0,
|
|
32
|
+
offset: res.offset ?? options.offset ?? 0,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Topics matching `query`. Never cached. */
|
|
36
|
+
async search(query, limit) {
|
|
37
|
+
const params = { q: query };
|
|
38
|
+
if (limit)
|
|
39
|
+
params.limit = limit;
|
|
40
|
+
const res = await this.ctx.request('GET', '/topics/search', params, { cache: false });
|
|
41
|
+
return res.topics ?? [];
|
|
42
|
+
}
|
|
43
|
+
/** One topic by slug. */
|
|
44
|
+
async get(slug) {
|
|
45
|
+
return this.ctx.request('GET', `/topics/${slug}`, undefined, { cache: true, cacheTTL: LONG });
|
|
46
|
+
}
|
|
47
|
+
/** The top-level categories, optionally translated. */
|
|
48
|
+
async categories(locale) {
|
|
49
|
+
const res = await this.ctx.request('GET', '/topics/categories', locale ? { locale } : {}, { cache: true, cacheTTL: EXTRA_LONG });
|
|
50
|
+
return res.categories ?? [];
|
|
51
|
+
}
|
|
52
|
+
/** Resolve names to topics, creating the missing ones. Staff or service only. */
|
|
53
|
+
async resolveNames(names) {
|
|
54
|
+
const res = await this.ctx.request('POST', '/topics/resolve', { names }, {
|
|
55
|
+
cache: false,
|
|
56
|
+
});
|
|
57
|
+
return Object.values(res.topics ?? {});
|
|
58
|
+
}
|
|
59
|
+
/** Update a topic's description and translations. Staff or service only. */
|
|
60
|
+
async update(slug, data) {
|
|
61
|
+
const topic = await this.ctx.request('PATCH', `/topics/${slug}`, data, { cache: false });
|
|
62
|
+
this.ctx.oxy.cache.delete(`GET:/topics/${slug}`);
|
|
63
|
+
return topic;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.TopicsApi = TopicsApi;
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.UsersApi = void 0;
|
|
37
|
+
const contracts_1 = require("@oxy.so/contracts");
|
|
38
|
+
const apiUtils_1 = require("../utils/apiUtils");
|
|
39
|
+
const userIdentity_1 = require("../utils/userIdentity");
|
|
40
|
+
const identityCacheSweep_1 = require("../utils/identityCacheSweep");
|
|
41
|
+
const accountCacheSweep_1 = require("../utils/accountCacheSweep");
|
|
42
|
+
const errorUtils_1 = require("../utils/errorUtils");
|
|
43
|
+
const logger_1 = require("../logger");
|
|
44
|
+
const PROFILE_TTL = 5 * 60 * 1000;
|
|
45
|
+
const SESSION_USER_TTL = 2 * 60 * 1000;
|
|
46
|
+
const ME_TTL = 60 * 1000;
|
|
47
|
+
const SEARCH_TTL = 2 * 60 * 1000;
|
|
48
|
+
/**
|
|
49
|
+
* Maximum number of ids sent per `POST /users/by-ids` request. Matches the
|
|
50
|
+
* server-side batch cap; larger inputs are split into chunked calls.
|
|
51
|
+
*/
|
|
52
|
+
const USERS_BY_IDS_CHUNK_SIZE = 100;
|
|
53
|
+
class UsersApi {
|
|
54
|
+
constructor(ctx) {
|
|
55
|
+
this.ctx = ctx;
|
|
56
|
+
}
|
|
57
|
+
// ── Reads ────────────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* A user by id. Cached 5 minutes; pass `{ cache: false }` for a
|
|
60
|
+
* registry-fresh read that neither serves nor overwrites a cached entry.
|
|
61
|
+
*/
|
|
62
|
+
async get(userId, options) {
|
|
63
|
+
const user = await this.ctx.request('GET', `/users/${userId}`, undefined, {
|
|
64
|
+
cache: options?.cache ?? true,
|
|
65
|
+
cacheTTL: PROFILE_TTL,
|
|
66
|
+
});
|
|
67
|
+
return (0, userIdentity_1.normalizeUserIdentity)(user);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Many users by id, one round-trip per chunk of 100 — for hydration call
|
|
71
|
+
* sites that would otherwise issue one `get` per author.
|
|
72
|
+
*
|
|
73
|
+
* Ids are deduplicated and blank ids dropped; the result is unordered (map
|
|
74
|
+
* by `id`). `/users/by-ids` accepts a service token, a user session or an
|
|
75
|
+
* anonymous caller and returns the same public payload in every case: on a
|
|
76
|
+
* server that can mint a service token (`OxyServer`) the chunks go over the
|
|
77
|
+
* service lane — an anonymous call from a backend is charged to its shared
|
|
78
|
+
* NAT address's per-IP budget — and everywhere else over the user bearer.
|
|
79
|
+
*
|
|
80
|
+
* Chunks are independent: a failed chunk is logged and skipped. Not cached.
|
|
81
|
+
*/
|
|
82
|
+
async getMany(ids) {
|
|
83
|
+
const uniqueIds = Array.from(new Set(ids.filter((id) => typeof id === 'string' && id.trim().length > 0)));
|
|
84
|
+
if (uniqueIds.length === 0)
|
|
85
|
+
return [];
|
|
86
|
+
const chunks = [];
|
|
87
|
+
for (let i = 0; i < uniqueIds.length; i += USERS_BY_IDS_CHUNK_SIZE) {
|
|
88
|
+
chunks.push(uniqueIds.slice(i, i + USERS_BY_IDS_CHUNK_SIZE));
|
|
89
|
+
}
|
|
90
|
+
const service = this.ctx.service?.available ? this.ctx.service : null;
|
|
91
|
+
const settled = await Promise.all(chunks.map(async (chunk) => {
|
|
92
|
+
try {
|
|
93
|
+
const users = service
|
|
94
|
+
? await service.request('POST', '/users/by-ids', { ids: chunk })
|
|
95
|
+
: await this.ctx.request('POST', '/users/by-ids', { ids: chunk }, { cache: false });
|
|
96
|
+
return Array.isArray(users) ? users.map((user) => (0, userIdentity_1.normalizeUserIdentity)(user)) : [];
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
logger_1.logger.warn('users.getMany: chunk failed, continuing with remaining chunks', {
|
|
100
|
+
method: 'users.getMany',
|
|
101
|
+
mode: service ? 'service' : 'user',
|
|
102
|
+
chunkSize: chunk.length,
|
|
103
|
+
status: (0, errorUtils_1.extractErrorStatus)(error),
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
});
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}));
|
|
109
|
+
return settled.flat();
|
|
110
|
+
}
|
|
111
|
+
/** The signed-in user. Cached 1 minute. */
|
|
112
|
+
async me() {
|
|
113
|
+
const user = await this.ctx.request('GET', '/users/me', undefined, { cache: true, cacheTTL: ME_TTL });
|
|
114
|
+
return (0, userIdentity_1.normalizeUserIdentity)(user);
|
|
115
|
+
}
|
|
116
|
+
/** A profile by username. Cached 5 minutes; `{ cache: false }` as in `get`. */
|
|
117
|
+
async byUsername(username, options) {
|
|
118
|
+
const user = await this.ctx.request('GET', `/profiles/username/${encodeURIComponent(username)}`, undefined, {
|
|
119
|
+
cache: options?.cache ?? true,
|
|
120
|
+
cacheTTL: PROFILE_TTL,
|
|
121
|
+
});
|
|
122
|
+
return (0, userIdentity_1.normalizeUserIdentity)(user);
|
|
123
|
+
}
|
|
124
|
+
/** The user owning a public key. Public (pre-session): sends no bearer. */
|
|
125
|
+
async byPublicKey(publicKey) {
|
|
126
|
+
const user = await this.ctx.request('GET', `/auth/user/${encodeURIComponent(publicKey)}`, undefined, {
|
|
127
|
+
cache: true,
|
|
128
|
+
cacheTTL: SESSION_USER_TTL,
|
|
129
|
+
skipAuth: true,
|
|
130
|
+
});
|
|
131
|
+
return (0, userIdentity_1.normalizeUserIdentity)(user);
|
|
132
|
+
}
|
|
133
|
+
/** The user a session belongs to. */
|
|
134
|
+
async bySession(sessionId) {
|
|
135
|
+
const user = await this.ctx.request('GET', `/session/user/${sessionId}`, undefined, {
|
|
136
|
+
cache: true,
|
|
137
|
+
cacheTTL: SESSION_USER_TTL,
|
|
138
|
+
});
|
|
139
|
+
return (0, userIdentity_1.normalizeUserIdentity)(user);
|
|
140
|
+
}
|
|
141
|
+
/** The users of many sessions in one request; `user` is `null` for a dead session. */
|
|
142
|
+
async bySessions(sessionIds) {
|
|
143
|
+
if (!Array.isArray(sessionIds) || sessionIds.length === 0)
|
|
144
|
+
return [];
|
|
145
|
+
const unique = Array.from(new Set(sessionIds)).sort();
|
|
146
|
+
const entries = await this.ctx.request('POST', '/session/users/batch', { sessionIds: unique },
|
|
147
|
+
// A read over POST: sorted ids make the body a stable cache/dedupe key.
|
|
148
|
+
{ cache: true, cacheTTL: SESSION_USER_TTL, deduplicate: true });
|
|
149
|
+
return entries.map((entry) => ({ ...entry, user: (0, userIdentity_1.normalizeUserIdentityOrNull)(entry.user) }));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Search profiles. Pass `signal` from a search box: every keystroke would
|
|
153
|
+
* otherwise run a search to completion while holding a request-queue slot.
|
|
154
|
+
*/
|
|
155
|
+
async search(query, pagination, options) {
|
|
156
|
+
const response = await this.ctx.request('GET', '/profiles/search', (0, apiUtils_1.buildQueryParams)({ query, ...pagination }), { cache: true, cacheTTL: SEARCH_TTL, signal: options?.signal });
|
|
157
|
+
if (typeof response !== 'object' || response === null || !Array.isArray(response.data)) {
|
|
158
|
+
throw new Error('Unexpected search response format');
|
|
159
|
+
}
|
|
160
|
+
const limit = pagination?.limit ?? response.data.length;
|
|
161
|
+
const paginationInfo = response.pagination ?? {
|
|
162
|
+
total: response.data.length,
|
|
163
|
+
limit,
|
|
164
|
+
offset: pagination?.offset ?? 0,
|
|
165
|
+
hasMore: response.data.length === limit && limit > 0,
|
|
166
|
+
};
|
|
167
|
+
return { data: response.data, pagination: paginationInfo };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Resolve a fediverse handle (`@user@mastodon.social`) to an Oxy profile by
|
|
171
|
+
* WebFinger. `null` when it cannot be resolved — discovery is best-effort.
|
|
172
|
+
* Cached 5 minutes: the profile carries the viewer-relative `relationship`.
|
|
173
|
+
*/
|
|
174
|
+
async resolveHandle(handle) {
|
|
175
|
+
try {
|
|
176
|
+
const result = await this.ctx.request('GET', '/profiles/resolve', { handle }, {
|
|
177
|
+
cache: true,
|
|
178
|
+
cacheTTL: PROFILE_TTL,
|
|
179
|
+
});
|
|
180
|
+
return (0, userIdentity_1.normalizeUserIdentityOrNull)(result);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
// A 404 (absent) and an upstream failure both return null; the log keeps
|
|
184
|
+
// them distinguishable without turning expected misses into noise.
|
|
185
|
+
const status = (0, errorUtils_1.extractErrorStatus)(error);
|
|
186
|
+
logger_1.logger.debug(status === 404 ? 'users.resolveHandle: handle not found' : 'users.resolveHandle: discovery failed', {
|
|
187
|
+
method: 'users.resolveHandle',
|
|
188
|
+
handle,
|
|
189
|
+
status,
|
|
190
|
+
notFound: status === 404,
|
|
191
|
+
error: error instanceof Error ? error.message : String(error),
|
|
192
|
+
});
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Find or create a non-local user (federated, agent, automated). All user
|
|
198
|
+
* creation for external accounts goes through here — services never write
|
|
199
|
+
* user data directly.
|
|
200
|
+
*/
|
|
201
|
+
async resolveExternal(input) {
|
|
202
|
+
return (0, userIdentity_1.normalizeUserIdentity)(await this.ctx.request('PUT', '/users/resolve', input));
|
|
203
|
+
}
|
|
204
|
+
/** Profiles similar to `userId`, by co-follower overlap. Cached 5 minutes. */
|
|
205
|
+
async similar(userId, limitOrPagination) {
|
|
206
|
+
const pagination = typeof limitOrPagination === 'number' ? { limit: limitOrPagination } : limitOrPagination ?? {};
|
|
207
|
+
const users = await this.ctx.request('GET', `/profiles/${userId}/similar`, (0, apiUtils_1.buildQueryParams)(pagination), {
|
|
208
|
+
cache: true,
|
|
209
|
+
cacheTTL: PROFILE_TTL,
|
|
210
|
+
});
|
|
211
|
+
return users.map((user) => (0, userIdentity_1.normalizeUserIdentity)(user));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Profile recommendations. Works signed out (popular public profiles) and
|
|
215
|
+
* personalises when signed in.
|
|
216
|
+
*
|
|
217
|
+
* Only `excludeTypes` / `limit` → the cached `GET /profiles/recommendations`.
|
|
218
|
+
* Any scored field (`boosts`, `excludeIds`, `signalWeights`, `clientId`,
|
|
219
|
+
* `offset`) → `POST` with the body validated by `recommendationRequestSchema`
|
|
220
|
+
* (also cached, keyed on the body).
|
|
221
|
+
*/
|
|
222
|
+
async recommendations(options) {
|
|
223
|
+
const scored = Boolean(options &&
|
|
224
|
+
(options.clientId !== undefined ||
|
|
225
|
+
options.offset !== undefined ||
|
|
226
|
+
(options.excludeIds?.length ?? 0) > 0 ||
|
|
227
|
+
(options.boosts?.length ?? 0) > 0 ||
|
|
228
|
+
options.signalWeights !== undefined));
|
|
229
|
+
try {
|
|
230
|
+
if (scored && options) {
|
|
231
|
+
const body = contracts_1.recommendationRequestSchema.parse(options);
|
|
232
|
+
return await this.ctx.request('POST', '/profiles/recommendations', body, { cache: true });
|
|
233
|
+
}
|
|
234
|
+
const params = {};
|
|
235
|
+
if (options?.excludeTypes?.length)
|
|
236
|
+
params.excludeTypes = options.excludeTypes.join(',');
|
|
237
|
+
if (options?.limit !== undefined)
|
|
238
|
+
params.limit = String(options.limit);
|
|
239
|
+
return await this.ctx.request('GET', '/profiles/recommendations', Object.keys(params).length > 0 ? params : undefined, { cache: true });
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
logger_1.logger.debug('users.recommendations: discovery read failed', {
|
|
243
|
+
method: 'users.recommendations',
|
|
244
|
+
path: scored ? 'POST' : 'GET',
|
|
245
|
+
excludeTypes: options?.excludeTypes,
|
|
246
|
+
status: (0, errorUtils_1.extractErrorStatus)(error),
|
|
247
|
+
error: error instanceof Error ? error.message : String(error),
|
|
248
|
+
});
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// ── The signed-in user ───────────────────────────────────────────────────
|
|
253
|
+
/**
|
|
254
|
+
* Update the signed-in user's profile and settings (`PUT /users/me`) —
|
|
255
|
+
* including `notificationPreferences`, `userPreferences` and
|
|
256
|
+
* `themePreference`.
|
|
257
|
+
*
|
|
258
|
+
* Every cached read that can return this user goes, in one pass: the
|
|
259
|
+
* identity reads (the list `identityCacheSweep` owns) and the account forest
|
|
260
|
+
* (a personal account IS this user, and `AccountNode.account` embeds it).
|
|
261
|
+
*
|
|
262
|
+
* A 401 with no token held rejects with `AUTH_REQUIRED_OFFLINE_SESSION: …` so
|
|
263
|
+
* the caller knows to sync an offline session before retrying.
|
|
264
|
+
*/
|
|
265
|
+
async updateMe(updates) {
|
|
266
|
+
let result;
|
|
267
|
+
try {
|
|
268
|
+
result = (0, userIdentity_1.normalizeUserIdentity)(await this.ctx.request('PUT', '/users/me', updates, { cache: false }));
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
if ((0, errorUtils_1.extractErrorStatus)(error) === 401 && !this.ctx.oxy.session.isAuthenticated) {
|
|
272
|
+
throw new Error('AUTH_REQUIRED_OFFLINE_SESSION: Session needs to be synced to get a token');
|
|
273
|
+
}
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
const id = result?.id;
|
|
277
|
+
this.ctx.http.invalidateCache({
|
|
278
|
+
prefixes: [...identityCacheSweep_1.OXY_IDENTITY_CACHE_PREFIXES, accountCacheSweep_1.OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX],
|
|
279
|
+
keys: id
|
|
280
|
+
? [(0, identityCacheSweep_1.oxyUserByIdCacheKey)(id), accountCacheSweep_1.OXY_ACCOUNT_LIST_CACHE_KEY, (0, accountCacheSweep_1.oxyAccountDetailCacheKey)(id)]
|
|
281
|
+
: [accountCacheSweep_1.OXY_ACCOUNT_LIST_CACHE_KEY],
|
|
282
|
+
});
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
/** Ask for the verified badge. */
|
|
286
|
+
async requestVerification(reason, evidence) {
|
|
287
|
+
return this.ctx.request('POST', '/users/verify/request', { reason, evidence }, { cache: false });
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Delete the signed-in account permanently. `confirmText` must equal the
|
|
291
|
+
* username. See {@link DeleteAccountProof} for what confirms it.
|
|
292
|
+
*/
|
|
293
|
+
async deleteMe(confirmText, proof) {
|
|
294
|
+
if ('reauth' in proof) {
|
|
295
|
+
return this.ctx.request('DELETE', '/users/me', { confirmText, reauth: proof.reauth }, { cache: false });
|
|
296
|
+
}
|
|
297
|
+
// Loaded on demand: only a Commons account deleting from its own device
|
|
298
|
+
// needs the key store, and nobody else should ship it.
|
|
299
|
+
const { KeyManager, SignatureService } = await Promise.resolve().then(() => __importStar(require('../crypto/internal')));
|
|
300
|
+
const publicKey = await KeyManager.getPublicKey();
|
|
301
|
+
if (!publicKey) {
|
|
302
|
+
throw new Error('No identity found on this device. Account deletion requires the device that holds your identity key.');
|
|
303
|
+
}
|
|
304
|
+
const timestamp = Date.now();
|
|
305
|
+
const signature = await SignatureService.sign(`delete:${publicKey}:${timestamp}`);
|
|
306
|
+
return this.ctx.request('DELETE', '/users/me', { signature, timestamp, confirmText, ...(proof.totpCode ? { totpCode: proof.totpCode } : {}) }, { cache: false });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.UsersApi = UsersApi;
|
|
@@ -17,7 +17,7 @@ exports.runSessionColdBoot = runSessionColdBoot;
|
|
|
17
17
|
* 2. `device-secret-mint` (web + native) — the zero-cookie transport: when the
|
|
18
18
|
* origin persisted a `deviceId` + `deviceSecret`, mint a short access token
|
|
19
19
|
* with a single bearer-less POST to `/session/device/token` (no cookie, no
|
|
20
|
-
* navigation)
|
|
20
|
+
* navigation). The secret is stable across mints.
|
|
21
21
|
* 3. `shared-device-adopt` (native, ACCOUNT mode) — this app has no credential
|
|
22
22
|
* of its own but a sibling official app already put one in the shared native
|
|
23
23
|
* slot: adopt it and mint. This is how a newly installed official app joins
|
|
@@ -127,7 +127,7 @@ async function runSessionColdBoot(opts) {
|
|
|
127
127
|
return { kind: 'skip' };
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
|
-
oxy.
|
|
130
|
+
oxy.session.setAccessToken(persisted.accessToken);
|
|
131
131
|
return {
|
|
132
132
|
kind: 'session',
|
|
133
133
|
session: {
|
|
@@ -352,11 +352,11 @@ async function runSessionColdBoot(opts) {
|
|
|
352
352
|
id: 'shared-key-signin',
|
|
353
353
|
enabled: () => isNative && !isOffline(),
|
|
354
354
|
run: async () => {
|
|
355
|
-
const session = await oxy.signInWithSharedIdentity({ requestOptions: { retry: false } });
|
|
355
|
+
const session = await oxy.auth.signInWithSharedIdentity({ requestOptions: { retry: false } });
|
|
356
356
|
if (!session?.accessToken) {
|
|
357
357
|
return { kind: 'skip' };
|
|
358
358
|
}
|
|
359
|
-
// `verifyChallenge`
|
|
359
|
+
// `verifyChallenge` issues a deviceSecret; persist it so the next
|
|
360
360
|
// boot can use the faster device-secret-mint lane (sockets + tab-focus
|
|
361
361
|
// re-mint depend on the credential being in the store).
|
|
362
362
|
if (session.deviceId && session.deviceSecret) {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyPublicCardAttestation = exports.parseAttestPayload = exports.parseIdPayload = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `@oxy.so/core/civic` — the Oxy ID QR payloads: parse, build, verify.
|
|
6
|
+
*
|
|
7
|
+
* Pure functions over the signed public card and the real-life attestation
|
|
8
|
+
* QR. Their own entry because verifying a card pulls the protocol's signature
|
|
9
|
+
* code, which an app that never scans a card should not ship.
|
|
10
|
+
*/
|
|
11
|
+
// Verifying a card reaches `@noble/*`; the shim goes first (see `../crypto/polyfill`).
|
|
12
|
+
require("../crypto/polyfill");
|
|
13
|
+
var payloads_1 = require("./payloads");
|
|
14
|
+
Object.defineProperty(exports, "parseIdPayload", { enumerable: true, get: function () { return payloads_1.parseIdPayload; } });
|
|
15
|
+
Object.defineProperty(exports, "parseAttestPayload", { enumerable: true, get: function () { return payloads_1.parseAttestPayload; } });
|
|
16
|
+
Object.defineProperty(exports, "verifyPublicCardAttestation", { enumerable: true, get: function () { return payloads_1.verifyPublicCardAttestation; } });
|