@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxy.so/core",
3
- "version": "1.18.1",
3
+ "version": "3.0.0",
4
4
  "description": "OxyHQ SDK Foundation — API client, authentication, cryptographic identity, and shared utilities",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -12,6 +12,18 @@
12
12
  ],
13
13
  "logger": [
14
14
  "dist/types/logger/index.d.ts"
15
+ ],
16
+ "inference": [
17
+ "dist/types/inference/index.d.ts"
18
+ ],
19
+ "session": [
20
+ "dist/types/session/index.d.ts"
21
+ ],
22
+ "crypto": [
23
+ "dist/types/crypto/index.d.ts"
24
+ ],
25
+ "civic": [
26
+ "dist/types/civic/index.d.ts"
15
27
  ]
16
28
  }
17
29
  },
@@ -59,12 +71,62 @@
59
71
  },
60
72
  "default": "./dist/esm/logger/index.js"
61
73
  },
74
+ "./inference": {
75
+ "react-native": "./dist/esm/inference/index.js",
76
+ "import": {
77
+ "types": "./dist/types/inference/index.d.ts",
78
+ "default": "./dist/esm/inference/index.js"
79
+ },
80
+ "require": {
81
+ "types": "./dist/types/inference/index.d.ts",
82
+ "default": "./dist/cjs/inference/index.js"
83
+ },
84
+ "default": "./dist/esm/inference/index.js"
85
+ },
86
+ "./session": {
87
+ "react-native": "./dist/esm/session/index.js",
88
+ "import": {
89
+ "types": "./dist/types/session/index.d.ts",
90
+ "default": "./dist/esm/session/index.js"
91
+ },
92
+ "require": {
93
+ "types": "./dist/types/session/index.d.ts",
94
+ "default": "./dist/cjs/session/index.js"
95
+ },
96
+ "default": "./dist/esm/session/index.js"
97
+ },
98
+ "./crypto": {
99
+ "react-native": "./dist/esm/crypto/index.js",
100
+ "import": {
101
+ "types": "./dist/types/crypto/index.d.ts",
102
+ "default": "./dist/esm/crypto/index.js"
103
+ },
104
+ "require": {
105
+ "types": "./dist/types/crypto/index.d.ts",
106
+ "default": "./dist/cjs/crypto/index.js"
107
+ },
108
+ "default": "./dist/esm/crypto/index.js"
109
+ },
110
+ "./civic": {
111
+ "react-native": "./dist/esm/civic/index.js",
112
+ "import": {
113
+ "types": "./dist/types/civic/index.d.ts",
114
+ "default": "./dist/esm/civic/index.js"
115
+ },
116
+ "require": {
117
+ "types": "./dist/types/civic/index.d.ts",
118
+ "default": "./dist/cjs/civic/index.js"
119
+ },
120
+ "default": "./dist/esm/civic/index.js"
121
+ },
62
122
  "./package.json": "./package.json"
63
123
  },
64
124
  "files": [
65
125
  "NOTICE",
66
126
  "dist",
67
- "src"
127
+ "!dist/**/*.tsbuildinfo",
128
+ "src",
129
+ "!src/**/__tests__"
68
130
  ],
69
131
  "keywords": [
70
132
  "oxyhq",
@@ -83,11 +145,10 @@
83
145
  "license": "SEE LICENSE IN LICENSE",
84
146
  "homepage": "https://oxy.so",
85
147
  "engines": {
86
- "node": ">=18.0.0"
148
+ "node": ">=20.0.0"
87
149
  },
88
150
  "scripts": {
89
- "build": "node scripts/build-workspace-deps.mjs @oxy.so/telemetry && bun run build:cjs && bun run build:esm && bun run build:types && bun run copy-assets && node scripts/mark-module-formats.mjs",
90
- "copy-assets": "cp -r src/i18n/locales dist/cjs/i18n/locales && cp -r src/i18n/locales dist/esm/i18n/locales",
151
+ "build": "node scripts/build-workspace-deps.mjs @oxy.so/telemetry && bun run build:cjs && bun run build:esm && bun run build:types && node scripts/mark-module-formats.mjs",
91
152
  "build:cjs": "tsc -p tsconfig.cjs.json",
92
153
  "build:esm": "tsc -p tsconfig.esm.json && node scripts/fix-esm-imports.mjs",
93
154
  "build:types": "tsc -p tsconfig.types.json",
@@ -115,10 +176,10 @@
115
176
  }
116
177
  },
