@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
@@ -70,8 +70,8 @@ export const REMINT_AFTER_EXPIRY_MS = 2000;
70
70
  export async function refreshDeviceSecretArm(deps) {
71
71
  const { oxy, store } = deps;
72
72
  const pin = deps.pin ?? null;
73
- return oxy.httpService.runSingleFlightDeviceSecretMint(async () => {
74
- const epoch = oxy.httpService.getSessionEpoch();
73
+ return oxy.http.runSingleFlightDeviceSecretMint(async () => {
74
+ const epoch = oxy.http.getSessionEpoch();
75
75
  const persisted = await store.load();
76
76
  if (!persisted?.deviceId || !persisted?.deviceSecret) {
77
77
  return { status: 'no-secret' };
@@ -81,10 +81,10 @@ export async function refreshDeviceSecretArm(deps) {
81
81
  // Unpinned callers pass NO third argument at all, so the account-mode call
82
82
  // shape (and therefore the request body) is untouched by this feature.
83
83
  mint = pin
84
- ? await oxy.mintFromDeviceSecret(persisted.deviceId, persisted.deviceSecret, {
84
+ ? await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret, {
85
85
  accountId: pin.accountId,
86
86
  })
87
- : await oxy.mintFromDeviceSecret(persisted.deviceId, persisted.deviceSecret);
87
+ : await oxy.devices.mintToken(persisted.deviceId, persisted.deviceSecret);
88
88
  }
89
89
  catch (error) {
90
90
  // 429 keeps the credential like any other transient failure — the secret
@@ -96,7 +96,7 @@ export async function refreshDeviceSecretArm(deps) {
96
96
  // requests. Telling HttpService lengthens the next cooldown to one attempt
97
97
  // per limiter window, which lets the budget drain and the session heal.
98
98
  if (extractErrorStatus(error) === 429) {
99
- oxy.httpService.noteRefreshRateLimited();
99
+ oxy.http.noteRefreshRateLimited();
100
100
  return { status: 'transient' };
101
101
  }
102
102
  if (extractErrorStatus(error) === 401) {
@@ -137,11 +137,11 @@ export async function refreshDeviceSecretArm(deps) {
137
137
  expiresAt: mint.expiresAt,
138
138
  ...(bound ? { sessionId: bound.sessionId, userId: bound.accountId } : {}),
139
139
  };
140
- if (oxy.httpService.getSessionEpoch() !== epoch) {
141
- // Signed out while minting. The server has rotated the secret, so a store
142
- // that still holds the presented one must learn the rotation (the
143
- // token-null lane keeps the store so a reload can restore); a store the
144
- // sign-out cleared must NOT be refilled. Either way, plant nothing.
140
+ if (oxy.http.getSessionEpoch() !== epoch) {
141
+ // Signed out while minting. A store that still holds the presented
142
+ // secret takes the server's `nextDeviceSecret` (the token-null lane keeps
143
+ // the store so a reload can restore); a store the sign-out cleared must
144
+ // NOT be refilled. Either way, plant nothing.
145
145
  const current = await store.load();
146
146
  if (current?.deviceId === persisted.deviceId && current.deviceSecret === persisted.deviceSecret) {
147
147
  await store.save(next);
@@ -154,10 +154,10 @@ export async function refreshDeviceSecretArm(deps) {
154
154
  if (!persistedOk) {
155
155
  return { status: 'persist-failed' };
156
156
  }
157
- if (oxy.httpService.getSessionEpoch() !== epoch) {
157
+ if (oxy.http.getSessionEpoch() !== epoch) {
158
158
  return { status: 'session-ended' };
159
159
  }
160
- oxy.setTokens(mint.accessToken);
160
+ oxy.session.setAccessToken(mint.accessToken);
161
161
  return {
162
162
  status: 'ok',
163
163
  token: mint.accessToken,
@@ -194,7 +194,7 @@ export async function refreshPersistedSession(deps) {
194
194
  const identity = deps.identity ?? null;
195
195
  // The shared keychain is never an identity-bound client's recovery path.
196
196
  const allowSharedKeyFallback = identity ? false : (deps.allowSharedKeyFallback ?? isNative());
197
- const epoch = oxy.httpService.getSessionEpoch();
197
+ const epoch = oxy.http.getSessionEpoch();
198
198
  // Resolved per call: a re-established identity session can move the pin, and a
199
199
  // replaced/removed local key clears it (in which case arm 1 must NOT mint —
200
200
  // an unpinned mint would adopt whatever account the device switched to).
@@ -223,13 +223,20 @@ export async function refreshPersistedSession(deps) {
223
223
  // 401: secret diverged or no live session. When a key-based arm 2 can still
224
224
  // recover (native shared key, or an identity-bound client's own primary
225
225
  // key) drop ONLY the secret and keep the deviceId; otherwise (web) the
226
- // session is over — clear the store.
226
+ // session is over.
227
227
  const persisted = await store.load();
228
228
  if (allowSharedKeyFallback || identity) {
229
229
  if (persisted) {
230
230
  await store.save({ ...persisted, deviceSecret: undefined });
231
231
  }
232
232
  }
233
+ else if (arm1.status === 'no-session' && persisted?.deviceId && persisted.deviceSecret) {
234
+ // Web, a credential the server still recognises: this origin stays a
235
+ // holder of the browser's device (ADR 0029 D2) — the next sign-in in any
236
+ // app lands on it, and this app follows without opening the bridge
237
+ // again. Only the session fields go.
238
+ await store.save({ sessionId: '', userId: '', deviceId: persisted.deviceId, deviceSecret: persisted.deviceSecret });
239
+ }
233
240
  else {
234
241
  await store.clear();
235
242
  }
@@ -248,14 +255,14 @@ export async function refreshPersistedSession(deps) {
248
255
  }
249
256
  // Never after a sign-out: the shared keychain holds an identity KEY, not a
250
257
  // session, and using it here would sign the user straight back in.
251
- if (allowSharedKeyFallback && !oxy.httpService.hasSessionEnded()) {
258
+ if (allowSharedKeyFallback && !oxy.http.hasSessionEnded()) {
252
259
  try {
253
260
  // Planted here, not by the sign-in: a sign-out that lands while the
254
261
  // challenge round-trips must win, or the shared keychain signs the user
255
262
  // straight back in.
256
- const session = await oxy.signInWithSharedIdentity({ plantTokens: false });
263
+ const session = await oxy.auth.signInWithSharedIdentity({ plantTokens: false });
257
264
  if (session?.accessToken) {
258
- if (oxy.httpService.getSessionEpoch() !== epoch) {
265
+ if (oxy.http.getSessionEpoch() !== epoch) {
259
266
  return null;
260
267
  }
261
268
  // Repopulate the fast device-secret lane from the shared-key re-mint.
@@ -269,10 +276,10 @@ export async function refreshPersistedSession(deps) {
269
276
  expiresAt: session.expiresAt,
270
277
  });
271
278
  }
272
- if (oxy.httpService.getSessionEpoch() !== epoch) {
279
+ if (oxy.http.getSessionEpoch() !== epoch) {
273
280
  return null;
274
281
  }
275
- oxy.setTokens(session.accessToken);
282
+ oxy.session.setAccessToken(session.accessToken);
276
283
  return session.accessToken;
277
284
  }
278
285
  }
@@ -319,9 +326,9 @@ export function createAuthRefreshHandler(deps) {
319
326
  * Returns a disposer that removes it.
320
327
  */
321
328
  export function installAuthRefreshHandler(deps) {
322
- deps.oxy.httpService.setAuthRefreshHandler(createAuthRefreshHandler(deps));
329
+ deps.oxy.http.setAuthRefreshHandler(createAuthRefreshHandler(deps));
323
330
  return () => {
324
- deps.oxy.httpService.setAuthRefreshHandler(null);
331
+ deps.oxy.http.setAuthRefreshHandler(null);
325
332
  };
326
333
  }
327
334
  /**
@@ -363,10 +370,10 @@ export function startTokenRefreshScheduler(oxy) {
363
370
  /** Schedule the next re-mint from the current token's expiry (the healthy path). */
364
371
  const scheduleFromExpiry = () => {
365
372
  clearTimer();
366
- if (disposed || !oxy.getAccessToken()) {
373
+ if (disposed || !oxy.session.accessToken) {
367
374
  return;
368
375
  }
369
- const expSeconds = oxy.getAccessTokenExpiry();
376
+ const expSeconds = oxy.session.accessTokenExpiry;
370
377
  if (expSeconds === null) {
371
378
  return;
372
379
  }
@@ -374,7 +381,7 @@ export function startTokenRefreshScheduler(oxy) {
374
381
  // The server already answered this token's refresh with this very token:
375
382
  // asking again before `exp` only gets it back again. Ask just after expiry,
376
383
  // when the server rotates (see REMINT_AFTER_EXPIRY_MS).
377
- if (untilExpiryMs > 0 && oxy.httpService.isAwaitingCurrentTokenExpiry?.()) {
384
+ if (untilExpiryMs > 0 && oxy.http.isAwaitingCurrentTokenExpiry?.()) {
378
385
  armTimer(untilExpiryMs + REMINT_AFTER_EXPIRY_MS);
379
386
  return;
380
387
  }
@@ -386,11 +393,11 @@ export function startTokenRefreshScheduler(oxy) {
386
393
  clearTimer();
387
394
  // Another lane (a request-time preflight) already asked, and the server
388
395
  // answered with this same token: re-arm for just past expiry instead.
389
- if (oxy.httpService.isAwaitingCurrentTokenExpiry?.()) {
396
+ if (oxy.http.isAwaitingCurrentTokenExpiry?.()) {
390
397
  scheduleFromExpiry();
391
398
  return;
392
399
  }
393
- void oxy.httpService.refreshAccessToken('preflight')
400
+ void oxy.http.refreshAccessToken('preflight')
394
401
  .then((token) => Boolean(token))
395
402
  .catch(() => false)
396
403
  .then((ok) => {
@@ -417,10 +424,10 @@ export function startTokenRefreshScheduler(oxy) {
417
424
  scheduleFromExpiry();
418
425
  };
419
426
  const onFocus = () => {
420
- if (disposed || !oxy.getAccessToken()) {
427
+ if (disposed || !oxy.session.accessToken) {
421
428
  return;
422
429
  }
423
- const expSeconds = oxy.getAccessTokenExpiry();
430
+ const expSeconds = oxy.session.accessTokenExpiry;
424
431
  if (expSeconds === null) {
425
432
  return;
426
433
  }
@@ -435,8 +442,8 @@ export function startTokenRefreshScheduler(oxy) {
435
442
  // Re-arm only on a token that actually CHANGED. The mint plants the token it
436
443
  // returns even when that is the token already held, and treating the repeat
437
444
  // as new re-armed from an in-lead-window expiry, i.e. at the 1s floor.
438
- let lastSeenToken = oxy.getAccessToken();
439
- const unsubscribeTokens = oxy.onTokensChanged((token) => {
445
+ let lastSeenToken = oxy.session.accessToken;
446
+ const unsubscribeTokens = oxy.session.onChange((token) => {
440
447
  if (disposed || token === lastSeenToken) {
441
448
  return;
442
449
  }
@@ -14,12 +14,12 @@ export function createSessionClientHost(oxyServices) {
14
14
  let currentAccountId = null;
15
15
  let deviceCredential = null;
16
16
  return {
17
- makeRequest: (method, url, data, options) => oxyServices.makeRequest(method, url, data, options),
18
- getBaseURL: () => oxyServices.getBaseURL(),
19
- getAccessToken: () => oxyServices.getAccessToken(),
17
+ makeRequest: (method, url, data, options) => oxyServices.request(method, url, data, options),
18
+ getBaseURL: () => oxyServices.baseURL,
19
+ getAccessToken: () => oxyServices.session.accessToken,
20
20
  getDeviceCredential: () => deviceCredential,
21
- onTokensChanged: (listener) => oxyServices.onTokensChanged(listener),
22
- setTokens: (accessToken) => oxyServices.setTokens(accessToken),
21
+ onTokensChanged: (listener) => oxyServices.session.onChange(listener),
22
+ setTokens: (accessToken) => oxyServices.session.setAccessToken(accessToken),
23
23
  getCurrentAccountId: () => currentAccountId,
24
24
  setCurrentAccountId: (id) => {
25
25
  currentAccountId = id;
@@ -155,8 +155,9 @@ export function decideSharedDevicePublish(proven, shared) {
155
155
  if (shared.credential.deviceSecret === proven.deviceSecret) {
156
156
  return { action: 'skip', reason: 'already-current' };
157
157
  }
158
- // Same device, newer secret. Sign-in rotates the secret (the mint does
159
- // not), so the just-proven one is the credential a fresh install should
158
+ // Same device, newer secret. Each sign-in issues a new holder credential
159
+ // (the older one stays valid until the device ends with nobody signed
160
+ // in), so the just-proven one is the credential a fresh install should
160
161
  // join with.
161
162
  return { action: 'publish' };
162
163
  }
@@ -56,7 +56,7 @@ export const calculateBackoffInterval = (state) => {
56
56
  const { consecutiveFailures, baseInterval, maxInterval } = state;
57
57
  if (consecutiveFailures === 0)
58
58
  return baseInterval;
59
- const backoffMultiplier = Math.min(Math.pow(2, consecutiveFailures - 1), maxInterval / baseInterval);
59
+ const backoffMultiplier = Math.min(2 ** (consecutiveFailures - 1), maxInterval / baseInterval);
60
60
  return Math.min(baseInterval * backoffMultiplier, maxInterval);
61
61
  };
62
62
  /**
@@ -164,7 +164,7 @@ export const withRetry = async (fn, options = {}) => {
164
164
  if (attempt === maxRetries || !shouldRetry(error)) {
165
165
  throw error;
166
166
  }
167
- const delayMs = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
167
+ const delayMs = Math.min(baseDelay * 2 ** attempt, maxDelay);
168
168
  onRetry?.(error, attempt + 1);
169
169
  await delay(delayMs);
170
170
  }
@@ -12,15 +12,12 @@
12
12
  * those cached and the account switcher keeps drawing the pre-edit name and
13
13
  * picture for the full TTL, against a perfectly healthy server.
14
14
  *
15
- * The mixins compose into one class at runtime but are typed one at a time, so
16
- * the user mixin cannot call a method the accounts mixin owns. The key list
17
- * therefore lives here, once, and every writer calls {@link
18
- * evictOxyAccountForestCache} — exactly like the identity key list in
19
- * `identityCacheSweep`, which the accounts mixin already calls for the
20
- * mirror-image case (an account write staling the identity reads). The
21
- * alternative — a second hand-written copy of these keys in the other mixin —
22
- * is the drift that shipped the two stale-profile bugs `identityCacheSweep`
23
- * documents.
15
+ * The key list lives here, once, and every writer (`users.updateMe`, the
16
+ * `accounts` namespace) reads it — exactly like the identity key list in
17
+ * `identityCacheSweep`, which account writes use for the mirror-image case (an
18
+ * account write staling the identity reads). A second hand-written copy of
19
+ * these keys in another namespace is the drift that shipped the two
20
+ * stale-profile bugs `identityCacheSweep` documents.
24
21
  *
25
22
  * WHY THE LIST NEEDS A PREFIX AND THE DETAIL DOES NOT
26
23
  * --------------------------------------------------
@@ -66,10 +63,9 @@ export function oxyAccountDetailCacheKey(accountId) {
66
63
  * account in it (create, archive, ownership transfer) has no
67
64
  * detail row to name, and clears only the lists.
68
65
  */
69
- export function evictOxyAccountForestCache(oxy, accountId) {
70
- oxy.clearCacheEntry(OXY_ACCOUNT_LIST_CACHE_KEY);
71
- oxy.clearCacheByPrefix(OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX);
72
- if (accountId) {
73
- oxy.clearCacheEntry(oxyAccountDetailCacheKey(accountId));
74
- }
66
+ export function evictOxyAccountForestCache(http, accountId) {
67
+ http.invalidateCache({
68
+ keys: accountId ? [OXY_ACCOUNT_LIST_CACHE_KEY, oxyAccountDetailCacheKey(accountId)] : [OXY_ACCOUNT_LIST_CACHE_KEY],
69
+ prefixes: [OXY_ACCOUNT_LIST_CACHE_QUERY_PREFIX],
70
+ });
75
71
  }
@@ -1,35 +1,22 @@
1
1
  /**
2
- * Async utilities for common asynchronous patterns and error handling
2
+ * Retry with exponential backoff and jitter — the policy `HttpService` uses.
3
3
  */
4
- import { logger } from '../logger/index.js';
5
4
  import { ErrorCodes, isCancelledError } from './errorUtils.js';
6
5
  /**
7
- * Wrapper for async operations with automatic error handling
8
- * Returns null on error instead of throwing
9
- */
10
- export async function withErrorHandling(operation, errorHandler, context) {
11
- try {
12
- return await operation();
13
- }
14
- catch (error) {
15
- if (errorHandler) {
16
- errorHandler(error);
17
- }
18
- else {
19
- logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
20
- component: 'asyncUtils',
21
- method: 'withErrorHandling',
22
- });
23
- }
24
- return null;
25
- }
26
- }
27
- /**
28
- * Execute multiple async operations in parallel with error handling
6
+ * Whether an error came from a request hitting its own timeout.
7
+ *
8
+ * A timeout and a caller cancellation both surface from `fetch` as an
9
+ * `AbortError`, so this only recognises one that has already been CLASSIFIED
10
+ * (by `HttpService`, which knows which of its own timers fired). An
11
+ * unclassified abort is treated as a cancellation, which is the safe
12
+ * direction: refusing to retry something that was abandoned costs nothing,
13
+ * while retrying it is the defect this whole option exists to fix.
29
14
  */
30
- export async function parallelWithErrorHandling(operations, errorHandler) {
31
- const results = await Promise.allSettled(operations.map((op, index) => withErrorHandling(op, error => errorHandler?.(error, index))));
32
- return results.map(result => result.status === 'fulfilled' ? result.value : null);
15
+ function isTimeoutError(error) {
16
+ if (!error || typeof error !== 'object')
17
+ return false;
18
+ const candidate = error;
19
+ return candidate.timeout === true || candidate.code === ErrorCodes.TIMEOUT;
33
20
  }
34
21
  /**
35
22
  * Extract an HTTP status code from an error value, tolerating both the
@@ -54,21 +41,15 @@ function extractHttpStatus(error) {
54
41
  return undefined;
55
42
  }
56
43
  /**
57
- * Whether an error came from a request hitting its own timeout.
44
+ * Retry an async operation with exponential backoff
58
45
  *
59
- * A timeout and a caller cancellation both surface from `fetch` as an
60
- * `AbortError`, so this only recognises one that has already been CLASSIFIED
61
- * (by `HttpService`, which knows which of its own timers fired). An
62
- * unclassified abort is treated as a cancellation, which is the safe
63
- * direction: refusing to retry something that was abandoned costs nothing,
64
- * while retrying it is the defect this whole option exists to fix.
46
+ * By default, does not retry on 4xx errors (client errors). The default
47
+ * predicate accepts both the axios-style `error.response.status` and the
48
+ * flat `error.status` shape produced by {@link handleHttpError}, so callers
49
+ * never accidentally retry a deterministic client failure.
50
+ *
51
+ * Use the `shouldRetry` callback to customize retry behavior.
65
52
  */
66
- function isTimeoutError(error) {
67
- if (!error || typeof error !== 'object')
68
- return false;
69
- const candidate = error;
70
- return candidate.timeout === true || candidate.code === ErrorCodes.TIMEOUT;
71
- }
72
53
  export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayArg = 1000, shouldRetryArg) {
73
54
  // An options-object overload rather than a fifth positional parameter:
74
55
  // `retryOnError` below and other in-tree callers pass positionally, and a
@@ -125,7 +106,7 @@ export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayAr
125
106
  break;
126
107
  }
127
108
  // Calculate delay with exponential backoff and jitter
128
- const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
109
+ const delay = baseDelay * 2 ** attempt + Math.random() * 1000;
129
110
  // Nothing may start, or even sleep, past the deadline — otherwise the
130
111
  // budget bounds the attempts but not the wall clock the caller feels.
131
112
  if (deadline !== undefined && Date.now() + delay >= deadline) {
@@ -136,113 +117,3 @@ export async function retryAsync(operation, maxRetriesOrOptions = 3, baseDelayAr
136
117
  }
137
118
  throw lastError;
138
119
  }
139
- /**
140
- * Debounce async function calls
141
- */
142
- export function debounceAsync(func, delay) {
143
- let timeoutId;
144
- return (...args) => {
145
- return new Promise((resolve, reject) => {
146
- clearTimeout(timeoutId);
147
- timeoutId = setTimeout(async () => {
148
- try {
149
- const result = await func(...args);
150
- resolve(result);
151
- }
152
- catch (error) {
153
- reject(error);
154
- }
155
- }, delay);
156
- });
157
- };
158
- }
159
- /**
160
- * Throttle async function calls
161
- */
162
- export function throttleAsync(func, limit, interval) {
163
- let inThrottle = false;
164
- let lastPromise = null;
165
- return (...args) => {
166
- if (inThrottle) {
167
- return lastPromise;
168
- }
169
- inThrottle = true;
170
- lastPromise = func(...args);
171
- setTimeout(() => {
172
- inThrottle = false;
173
- }, interval);
174
- return lastPromise;
175
- };
176
- }
177
- /**
178
- * Execute async operations sequentially with progress tracking
179
- */
180
- export async function sequentialWithProgress(operations, onProgress) {
181
- const results = [];
182
- for (let i = 0; i < operations.length; i++) {
183
- const result = await operations[i]();
184
- results.push(result);
185
- onProgress?.(i + 1, operations.length);
186
- }
187
- return results;
188
- }
189
- /**
190
- * Batch async operations
191
- */
192
- export async function batchAsync(items, batchSize, processor) {
193
- for (let i = 0; i < items.length; i += batchSize) {
194
- const batch = items.slice(i, i + batchSize);
195
- await processor(batch);
196
- }
197
- }
198
- /**
199
- * Create a cancellable async operation
200
- */
201
- export function createCancellableAsync(operation) {
202
- let abortController = null;
203
- return {
204
- execute: async () => {
205
- abortController = new AbortController();
206
- return await operation(abortController.signal);
207
- },
208
- cancel: () => {
209
- abortController?.abort();
210
- }
211
- };
212
- }
213
- /**
214
- * Timeout wrapper for async operations
215
- */
216
- export async function withTimeout(operation, timeoutMs, timeoutMessage) {
217
- const timeoutPromise = new Promise((_, reject) => {
218
- setTimeout(() => {
219
- reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));
220
- }, timeoutMs);
221
- });
222
- return Promise.race([operation, timeoutPromise]);
223
- }
224
- /**
225
- * Execute async operation with loading state
226
- */
227
- export async function withLoadingState(operation, setLoading) {
228
- setLoading(true);
229
- try {
230
- return await operation();
231
- }
232
- finally {
233
- setLoading(false);
234
- }
235
- }
236
- /**
237
- * Create a promise that resolves after a delay
238
- */
239
- export const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
240
- /**
241
- * Execute async operation with retry on specific errors
242
- */
243
- export async function retryOnError(operation, retryableErrors, maxRetries = 3) {
244
- return retryAsync(operation, maxRetries, 1000, (error) => {
245
- const errorCode = error?.code || error?.status || error?.message;
246
- return retryableErrors.includes(errorCode);
247
- });
248
- }
@@ -29,13 +29,13 @@ export class AuthenticationFailedError extends Error {
29
29
  * @throws {SessionSyncRequiredError} If the session needs to be synced (offline session)
30
30
  */
31
31
  export async function ensureValidToken(oxyServices, _activeSessionId, syncSession) {
32
- if (oxyServices.hasValidToken()) {
32
+ if (oxyServices.session.isAuthenticated) {
33
33
  return;
34
34
  }
35
35
  if (syncSession) {
36
36
  try {
37
37
  await syncSession();
38
- if (oxyServices.hasValidToken()) {
38
+ if (oxyServices.session.isAuthenticated) {
39
39
  return;
40
40
  }
41
41
  }
@@ -15,9 +15,8 @@
15
15
  */
16
16
  export const CENTRAL_IDP_APEX = 'oxy.so';
17
17
  /**
18
- * The IdP's origin, `auth.oxy.so` — the OAuth authorize/consent surface and the
19
- * one origin that asserts Oxy passkeys: where a person signs in, creates,
20
- * recovers or deletes a web account, in the window an app opens (ADR 0029).
21
- * Apps open it; they never run the passkey themselves.
18
+ * The IdP's origin, `auth.oxy.so` — the OAuth authorize/consent surface for
19
+ * third parties, the browser bridge (ADR 0029 D2) and the page an email
20
+ * sign-in link opens. Official apps sign in inside their own dialog (ADR 0030).
22
21
  */
23
22
  export const AUTH_WEB_ORIGIN = `https://auth.${CENTRAL_IDP_APEX}`;
@@ -4,7 +4,7 @@ import { logger } from '../logger/index.js';
4
4
  * Logs non-404 errors to help debug upload issues.
5
5
  *
6
6
  * @param fileId - The file ID to update visibility for
7
- * @param oxyServices - OxyServices instance (or any object with assetUpdateVisibility)
7
+ * @param oxyServices - An OxyServices client
8
8
  * @param contextName - Context name for error logging
9
9
  */
10
10
  export async function updateAvatarVisibility(fileId, oxyServices, contextName = 'AvatarUtils') {
@@ -12,7 +12,7 @@ export async function updateAvatarVisibility(fileId, oxyServices, contextName =
12
12
  return;
13
13
  }
14
14
  try {
15
- await oxyServices.assetUpdateVisibility(fileId, 'public');
15
+ await oxyServices.assets.setVisibility(fileId, 'public');
16
16
  }
17
17
  catch (visError) {
18
18
  // 404 is expected when asset doesn't exist yet — skip logging
@@ -34,12 +34,15 @@ export class TTLCache {
34
34
  /**
35
35
  * Create a new TTL cache
36
36
  * @param defaultTTL Default TTL in milliseconds (default: 5 minutes)
37
+ * @param maxEntries Bound on live entries; the least recently used is evicted
38
+ * past it (default: 1000)
37
39
  */
38
- constructor(defaultTTL = 5 * 60 * 1000) {
40
+ constructor(defaultTTL = 5 * 60 * 1000, maxEntries = 1000) {
39
41
  this.cache = new Map();
40
42
  this.hits = 0;
41
43
  this.misses = 0;
42
44
  this.defaultTTL = defaultTTL;
45
+ this.maxEntries = maxEntries;
43
46
  }
44
47
  /**
45
48
  * Get a value from cache
@@ -58,6 +61,9 @@ export class TTLCache {
58
61
  this.misses++;
59
62
  return null;
60
63
  }
64
+ // Re-insert so Map order is recency order and eviction drops the LRU.
65
+ this.cache.delete(key);
66
+ this.cache.set(key, entry);
61
67
  this.hits++;
62
68
  return entry.data;
63
69
  }
@@ -77,7 +83,13 @@ export class TTLCache {
77
83
  // both into the default, making `cacheTTL:0` impossible to honor.
78
84
  const effectiveTTL = ttl === undefined ? this.defaultTTL : ttl;
79
85
  const expiresAt = now + effectiveTTL;
86
+ this.cache.delete(key);
80
87
  this.cache.set(key, { data, timestamp: now, expiresAt });
88
+ if (this.cache.size > this.maxEntries) {
89
+ const oldest = this.cache.keys().next().value;
90
+ if (oldest !== undefined)
91
+ this.cache.delete(oldest);
92
+ }
81
93
  if (!cleanupInterval && activeCaches.has(this))
82
94
  updateCleanupInterval();
83
95
  }
@@ -88,7 +100,9 @@ export class TTLCache {
88
100
  */
89
101
  delete(key) {
90
102
  const deleted = this.cache.delete(key);
91
- if (activeCaches.has(this))
103
+ // Only the delete that EMPTIES this cache can let the timer stop; checking
104
+ // on every delete made bulk invalidation O(deletes x caches).
105
+ if (deleted && this.cache.size === 0 && activeCaches.has(this))
92
106
  updateCleanupInterval();
93
107
  return deleted;
94
108
  }
@@ -102,6 +116,22 @@ export class TTLCache {
102
116
  if (activeCaches.has(this))
103
117
  updateCleanupInterval();
104
118
  }
119
+ /**
120
+ * Delete every entry whose key matches, in ONE pass.
121
+ * @returns Number of entries deleted
122
+ */
123
+ deleteWhere(match) {
124
+ let removed = 0;
125
+ for (const key of this.cache.keys()) {
126
+ if (match(key)) {
127
+ this.cache.delete(key);
128
+ removed++;
129
+ }
130
+ }
131
+ if (removed > 0 && this.cache.size === 0 && activeCaches.has(this))
132
+ updateCleanupInterval();
133
+ return removed;
134
+ }
105
135
  /**
106
136
  * Check if a key exists and is not expired
107
137
  * @param key Cache key
@@ -6,7 +6,7 @@
6
6
  * The HTTP service injects the live access token; everything here is
7
7
  * referentially transparent given that input.
8
8
  */
9
- import { jwtDecode } from 'jwt-decode';
9
+ import { decodeTokenClaims } from './tokenClaims.js';
10
10
  /**
11
11
  * Discriminator used when there is no access token at all. Anonymous responses
12
12
  * must never collide with any authenticated identity.
@@ -68,13 +68,8 @@ export function computeIdentityTag(accessToken) {
68
68
  if (!accessToken) {
69
69
  return ANON_IDENTITY;
70
70
  }
71
- try {
72
- const decoded = jwtDecode(accessToken);
73
- return decoded.userId || decoded.id || `t${fnv1a32(accessToken)}`;
74
- }
75
- catch {
76
- // Undecodable token — still partition it away from anon and from other
77
- // tokens via a hash. Never silently fall back to ANON_IDENTITY.
78
- return `t${fnv1a32(accessToken)}`;
79
- }
71
+ const decoded = decodeTokenClaims(accessToken);
72
+ // An undecodable token is still partitioned away from anon and from other
73
+ // tokens via a hash — never silently ANON_IDENTITY.
74
+ return decoded?.userId || decoded?.id || `t${fnv1a32(accessToken)}`;
80
75
  }