@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.
Files changed (663) hide show
  1. package/README.md +13 -7
  2. package/dist/cjs/HttpService.js +159 -111
  3. package/dist/cjs/OxyServices.errors.js +48 -1
  4. package/dist/cjs/OxyServices.js +263 -60
  5. package/dist/cjs/api/accounts.js +231 -0
  6. package/dist/cjs/api/agency.js +102 -0
  7. package/dist/cjs/api/appData.js +45 -0
  8. package/dist/cjs/api/apps.js +197 -0
  9. package/dist/cjs/api/assets.js +329 -0
  10. package/dist/cjs/api/auth.js +900 -0
  11. package/dist/cjs/api/billing.js +44 -0
  12. package/dist/cjs/api/civic.js +289 -0
  13. package/dist/cjs/api/contacts.js +16 -0
  14. package/dist/cjs/api/devices.js +351 -0
  15. package/dist/cjs/api/follows.js +240 -0
  16. package/dist/cjs/api/identity.js +569 -0
  17. package/dist/cjs/api/linkedAccounts.js +48 -0
  18. package/dist/cjs/api/nodes.js +75 -0
  19. package/dist/cjs/api/notifications.js +75 -0
  20. package/dist/cjs/api/privacy.js +105 -0
  21. package/dist/cjs/api/reputation.js +74 -0
  22. package/dist/cjs/api/session.js +177 -0
  23. package/dist/cjs/api/store.js +199 -0
  24. package/dist/cjs/api/topics.js +66 -0
  25. package/dist/cjs/api/users.js +309 -0
  26. package/dist/cjs/boot/sessionColdBoot.js +4 -4
  27. package/dist/cjs/civic/index.js +16 -0
  28. package/dist/cjs/civic/payloads.js +156 -0
  29. package/dist/cjs/client/context.js +2 -0
  30. package/dist/cjs/crypto/identityLink.js +5 -5
  31. package/dist/cjs/crypto/index.js +44 -0
  32. package/dist/cjs/crypto/internal.js +37 -0
  33. package/dist/cjs/crypto/keyManager.js +2 -2
  34. package/dist/cjs/crypto/polyfill.js +9 -80
  35. package/dist/cjs/crypto/recoveryPhrase.js +1 -0
  36. package/dist/cjs/crypto/registrationPow.js +1 -1
  37. package/dist/cjs/crypto/signatureService.js +1 -0
  38. package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
  39. package/dist/cjs/i18n/accountRoleLabels.js +7 -7
  40. package/dist/cjs/i18n/index.js +130 -52
  41. package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
  42. package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
  43. package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
  44. package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
  45. package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
  46. package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
  47. package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
  48. package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
  49. package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
  50. package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
  51. package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
  52. package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
  53. package/dist/cjs/i18n/trustTierLabels.js +2 -2
  54. package/dist/cjs/index.js +55 -263
  55. package/dist/cjs/inference/index.js +21 -0
  56. package/dist/cjs/server/OxyServer.js +521 -0
  57. package/dist/cjs/server/auth.js +2 -2
  58. package/dist/cjs/server/index.js +23 -6
  59. package/dist/cjs/server/middleware.js +1154 -0
  60. package/dist/cjs/server/namespaces.js +214 -0
  61. package/dist/cjs/server/rateLimit.js +2 -2
  62. package/dist/cjs/server/requesterAssertion.js +5 -5
  63. package/dist/cjs/server/securityHeaders.js +3 -3
  64. package/dist/cjs/server/traffic.js +7 -6
  65. package/dist/cjs/server/trafficNodeHttp.js +9 -3
  66. package/dist/cjs/server/userInvalidation.js +5 -5
  67. package/dist/cjs/session/accountDialogController.js +23 -23
  68. package/dist/cjs/session/authStateStore.js +2 -2
  69. package/dist/cjs/session/identitySession.js +3 -3
  70. package/dist/cjs/session/index.js +131 -0
  71. package/dist/cjs/session/refresh.js +37 -30
  72. package/dist/cjs/session/sessionClientHost.js +5 -5
  73. package/dist/cjs/session/sharedDeviceCredential.js +3 -2
  74. package/dist/cjs/shared/utils/networkUtils.js +2 -2
  75. package/dist/cjs/utils/accountCacheSweep.js +11 -15
  76. package/dist/cjs/utils/asyncUtils.js +22 -163
  77. package/dist/cjs/utils/authHelpers.js +2 -2
  78. package/dist/cjs/utils/authWebUrl.js +3 -4
  79. package/dist/cjs/utils/avatarUtils.js +2 -2
  80. package/dist/cjs/utils/cache.js +32 -2
  81. package/dist/cjs/utils/cacheKey.js +5 -10
  82. package/dist/cjs/utils/deviceManager.js +17 -16
  83. package/dist/cjs/utils/edgeRegion.js +2 -3
  84. package/dist/cjs/utils/identityCacheSweep.js +6 -10
  85. package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
  86. package/dist/cjs/utils/requestUtils.js +40 -33
  87. package/dist/cjs/utils/sessionUtils.js +0 -2
  88. package/dist/cjs/utils/tokenClaims.js +34 -0
  89. package/dist/esm/HttpService.js +160 -112
  90. package/dist/esm/OxyServices.errors.js +45 -0
  91. package/dist/esm/OxyServices.js +262 -57
  92. package/dist/esm/api/accounts.js +218 -0
  93. package/dist/esm/api/agency.js +95 -0
  94. package/dist/esm/api/appData.js +40 -0
  95. package/dist/esm/api/apps.js +191 -0
  96. package/dist/esm/api/assets.js +324 -0
  97. package/dist/esm/api/auth.js +858 -0
  98. package/dist/esm/api/billing.js +40 -0
  99. package/dist/esm/api/civic.js +250 -0
  100. package/dist/esm/api/contacts.js +12 -0
  101. package/dist/esm/api/devices.js +346 -0
  102. package/dist/esm/api/follows.js +236 -0
  103. package/dist/esm/api/identity.js +527 -0
  104. package/dist/esm/api/linkedAccounts.js +44 -0
  105. package/dist/esm/api/nodes.js +71 -0
  106. package/dist/esm/api/notifications.js +71 -0
  107. package/dist/esm/api/privacy.js +101 -0
  108. package/dist/esm/api/reputation.js +70 -0
  109. package/dist/esm/api/session.js +173 -0
  110. package/dist/esm/api/store.js +192 -0
  111. package/dist/esm/api/topics.js +62 -0
  112. package/dist/esm/api/users.js +272 -0
  113. package/dist/esm/boot/sessionColdBoot.js +4 -4
  114. package/dist/esm/civic/index.js +10 -0
  115. package/dist/esm/civic/payloads.js +118 -0
  116. package/dist/esm/client/context.js +1 -0
  117. package/dist/esm/crypto/identityLink.js +5 -5
  118. package/dist/esm/crypto/index.js +24 -0
  119. package/dist/esm/crypto/internal.js +19 -0
  120. package/dist/esm/crypto/keyManager.js +2 -2
  121. package/dist/esm/crypto/polyfill.js +10 -81
  122. package/dist/esm/crypto/recoveryPhrase.js +1 -0
  123. package/dist/esm/crypto/registrationPow.js +1 -1
  124. package/dist/esm/crypto/signatureService.js +1 -0
  125. package/dist/esm/i18n/accountCategoryLabels.js +2 -2
  126. package/dist/esm/i18n/accountRoleLabels.js +1 -1
  127. package/dist/esm/i18n/index.js +93 -52
  128. package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
  129. package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
  130. package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
  131. package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
  132. package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
  133. package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
  134. package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
  135. package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
  136. package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
  137. package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
  138. package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
  139. package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
  140. package/dist/esm/i18n/trustTierLabels.js +1 -1
  141. package/dist/esm/index.js +30 -166
  142. package/dist/esm/inference/index.js +13 -0
  143. package/dist/esm/server/OxyServer.js +516 -0
  144. package/dist/esm/server/auth.js +2 -2
  145. package/dist/esm/server/index.js +10 -5
  146. package/dist/esm/server/middleware.js +1147 -0
  147. package/dist/esm/server/namespaces.js +206 -0
  148. package/dist/esm/server/rateLimit.js +2 -2
  149. package/dist/esm/server/requesterAssertion.js +5 -5
  150. package/dist/esm/server/securityHeaders.js +3 -3
  151. package/dist/esm/server/traffic.js +7 -6
  152. package/dist/esm/server/trafficNodeHttp.js +9 -3
  153. package/dist/esm/server/userInvalidation.js +5 -5
  154. package/dist/esm/session/accountDialogController.js +23 -23
  155. package/dist/esm/session/authStateStore.js +2 -2
  156. package/dist/esm/session/identitySession.js +3 -3
  157. package/dist/esm/session/index.js +82 -0
  158. package/dist/esm/session/refresh.js +37 -30
  159. package/dist/esm/session/sessionClientHost.js +5 -5
  160. package/dist/esm/session/sharedDeviceCredential.js +3 -2
  161. package/dist/esm/shared/utils/networkUtils.js +2 -2
  162. package/dist/esm/utils/accountCacheSweep.js +11 -15
  163. package/dist/esm/utils/asyncUtils.js +22 -151
  164. package/dist/esm/utils/authHelpers.js +2 -2
  165. package/dist/esm/utils/authWebUrl.js +3 -4
  166. package/dist/esm/utils/avatarUtils.js +2 -2
  167. package/dist/esm/utils/cache.js +32 -2
  168. package/dist/esm/utils/cacheKey.js +5 -10
  169. package/dist/esm/utils/deviceManager.js +17 -16
  170. package/dist/esm/utils/edgeRegion.js +1 -2
  171. package/dist/esm/utils/identityCacheSweep.js +6 -10
  172. package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
  173. package/dist/esm/utils/requestUtils.js +40 -33
  174. package/dist/esm/utils/sessionUtils.js +0 -2
  175. package/dist/esm/utils/tokenClaims.js +31 -0
  176. package/dist/types/HttpService.d.ts +26 -9
  177. package/dist/types/OxyServices.d.ts +160 -131
  178. package/dist/types/OxyServices.errors.d.ts +42 -0
  179. package/dist/types/api/accounts.d.ts +415 -0
  180. package/dist/types/api/agency.d.ts +135 -0
  181. package/dist/types/api/appData.d.ts +27 -0
  182. package/dist/types/api/apps.d.ts +433 -0
  183. package/dist/types/api/assets.d.ts +174 -0
  184. package/dist/types/api/auth.d.ts +766 -0
  185. package/dist/types/api/billing.d.ts +113 -0
  186. package/dist/types/api/civic.d.ts +203 -0
  187. package/dist/types/api/contacts.d.ts +31 -0
  188. package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
  189. package/dist/types/api/follows.d.ts +236 -0
  190. package/dist/types/api/identity.d.ts +275 -0
  191. package/dist/types/api/linkedAccounts.d.ts +48 -0
  192. package/dist/types/api/nodes.d.ts +102 -0
  193. package/dist/types/api/notifications.d.ts +77 -0
  194. package/dist/types/api/privacy.d.ts +43 -0
  195. package/dist/types/api/reputation.d.ts +50 -0
  196. package/dist/types/api/session.d.ts +85 -0
  197. package/dist/types/api/store.d.ts +278 -0
  198. package/dist/types/api/topics.d.ts +34 -0
  199. package/dist/types/api/users.d.ts +134 -0
  200. package/dist/types/boot/sessionColdBoot.d.ts +1 -1
  201. package/dist/types/civic/index.d.ts +10 -0
  202. package/dist/types/civic/payloads.d.ts +83 -0
  203. package/dist/types/client/context.d.ts +33 -0
  204. package/dist/types/crypto/identityLink.d.ts +5 -5
  205. package/dist/types/crypto/index.d.ts +24 -0
  206. package/dist/types/crypto/internal.d.ts +19 -0
  207. package/dist/types/crypto/polyfill.d.ts +6 -9
  208. package/dist/types/crypto/registrationPow.d.ts +1 -1
  209. package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
  210. package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
  211. package/dist/types/i18n/index.d.ts +20 -1
  212. package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
  213. package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
  214. package/dist/types/i18n/locales/de-DE.d.ts +386 -0
  215. package/dist/types/i18n/locales/en-US.d.ts +2034 -0
  216. package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
  217. package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
  218. package/dist/types/i18n/locales/it-IT.d.ts +386 -0
  219. package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
  220. package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
  221. package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
  222. package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
  223. package/dist/types/index.d.ts +46 -95
  224. package/dist/types/inference/index.d.ts +22 -0
  225. package/dist/types/models/interfaces.d.ts +1 -22
  226. package/dist/types/server/OxyServer.d.ts +183 -0
  227. package/dist/types/server/auth.d.ts +10 -7
  228. package/dist/types/server/index.d.ts +10 -4
  229. package/dist/types/server/middleware.d.ts +291 -0
  230. package/dist/types/server/namespaces.d.ts +98 -0
  231. package/dist/types/server/rateLimit.d.ts +7 -5
  232. package/dist/types/server/requesterAssertion.d.ts +14 -11
  233. package/dist/types/server/securityHeaders.d.ts +4 -5
  234. package/dist/types/server/userInvalidation.d.ts +10 -8
  235. package/dist/types/session/accountDelegationAccess.d.ts +1 -1
  236. package/dist/types/session/accountDialogController.d.ts +8 -8
  237. package/dist/types/session/accountSwitchTargets.d.ts +1 -1
  238. package/dist/types/session/authStateStore.d.ts +7 -6
  239. package/dist/types/session/index.d.ts +40 -0
  240. package/dist/types/utils/accountCacheSweep.d.ts +7 -10
  241. package/dist/types/utils/apiUtils.d.ts +3 -3
  242. package/dist/types/utils/asyncUtils.d.ts +11 -58
  243. package/dist/types/utils/authWebUrl.d.ts +3 -4
  244. package/dist/types/utils/avatarUtils.d.ts +5 -6
  245. package/dist/types/utils/cache.d.ts +11 -3
  246. package/dist/types/utils/commonsApproval.d.ts +1 -1
  247. package/dist/types/utils/edgeRegion.d.ts +1 -2
  248. package/dist/types/utils/identityCacheSweep.d.ts +6 -4
  249. package/dist/types/utils/oauthPkce.d.ts +2 -2
  250. package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
  251. package/dist/types/utils/requestUtils.d.ts +18 -14
  252. package/dist/types/utils/tokenClaims.d.ts +9 -0
  253. package/package.json +68 -7
  254. package/src/HttpService.ts +166 -131
  255. package/src/OxyServices.errors.ts +73 -0
  256. package/src/OxyServices.ts +289 -164
  257. package/src/api/accounts.ts +579 -0
  258. package/src/api/agency.ts +277 -0
  259. package/src/api/appData.ts +63 -0
  260. package/src/api/apps.ts +596 -0
  261. package/src/api/assets.ts +416 -0
  262. package/src/api/auth.ts +1457 -0
  263. package/src/api/billing.ts +144 -0
  264. package/src/api/civic.ts +428 -0
  265. package/src/api/contacts.ts +41 -0
  266. package/src/api/devices.ts +438 -0
  267. package/src/api/follows.ts +414 -0
  268. package/src/api/identity.ts +727 -0
  269. package/src/api/linkedAccounts.ts +78 -0
  270. package/src/api/nodes.ts +169 -0
  271. package/src/api/notifications.ts +135 -0
  272. package/src/api/privacy.ts +120 -0
  273. package/src/api/reputation.ts +134 -0
  274. package/src/api/session.ts +210 -0
  275. package/src/api/store.ts +435 -0
  276. package/src/api/topics.ts +83 -0
  277. package/src/api/users.ts +357 -0
  278. package/src/boot/sessionColdBoot.ts +4 -4
  279. package/src/civic/index.ts +12 -0
  280. package/src/civic/payloads.ts +175 -0
  281. package/src/client/context.ts +34 -0
  282. package/src/crypto/identityLink.ts +5 -5
  283. package/src/crypto/index.ts +39 -0
  284. package/src/crypto/internal.ts +20 -0
  285. package/src/crypto/keyManager.ts +2 -2
  286. package/src/crypto/polyfill.ts +9 -89
  287. package/src/crypto/recoveryPhrase.ts +1 -0
  288. package/src/crypto/registrationPow.ts +1 -1
  289. package/src/crypto/signatureService.ts +1 -0
  290. package/src/i18n/accountCategoryLabels.ts +2 -2
  291. package/src/i18n/accountRoleLabels.ts +2 -2
  292. package/src/i18n/index.ts +105 -54
  293. package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
  294. package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
  295. package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
  296. package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
  297. package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
  298. package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
  299. package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
  300. package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
  301. package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
  302. package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
  303. package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
  304. package/src/i18n/reputationCategoryLabels.ts +1 -1
  305. package/src/i18n/trustTierLabels.ts +1 -1
  306. package/src/index.ts +170 -501
  307. package/src/inference/index.ts +48 -0
  308. package/src/models/interfaces.ts +1 -22
  309. package/src/server/OxyServer.ts +637 -0
  310. package/src/server/auth.ts +12 -8
  311. package/src/server/index.ts +28 -5
  312. package/src/server/middleware.ts +1520 -0
  313. package/src/server/namespaces.ts +257 -0
  314. package/src/server/rateLimit.ts +10 -9
  315. package/src/server/requesterAssertion.ts +13 -10
  316. package/src/server/securityHeaders.ts +7 -8
  317. package/src/server/traffic.ts +6 -6
  318. package/src/server/trafficNodeHttp.ts +7 -3
  319. package/src/server/userInvalidation.ts +9 -9
  320. package/src/session/accountDelegationAccess.ts +1 -1
  321. package/src/session/accountDialogController.ts +24 -24
  322. package/src/session/accountSwitchTargets.ts +1 -1
  323. package/src/session/authStateStore.ts +9 -8
  324. package/src/session/identitySession.ts +3 -3
  325. package/src/session/index.ts +210 -0
  326. package/src/session/refresh.ts +36 -30
  327. package/src/session/sessionClientHost.ts +5 -5
  328. package/src/session/sharedDeviceCredential.ts +3 -2
  329. package/src/shared/utils/networkUtils.ts +2 -2
  330. package/src/utils/accountCacheSweep.ts +11 -15
  331. package/src/utils/apiUtils.ts +3 -3
  332. package/src/utils/asyncUtils.ts +38 -235
  333. package/src/utils/authHelpers.ts +2 -2
  334. package/src/utils/authWebUrl.ts +3 -4
  335. package/src/utils/avatarUtils.ts +4 -7
  336. package/src/utils/cache.ts +36 -5
  337. package/src/utils/cacheKey.ts +5 -9
  338. package/src/utils/commonsApproval.ts +1 -1
  339. package/src/utils/deviceManager.ts +17 -16
  340. package/src/utils/edgeRegion.ts +1 -2
  341. package/src/utils/identityCacheSweep.ts +7 -12
  342. package/src/utils/oauthPkce.ts +2 -2
  343. package/src/utils/oxyServiceEnvironment.ts +3 -7
  344. package/src/utils/requestUtils.ts +48 -44
  345. package/src/utils/sessionUtils.ts +0 -2
  346. package/src/utils/tokenClaims.ts +38 -0
  347. package/dist/cjs/.tsbuildinfo +0 -1
  348. package/dist/cjs/OxyServices.base.js +0 -392
  349. package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
  350. package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
  351. package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
  352. package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
  353. package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
  354. package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
  355. package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
  356. package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
  357. package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
  358. package/dist/cjs/mixins/OxyServices.agency.js +0 -154
  359. package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
  360. package/dist/cjs/mixins/OxyServices.appData.js +0 -108
  361. package/dist/cjs/mixins/OxyServices.assets.js +0 -854
  362. package/dist/cjs/mixins/OxyServices.auth.js +0 -1495
  363. package/dist/cjs/mixins/OxyServices.chains.js +0 -73
  364. package/dist/cjs/mixins/OxyServices.civic.js +0 -611
  365. package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
  366. package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
  367. package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
  368. package/dist/cjs/mixins/OxyServices.devices.js +0 -116
  369. package/dist/cjs/mixins/OxyServices.features.js +0 -335
  370. package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
  371. package/dist/cjs/mixins/OxyServices.identity.js +0 -562
  372. package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
  373. package/dist/cjs/mixins/OxyServices.inference.js +0 -59
  374. package/dist/cjs/mixins/OxyServices.language.js +0 -125
  375. package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
  376. package/dist/cjs/mixins/OxyServices.location.js +0 -43
  377. package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
  378. package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
  379. package/dist/cjs/mixins/OxyServices.payment.js +0 -158
  380. package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
  381. package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
  382. package/dist/cjs/mixins/OxyServices.security.js +0 -89
  383. package/dist/cjs/mixins/OxyServices.store.js +0 -266
  384. package/dist/cjs/mixins/OxyServices.topics.js +0 -137
  385. package/dist/cjs/mixins/OxyServices.user.js +0 -954
  386. package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
  387. package/dist/cjs/mixins/index.js +0 -136
  388. package/dist/cjs/mixins/mixinHelpers.js +0 -53
  389. package/dist/cjs/utils/webauthnOrigin.js +0 -51
  390. package/dist/esm/.tsbuildinfo +0 -1
  391. package/dist/esm/OxyServices.base.js +0 -388
  392. package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
  393. package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
  394. package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
  395. package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
  396. package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
  397. package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
  398. package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
  399. package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
  400. package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
  401. package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
  402. package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
  403. package/dist/esm/mixins/OxyServices.accounts.js +0 -543
  404. package/dist/esm/mixins/OxyServices.agency.js +0 -151
  405. package/dist/esm/mixins/OxyServices.analytics.js +0 -46
  406. package/dist/esm/mixins/OxyServices.appData.js +0 -103
  407. package/dist/esm/mixins/OxyServices.assets.js +0 -851
  408. package/dist/esm/mixins/OxyServices.auth.js +0 -1455
  409. package/dist/esm/mixins/OxyServices.chains.js +0 -70
  410. package/dist/esm/mixins/OxyServices.civic.js +0 -605
  411. package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
  412. package/dist/esm/mixins/OxyServices.contacts.js +0 -47
  413. package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
  414. package/dist/esm/mixins/OxyServices.devices.js +0 -113
  415. package/dist/esm/mixins/OxyServices.features.js +0 -332
  416. package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
  417. package/dist/esm/mixins/OxyServices.identity.js +0 -558
  418. package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
  419. package/dist/esm/mixins/OxyServices.inference.js +0 -56
  420. package/dist/esm/mixins/OxyServices.language.js +0 -122
  421. package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
  422. package/dist/esm/mixins/OxyServices.location.js +0 -40
  423. package/dist/esm/mixins/OxyServices.nodes.js +0 -172
  424. package/dist/esm/mixins/OxyServices.notifications.js +0 -60
  425. package/dist/esm/mixins/OxyServices.payment.js +0 -155
  426. package/dist/esm/mixins/OxyServices.privacy.js +0 -196
  427. package/dist/esm/mixins/OxyServices.reputation.js +0 -286
  428. package/dist/esm/mixins/OxyServices.security.js +0 -86
  429. package/dist/esm/mixins/OxyServices.store.js +0 -263
  430. package/dist/esm/mixins/OxyServices.topics.js +0 -134
  431. package/dist/esm/mixins/OxyServices.user.js +0 -951
  432. package/dist/esm/mixins/OxyServices.utility.js +0 -1397
  433. package/dist/esm/mixins/index.js +0 -133
  434. package/dist/esm/mixins/mixinHelpers.js +0 -48
  435. package/dist/esm/utils/webauthnOrigin.js +0 -48
  436. package/dist/types/.tsbuildinfo +0 -1
  437. package/dist/types/OxyServices.base.d.ts +0 -189
  438. package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
  439. package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
  440. package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
  441. package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
  442. package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
  443. package/dist/types/mixins/OxyServices.auth.d.ts +0 -998
  444. package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
  445. package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
  446. package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
  447. package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
  448. package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
  449. package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
  450. package/dist/types/mixins/OxyServices.features.d.ts +0 -250
  451. package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
  452. package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
  453. package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
  454. package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
  455. package/dist/types/mixins/OxyServices.language.d.ts +0 -87
  456. package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
  457. package/dist/types/mixins/OxyServices.location.d.ts +0 -70
  458. package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
  459. package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
  460. package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
  461. package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
  462. package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
  463. package/dist/types/mixins/OxyServices.security.d.ts +0 -84
  464. package/dist/types/mixins/OxyServices.store.d.ts +0 -334
  465. package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
  466. package/dist/types/mixins/OxyServices.user.d.ts +0 -600
  467. package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
  468. package/dist/types/mixins/index.d.ts +0 -87
  469. package/dist/types/mixins/mixinHelpers.d.ts +0 -31
  470. package/dist/types/utils/webauthnOrigin.d.ts +0 -32
  471. package/src/OxyServices.base.ts +0 -480
  472. package/src/__tests__/authSocket.test.ts +0 -96
  473. package/src/__tests__/fixEsmImports.test.ts +0 -132
  474. package/src/__tests__/httpServiceAbort.test.ts +0 -308
  475. package/src/__tests__/httpServiceActivityId.test.ts +0 -49
  476. package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
  477. package/src/__tests__/httpServiceCache.test.ts +0 -318
  478. package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
  479. package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
  480. package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
  481. package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
  482. package/src/__tests__/httpServiceWrites.test.ts +0 -175
  483. package/src/__tests__/inSessionRefresh.test.ts +0 -313
  484. package/src/__tests__/linkedClient.test.ts +0 -363
  485. package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
  486. package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
  487. package/src/__tests__/publicInterfaceParity.test.ts +0 -75
  488. package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
  489. package/src/__tests__/serviceIdentityWhenAnonymous.test.ts +0 -159
  490. package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
  491. package/src/__tests__/userIdentity.test.ts +0 -143
  492. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
  493. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
  494. package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
  495. package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
  496. package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
  497. package/src/crypto/__tests__/identityLink.test.ts +0 -18
  498. package/src/crypto/__tests__/identityMocks.ts +0 -125
  499. package/src/crypto/__tests__/identityProof.test.ts +0 -81
  500. package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
  501. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
  502. package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
  503. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
  504. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
  505. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
  506. package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
  507. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
  508. package/src/crypto/__tests__/keyManager.test.ts +0 -329
  509. package/src/crypto/__tests__/polyfill.test.ts +0 -109
  510. package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
  511. package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
  512. package/src/crypto/__tests__/registrationPow.test.ts +0 -61
  513. package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
  514. package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
  515. package/src/crypto/__tests__/signedRecord.test.ts +0 -230
  516. package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
  517. package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
  518. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
  519. package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
  520. package/src/i18n/locales/de-DE.json +0 -306
  521. package/src/i18n/locales/es-ES.json +0 -2127
  522. package/src/i18n/locales/ja-JP.json +0 -306
  523. package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
  524. package/src/logger/__tests__/logger.test.ts +0 -207
  525. package/src/mixins/OxyServices.accounts.ts +0 -1330
  526. package/src/mixins/OxyServices.agency.ts +0 -353
  527. package/src/mixins/OxyServices.analytics.ts +0 -53
  528. package/src/mixins/OxyServices.appData.ts +0 -158
  529. package/src/mixins/OxyServices.assets.ts +0 -964
  530. package/src/mixins/OxyServices.auth.ts +0 -2083
  531. package/src/mixins/OxyServices.chains.ts +0 -134
  532. package/src/mixins/OxyServices.civic.ts +0 -945
  533. package/src/mixins/OxyServices.connectedApps.ts +0 -212
  534. package/src/mixins/OxyServices.contacts.ts +0 -73
  535. package/src/mixins/OxyServices.devices.ts +0 -120
  536. package/src/mixins/OxyServices.features.ts +0 -454
  537. package/src/mixins/OxyServices.followGraph.ts +0 -293
  538. package/src/mixins/OxyServices.identity.ts +0 -787
  539. package/src/mixins/OxyServices.identityBackup.ts +0 -250
  540. package/src/mixins/OxyServices.inference.ts +0 -57
  541. package/src/mixins/OxyServices.language.ts +0 -144
  542. package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
  543. package/src/mixins/OxyServices.location.ts +0 -46
  544. package/src/mixins/OxyServices.nodes.ts +0 -337
  545. package/src/mixins/OxyServices.notifications.ts +0 -142
  546. package/src/mixins/OxyServices.payment.ts +0 -163
  547. package/src/mixins/OxyServices.privacy.ts +0 -219
  548. package/src/mixins/OxyServices.reputation.ts +0 -436
  549. package/src/mixins/OxyServices.security.ts +0 -110
  550. package/src/mixins/OxyServices.store.ts +0 -585
  551. package/src/mixins/OxyServices.topics.ts +0 -169
  552. package/src/mixins/OxyServices.user.ts +0 -1208
  553. package/src/mixins/OxyServices.utility.ts +0 -1803
  554. package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
  555. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
  556. package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
  557. package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
  558. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
  559. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
  560. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
  561. package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
  562. package/src/mixins/__tests__/accountEvents.test.ts +0 -158
  563. package/src/mixins/__tests__/accounts.test.ts +0 -727
  564. package/src/mixins/__tests__/agency.test.ts +0 -120
  565. package/src/mixins/__tests__/appData.test.ts +0 -203
  566. package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
  567. package/src/mixins/__tests__/assetUpload.test.ts +0 -191
  568. package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
  569. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
  570. package/src/mixins/__tests__/chains.test.ts +0 -113
  571. package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
  572. package/src/mixins/__tests__/connectedApps.test.ts +0 -146
  573. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
  574. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
  575. package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
  576. package/src/mixins/__tests__/followGraph.test.ts +0 -147
  577. package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
  578. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
  579. package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
  580. package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
  581. package/src/mixins/__tests__/identityBackup.test.ts +0 -315
  582. package/src/mixins/__tests__/identityLink.test.ts +0 -89
  583. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
  584. package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
  585. package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
  586. package/src/mixins/__tests__/notifications.read.test.ts +0 -82
  587. package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
  588. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
  589. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
  590. package/src/mixins/__tests__/reputation.test.ts +0 -522
  591. package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
  592. package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
  593. package/src/mixins/__tests__/store.test.ts +0 -304
  594. package/src/mixins/__tests__/topics.test.ts +0 -155
  595. package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
  596. package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
  597. package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
  598. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
  599. package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
  600. package/src/mixins/index.ts +0 -203
  601. package/src/mixins/mixinHelpers.ts +0 -69
  602. package/src/server/__tests__/auth.test.ts +0 -78
  603. package/src/server/__tests__/capabilityTicket.test.ts +0 -111
  604. package/src/server/__tests__/cors.socket.test.ts +0 -225
  605. package/src/server/__tests__/cors.test.ts +0 -158
  606. package/src/server/__tests__/rateLimit.test.ts +0 -257
  607. package/src/server/__tests__/requesterAssertion.test.ts +0 -359
  608. package/src/server/__tests__/safeFetch.test.ts +0 -232
  609. package/src/server/__tests__/securityHeaders.test.ts +0 -387
  610. package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
  611. package/src/server/__tests__/traffic.test.ts +0 -180
  612. package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
  613. package/src/server/__tests__/userInvalidation.test.ts +0 -203
  614. package/src/server/__tests__/verifySecret.test.ts +0 -40
  615. package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
  616. package/src/server/__tests__/workloadIdentity.test.ts +0 -128
  617. package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
  618. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
  619. package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
  620. package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
  621. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
  622. package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
  623. package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
  624. package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
  625. package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
  626. package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
  627. package/src/session/__tests__/SessionClient.state.test.ts +0 -78
  628. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
  629. package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
  630. package/src/session/__tests__/accountDialogController.test.ts +0 -2502
  631. package/src/session/__tests__/accountDialogShape.test.ts +0 -120
  632. package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
  633. package/src/session/__tests__/authStateStore.test.ts +0 -451
  634. package/src/session/__tests__/deviceDirectory.test.ts +0 -422
  635. package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
  636. package/src/session/__tests__/identityPin.test.ts +0 -131
  637. package/src/session/__tests__/identitySession.test.ts +0 -194
  638. package/src/session/__tests__/projectSessionState.test.ts +0 -105
  639. package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
  640. package/src/session/__tests__/refresh.test.ts +0 -606
  641. package/src/session/__tests__/sessionIntegration.test.ts +0 -209
  642. package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
  643. package/src/utils/__tests__/accountUtils.test.ts +0 -151
  644. package/src/utils/__tests__/activityId.test.ts +0 -45
  645. package/src/utils/__tests__/asyncUtils.test.ts +0 -279
  646. package/src/utils/__tests__/authWebUrl.test.ts +0 -15
  647. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  648. package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
  649. package/src/utils/__tests__/coldBoot.test.ts +0 -496
  650. package/src/utils/__tests__/commonsApproval.test.ts +0 -60
  651. package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
  652. package/src/utils/__tests__/languageUtils.test.ts +0 -244
  653. package/src/utils/__tests__/oauthPkce.test.ts +0 -303
  654. package/src/utils/__tests__/officialOrigins.test.ts +0 -31
  655. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
  656. package/src/utils/__tests__/profileLinks.test.ts +0 -180
  657. package/src/utils/__tests__/redactUrl.test.ts +0 -33
  658. package/src/utils/__tests__/registrableApex.test.ts +0 -62
  659. package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
  660. package/src/utils/__tests__/textNormalization.test.ts +0 -205
  661. package/src/utils/__tests__/validationUtils.test.ts +0 -703
  662. package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
  663. package/src/utils/webauthnOrigin.ts +0 -52