117
178
  "dependencies": {
118
- "@oxy.so/telemetry": "^1.1.1",
179
+ "@oxy.so/telemetry": "^1.2.0",
119
180
  "@noble/ciphers": "^1.3.0",
120
181
  "@noble/hashes": "^1.8.0",
121
- "@oxy.so/contracts": "^2.2.0",
182
+ "@oxy.so/contracts": "^3.0.0",
122
183
  "@oxy.so/protocol": "^1.1.2",
123
184
  "@scure/bip39": "^1.6.0",
124
185
  "buffer": "^6.0.3",
@@ -13,28 +13,20 @@
13
13
  * - Request queuing
14
14
  */
15
15
 
16
- import { TTLCache, registerCacheForCleanup } from './utils/cache';
16
+ import { TTLCache, registerCacheForCleanup, unregisterCacheFromCleanup } from './utils/cache';
17
17
  import { RequestDeduplicator, RequestQueue, SimpleLogger } from './utils/requestUtils';
18
18
  import { retryAsync } from './utils/asyncUtils';
19
19
  import { createCancelledError, ErrorCodes, handleHttpError, isCancelledError, parseHttpErrorBody } from './utils/errorUtils';
20
- import { jwtDecode } from 'jwt-decode';
21
- import { isReactNative } from '@oxy.so/protocol';
20
+ import { decodeTokenClaims } from './utils/tokenClaims';
21
+ import { isReactNative } from '@oxy.so/protocol/random';
22
22
  import { computeIdentityTag, fnv1a32 } from './utils/cacheKey';
23
23
  import { redactUrlQuery } from './utils/redactUrl';
24
24
  import type { OxyConfig } from './models/interfaces';
25
25
  import type { DeviceSecretMintOutcome } from './session/refresh';
26
26
  import { OxyAuthenticationError } from './OxyServices.errors';
27
- import { getBrowserEdgeRegionHeader } from './utils/edgeRegion';
27
+ import { peekBrowserEdgeRegionHeader } from './utils/edgeRegion';
28
28
  import { getBrowserActivityIdHeader } from './utils/activityId';
29
29
 
30
- interface JwtPayload {
31
- exp?: number;
32
- userId?: string;
33
- id?: string;
34
- sessionId?: string;
35
- [key: string]: unknown;
36
- }
37
-
38
30
  export type AuthRefreshReason = 'preflight' | 'response-401';
39
31
  export type AuthRefreshHandler = (reason: AuthRefreshReason) => Promise<string | null>;
40
32
  export type AccessTokenProvider = () => string | null;
@@ -150,6 +142,25 @@ interface RequestConfig extends RequestOptions {
150
142
  * endpoint surfaces as an `AbortError` quickly rather than blocking the
151
143
  * request queue.
152
144
  */
145
+ /**
146
+ * Strip leading or trailing `/`s without a regex: `/\/+$/` backtracks
147
+ * polynomially on a long run of slashes (CodeQL js/polynomial-redos), and this
148
+ * runs on every request.
149
+ */
150
+ function trimSlashes(value: string, side: 'start' | 'end'): string {
151
+ let start = 0;
152
+ let end = value.length;
153
+ if (side === 'start') while (start < end && value.charCodeAt(start) === 47) start++;
154
+ else while (end > start && value.charCodeAt(end - 1) === 47) end--;
155
+ return value.slice(start, end);
156
+ }
157
+
158
+ /** Methods whose calls concurrent callers may share (read-only). */
159
+ const SAFE_METHODS: ReadonlySet<string> = new Set(['GET']);
160
+
161
+ /** Methods safe to re-send after a transient failure (RFC 9110 §9.2.2). */
162
+ const IDEMPOTENT_METHODS: ReadonlySet<string> = new Set(['GET', 'PUT', 'DELETE']);
163
+
153
164
  const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
154
165
 
155
166
  /**
@@ -220,17 +231,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
220
231
  * lead window. `false` for an expired, opaque or no-`exp` token.
221
232
  */
222
233
  function isInsideRefreshLeadWindow(token: string): boolean {
223
- try {
224
- const decoded = jwtDecode<JwtPayload>(token);
225
- if (typeof decoded.exp !== 'number') {
226
- return false;
227
- }
228
- const now = Math.floor(Date.now() / 1000);
229
- // `<=`: the proactive scheduler fires at exactly `exp - lead`.
230
- return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
231
- } catch {
234
+ const decoded = decodeTokenClaims(token);
235
+ if (typeof decoded?.exp !== 'number') {
232
236
  return false;
233
237
  }
238
+ const now = Math.floor(Date.now() / 1000);
239
+ // `<=`: the proactive scheduler fires at exactly `exp - lead`.
240
+ return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
234
241
  }
235
242
 
236
243
  /**
@@ -325,7 +332,7 @@ function linkAbort(parent: AbortSignal, child: AbortController): () => void {
325
332
  export class HttpService {
326
333
  private baseURL: string;
327
334
  private tokenStore: TokenStore;
328
- private cache: TTLCache<any>;
335
+ private cache: TTLCache<unknown>;
329
336
  /**
330
337
  * When true, the per-instance GET response cache is OFF: GET responses are
331
338
  * never read from nor written to {@link cache}, so every request hits the
@@ -448,7 +455,7 @@ export class HttpService {
448
455
  this.cacheDisabled =
449
456
  config.enableCache === false ||
450
457
  (typeof config.cacheTTL === 'number' && config.cacheTTL <= 0);
451
- this.cache = new TTLCache<any>(config.cacheTTL && config.cacheTTL > 0 ? config.cacheTTL : 5 * 60 * 1000);
458
+ this.cache = new TTLCache<unknown>(config.cacheTTL && config.cacheTTL > 0 ? config.cacheTTL : 5 * 60 * 1000);
452
459
  if (!this.cacheDisabled) {
453
460
  registerCacheForCleanup(this.cache);
454
461
  }
@@ -563,8 +570,14 @@ export class HttpService {
563
570
  signal,
564
571
  cache: cacheRequested = method === 'GET',
565
572
  cacheTTL,
566
- deduplicate = true,
567
- retry = this.config.enableRetry !== false,
573
+ // Only reads are shared by default. A write's body can be opaque
574
+ // (`FormData`, `URLSearchParams` key as empty objects), so two different
575
+ // uploads used to collapse into one call and the second caller got the
576
+ // first file's result.
577
+ deduplicate = SAFE_METHODS.has(method),
578
+ // Only idempotent methods are re-sent by default: re-sending a POST after a
579
+ // 5xx or a dropped connection can apply it twice.
580
+ retry = this.config.enableRetry !== false && IDEMPOTENT_METHODS.has(method),
568
581
  maxRetries = this.config.maxRetries || 3,
569
582
  } = config;
570
583
 
@@ -600,7 +613,9 @@ export class HttpService {
600
613
  // 401 retry re-enters request() with a fresh config, so it re-resolves
601
614
  // this here with the refreshed token.
602
615
  const authHeader = config.skipAuth ? null : await this.getAuthHeader();
603
- const edgeRegionHeader = await getBrowserEdgeRegionHeader();
616
+ // Never awaited: the PoP is a hint, and waiting on its trace fetch put up
617
+ // to a second in front of requests.
618
+ const edgeRegionHeader = peekBrowserEdgeRegionHeader();
604
619
  const activityIdHeader = getBrowserActivityIdHeader();
605
620
 
606
621
  // A request the caller has ALREADY abandoned takes no queue slot and makes
@@ -611,43 +626,32 @@ export class HttpService {
611
626
  throw createCancelledError('Request cancelled before it was sent');
612
627
  }
613
628
 
614
- // ONE abort domain for the whole call, linked to the caller's signal ONCE.
615
- //
616
- // The bug this replaces: the controller used to be built INSIDE `requestFn`
617
- // — the function `retryAsync` re-invokes — and the caller's signal was
618
- // linked to each new controller with a bare `addEventListener`. An `abort`
619
- // event fires once, so on attempt 2 the caller's already-fired signal could
620
- // not abort the freshly built controller, and the request the caller had
621
- // cancelled went out for real. Hoisting the linkage means a cancellation
622
- // arrives once and is then true for every attempt, including ones not yet
623
- // started.
624
- const callController = new AbortController();
625
- const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
626
-
627
- /**
628
- * Which of our own timers fired, so a timeout can be told apart from a
629
- * cancellation. Both reach us from `fetch` as an indistinguishable
630
- * `AbortError`, and collapsing them (as this used to) is what let the retry
631
- * predicate treat an abandoned request as a transient failure.
632
- */
633
- let timedOut = false;
634
-
635
- // Request function
636
- const requestFn = async (): Promise<T> => {
629
+ // One network attempt, inside the call's abort domain `domain`: the caller's
630
+ // own signal, or — when deduplicated — the shared work's, which aborts only
631
+ // once every caller waiting on it has cancelled.
632
+ const attempt = async (domain: AbortSignal): Promise<T> => {
637
633
  const startTime = Date.now();
638
634
  // Re-checked per attempt so no retry can issue a network call after the
639
635
  // caller gave up — belt to `retryAsync`'s braces, and the one that holds
640
636
  // if a custom `shouldRetry` ever says yes to a cancellation.
641
- if (callController.signal.aborted) {
637
+ if (domain.aborted) {
642
638
  throw createCancelledError('Request cancelled');
643
639
  }
644
640
 
641
+ /**
642
+ * Whether OUR timer fired, so a timeout can be told apart from a
643
+ * cancellation. Both reach us from `fetch` as an indistinguishable
644
+ * `AbortError`, and collapsing them is what let the retry predicate treat
645
+ * an abandoned request as a transient failure.
646
+ */
647
+ let timedOut = false;
648
+
645
649
  // This attempt's controller carries its own timeout and inherits the
646
650
  // call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
647
651
  // that releases them can see them — the timer and the listener are
648
652
  // exactly what leaked when they lived inside it.
649
653
  const controller = new AbortController();
650
- const disposeCallLink = linkAbort(callController.signal, controller);
654
+ const disposeCallLink = linkAbort(domain, controller);
651
655
  const timeoutId = timeout
652
656
  ? setTimeout(() => {
653
657
  timedOut = true;
@@ -677,20 +681,20 @@ export class HttpService {
677
681
 
678
682
  // Add authorization header if available
679
683
  if (authHeader) {
680
- headers['Authorization'] = authHeader;
684
+ headers.Authorization = authHeader;
681
685
  }
682
686
 
683
687
  // Merge custom headers if provided
684
688
  if (config.headers) {
685
- Object.entries(config.headers).forEach(([key, value]) => {
689
+ for (const [key, value] of Object.entries(config.headers)) {
686
690
  // For FormData, explicitly remove Content-Type if user tries to set it
687
691
  // The browser/fetch API will set it automatically with the boundary
688
692
  if (isFormData && key.toLowerCase() === 'content-type') {
689
693
  this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
690
- return;
694
+ continue;
691
695
  }
692
696
  headers[key] = value;
693
- });
697
+ }
694
698
  }
695
699
 
696
700
  // This is Cloudflare's coarse serving PoP (for example `mad`), never an
@@ -751,7 +755,12 @@ export class HttpService {
751
755
  // deduplicated retry would resolve to the still-pending original
752
756
  // and await itself (deadlock). Opting the retry out of dedupe makes
753
757
  // it a fresh request.
754
- return this.request<T>({ ...config, _isAuthRetry: true, retry: false, deduplicate: false });
758
+ //
759
+ // `bypassQueue: true` is REQUIRED too: this attempt still holds its
760
+ // queue slot, so a queued retry waits for a slot while holding one.
761
+ // With every slot held by a 401 (a revoked session under load) no
762
+ // retry could ever start and the whole client stalled.
763
+ return this.request<T>({ ...config, _isAuthRetry: true, retry: false, deduplicate: false, bypassQueue: true });
755
764
  }
756
765
  // Refresh failed or no token — clear tokens
757
766
  this.tokenStore.clearTokens();
@@ -805,7 +814,7 @@ export class HttpService {
805
814
 
806
815
  if (config.responseType === 'blob') {
807
816
  responseData = await response.blob();
808
- } else if (contentType && contentType.includes('application/json')) {
817
+ } else if (contentType?.includes('application/json')) {
809
818
  // Use response.json() directly for better performance
810
819
  try {
811
820
  responseData = await response.json();
@@ -889,50 +898,57 @@ export class HttpService {
889
898
  }
890
899
  };
891
900
 
892
- // Wrap with retry if enabled.
901
+ // Composition: dedupe(retry(queue(attempt))). A queue slot is network
902
+ // occupancy only — each attempt takes one and releases it — so neither the
903
+ // retry backoff sleep nor a deduplicated caller waiting on shared work holds
904
+ // a slot while doing nothing.
893
905
  //
894
- // `retryOnTimeout` defaults to false in `retryAsync`, which is what makes
895
- // the pathological total unreachable: a timeout now costs ONE attempt
896
- // instead of four-plus-backoff (~28s at the 5s default), and a cancellation
897
- // costs none. `deadline` bounds whatever retries do happen by wall clock
898
- // rather than by attempts x timeout + backoff.
899
- const requestWithRetry = retry
900
- ? () => retryAsync(requestFn, {
901
- maxRetries,
902
- baseDelay: this.config.retryDelay || 1000,
903
- retryOnTimeout: config.retryOnTimeout ?? false,
904
- deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
905
- })
906
- : requestFn;
907
-
908
- // Wrap with deduplication if enabled (use optimized key generation)
909
- const dedupeKey = deduplicate ? this.generateCacheKey(method, url, data || params) : null;
910
- const finalRequest = dedupeKey
911
- ? () => this.deduplicator.deduplicate(dedupeKey, requestWithRetry, callController.signal)
912
- : requestWithRetry;
913
-
914
- try {
915
- // Execute the request. Control-plane calls the auth lane depends on
916
- // (`bypassQueue`, e.g. the device-secret mint) run DIRECTLY — a queued mint
917
- // could never acquire a slot when every slot is parked awaiting it.
918
- const result = config.bypassQueue
919
- ? await finalRequest()
920
- : await this.requestQueue.enqueue(finalRequest, callController.signal);
921
-
922
- // Cache the result if caching is enabled
923
- if (cache && cacheKey && result) {
924
- this.cache.set(cacheKey, result, cacheTTL);
925
- this.warnIfCacheOversized();
906
+ // `retryOnTimeout` defaults to false in `retryAsync`: a timeout costs ONE
907
+ // attempt, a cancellation none. `deadline` bounds whatever retries do happen
908
+ // by wall clock rather than by attempts x timeout + backoff.
909
+ const runAttempt = (domain: AbortSignal): Promise<T> =>
910
+ // Control-plane calls the auth lane depends on (`bypassQueue`, e.g. the
911
+ // device-secret mint) run DIRECTLY — a queued mint could never acquire a
912
+ // slot when every slot is parked awaiting it.
913
+ config.bypassQueue ? attempt(domain) : this.requestQueue.enqueue(() => attempt(domain), domain);
914
+ const execute = (domain: AbortSignal): Promise<T> =>
915
+ retry
916
+ ? retryAsync(() => runAttempt(domain), {
917
+ maxRetries,
918
+ baseDelay: this.config.retryDelay || 1000,
919
+ retryOnTimeout: config.retryOnTimeout ?? false,
920
+ deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
921
+ })
922
+ : runAttempt(domain);
923
+
924
+ let result: T;
925
+ if (deduplicate) {
926
+ // The cache key IS the dedupe key (same method, url, payload, identity);
927
+ // computed once per call.
928
+ const dedupeKey = cacheKey ?? this.generateCacheKey(method, url, data || params);
929
+ result = await this.deduplicator.deduplicate(dedupeKey, execute, signal);
930
+ } else {
931
+ // The call's own abort domain, linked to the caller's signal ONCE, so a
932
+ // cancellation arrives once and is then true for every attempt, including
933
+ // ones not yet started. Released however the call ends: a caller signal
934
+ // that outlives the request (a React Query signal) would otherwise accrue
935
+ // one listener per request.
936
+ const callController = new AbortController();
937
+ const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
938
+ try {
939
+ result = await execute(callController.signal);
940
+ } finally {
941
+ disposeCallerLink?.();
926
942
  }
943
+ }
927
944
 
928
- return result;
929
- } finally {
930
- // The call-wide link to the CALLER's signal, released once the call is
931
- // over however it ended. Without this a caller signal that outlives the
932
- // request — the normal case for a React Query query signal — accrues one
933
- // listener per request for its whole lifetime.
934
- disposeCallerLink?.();
945
+ // Cache the result if caching is enabled
946
+ if (cache && cacheKey && result) {
947
+ this.cache.set(cacheKey, result, cacheTTL);
948
+ this.warnIfCacheOversized();
935
949
  }
950
+
951
+ return result;
936
952
  }
937
953
 
938
954
  /**
@@ -1162,18 +1178,18 @@ export class HttpService {
1162
1178
  private buildURL(url: string, params?: Record<string, unknown>): string {
1163
1179
  const base = /^https?:\/\//i.test(url)
1164
1180
  ? url
1165
- : `${this.baseURL.replace(/\/+$/, '')}/${url.replace(/^\/+/, '')}`;
1181
+ : `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
1166
1182
 
1167
1183
  if (!params || Object.keys(params).length === 0) {
1168
1184
  return base;
1169
1185
  }
1170
1186
 
1171
1187
  const searchParams = new URLSearchParams();
1172
- Object.entries(params).forEach(([key, value]) => {
1188
+ for (const [key, value] of Object.entries(params)) {
1173
1189
  if (value !== undefined && value !== null) {
1174
1190
  searchParams.append(key, String(value));
1175
1191
  }
1176
- });
1192
+ }
1177
1193
 
1178
1194
  const queryString = searchParams.toString();
1179
1195
  return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
@@ -1201,7 +1217,8 @@ export class HttpService {
1201
1217
  }
1202
1218
 
1203
1219
  try {
1204
- const decoded = jwtDecode<JwtPayload>(accessToken);
1220
+ const decoded = decodeTokenClaims(accessToken);
1221
+ if (!decoded) throw new Error('opaque token');
1205
1222
  const currentTime = Math.floor(Date.now() / 1000);
1206
1223
 
1207
1224
  // If the token expires within the refresh lead window, refresh it.
@@ -1353,26 +1370,23 @@ export class HttpService {
1353
1370
  if (!token) {
1354
1371
  return false;
1355
1372
  }
1356
- try {
1357
- const decoded = jwtDecode<JwtPayload>(token);
1358
- return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
1359
- } catch {
1360
- return false;
1361
- }
1373
+ const exp = decodeTokenClaims(token)?.exp;
1374
+ return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
1362
1375
  }
1363
1376
 
1364
1377
  /**
1365
- * PROCESS-WIDE single-flight for the rotating device-secret mint
1378
+ * PROCESS-WIDE single-flight for the device-secret mint
1366
1379
  * (`POST /session/device/token`).
1367
1380
  *
1368
- * The server rotates the presented `deviceSecret` on every successful mint, so
1369
- * two concurrent mints would double-rotate and the durable store could end up
1370
- * holding a superseded secret → a later cold-boot mint 401s → the user is
1371
- * signed out. Every mint lane (the re-mint handler behind `refreshAccessToken`,
1372
- * the device-first cold boot, the socket token transport, the tab-focus
1373
- * reconcile) funnels its `refreshDeviceSecretArm` call through here, so
1374
- * concurrent callers await the SAME in-flight mint and all receive its result —
1375
- * exactly one server rotation.
1381
+ * The server does not rotate the presented `deviceSecret` (it echoes it back
1382
+ * as `nextDeviceSecret`; each holder of a shared DeviceSession has its own
1383
+ * stable credential), so this is no longer what keeps the store's secret
1384
+ * valid. It still collapses concurrent callers onto one request and one
1385
+ * persisted write. Every mint lane (the re-mint handler behind
1386
+ * `refreshAccessToken`, the device-first cold boot, the socket token
1387
+ * transport, the tab-focus reconcile) funnels its `refreshDeviceSecretArm`
1388
+ * call through here, so concurrent callers await the SAME in-flight mint and
1389
+ * all receive its result.
1376
1390
  *
1377
1391
  * Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
1378
1392
  * handler incl. the native shared-key arm + the failure cooldown): this inner
@@ -1485,7 +1499,9 @@ export class HttpService {
1485
1499
  // Authentication is owned by this SDK instance. A caller cannot replace
1486
1500
  // the bearer with a different session or leak one across linked apps.
1487
1501
  headers.set('Authorization', authHeader);
1488
- const edgeRegionHeader = await getBrowserEdgeRegionHeader();
1502
+ // Never awaited: the PoP is a hint, and waiting on its trace fetch put up
1503
+ // to a second in front of requests.
1504
+ const edgeRegionHeader = peekBrowserEdgeRegionHeader();
1489
1505
  for (const [name, value] of Object.entries(edgeRegionHeader)) headers.set(name, value);
1490
1506
  const activityIdHeader = getBrowserActivityIdHeader();
1491
1507
  for (const [name, value] of Object.entries(activityIdHeader)) headers.set(name, value);
@@ -1680,13 +1696,7 @@ export class HttpService {
1680
1696
  * identity-scoped variant `<key> id=*`.
1681
1697
  */
1682
1698
  clearCacheEntry(key: string): void {
1683
- this.cache.delete(key);
1684
- const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
1685
- for (const existing of this.cache.keys()) {
1686
- if (existing.startsWith(identityVariantPrefix)) {
1687
- this.cache.delete(existing);
1688
- }
1689
- }
1699
+ this.invalidateCache({ keys: [key] });
1690
1700
  }
1691
1701
 
1692
1702
  /**
@@ -1698,14 +1708,39 @@ export class HttpService {
1698
1708
  * deleted entries (for observability in tests).
1699
1709
  */
1700
1710
  clearCacheByPrefix(prefix: string): number {
1701
- let removed = 0;
1702
- for (const key of this.cache.keys()) {
1703
- if (key.startsWith(prefix)) {
1704
- this.cache.delete(key);
1705
- removed++;
1711
+ return this.invalidateCache({ prefixes: [prefix] });
1712
+ }
1713
+
1714
+ /**
1715
+ * Invalidate a set of LOGICAL keys (each with every identity-scoped variant,
1716
+ * see `clearCacheEntry`) and key prefixes in ONE pass over the cache. A
1717
+ * mutation touching many resources (a bulk follow) costs one scan, not one
1718
+ * per resource.
1719
+ * @returns Number of entries deleted
1720
+ */
1721
+ invalidateCache({ keys = [], prefixes = [] }: { keys?: readonly string[]; prefixes?: readonly string[] }): number {
1722
+ if (keys.length === 0 && prefixes.length === 0) return 0;
1723
+ const exact = new Set(keys);
1724
+ const delim = HttpService.CACHE_IDENTITY_DELIM;
1725
+ return this.cache.deleteWhere((stored) => {
1726
+ const cut = stored.lastIndexOf(delim);
1727
+ if (exact.has(cut === -1 ? stored : stored.slice(0, cut))) return true;
1728
+ for (const prefix of prefixes) {
1729
+ if (stored.startsWith(prefix)) return true;
1706
1730
  }
1707
- }
1708
- return removed;
1731
+ return false;
1732
+ });
1733
+ }
1734
+
1735
+ /**
1736
+ * Release this client: its response cache leaves the global cleanup sweep and
1737
+ * is emptied, pending shared calls are forgotten, and the session ends.
1738
+ */
1739
+ dispose(): void {
1740
+ unregisterCacheFromCleanup(this.cache);
1741
+ this.cache.clear();
1742
+ this.deduplicator.clear();
1743
+ this.endSession();
1709
1744
  }
1710
1745
 
1711
1746
  getCacheStats() {