@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.
Files changed (662) hide show
  1. package/README.md +13 -7
  2. package/dist/cjs/HttpService.js +189 -112
  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 +190 -113
  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 +47 -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 -1
  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 +201 -132
  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 -1
  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 -1440
  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 -1400
  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 -965
  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__/serviceTokenWorkloadFallback.test.ts +0 -85
  490. package/src/__tests__/userIdentity.test.ts +0 -143
  491. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
  492. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
  493. package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
  494. package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
  495. package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
  496. package/src/crypto/__tests__/identityLink.test.ts +0 -18
  497. package/src/crypto/__tests__/identityMocks.ts +0 -125
  498. package/src/crypto/__tests__/identityProof.test.ts +0 -81
  499. package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
  500. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
  501. package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
  502. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
  503. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
  504. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
  505. package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
  506. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
  507. package/src/crypto/__tests__/keyManager.test.ts +0 -329
  508. package/src/crypto/__tests__/polyfill.test.ts +0 -109
  509. package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
  510. package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
  511. package/src/crypto/__tests__/registrationPow.test.ts +0 -61
  512. package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
  513. package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
  514. package/src/crypto/__tests__/signedRecord.test.ts +0 -230
  515. package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
  516. package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
  517. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
  518. package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
  519. package/src/i18n/locales/de-DE.json +0 -306
  520. package/src/i18n/locales/es-ES.json +0 -2127
  521. package/src/i18n/locales/ja-JP.json +0 -306
  522. package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
  523. package/src/logger/__tests__/logger.test.ts +0 -207
  524. package/src/mixins/OxyServices.accounts.ts +0 -1330
  525. package/src/mixins/OxyServices.agency.ts +0 -353
  526. package/src/mixins/OxyServices.analytics.ts +0 -53
  527. package/src/mixins/OxyServices.appData.ts +0 -158
  528. package/src/mixins/OxyServices.assets.ts +0 -964
  529. package/src/mixins/OxyServices.auth.ts +0 -2028
  530. package/src/mixins/OxyServices.chains.ts +0 -134
  531. package/src/mixins/OxyServices.civic.ts +0 -945
  532. package/src/mixins/OxyServices.connectedApps.ts +0 -212
  533. package/src/mixins/OxyServices.contacts.ts +0 -73
  534. package/src/mixins/OxyServices.devices.ts +0 -120
  535. package/src/mixins/OxyServices.features.ts +0 -454
  536. package/src/mixins/OxyServices.followGraph.ts +0 -293
  537. package/src/mixins/OxyServices.identity.ts +0 -787
  538. package/src/mixins/OxyServices.identityBackup.ts +0 -250
  539. package/src/mixins/OxyServices.inference.ts +0 -57
  540. package/src/mixins/OxyServices.language.ts +0 -144
  541. package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
  542. package/src/mixins/OxyServices.location.ts +0 -46
  543. package/src/mixins/OxyServices.nodes.ts +0 -337
  544. package/src/mixins/OxyServices.notifications.ts +0 -142
  545. package/src/mixins/OxyServices.payment.ts +0 -163
  546. package/src/mixins/OxyServices.privacy.ts +0 -219
  547. package/src/mixins/OxyServices.reputation.ts +0 -436
  548. package/src/mixins/OxyServices.security.ts +0 -110
  549. package/src/mixins/OxyServices.store.ts +0 -585
  550. package/src/mixins/OxyServices.topics.ts +0 -169
  551. package/src/mixins/OxyServices.user.ts +0 -1208
  552. package/src/mixins/OxyServices.utility.ts +0 -1803
  553. package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
  554. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
  555. package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
  556. package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
  557. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
  558. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
  559. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
  560. package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
  561. package/src/mixins/__tests__/accountEvents.test.ts +0 -158
  562. package/src/mixins/__tests__/accounts.test.ts +0 -727
  563. package/src/mixins/__tests__/agency.test.ts +0 -120
  564. package/src/mixins/__tests__/appData.test.ts +0 -203
  565. package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
  566. package/src/mixins/__tests__/assetUpload.test.ts +0 -191
  567. package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
  568. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
  569. package/src/mixins/__tests__/chains.test.ts +0 -113
  570. package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
  571. package/src/mixins/__tests__/connectedApps.test.ts +0 -146
  572. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
  573. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
  574. package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
  575. package/src/mixins/__tests__/followGraph.test.ts +0 -147
  576. package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
  577. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
  578. package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
  579. package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
  580. package/src/mixins/__tests__/identityBackup.test.ts +0 -315
  581. package/src/mixins/__tests__/identityLink.test.ts +0 -89
  582. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
  583. package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
  584. package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
  585. package/src/mixins/__tests__/notifications.read.test.ts +0 -82
  586. package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
  587. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
  588. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
  589. package/src/mixins/__tests__/reputation.test.ts +0 -522
  590. package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
  591. package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
  592. package/src/mixins/__tests__/store.test.ts +0 -304
  593. package/src/mixins/__tests__/topics.test.ts +0 -155
  594. package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
  595. package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
  596. package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
  597. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
  598. package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
  599. package/src/mixins/index.ts +0 -203
  600. package/src/mixins/mixinHelpers.ts +0 -69
  601. package/src/server/__tests__/auth.test.ts +0 -78
  602. package/src/server/__tests__/capabilityTicket.test.ts +0 -111
  603. package/src/server/__tests__/cors.socket.test.ts +0 -225
  604. package/src/server/__tests__/cors.test.ts +0 -158
  605. package/src/server/__tests__/rateLimit.test.ts +0 -257
  606. package/src/server/__tests__/requesterAssertion.test.ts +0 -359
  607. package/src/server/__tests__/safeFetch.test.ts +0 -232
  608. package/src/server/__tests__/securityHeaders.test.ts +0 -387
  609. package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
  610. package/src/server/__tests__/traffic.test.ts +0 -180
  611. package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
  612. package/src/server/__tests__/userInvalidation.test.ts +0 -203
  613. package/src/server/__tests__/verifySecret.test.ts +0 -40
  614. package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
  615. package/src/server/__tests__/workloadIdentity.test.ts +0 -128
  616. package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
  617. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
  618. package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
  619. package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
  620. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
  621. package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
  622. package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
  623. package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
  624. package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
  625. package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
  626. package/src/session/__tests__/SessionClient.state.test.ts +0 -78
  627. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
  628. package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
  629. package/src/session/__tests__/accountDialogController.test.ts +0 -2502
  630. package/src/session/__tests__/accountDialogShape.test.ts +0 -120
  631. package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
  632. package/src/session/__tests__/authStateStore.test.ts +0 -451
  633. package/src/session/__tests__/deviceDirectory.test.ts +0 -422
  634. package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
  635. package/src/session/__tests__/identityPin.test.ts +0 -131
  636. package/src/session/__tests__/identitySession.test.ts +0 -194
  637. package/src/session/__tests__/projectSessionState.test.ts +0 -105
  638. package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
  639. package/src/session/__tests__/refresh.test.ts +0 -606
  640. package/src/session/__tests__/sessionIntegration.test.ts +0 -209
  641. package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
  642. package/src/utils/__tests__/accountUtils.test.ts +0 -151
  643. package/src/utils/__tests__/activityId.test.ts +0 -45
  644. package/src/utils/__tests__/asyncUtils.test.ts +0 -279
  645. package/src/utils/__tests__/authWebUrl.test.ts +0 -15
  646. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  647. package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
  648. package/src/utils/__tests__/coldBoot.test.ts +0 -496
  649. package/src/utils/__tests__/commonsApproval.test.ts +0 -60
  650. package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
  651. package/src/utils/__tests__/languageUtils.test.ts +0 -244
  652. package/src/utils/__tests__/oauthPkce.test.ts +0 -303
  653. package/src/utils/__tests__/officialOrigins.test.ts +0 -31
  654. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
  655. package/src/utils/__tests__/profileLinks.test.ts +0 -180
  656. package/src/utils/__tests__/redactUrl.test.ts +0 -33
  657. package/src/utils/__tests__/registrableApex.test.ts +0 -62
  658. package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
  659. package/src/utils/__tests__/textNormalization.test.ts +0 -205
  660. package/src/utils/__tests__/validationUtils.test.ts +0 -703
  661. package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
  662. 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. */