@@ -0,0 +1,257 @@
1
+ /**
2
+ * The server-side halves of the namespaces: what exists only with a service
3
+ * credential. `OxyServer` returns these from its namespace getters, so
4
+ * `server.assets.metadataByIds(...)` sits beside every client method of
5
+ * `oxy.assets`.
6
+ */
7
+ import type { CreateOxyNotificationRequest, AwardReputationInput, ReputationTransaction, ServiceLinkedAccountListResponse } from '@oxy.so/contracts';
8
+ import type { OxyContext, ServiceLane } from '../client/context';
9
+ import type {
10
+ Notification,
11
+ ServiceAssetMetadata,
12
+ ServiceAssetMetadataBySha,
13
+ ServiceLinkedDownloadUrl,
14
+ } from '../models/interfaces';
15
+ import { AssetsApi } from '../api/assets';
16
+ import { NotificationsApi } from '../api/notifications';
17
+ import { LinkedAccountsApi } from '../api/linkedAccounts';
18
+ import { AgencyApi, type RequesterAssertionGrant, type RequesterAssertionIntrospection } from '../api/agency';
19
+ import { ReputationApi } from '../api/reputation';
20
+ import { ServiceAssetMetadataError, ServiceLinkedDownloadUrlError } from '../OxyServices.errors';
21
+ import { extractErrorStatus } from '../utils/errorUtils';
22
+ import { logger } from '../logger';
23
+
24
+ /** Server-side cap of `POST /assets/service/by-ids`. */
25
+ const SERVICE_ASSET_METADATA_CHUNK_SIZE = 100;
26
+ /** Server-side cap of `POST /assets/service/by-sha256`. */
27
+ const SERVICE_ASSET_METADATA_BY_SHA_CHUNK_SIZE = 100;
28
+ /** Server-side cap of `POST /assets/service/linked-url`. */
29
+ const SERVICE_LINKED_DOWNLOAD_URL_CHUNK_SIZE = 25;
30
+ const SHA256_HEX_PATTERN = /^[a-f0-9]{64}$/;
31
+
32
+ const REPUTATION_CACHE_PREFIX = 'GET:/reputation/';
33
+
34
+ function lane(ctx: OxyContext): ServiceLane {
35
+ if (!ctx.service) {
36
+ throw new Error('This call needs a service credential (OxyServer from @oxy.so/core/server)');
37
+ }
38
+ return ctx.service;
39
+ }
40
+
41
+ function chunk<T>(items: T[], size: number): T[][] {
42
+ const chunks: T[][] = [];
43
+ for (let i = 0; i < items.length; i += size) chunks.push(items.slice(i, i + size));
44
+ return chunks;
45
+ }
46
+
47
+ function uniqueIds(ids: string[]): string[] {
48
+ return Array.from(new Set(ids.filter((id): id is string => typeof id === 'string' && id.trim().length > 0)));
49
+ }
50
+
51
+ export class ServerAssetsApi extends AssetsApi {
52
+ /**
53
+ * Resolve many asset ids to their content-addressed metadata (`sha256`,
54
+ * `mime`, `size`, `status`) via `POST /assets/service/by-ids`, one call per
55
+ * chunk of 100. Service token with `files:read`.
56
+ *
57
+ * The server omits unknown/deleted ids, so a short result is normal — map by
58
+ * `id`. FAILURE IS NOT ABSENCE: a failed chunk throws
59
+ * {@link ServiceAssetMetadataError} carrying the ids it could not resolve,
60
+ * unless `{ partial: true }` asks for best-effort. Never cached.
61
+ */
62
+ async metadataByIds(ids: string[], options: { partial?: boolean } = {}): Promise<ServiceAssetMetadata[]> {
63
+ const unique = uniqueIds(ids);
64
+ if (unique.length === 0) return [];
65
+
66
+ const unresolvedIds: string[] = [];
67
+ const statuses: number[] = [];
68
+ let firstError: unknown;
69
+
70
+ const settled = await Promise.all(
71
+ chunk(unique, SERVICE_ASSET_METADATA_CHUNK_SIZE).map(async (part): Promise<ServiceAssetMetadata[]> => {
72
+ try {
73
+ const entries = await lane(this.ctx).request<ServiceAssetMetadata[]>('POST', '/assets/service/by-ids', { ids: part });
74
+ return Array.isArray(entries) ? entries : [];
75
+ } catch (error: unknown) {
76
+ const status = extractErrorStatus(error);
77
+ logger.warn('assets.metadataByIds: chunk failed', {
78
+ method: 'assets.metadataByIds',
79
+ chunkSize: part.length,
80
+ status,
81
+ partial: options.partial === true,
82
+ error: error instanceof Error ? error.message : String(error),
83
+ });
84
+ unresolvedIds.push(...part);
85
+ if (typeof status === 'number') statuses.push(status);
86
+ firstError ??= error;
87
+ return [];
88
+ }
89
+ }),
90
+ );
91
+
92
+ if (unresolvedIds.length > 0 && options.partial !== true) {
93
+ throw new ServiceAssetMetadataError(unresolvedIds, statuses, firstError);
94
+ }
95
+ return settled.flat();
96
+ }
97
+
98
+ /**
99
+ * Mint short-lived direct download URLs for files the calling application's
100
+ * own users attached to it (`POST /assets/service/linked-url`, scope
101
+ * `files:linked:read`). The ONLY way a service token reaches file bytes.
102
+ *
103
+ * A URL comes back only for a file whose OWN OWNER linked it to this
104
+ * application; every other id is omitted, and the route answers identically
105
+ * for "no such file" and "not yours". ABSENCE IS A REFUSAL, not a fact about
106
+ * the file: decide what to tell your user from your own entitlement record.
107
+ * A failed chunk throws {@link ServiceLinkedDownloadUrlError}; there is no
108
+ * partial mode. Never cached — each URL is a live credential.
109
+ */
110
+ async linkedDownloadUrls(ids: string[]): Promise<ServiceLinkedDownloadUrl[]> {
111
+ const unique = uniqueIds(ids);
112
+ if (unique.length === 0) return [];
113
+
114
+ const unresolvedIds: string[] = [];
115
+ const statuses: number[] = [];
116
+ let firstError: unknown;
117
+
118
+ const settled = await Promise.all(
119
+ chunk(unique, SERVICE_LINKED_DOWNLOAD_URL_CHUNK_SIZE).map(async (part): Promise<ServiceLinkedDownloadUrl[]> => {
120
+ try {
121
+ const entries = await lane(this.ctx).request<ServiceLinkedDownloadUrl[]>('POST', '/assets/service/linked-url', { ids: part });
122
+ return Array.isArray(entries) ? entries : [];
123
+ } catch (error: unknown) {
124
+ const status = extractErrorStatus(error);
125
+ // `chunkSize` and `status`, never the ids and never a `url`: a minted
126
+ // URL in a log line is a credential in a log line.
127
+ logger.warn('assets.linkedDownloadUrls: chunk failed', {
128
+ method: 'assets.linkedDownloadUrls',
129
+ chunkSize: part.length,
130
+ status,
131
+ error: error instanceof Error ? error.message : String(error),
132
+ });
133
+ unresolvedIds.push(...part);
134
+ if (typeof status === 'number') statuses.push(status);
135
+ firstError ??= error;
136
+ return [];
137
+ }
138
+ }),
139
+ );
140
+
141
+ if (unresolvedIds.length > 0) {
142
+ throw new ServiceLinkedDownloadUrlError(unresolvedIds, statuses, firstError);
143
+ }
144
+ return settled.flat();
145
+ }
146
+
147
+ /**
148
+ * Reverse content-address lookup: resolve `sha256` digests to the servable
149
+ * asset holding each (`POST /assets/service/by-sha256`, scope `files:read`),
150
+ * with a public `url` for active public assets. Malformed hashes are dropped
151
+ * client-side; the server omits unknown ones, so map by `sha256`. A failed
152
+ * chunk is logged and skipped. Never cached.
153
+ */
154
+ async metadataBySha256(sha256s: string[]): Promise<ServiceAssetMetadataBySha[]> {
155
+ const unique = Array.from(
156
+ new Set(
157
+ sha256s
158
+ .filter((sha): sha is string => typeof sha === 'string')
159
+ .map((sha) => sha.trim().toLowerCase())
160
+ .filter((sha) => SHA256_HEX_PATTERN.test(sha)),
161
+ ),
162
+ );
163
+ if (unique.length === 0) return [];
164
+
165
+ const settled = await Promise.all(
166
+ chunk(unique, SERVICE_ASSET_METADATA_BY_SHA_CHUNK_SIZE).map(async (part): Promise<ServiceAssetMetadataBySha[]> => {
167
+ try {
168
+ const entries = await lane(this.ctx).request<ServiceAssetMetadataBySha[]>('POST', '/assets/service/by-sha256', { sha256s: part });
169
+ return Array.isArray(entries) ? entries : [];
170
+ } catch (error: unknown) {
171
+ logger.warn('assets.metadataBySha256: chunk failed, continuing with remaining chunks', {
172
+ method: 'assets.metadataBySha256',
173
+ chunkSize: part.length,
174
+ status: extractErrorStatus(error),
175
+ error: error instanceof Error ? error.message : String(error),
176
+ });
177
+ return [];
178
+ }
179
+ }),
180
+ );
181
+ return settled.flat();
182
+ }
183
+ }
184
+
185
+ export class ServerNotificationsApi extends NotificationsApi {
186
+ /**
187
+ * Create a notification (`POST /notifications`; the application needs
188
+ * `notifications:write`). `type` is one of `OXY_NOTIFICATION_TYPES` from
189
+ * `@oxy.so/contracts` — `system` for a message from an Oxy service about the
190
+ * recipient's own account.
191
+ */
192
+ async create(data: CreateOxyNotificationRequest): Promise<Notification> {
193
+ const res = await lane(this.ctx).request<{ notification: Notification }>('POST', '/notifications', data);
194
+ return res.notification;
195
+ }
196
+ }
197
+
198
+ export class ServerLinkedAccountsApi extends LinkedAccountsApi {
199
+ /**
200
+ * A user's live linked accounts, each with the federated shadow user Oxy holds
201
+ * for it (`federatedUserId`). Needs the privileged `linked-accounts:read`.
202
+ */
203
+ async forUser(userId: string): Promise<ServiceLinkedAccountListResponse> {
204
+ return lane(this.ctx).request<ServiceLinkedAccountListResponse>(
205
+ 'GET',
206
+ `/linked-accounts/by-user/${encodeURIComponent(userId)}`,
207
+ );
208
+ }
209
+ }
210
+
211
+ export class ServerAgencyApi extends AgencyApi {
212
+ /**
213
+ * Product backend → Oxy: trade the signed-in requester's access token for a
214
+ * one-use assertion naming `agentId` (ADR 0025), authenticated with this
215
+ * service's credential. `subjectToken` goes to Oxy only, in the body; never
216
+ * forward it anywhere else. Not retried: a refusal is an answer, and the
217
+ * caller mints per turn.
218
+ */
219
+ async mintRequesterAssertion(input: { agentId: string; subjectToken: string }): Promise<RequesterAssertionGrant> {
220
+ return lane(this.ctx).request<RequesterAssertionGrant>(
221
+ 'POST',
222
+ '/internal/native-agents/requester-assertions',
223
+ { agentId: input.agentId, subjectToken: input.subjectToken },
224
+ { retry: false, timeout: 5000 },
225
+ );
226
+ }
227
+
228
+ /**
229
+ * Audience → Oxy: verify, live-revalidate and CONSUME a present-requester
230
+ * assertion (ADR 0025). A second call with the same assertion answers
231
+ * `active: false`. Authenticated with the audience's own service credential.
232
+ */
233
+ async introspectRequesterAssertion(input: {
234
+ assertion: string;
235
+ presenter: { applicationId: string; credentialId: string };
236
+ }): Promise<RequesterAssertionIntrospection> {
237
+ return lane(this.ctx).request<RequesterAssertionIntrospection>(
238
+ 'POST',
239
+ '/internal/native-agents/requester-assertions/introspect',
240
+ { assertion: input.assertion, presenter: input.presenter },
241
+ { retry: false, timeout: 5000 },
242
+ );
243
+ }
244
+ }
245
+
246
+ export class ServerReputationApi extends ReputationApi {
247
+ /**
248
+ * Award (or penalise) reputation to a user by `actionType`. Service token with
249
+ * `reputation:write` only — people never award reputation, and nobody at Oxy
250
+ * moves it by hand. Invalidates cached reputation reads.
251
+ */
252
+ async award(input: AwardReputationInput): Promise<ReputationTransaction> {
253
+ const res = await lane(this.ctx).request<{ transaction: ReputationTransaction }>('POST', '/reputation/award', input);
254
+ this.ctx.oxy.cache.deletePrefix(REPUTATION_CACHE_PREFIX);
255
+ return res.transaction;
256
+ }
257
+ }
@@ -2,8 +2,8 @@ import { createHmac } from 'node:crypto';
2
2
  import { isIPv4, isIPv6 } from 'node:net';
3
3
  import type { Request, RequestHandler } from 'express';
4
4
  import rateLimit, { type Store } from 'express-rate-limit';
5
- import type { OxyServices } from '../OxyServices';
6
- import { createOptionalOxyAuth } from './auth';
5
+ import type { AuthMiddlewareOptions } from './middleware';
6
+ import { createOptionalOxyAuth, type OxyAuthHost } from './auth';
7
7
 
8
8
  /**
9
9
  * Server-only rate limiting for Oxy backends.
@@ -19,7 +19,7 @@ import { createOptionalOxyAuth } from './auth';
19
19
  * ALB) many users share one egress IP, so a single bucket was split across
20
20
  * all of them → frequent, spurious HTTP 429s.
21
21
  *
22
- * `@oxy.so/core` already owns the session: `oxy.auth()` resolves `req.user` /
22
+ * `@oxy.so/core` already owns the session: `server.middleware.auth()` resolves `req.user` /
23
23
  * `req.userId`. Per-user rate limiting is the same concern (session identity),
24
24
  * so it belongs here — once — instead of being re-implemented per app.
25
25
  *
@@ -78,10 +78,11 @@ export interface OxyRateLimitOptions {
78
78
  /** Response message body sent with a 429. */
79
79
  message?: string;
80
80
  /**
81
- * Options forwarded to the internal `oxy.auth({ optional: true })` resolver
82
- * (e.g. `{ jwtSecret }` to verify service tokens). `optional` is forced true.
81
+ * Options forwarded to the internal `server.middleware.auth({ optional: true })` resolver
82
+ * (e.g. `{ serviceTokenJwksUrl }` to verify service tokens against a
83
+ * non-default JWKS). `optional` is forced true.
83
84
  */
84
- auth?: Parameters<OxyServices['auth']>[0];
85
+ auth?: AuthMiddlewareOptions;
85
86
  }
86
87
 
87
88
  /**
@@ -207,7 +208,7 @@ function hashAnonymousIp(ip: string): string {
207
208
  *
208
209
  * Only identities that came from a server-validated session or a verified
209
210
  * service token/delegation may pick a bucket. `req.sessionId` is the marker
210
- * for the former: `oxy.auth()` sets it only after `validateSession()` came
211
+ * for the former: `server.middleware.auth()` sets it only after `session.validate()` came
211
212
  * back valid, so requiring it here means an identity written by some OTHER
212
213
  * middleware — which this package cannot vouch for — shares the anonymous
213
214
  * per-IP bucket rather than getting the authenticated quota.
@@ -248,7 +249,7 @@ function resolveKey(req: OxyAuthedRequest): string {
248
249
  * Build the composed Oxy rate-limit middleware. See module docs for rationale.
249
250
  */
250
251
  export function createOxyRateLimit(
251
- oxy: OxyServices,
252
+ oxy: OxyAuthHost,
252
253
  options: OxyRateLimitOptions = {},
253
254
  ): RequestHandler {
254
255
  const {
@@ -264,7 +265,7 @@ export function createOxyRateLimit(
264
265
  // Idempotent optional-auth resolver. Reuses the SAME session resolution as
265
266
  // every protected route, so the limiter keys by the real user identity.
266
267
  //
267
- // `createOptionalOxyAuth` — NOT the raw `oxy.auth({ optional: true })` —
268
+ // `createOptionalOxyAuth` — NOT the raw `server.middleware.auth({ optional: true })` —
268
269
  // because only the former skips resolution when a preceding middleware has
269
270
  // already resolved a user. The raw middleware writes `req.userId = null` on
270
271
  // every request it cannot authenticate, and because it mutates the shared
@@ -2,7 +2,7 @@
2
2
  * Present-requester assertions (ADR 0025).
3
3
  *
4
4
  * A first-party product backend holding a signed-in person's live Oxy session
5
- * trades it with Oxy (`OxyServices.mintRequesterAssertion`) for a one-use,
5
+ * trades it with Oxy (`server.agency.mintRequesterAssertion`) for a one-use,
6
6
  * short-lived `OXY-REQUESTER+JWT`, and sends that — never the person's bearer —
7
7
  * to the audience service (Alia) beside its own service token. The audience
8
8
  * mounts {@link createOxyRequesterAssertionAuth} after `createOxyAuthMiddleware`
@@ -291,12 +291,15 @@ export interface OxyRequesterAssertionIntrospection {
291
291
  readonly expiresAt?: string;
292
292
  }
293
293
 
294
+ /** What the audience middleware needs of its `OxyServer`. */
294
295
  export interface OxyRequesterAssertionIntrospector {
295
- introspectRequesterAssertion(input: {
296
- assertion: string;
297
- presenter: { applicationId: string; credentialId: string };
298
- }): Promise<OxyRequesterAssertionIntrospection>;
299
- getBaseURL(): string;
296
+ readonly baseURL: string;
297
+ readonly agency: {
298
+ introspectRequesterAssertion(input: {
299
+ assertion: string;
300
+ presenter: { applicationId: string; credentialId: string };
301
+ }): Promise<OxyRequesterAssertionIntrospection>;
302
+ };
300
303
  }
301
304
 
302
305
  /** What the audience learns about the present requester. */
@@ -358,8 +361,8 @@ function singleHeader(req: Request, name: string): string | null | 'invalid' {
358
361
  * token. Mount it after `createOxyAuthMiddleware`. Without the header it does
359
362
  * nothing, so it composes with every other lane.
360
363
  *
361
- * `introspector` must be an `OxyServices` configured with THIS service's own
362
- * credential (`configureServiceAuth`): Oxy only lets the audience's application
364
+ * `introspector` is this service's `OxyServer`, holding THIS service's own
365
+ * credential: Oxy only lets the audience's application
363
366
  * consume an assertion.
364
367
  */
365
368
  export function createOxyRequesterAssertionAuth(
@@ -371,7 +374,7 @@ export function createOxyRequesterAssertionAuth(
371
374
  const resolver = (): ((keyId: string) => Promise<KeyObject | undefined>) => {
372
375
  resolvePublicKey ??= createOxyJwksKeyResolver({
373
376
  jwksUrl: options.jwksUrl
374
- ?? new URL('/capabilities/.well-known/jwks.json', introspector.getBaseURL()).toString(),
377
+ ?? new URL('/capabilities/.well-known/jwks.json', introspector.baseURL).toString(),
375
378
  });
376
379
  return resolvePublicKey;
377
380
  };
@@ -429,7 +432,7 @@ export function createOxyRequesterAssertionAuth(
429
432
 
430
433
  let introspection: OxyRequesterAssertionIntrospection;
431
434
  try {
432
- introspection = await introspector.introspectRequesterAssertion({
435
+ introspection = await introspector.agency.introspectRequesterAssertion({
433
436
  assertion,
434
437
  presenter: { applicationId: serviceApp.appId, credentialId: serviceApp.credentialId },
435
438
  });
@@ -372,11 +372,10 @@ export interface OxyPagesHeadersOptions {
372
372
  * violation for a script we never asked for. The rest of the value is Pages'
373
373
  * own default, so caching is unchanged.
374
374
  *
375
- * And, because this origin is where a web account is created, recovered and
376
- * deleted and every Oxy passkey is asserted (ADR 0028, ADR 0029) — the rest
377
- * of the holder policy: no `<base>` and no form posts (`base-uri` /
378
- * `form-action 'none'`), no Referer to anyone, passkeys for this origin only
379
- * with every other powerful feature off (`Permissions-Policy`), and its
375
+ * And, because this origin is where people sign in and approve third-party
376
+ * access (ADR 0028, ADR 0029, ADR 0030) — the rest of the holder policy: no
377
+ * `<base>` and no form posts (`base-uri` / `form-action 'none'`), no Referer
378
+ * to anyone, every powerful feature off (`Permissions-Policy`), and its
380
379
  * responses readable by no other origin (`Cross-Origin-Resource-Policy`).
381
380
  * Never `Cross-Origin-Opener-Policy`: the third-party OAuth popup reports
382
381
  * its code to the app that opened it, and COOP severs `window.opener`.
@@ -411,10 +410,10 @@ export interface OxyPagesHeadersOptions {
411
410
  * react-native-web's runtime stylesheet, and a style hash would silently switch
412
411
  * that off and render every Oxy web app unstyled.)
413
412
  */
414
- /** Passkeys for this origin itself; every other powerful feature off. */
413
+ /** Every powerful feature off, WebAuthn included: Oxy has no passkeys (ADR 0030). */
415
414
  const SENSITIVE_PERMISSIONS_POLICY = [
416
- 'publickey-credentials-get=(self)',
417
- 'publickey-credentials-create=(self)',
415
+ 'publickey-credentials-get=()',
416
+ 'publickey-credentials-create=()',
418
417
  'camera=()',
419
418
  'microphone=()',
420
419
  'geolocation=()',
@@ -2,8 +2,8 @@ import { observeNodeHttp, withoutNodeHttpObservation } from './trafficNodeHttp';
2
2
  import { observeTrafficSocket, observeTrafficWebSocket, type TrafficWebSocket, type TrafficSocket } from '@oxy.so/telemetry/socket';
3
3
  import { randomUUID } from 'node:crypto';
4
4
  import type { RequestHandler } from 'express';
5
- import { OxyServices } from '../OxyServices';
6
- // Static, unlike the lazy import in `mixins/OxyServices.auth.ts`: that module is
5
+ import { OxyServer } from './OxyServer';
6
+ // Static, like `OxyServer`'s own import: this module is
7
7
  // reachable from the root barrel, which ships to React Native, so pulling
8
8
  // `node:crypto` in eagerly there would cost every mobile bundle. This file is
9
9
  // server-only and the server barrel already exports `./workloadIdentity`, so
@@ -65,11 +65,11 @@ export function createEcosystemTraffic(options: EcosystemTrafficOptions): {
65
65
  'Ecosystem activity needs one of: an OXY_ACTIVITY_API_KEY and OXY_ACTIVITY_API_SECRET pair, an OXY_SERVICE_API_KEY and OXY_SERVICE_API_SECRET pair, or a workload identity this process can attest (ADR 0026).',
66
66
  );
67
67
  }
68
- const oxy = new OxyServices({ baseURL });
69
- // Left unconfigured when there is no pair on purpose: `getServiceToken()`
68
+ const oxy = new OxyServer({ baseURL });
69
+ // Left unconfigured when there is no pair on purpose: `serviceToken()`
70
70
  // attests instead of being handed half a credential to fail on.
71
71
  if (apiKey && apiSecret) oxy.configureServiceAuth(apiKey, apiSecret);
72
- const credential = options.credential ?? (() => oxy.getServiceToken());
72
+ const credential = options.credential ?? (() => oxy.serviceToken());
73
73
  const fetcher = globalThis.fetch.bind(globalThis);
74
74
  const instanceId = randomUUID();
75
75
  const location = options.location ?? infrastructureLocation(region);
@@ -141,6 +141,6 @@ export function createEcosystemTraffic(options: EcosystemTrafficOptions): {
141
141
  cleanups.add(cleanup);
142
142
  return cleanup;
143
143
  },
144
- async stop() { if (stopped) return; stopped = true; cleanups.forEach(cleanup => cleanup()); cleanups.clear(); clearInterval(timer); clearInterval(heartbeatTimer); await flush(); await heartbeat(true); },
144
+ async stop() { if (stopped) return; stopped = true; for (const cleanup of cleanups) cleanup(); cleanups.clear(); clearInterval(timer); clearInterval(heartbeatTimer); await flush(); await heartbeat(true); },
145
145
  };
146
146
  }
@@ -55,8 +55,8 @@ export function observeNodeHttp(
55
55
  const patches = [http, https].map(module => {
56
56
  const request = module.request;
57
57
  const get = module.get;
58
- const wrappedRequest = function (...args: Parameters<typeof request>) { return safelyObserve(request.apply(module, args)); } as typeof request;
59
- const wrappedGet = function (...args: Parameters<typeof get>) { return safelyObserve(get.apply(module, args)); } as typeof get;
58
+ const wrappedRequest = ((...args: Parameters<typeof request>) => safelyObserve(request.apply(module, args))) as typeof request;
59
+ const wrappedGet = ((...args: Parameters<typeof get>) => safelyObserve(get.apply(module, args))) as typeof get;
60
60
  module.request = wrappedRequest;
61
61
  module.get = wrappedGet;
62
62
  return () => {
@@ -65,5 +65,9 @@ export function observeNodeHttp(
65
65
  };
66
66
  });
67
67
  syncBuiltinESMExports();
68
- return () => { patches.forEach(restore => restore()); restoreRequests.forEach(restore => restore()); syncBuiltinESMExports(); };
68
+ return () => {
69
+ for (const restore of patches) restore();
70
+ for (const restore of restoreRequests) restore();
71
+ syncBuiltinESMExports();
72
+ };
69
73
  }
@@ -6,8 +6,8 @@
6
6
  * Every Oxy backend caches Oxy identity, and none of them find out when it
7
7
  * changes. The `OxyServices` GET response cache holds `GET /users/:id` and
8
8
  * `GET /profiles/username/:name` for five minutes; it is swept when THIS process
9
- * writes the profile (the `evictOxyIdentityCache` calls in the user and accounts
10
- * mixins) and never when somebody else does — which is the normal case, since
9
+ * writes the profile (the `evictOxyIdentityCache` calls in the `users` and
10
+ * `accounts` namespaces) and never when somebody else does — which is the normal case, since
11
11
  * profiles are edited in Oxy's own apps. So an avatar or display-name change is
12
12
  * invisible to every consuming backend for up to five minutes, per process.
13
13
  *
@@ -34,11 +34,11 @@
34
34
  * // node-redis
35
35
  * await subscriber.subscribe(
36
36
  * OXY_USER_INVALIDATION_CHANNEL,
37
- * createOxyUserInvalidationHandler({ oxy: oxyClient }),
37
+ * createOxyUserInvalidationHandler({ oxy: server }),
38
38
  * );
39
39
  *
40
40
  * // ioredis
41
- * const handle = createOxyUserInvalidationHandler({ oxy: oxyClient });
41
+ * const handle = createOxyUserInvalidationHandler({ oxy: server });
42
42
  * await subscriber.subscribe(OXY_USER_INVALIDATION_CHANNEL);
43
43
  * subscriber.on('message', (_channel, raw) => handle(raw));
44
44
  *
@@ -130,11 +130,11 @@ function isPromiseLike(value: unknown): value is PromiseLike<unknown> {
130
130
  /** Options for {@link createOxyUserInvalidationHandler}. */
131
131
  export interface OxyUserInvalidationHandlerOptions {
132
132
  /**
133
- * The backend's `OxyServices` instance. When supplied, its GET response cache
134
- * is swept for the invalidated user — this is the whole reason a backend that
135
- * has no cache of its own still benefits from subscribing.
133
+ * The backend's `OxyServer` (or any `OxyServices`). When supplied, its GET
134
+ * response cache is swept for the invalidated user — this is the whole reason
135
+ * a backend that has no cache of its own still benefits from subscribing.
136
136
  */
137
- oxy?: OxyIdentityCacheEvictor;
137
+ oxy?: { readonly http: OxyIdentityCacheEvictor };
138
138
  /**
139
139
  * App-specific eviction (e.g. a Redis identity cache the app maintains itself).
140
140
  * May be async; a rejection is routed to `onError` and never escapes.
@@ -179,7 +179,7 @@ export function createOxyUserInvalidationHandler(
179
179
 
180
180
  if (oxy) {
181
181
  try {
182
- evictOxyIdentityCache(oxy, event.userId);
182
+ evictOxyIdentityCache(oxy.http, event.userId);
183
183
  } catch (error) {
184
184
  // A cache sweep must never cost us the app-specific eviction below.
185
185
  onError?.(error, raw);
@@ -19,7 +19,7 @@ import type {
19
19
  AccountKind,
20
20
  AccountMember,
21
21
  AccountRelationship,
22
- } from "../mixins/OxyServices.accounts";
22
+ } from "../api/accounts";
23
23
 
24
24
  export interface AccountDelegationAccess {
25
25
  /** The caller owns the account or has a live membership in it. */