@oxy.so/core 1.18.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/README.md +13 -7
  2. package/dist/cjs/HttpService.js +189 -112
  3. package/dist/cjs/OxyServices.errors.js +48 -1
  4. package/dist/cjs/OxyServices.js +263 -60
  5. package/dist/cjs/api/accounts.js +231 -0
  6. package/dist/cjs/api/agency.js +102 -0
  7. package/dist/cjs/api/appData.js +45 -0
  8. package/dist/cjs/api/apps.js +197 -0
  9. package/dist/cjs/api/assets.js +329 -0
  10. package/dist/cjs/api/auth.js +900 -0
  11. package/dist/cjs/api/billing.js +44 -0
  12. package/dist/cjs/api/civic.js +289 -0
  13. package/dist/cjs/api/contacts.js +16 -0
  14. package/dist/cjs/api/devices.js +351 -0
  15. package/dist/cjs/api/follows.js +240 -0
  16. package/dist/cjs/api/identity.js +569 -0
  17. package/dist/cjs/api/linkedAccounts.js +48 -0
  18. package/dist/cjs/api/nodes.js +75 -0
  19. package/dist/cjs/api/notifications.js +75 -0
  20. package/dist/cjs/api/privacy.js +105 -0
  21. package/dist/cjs/api/reputation.js +74 -0
  22. package/dist/cjs/api/session.js +177 -0
  23. package/dist/cjs/api/store.js +199 -0
  24. package/dist/cjs/api/topics.js +66 -0
  25. package/dist/cjs/api/users.js +309 -0
  26. package/dist/cjs/boot/sessionColdBoot.js +4 -4
  27. package/dist/cjs/civic/index.js +16 -0
  28. package/dist/cjs/civic/payloads.js +156 -0
  29. package/dist/cjs/client/context.js +2 -0
  30. package/dist/cjs/crypto/identityLink.js +5 -5
  31. package/dist/cjs/crypto/index.js +44 -0
  32. package/dist/cjs/crypto/internal.js +37 -0
  33. package/dist/cjs/crypto/keyManager.js +2 -2
  34. package/dist/cjs/crypto/polyfill.js +9 -80
  35. package/dist/cjs/crypto/recoveryPhrase.js +1 -0
  36. package/dist/cjs/crypto/registrationPow.js +1 -1
  37. package/dist/cjs/crypto/signatureService.js +1 -0
  38. package/dist/cjs/i18n/accountCategoryLabels.js +3 -3
  39. package/dist/cjs/i18n/accountRoleLabels.js +7 -7
  40. package/dist/cjs/i18n/index.js +130 -52
  41. package/dist/cjs/i18n/locales/{ar-SA.json → ar-SA.js} +134 -52
  42. package/dist/cjs/i18n/locales/{ca-ES.json → ca-ES.js} +134 -52
  43. package/dist/{esm/i18n/locales/de-DE.json → cjs/i18n/locales/de-DE.js} +136 -54
  44. package/dist/{esm/i18n/locales/en-US.json → cjs/i18n/locales/en-US.js} +163 -245
  45. package/dist/{esm/i18n/locales/es-ES.json → cjs/i18n/locales/es-ES.js} +163 -245
  46. package/dist/cjs/i18n/locales/{fr-FR.json → fr-FR.js} +134 -52
  47. package/dist/cjs/i18n/locales/{it-IT.json → it-IT.js} +134 -52
  48. package/dist/{esm/i18n/locales/ja-JP.json → cjs/i18n/locales/ja-JP.js} +134 -52
  49. package/dist/cjs/i18n/locales/{ko-KR.json → ko-KR.js} +134 -52
  50. package/dist/{esm/i18n/locales/pt-PT.json → cjs/i18n/locales/pt-PT.js} +136 -54
  51. package/dist/{esm/i18n/locales/zh-CN.json → cjs/i18n/locales/zh-CN.js} +135 -53
  52. package/dist/cjs/i18n/reputationCategoryLabels.js +2 -2
  53. package/dist/cjs/i18n/trustTierLabels.js +2 -2
  54. package/dist/cjs/index.js +55 -263
  55. package/dist/cjs/inference/index.js +21 -0
  56. package/dist/cjs/server/OxyServer.js +521 -0
  57. package/dist/cjs/server/auth.js +2 -2
  58. package/dist/cjs/server/index.js +23 -6
  59. package/dist/cjs/server/middleware.js +1154 -0
  60. package/dist/cjs/server/namespaces.js +214 -0
  61. package/dist/cjs/server/rateLimit.js +2 -2
  62. package/dist/cjs/server/requesterAssertion.js +5 -5
  63. package/dist/cjs/server/securityHeaders.js +3 -3
  64. package/dist/cjs/server/traffic.js +7 -6
  65. package/dist/cjs/server/trafficNodeHttp.js +9 -3
  66. package/dist/cjs/server/userInvalidation.js +5 -5
  67. package/dist/cjs/session/accountDialogController.js +23 -23
  68. package/dist/cjs/session/authStateStore.js +2 -2
  69. package/dist/cjs/session/identitySession.js +3 -3
  70. package/dist/cjs/session/index.js +131 -0
  71. package/dist/cjs/session/refresh.js +37 -30
  72. package/dist/cjs/session/sessionClientHost.js +5 -5
  73. package/dist/cjs/session/sharedDeviceCredential.js +3 -2
  74. package/dist/cjs/shared/utils/networkUtils.js +2 -2
  75. package/dist/cjs/utils/accountCacheSweep.js +11 -15
  76. package/dist/cjs/utils/asyncUtils.js +22 -163
  77. package/dist/cjs/utils/authHelpers.js +2 -2
  78. package/dist/cjs/utils/authWebUrl.js +3 -4
  79. package/dist/cjs/utils/avatarUtils.js +2 -2
  80. package/dist/cjs/utils/cache.js +32 -2
  81. package/dist/cjs/utils/cacheKey.js +5 -10
  82. package/dist/cjs/utils/deviceManager.js +17 -16
  83. package/dist/cjs/utils/edgeRegion.js +2 -3
  84. package/dist/cjs/utils/identityCacheSweep.js +6 -10
  85. package/dist/cjs/utils/oxyServiceEnvironment.js +3 -7
  86. package/dist/cjs/utils/requestUtils.js +40 -33
  87. package/dist/cjs/utils/sessionUtils.js +0 -2
  88. package/dist/cjs/utils/tokenClaims.js +34 -0
  89. package/dist/esm/HttpService.js +190 -113
  90. package/dist/esm/OxyServices.errors.js +45 -0
  91. package/dist/esm/OxyServices.js +262 -57
  92. package/dist/esm/api/accounts.js +218 -0
  93. package/dist/esm/api/agency.js +95 -0
  94. package/dist/esm/api/appData.js +40 -0
  95. package/dist/esm/api/apps.js +191 -0
  96. package/dist/esm/api/assets.js +324 -0
  97. package/dist/esm/api/auth.js +858 -0
  98. package/dist/esm/api/billing.js +40 -0
  99. package/dist/esm/api/civic.js +250 -0
  100. package/dist/esm/api/contacts.js +12 -0
  101. package/dist/esm/api/devices.js +346 -0
  102. package/dist/esm/api/follows.js +236 -0
  103. package/dist/esm/api/identity.js +527 -0
  104. package/dist/esm/api/linkedAccounts.js +44 -0
  105. package/dist/esm/api/nodes.js +71 -0
  106. package/dist/esm/api/notifications.js +71 -0
  107. package/dist/esm/api/privacy.js +101 -0
  108. package/dist/esm/api/reputation.js +70 -0
  109. package/dist/esm/api/session.js +173 -0
  110. package/dist/esm/api/store.js +192 -0
  111. package/dist/esm/api/topics.js +62 -0
  112. package/dist/esm/api/users.js +272 -0
  113. package/dist/esm/boot/sessionColdBoot.js +4 -4
  114. package/dist/esm/civic/index.js +10 -0
  115. package/dist/esm/civic/payloads.js +118 -0
  116. package/dist/esm/client/context.js +1 -0
  117. package/dist/esm/crypto/identityLink.js +5 -5
  118. package/dist/esm/crypto/index.js +24 -0
  119. package/dist/esm/crypto/internal.js +19 -0
  120. package/dist/esm/crypto/keyManager.js +2 -2
  121. package/dist/esm/crypto/polyfill.js +10 -81
  122. package/dist/esm/crypto/recoveryPhrase.js +1 -0
  123. package/dist/esm/crypto/registrationPow.js +1 -1
  124. package/dist/esm/crypto/signatureService.js +1 -0
  125. package/dist/esm/i18n/accountCategoryLabels.js +2 -2
  126. package/dist/esm/i18n/accountRoleLabels.js +1 -1
  127. package/dist/esm/i18n/index.js +93 -52
  128. package/dist/esm/i18n/locales/{ar-SA.json → ar-SA.js} +132 -52
  129. package/dist/esm/i18n/locales/{ca-ES.json → ca-ES.js} +132 -52
  130. package/dist/{cjs/i18n/locales/de-DE.json → esm/i18n/locales/de-DE.js} +134 -54
  131. package/dist/{cjs/i18n/locales/en-US.json → esm/i18n/locales/en-US.js} +161 -245
  132. package/dist/{cjs/i18n/locales/es-ES.json → esm/i18n/locales/es-ES.js} +161 -245
  133. package/dist/esm/i18n/locales/{fr-FR.json → fr-FR.js} +132 -52
  134. package/dist/esm/i18n/locales/{it-IT.json → it-IT.js} +132 -52
  135. package/dist/{cjs/i18n/locales/ja-JP.json → esm/i18n/locales/ja-JP.js} +132 -52
  136. package/dist/esm/i18n/locales/{ko-KR.json → ko-KR.js} +132 -52
  137. package/dist/{cjs/i18n/locales/pt-PT.json → esm/i18n/locales/pt-PT.js} +134 -54
  138. package/dist/{cjs/i18n/locales/zh-CN.json → esm/i18n/locales/zh-CN.js} +133 -53
  139. package/dist/esm/i18n/reputationCategoryLabels.js +1 -1
  140. package/dist/esm/i18n/trustTierLabels.js +1 -1
  141. package/dist/esm/index.js +30 -166
  142. package/dist/esm/inference/index.js +13 -0
  143. package/dist/esm/server/OxyServer.js +516 -0
  144. package/dist/esm/server/auth.js +2 -2
  145. package/dist/esm/server/index.js +10 -5
  146. package/dist/esm/server/middleware.js +1147 -0
  147. package/dist/esm/server/namespaces.js +206 -0
  148. package/dist/esm/server/rateLimit.js +2 -2
  149. package/dist/esm/server/requesterAssertion.js +5 -5
  150. package/dist/esm/server/securityHeaders.js +3 -3
  151. package/dist/esm/server/traffic.js +7 -6
  152. package/dist/esm/server/trafficNodeHttp.js +9 -3
  153. package/dist/esm/server/userInvalidation.js +5 -5
  154. package/dist/esm/session/accountDialogController.js +23 -23
  155. package/dist/esm/session/authStateStore.js +2 -2
  156. package/dist/esm/session/identitySession.js +3 -3
  157. package/dist/esm/session/index.js +82 -0
  158. package/dist/esm/session/refresh.js +37 -30
  159. package/dist/esm/session/sessionClientHost.js +5 -5
  160. package/dist/esm/session/sharedDeviceCredential.js +3 -2
  161. package/dist/esm/shared/utils/networkUtils.js +2 -2
  162. package/dist/esm/utils/accountCacheSweep.js +11 -15
  163. package/dist/esm/utils/asyncUtils.js +22 -151
  164. package/dist/esm/utils/authHelpers.js +2 -2
  165. package/dist/esm/utils/authWebUrl.js +3 -4
  166. package/dist/esm/utils/avatarUtils.js +2 -2
  167. package/dist/esm/utils/cache.js +32 -2
  168. package/dist/esm/utils/cacheKey.js +5 -10
  169. package/dist/esm/utils/deviceManager.js +17 -16
  170. package/dist/esm/utils/edgeRegion.js +1 -2
  171. package/dist/esm/utils/identityCacheSweep.js +6 -10
  172. package/dist/esm/utils/oxyServiceEnvironment.js +3 -7
  173. package/dist/esm/utils/requestUtils.js +40 -33
  174. package/dist/esm/utils/sessionUtils.js +0 -2
  175. package/dist/esm/utils/tokenClaims.js +31 -0
  176. package/dist/types/HttpService.d.ts +47 -9
  177. package/dist/types/OxyServices.d.ts +160 -131
  178. package/dist/types/OxyServices.errors.d.ts +42 -0
  179. package/dist/types/api/accounts.d.ts +415 -0
  180. package/dist/types/api/agency.d.ts +135 -0
  181. package/dist/types/api/appData.d.ts +27 -0
  182. package/dist/types/api/apps.d.ts +433 -0
  183. package/dist/types/api/assets.d.ts +174 -0
  184. package/dist/types/api/auth.d.ts +766 -0
  185. package/dist/types/api/billing.d.ts +113 -0
  186. package/dist/types/api/civic.d.ts +203 -0
  187. package/dist/types/api/contacts.d.ts +31 -0
  188. package/{src/mixins/OxyServices.deviceBoot.ts → dist/types/api/devices.d.ts} +130 -110
  189. package/dist/types/api/follows.d.ts +236 -0
  190. package/dist/types/api/identity.d.ts +275 -0
  191. package/dist/types/api/linkedAccounts.d.ts +48 -0
  192. package/dist/types/api/nodes.d.ts +102 -0
  193. package/dist/types/api/notifications.d.ts +77 -0
  194. package/dist/types/api/privacy.d.ts +43 -0
  195. package/dist/types/api/reputation.d.ts +50 -0
  196. package/dist/types/api/session.d.ts +85 -0
  197. package/dist/types/api/store.d.ts +278 -0
  198. package/dist/types/api/topics.d.ts +34 -0
  199. package/dist/types/api/users.d.ts +134 -0
  200. package/dist/types/boot/sessionColdBoot.d.ts +1 -1
  201. package/dist/types/civic/index.d.ts +10 -0
  202. package/dist/types/civic/payloads.d.ts +83 -0
  203. package/dist/types/client/context.d.ts +33 -0
  204. package/dist/types/crypto/identityLink.d.ts +5 -5
  205. package/dist/types/crypto/index.d.ts +24 -0
  206. package/dist/types/crypto/internal.d.ts +19 -0
  207. package/dist/types/crypto/polyfill.d.ts +6 -9
  208. package/dist/types/crypto/registrationPow.d.ts +1 -1
  209. package/dist/types/i18n/accountCategoryLabels.d.ts +1 -1
  210. package/dist/types/i18n/accountRoleLabels.d.ts +1 -1
  211. package/dist/types/i18n/index.d.ts +20 -1
  212. package/dist/types/i18n/locales/ar-SA.d.ts +386 -0
  213. package/dist/types/i18n/locales/ca-ES.d.ts +386 -0
  214. package/dist/types/i18n/locales/de-DE.d.ts +386 -0
  215. package/dist/types/i18n/locales/en-US.d.ts +2034 -0
  216. package/dist/types/i18n/locales/es-ES.d.ts +2034 -0
  217. package/dist/types/i18n/locales/fr-FR.d.ts +386 -0
  218. package/dist/types/i18n/locales/it-IT.d.ts +386 -0
  219. package/dist/types/i18n/locales/ja-JP.d.ts +386 -0
  220. package/dist/types/i18n/locales/ko-KR.d.ts +386 -0
  221. package/dist/types/i18n/locales/pt-PT.d.ts +386 -0
  222. package/dist/types/i18n/locales/zh-CN.d.ts +386 -0
  223. package/dist/types/index.d.ts +46 -95
  224. package/dist/types/inference/index.d.ts +22 -0
  225. package/dist/types/models/interfaces.d.ts +1 -1
  226. package/dist/types/server/OxyServer.d.ts +183 -0
  227. package/dist/types/server/auth.d.ts +10 -7
  228. package/dist/types/server/index.d.ts +10 -4
  229. package/dist/types/server/middleware.d.ts +291 -0
  230. package/dist/types/server/namespaces.d.ts +98 -0
  231. package/dist/types/server/rateLimit.d.ts +7 -5
  232. package/dist/types/server/requesterAssertion.d.ts +14 -11
  233. package/dist/types/server/securityHeaders.d.ts +4 -5
  234. package/dist/types/server/userInvalidation.d.ts +10 -8
  235. package/dist/types/session/accountDelegationAccess.d.ts +1 -1
  236. package/dist/types/session/accountDialogController.d.ts +8 -8
  237. package/dist/types/session/accountSwitchTargets.d.ts +1 -1
  238. package/dist/types/session/authStateStore.d.ts +7 -6
  239. package/dist/types/session/index.d.ts +40 -0
  240. package/dist/types/utils/accountCacheSweep.d.ts +7 -10
  241. package/dist/types/utils/apiUtils.d.ts +3 -3
  242. package/dist/types/utils/asyncUtils.d.ts +11 -58
  243. package/dist/types/utils/authWebUrl.d.ts +3 -4
  244. package/dist/types/utils/avatarUtils.d.ts +5 -6
  245. package/dist/types/utils/cache.d.ts +11 -3
  246. package/dist/types/utils/commonsApproval.d.ts +1 -1
  247. package/dist/types/utils/edgeRegion.d.ts +1 -2
  248. package/dist/types/utils/identityCacheSweep.d.ts +6 -4
  249. package/dist/types/utils/oauthPkce.d.ts +2 -2
  250. package/dist/types/utils/oxyServiceEnvironment.d.ts +3 -7
  251. package/dist/types/utils/requestUtils.d.ts +18 -14
  252. package/dist/types/utils/tokenClaims.d.ts +9 -0
  253. package/package.json +68 -7
  254. package/src/HttpService.ts +201 -132
  255. package/src/OxyServices.errors.ts +73 -0
  256. package/src/OxyServices.ts +289 -164
  257. package/src/api/accounts.ts +579 -0
  258. package/src/api/agency.ts +277 -0
  259. package/src/api/appData.ts +63 -0
  260. package/src/api/apps.ts +596 -0
  261. package/src/api/assets.ts +416 -0
  262. package/src/api/auth.ts +1457 -0
  263. package/src/api/billing.ts +144 -0
  264. package/src/api/civic.ts +428 -0
  265. package/src/api/contacts.ts +41 -0
  266. package/src/api/devices.ts +438 -0
  267. package/src/api/follows.ts +414 -0
  268. package/src/api/identity.ts +727 -0
  269. package/src/api/linkedAccounts.ts +78 -0
  270. package/src/api/nodes.ts +169 -0
  271. package/src/api/notifications.ts +135 -0
  272. package/src/api/privacy.ts +120 -0
  273. package/src/api/reputation.ts +134 -0
  274. package/src/api/session.ts +210 -0
  275. package/src/api/store.ts +435 -0
  276. package/src/api/topics.ts +83 -0
  277. package/src/api/users.ts +357 -0
  278. package/src/boot/sessionColdBoot.ts +4 -4
  279. package/src/civic/index.ts +12 -0
  280. package/src/civic/payloads.ts +175 -0
  281. package/src/client/context.ts +34 -0
  282. package/src/crypto/identityLink.ts +5 -5
  283. package/src/crypto/index.ts +39 -0
  284. package/src/crypto/internal.ts +20 -0
  285. package/src/crypto/keyManager.ts +2 -2
  286. package/src/crypto/polyfill.ts +9 -89
  287. package/src/crypto/recoveryPhrase.ts +1 -0
  288. package/src/crypto/registrationPow.ts +1 -1
  289. package/src/crypto/signatureService.ts +1 -0
  290. package/src/i18n/accountCategoryLabels.ts +2 -2
  291. package/src/i18n/accountRoleLabels.ts +2 -2
  292. package/src/i18n/index.ts +105 -54
  293. package/src/i18n/locales/{ar-SA.json → ar-SA.ts} +132 -52
  294. package/src/i18n/locales/{ca-ES.json → ca-ES.ts} +132 -52
  295. package/{dist/cjs/i18n/locales/locales/de-DE.json → src/i18n/locales/de-DE.ts} +134 -54
  296. package/src/i18n/locales/{en-US.json → en-US.ts} +161 -245
  297. package/{dist/cjs/i18n/locales/locales/es-ES.json → src/i18n/locales/es-ES.ts} +161 -245
  298. package/src/i18n/locales/{fr-FR.json → fr-FR.ts} +132 -52
  299. package/src/i18n/locales/{it-IT.json → it-IT.ts} +132 -52
  300. package/{dist/cjs/i18n/locales/locales/ja-JP.json → src/i18n/locales/ja-JP.ts} +132 -52
  301. package/src/i18n/locales/{ko-KR.json → ko-KR.ts} +132 -52
  302. package/src/i18n/locales/{pt-PT.json → pt-PT.ts} +134 -54
  303. package/src/i18n/locales/{zh-CN.json → zh-CN.ts} +133 -53
  304. package/src/i18n/reputationCategoryLabels.ts +1 -1
  305. package/src/i18n/trustTierLabels.ts +1 -1
  306. package/src/index.ts +170 -501
  307. package/src/inference/index.ts +48 -0
  308. package/src/models/interfaces.ts +1 -1
  309. package/src/server/OxyServer.ts +637 -0
  310. package/src/server/auth.ts +12 -8
  311. package/src/server/index.ts +28 -5
  312. package/src/server/middleware.ts +1520 -0
  313. package/src/server/namespaces.ts +257 -0
  314. package/src/server/rateLimit.ts +10 -9
  315. package/src/server/requesterAssertion.ts +13 -10
  316. package/src/server/securityHeaders.ts +7 -8
  317. package/src/server/traffic.ts +6 -6
  318. package/src/server/trafficNodeHttp.ts +7 -3
  319. package/src/server/userInvalidation.ts +9 -9
  320. package/src/session/accountDelegationAccess.ts +1 -1
  321. package/src/session/accountDialogController.ts +24 -24
  322. package/src/session/accountSwitchTargets.ts +1 -1
  323. package/src/session/authStateStore.ts +9 -8
  324. package/src/session/identitySession.ts +3 -3
  325. package/src/session/index.ts +210 -0
  326. package/src/session/refresh.ts +36 -30
  327. package/src/session/sessionClientHost.ts +5 -5
  328. package/src/session/sharedDeviceCredential.ts +3 -2
  329. package/src/shared/utils/networkUtils.ts +2 -2
  330. package/src/utils/accountCacheSweep.ts +11 -15
  331. package/src/utils/apiUtils.ts +3 -3
  332. package/src/utils/asyncUtils.ts +38 -235
  333. package/src/utils/authHelpers.ts +2 -2
  334. package/src/utils/authWebUrl.ts +3 -4
  335. package/src/utils/avatarUtils.ts +4 -7
  336. package/src/utils/cache.ts +36 -5
  337. package/src/utils/cacheKey.ts +5 -9
  338. package/src/utils/commonsApproval.ts +1 -1
  339. package/src/utils/deviceManager.ts +17 -16
  340. package/src/utils/edgeRegion.ts +1 -2
  341. package/src/utils/identityCacheSweep.ts +7 -12
  342. package/src/utils/oauthPkce.ts +2 -2
  343. package/src/utils/oxyServiceEnvironment.ts +3 -7
  344. package/src/utils/requestUtils.ts +48 -44
  345. package/src/utils/sessionUtils.ts +0 -2
  346. package/src/utils/tokenClaims.ts +38 -0
  347. package/dist/cjs/.tsbuildinfo +0 -1
  348. package/dist/cjs/OxyServices.base.js +0 -392
  349. package/dist/cjs/i18n/locales/locales/ar-SA.json +0 -306
  350. package/dist/cjs/i18n/locales/locales/ca-ES.json +0 -306
  351. package/dist/cjs/i18n/locales/locales/en-US.json +0 -2127
  352. package/dist/cjs/i18n/locales/locales/fr-FR.json +0 -306
  353. package/dist/cjs/i18n/locales/locales/it-IT.json +0 -306
  354. package/dist/cjs/i18n/locales/locales/ko-KR.json +0 -306
  355. package/dist/cjs/i18n/locales/locales/pt-PT.json +0 -306
  356. package/dist/cjs/i18n/locales/locales/zh-CN.json +0 -306
  357. package/dist/cjs/mixins/OxyServices.accounts.js +0 -555
  358. package/dist/cjs/mixins/OxyServices.agency.js +0 -154
  359. package/dist/cjs/mixins/OxyServices.analytics.js +0 -49
  360. package/dist/cjs/mixins/OxyServices.appData.js +0 -108
  361. package/dist/cjs/mixins/OxyServices.assets.js +0 -854
  362. package/dist/cjs/mixins/OxyServices.auth.js +0 -1440
  363. package/dist/cjs/mixins/OxyServices.chains.js +0 -73
  364. package/dist/cjs/mixins/OxyServices.civic.js +0 -611
  365. package/dist/cjs/mixins/OxyServices.connectedApps.js +0 -95
  366. package/dist/cjs/mixins/OxyServices.contacts.js +0 -50
  367. package/dist/cjs/mixins/OxyServices.deviceBoot.js +0 -191
  368. package/dist/cjs/mixins/OxyServices.devices.js +0 -116
  369. package/dist/cjs/mixins/OxyServices.features.js +0 -335
  370. package/dist/cjs/mixins/OxyServices.followGraph.js +0 -221
  371. package/dist/cjs/mixins/OxyServices.identity.js +0 -562
  372. package/dist/cjs/mixins/OxyServices.identityBackup.js +0 -172
  373. package/dist/cjs/mixins/OxyServices.inference.js +0 -59
  374. package/dist/cjs/mixins/OxyServices.language.js +0 -125
  375. package/dist/cjs/mixins/OxyServices.linkedAccounts.js +0 -79
  376. package/dist/cjs/mixins/OxyServices.location.js +0 -43
  377. package/dist/cjs/mixins/OxyServices.nodes.js +0 -175
  378. package/dist/cjs/mixins/OxyServices.notifications.js +0 -63
  379. package/dist/cjs/mixins/OxyServices.payment.js +0 -158
  380. package/dist/cjs/mixins/OxyServices.privacy.js +0 -199
  381. package/dist/cjs/mixins/OxyServices.reputation.js +0 -289
  382. package/dist/cjs/mixins/OxyServices.security.js +0 -89
  383. package/dist/cjs/mixins/OxyServices.store.js +0 -266
  384. package/dist/cjs/mixins/OxyServices.topics.js +0 -137
  385. package/dist/cjs/mixins/OxyServices.user.js +0 -954
  386. package/dist/cjs/mixins/OxyServices.utility.js +0 -1402
  387. package/dist/cjs/mixins/index.js +0 -136
  388. package/dist/cjs/mixins/mixinHelpers.js +0 -53
  389. package/dist/cjs/utils/webauthnOrigin.js +0 -51
  390. package/dist/esm/.tsbuildinfo +0 -1
  391. package/dist/esm/OxyServices.base.js +0 -388
  392. package/dist/esm/i18n/locales/locales/ar-SA.json +0 -306
  393. package/dist/esm/i18n/locales/locales/ca-ES.json +0 -306
  394. package/dist/esm/i18n/locales/locales/de-DE.json +0 -306
  395. package/dist/esm/i18n/locales/locales/en-US.json +0 -2127
  396. package/dist/esm/i18n/locales/locales/es-ES.json +0 -2127
  397. package/dist/esm/i18n/locales/locales/fr-FR.json +0 -306
  398. package/dist/esm/i18n/locales/locales/it-IT.json +0 -306
  399. package/dist/esm/i18n/locales/locales/ja-JP.json +0 -306
  400. package/dist/esm/i18n/locales/locales/ko-KR.json +0 -306
  401. package/dist/esm/i18n/locales/locales/pt-PT.json +0 -306
  402. package/dist/esm/i18n/locales/locales/zh-CN.json +0 -306
  403. package/dist/esm/mixins/OxyServices.accounts.js +0 -543
  404. package/dist/esm/mixins/OxyServices.agency.js +0 -151
  405. package/dist/esm/mixins/OxyServices.analytics.js +0 -46
  406. package/dist/esm/mixins/OxyServices.appData.js +0 -103
  407. package/dist/esm/mixins/OxyServices.assets.js +0 -851
  408. package/dist/esm/mixins/OxyServices.auth.js +0 -1400
  409. package/dist/esm/mixins/OxyServices.chains.js +0 -70
  410. package/dist/esm/mixins/OxyServices.civic.js +0 -605
  411. package/dist/esm/mixins/OxyServices.connectedApps.js +0 -92
  412. package/dist/esm/mixins/OxyServices.contacts.js +0 -47
  413. package/dist/esm/mixins/OxyServices.deviceBoot.js +0 -186
  414. package/dist/esm/mixins/OxyServices.devices.js +0 -113
  415. package/dist/esm/mixins/OxyServices.features.js +0 -332
  416. package/dist/esm/mixins/OxyServices.followGraph.js +0 -218
  417. package/dist/esm/mixins/OxyServices.identity.js +0 -558
  418. package/dist/esm/mixins/OxyServices.identityBackup.js +0 -169
  419. package/dist/esm/mixins/OxyServices.inference.js +0 -56
  420. package/dist/esm/mixins/OxyServices.language.js +0 -122
  421. package/dist/esm/mixins/OxyServices.linkedAccounts.js +0 -76
  422. package/dist/esm/mixins/OxyServices.location.js +0 -40
  423. package/dist/esm/mixins/OxyServices.nodes.js +0 -172
  424. package/dist/esm/mixins/OxyServices.notifications.js +0 -60
  425. package/dist/esm/mixins/OxyServices.payment.js +0 -155
  426. package/dist/esm/mixins/OxyServices.privacy.js +0 -196
  427. package/dist/esm/mixins/OxyServices.reputation.js +0 -286
  428. package/dist/esm/mixins/OxyServices.security.js +0 -86
  429. package/dist/esm/mixins/OxyServices.store.js +0 -263
  430. package/dist/esm/mixins/OxyServices.topics.js +0 -134
  431. package/dist/esm/mixins/OxyServices.user.js +0 -951
  432. package/dist/esm/mixins/OxyServices.utility.js +0 -1397
  433. package/dist/esm/mixins/index.js +0 -133
  434. package/dist/esm/mixins/mixinHelpers.js +0 -48
  435. package/dist/esm/utils/webauthnOrigin.js +0 -48
  436. package/dist/types/.tsbuildinfo +0 -1
  437. package/dist/types/OxyServices.base.d.ts +0 -189
  438. package/dist/types/mixins/OxyServices.accounts.d.ts +0 -868
  439. package/dist/types/mixins/OxyServices.agency.d.ts +0 -176
  440. package/dist/types/mixins/OxyServices.analytics.d.ts +0 -72
  441. package/dist/types/mixins/OxyServices.appData.d.ts +0 -108
  442. package/dist/types/mixins/OxyServices.assets.d.ts +0 -371
  443. package/dist/types/mixins/OxyServices.auth.d.ts +0 -965
  444. package/dist/types/mixins/OxyServices.chains.d.ts +0 -156
  445. package/dist/types/mixins/OxyServices.civic.d.ts +0 -520
  446. package/dist/types/mixins/OxyServices.connectedApps.d.ts +0 -184
  447. package/dist/types/mixins/OxyServices.contacts.d.ts +0 -100
  448. package/dist/types/mixins/OxyServices.deviceBoot.d.ts +0 -185
  449. package/dist/types/mixins/OxyServices.devices.d.ts +0 -103
  450. package/dist/types/mixins/OxyServices.features.d.ts +0 -250
  451. package/dist/types/mixins/OxyServices.followGraph.d.ts +0 -223
  452. package/dist/types/mixins/OxyServices.identity.d.ts +0 -337
  453. package/dist/types/mixins/OxyServices.identityBackup.d.ts +0 -129
  454. package/dist/types/mixins/OxyServices.inference.d.ts +0 -95
  455. package/dist/types/mixins/OxyServices.language.d.ts +0 -87
  456. package/dist/types/mixins/OxyServices.linkedAccounts.d.ts +0 -107
  457. package/dist/types/mixins/OxyServices.location.d.ts +0 -70
  458. package/dist/types/mixins/OxyServices.nodes.d.ts +0 -198
  459. package/dist/types/mixins/OxyServices.notifications.d.ts +0 -143
  460. package/dist/types/mixins/OxyServices.payment.d.ts +0 -117
  461. package/dist/types/mixins/OxyServices.privacy.d.ts +0 -146
  462. package/dist/types/mixins/OxyServices.reputation.d.ts +0 -202
  463. package/dist/types/mixins/OxyServices.security.d.ts +0 -84
  464. package/dist/types/mixins/OxyServices.store.d.ts +0 -334
  465. package/dist/types/mixins/OxyServices.topics.d.ts +0 -110
  466. package/dist/types/mixins/OxyServices.user.d.ts +0 -600
  467. package/dist/types/mixins/OxyServices.utility.d.ts +0 -526
  468. package/dist/types/mixins/index.d.ts +0 -87
  469. package/dist/types/mixins/mixinHelpers.d.ts +0 -31
  470. package/dist/types/utils/webauthnOrigin.d.ts +0 -32
  471. package/src/OxyServices.base.ts +0 -480
  472. package/src/__tests__/authSocket.test.ts +0 -96
  473. package/src/__tests__/fixEsmImports.test.ts +0 -132
  474. package/src/__tests__/httpServiceAbort.test.ts +0 -308
  475. package/src/__tests__/httpServiceActivityId.test.ts +0 -49
  476. package/src/__tests__/httpServiceAuthSelfAwait.test.ts +0 -108
  477. package/src/__tests__/httpServiceCache.test.ts +0 -318
  478. package/src/__tests__/httpServiceFormEncoded.test.ts +0 -139
  479. package/src/__tests__/httpServiceQueueDeadlock.test.ts +0 -128
  480. package/src/__tests__/httpServiceRateLimitedRefresh.test.ts +0 -160
  481. package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +0 -115
  482. package/src/__tests__/httpServiceWrites.test.ts +0 -175
  483. package/src/__tests__/inSessionRefresh.test.ts +0 -313
  484. package/src/__tests__/linkedClient.test.ts +0 -363
  485. package/src/__tests__/nearExpiryMintStorm.test.ts +0 -165
  486. package/src/__tests__/parseHttpErrorBody.test.ts +0 -116
  487. package/src/__tests__/publicInterfaceParity.test.ts +0 -75
  488. package/src/__tests__/serverValueImportsDeclared.test.ts +0 -120
  489. package/src/__tests__/serviceTokenWorkloadFallback.test.ts +0 -85
  490. package/src/__tests__/userIdentity.test.ts +0 -143
  491. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +0 -393
  492. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +0 -325
  493. package/src/boot/__tests__/sessionColdBoot.test.ts +0 -570
  494. package/src/crypto/__tests__/backupMaterial.test.ts +0 -86
  495. package/src/crypto/__tests__/cryptoPrimitives.test.ts +0 -226
  496. package/src/crypto/__tests__/identityLink.test.ts +0 -18
  497. package/src/crypto/__tests__/identityMocks.ts +0 -125
  498. package/src/crypto/__tests__/identityProof.test.ts +0 -81
  499. package/src/crypto/__tests__/keyManager.atomicity.test.ts +0 -272
  500. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +0 -175
  501. package/src/crypto/__tests__/keyManager.deviceBackup.test.ts +0 -310
  502. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +0 -217
  503. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +0 -179
  504. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +0 -138
  505. package/src/crypto/__tests__/keyManager.sharedSlotSync.test.ts +0 -150
  506. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +0 -227
  507. package/src/crypto/__tests__/keyManager.test.ts +0 -329
  508. package/src/crypto/__tests__/polyfill.test.ts +0 -109
  509. package/src/crypto/__tests__/polyfillOrder.test.ts +0 -114
  510. package/src/crypto/__tests__/recoveryPhrase.test.ts +0 -61
  511. package/src/crypto/__tests__/registrationPow.test.ts +0 -61
  512. package/src/crypto/__tests__/scopedSeed.test.ts +0 -126
  513. package/src/crypto/__tests__/signChallengeShared.test.ts +0 -63
  514. package/src/crypto/__tests__/signedRecord.test.ts +0 -230
  515. package/src/i18n/__tests__/accountCategoryLabels.test.ts +0 -62
  516. package/src/i18n/__tests__/accountRoleLabels.test.ts +0 -54
  517. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +0 -56
  518. package/src/i18n/__tests__/trustTierLabels.test.ts +0 -47
  519. package/src/i18n/locales/de-DE.json +0 -306
  520. package/src/i18n/locales/es-ES.json +0 -2127
  521. package/src/i18n/locales/ja-JP.json +0 -306
  522. package/src/inference/__tests__/OxyInferenceClient.test.ts +0 -899
  523. package/src/logger/__tests__/logger.test.ts +0 -207
  524. package/src/mixins/OxyServices.accounts.ts +0 -1330
  525. package/src/mixins/OxyServices.agency.ts +0 -353
  526. package/src/mixins/OxyServices.analytics.ts +0 -53
  527. package/src/mixins/OxyServices.appData.ts +0 -158
  528. package/src/mixins/OxyServices.assets.ts +0 -964
  529. package/src/mixins/OxyServices.auth.ts +0 -2028
  530. package/src/mixins/OxyServices.chains.ts +0 -134
  531. package/src/mixins/OxyServices.civic.ts +0 -945
  532. package/src/mixins/OxyServices.connectedApps.ts +0 -212
  533. package/src/mixins/OxyServices.contacts.ts +0 -73
  534. package/src/mixins/OxyServices.devices.ts +0 -120
  535. package/src/mixins/OxyServices.features.ts +0 -454
  536. package/src/mixins/OxyServices.followGraph.ts +0 -293
  537. package/src/mixins/OxyServices.identity.ts +0 -787
  538. package/src/mixins/OxyServices.identityBackup.ts +0 -250
  539. package/src/mixins/OxyServices.inference.ts +0 -57
  540. package/src/mixins/OxyServices.language.ts +0 -144
  541. package/src/mixins/OxyServices.linkedAccounts.ts +0 -129
  542. package/src/mixins/OxyServices.location.ts +0 -46
  543. package/src/mixins/OxyServices.nodes.ts +0 -337
  544. package/src/mixins/OxyServices.notifications.ts +0 -142
  545. package/src/mixins/OxyServices.payment.ts +0 -163
  546. package/src/mixins/OxyServices.privacy.ts +0 -219
  547. package/src/mixins/OxyServices.reputation.ts +0 -436
  548. package/src/mixins/OxyServices.security.ts +0 -110
  549. package/src/mixins/OxyServices.store.ts +0 -585
  550. package/src/mixins/OxyServices.topics.ts +0 -169
  551. package/src/mixins/OxyServices.user.ts +0 -1208
  552. package/src/mixins/OxyServices.utility.ts +0 -1803
  553. package/src/mixins/__tests__/OxyServices.civic.test.ts +0 -1095
  554. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +0 -124
  555. package/src/mixins/__tests__/OxyServices.identity.test.ts +0 -301
  556. package/src/mixins/__tests__/OxyServices.nodes.test.ts +0 -341
  557. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +0 -323
  558. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +0 -192
  559. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +0 -135
  560. package/src/mixins/__tests__/OxyServices.serviceLinkedDownloadUrl.test.ts +0 -139
  561. package/src/mixins/__tests__/accountEvents.test.ts +0 -158
  562. package/src/mixins/__tests__/accounts.test.ts +0 -727
  563. package/src/mixins/__tests__/agency.test.ts +0 -120
  564. package/src/mixins/__tests__/appData.test.ts +0 -203
  565. package/src/mixins/__tests__/assetCredentials.test.ts +0 -47
  566. package/src/mixins/__tests__/assetUpload.test.ts +0 -191
  567. package/src/mixins/__tests__/authRefusalObservability.test.ts +0 -396
  568. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +0 -130
  569. package/src/mixins/__tests__/chains.test.ts +0 -113
  570. package/src/mixins/__tests__/commonsSignIn.test.ts +0 -1147
  571. package/src/mixins/__tests__/connectedApps.test.ts +0 -146
  572. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +0 -113
  573. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +0 -265
  574. package/src/mixins/__tests__/followCacheInvalidation.test.ts +0 -173
  575. package/src/mixins/__tests__/followGraph.test.ts +0 -147
  576. package/src/mixins/__tests__/followGraphPagination.test.ts +0 -271
  577. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +0 -346
  578. package/src/mixins/__tests__/getFollowStatuses.test.ts +0 -95
  579. package/src/mixins/__tests__/getUsersByIds.test.ts +0 -176
  580. package/src/mixins/__tests__/identityBackup.test.ts +0 -315
  581. package/src/mixins/__tests__/identityLink.test.ts +0 -89
  582. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +0 -407
  583. package/src/mixins/__tests__/inferenceFactory.test.ts +0 -58
  584. package/src/mixins/__tests__/linkedAccounts.test.ts +0 -109
  585. package/src/mixins/__tests__/notifications.read.test.ts +0 -82
  586. package/src/mixins/__tests__/onTokensChanged.test.ts +0 -129
  587. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +0 -284
  588. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +0 -155
  589. package/src/mixins/__tests__/reputation.test.ts +0 -522
  590. package/src/mixins/__tests__/serviceAuth.test.ts +0 -889
  591. package/src/mixins/__tests__/serviceTokenJwks.test.ts +0 -208
  592. package/src/mixins/__tests__/store.test.ts +0 -304
  593. package/src/mixins/__tests__/topics.test.ts +0 -155
  594. package/src/mixins/__tests__/userReadCacheBypass.test.ts +0 -129
  595. package/src/mixins/__tests__/userTokenAuth.test.ts +0 -746
  596. package/src/mixins/__tests__/verifyChallenge.test.ts +0 -161
  597. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +0 -167
  598. package/src/mixins/__tests__/webauthnAuth.test.ts +0 -279
  599. package/src/mixins/index.ts +0 -203
  600. package/src/mixins/mixinHelpers.ts +0 -69
  601. package/src/server/__tests__/auth.test.ts +0 -78
  602. package/src/server/__tests__/capabilityTicket.test.ts +0 -111
  603. package/src/server/__tests__/cors.socket.test.ts +0 -225
  604. package/src/server/__tests__/cors.test.ts +0 -158
  605. package/src/server/__tests__/rateLimit.test.ts +0 -257
  606. package/src/server/__tests__/requesterAssertion.test.ts +0 -359
  607. package/src/server/__tests__/safeFetch.test.ts +0 -232
  608. package/src/server/__tests__/securityHeaders.test.ts +0 -387
  609. package/src/server/__tests__/serviceTokenAttribution.test.ts +0 -396
  610. package/src/server/__tests__/traffic.test.ts +0 -180
  611. package/src/server/__tests__/trafficNodeHttp.test.ts +0 -38
  612. package/src/server/__tests__/userInvalidation.test.ts +0 -203
  613. package/src/server/__tests__/verifySecret.test.ts +0 -40
  614. package/src/server/__tests__/workloadIdentity.client.test.ts +0 -16
  615. package/src/server/__tests__/workloadIdentity.test.ts +0 -128
  616. package/src/session/__tests__/SessionClient.additive.test.ts +0 -153
  617. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +0 -114
  618. package/src/session/__tests__/SessionClient.diagnostics.test.ts +0 -91
  619. package/src/session/__tests__/SessionClient.directory.test.ts +0 -688
  620. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +0 -65
  621. package/src/session/__tests__/SessionClient.identityPin.test.ts +0 -175
  622. package/src/session/__tests__/SessionClient.rest.test.ts +0 -119
  623. package/src/session/__tests__/SessionClient.serverEvents.test.ts +0 -72
  624. package/src/session/__tests__/SessionClient.socket.test.ts +0 -202
  625. package/src/session/__tests__/SessionClient.socketFactory.test.ts +0 -81
  626. package/src/session/__tests__/SessionClient.state.test.ts +0 -78
  627. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +0 -170
  628. package/src/session/__tests__/accountDelegationAccess.test.ts +0 -104
  629. package/src/session/__tests__/accountDialogController.test.ts +0 -2502
  630. package/src/session/__tests__/accountDialogShape.test.ts +0 -120
  631. package/src/session/__tests__/accountSwitchTargets.test.ts +0 -137
  632. package/src/session/__tests__/authStateStore.test.ts +0 -451
  633. package/src/session/__tests__/deviceDirectory.test.ts +0 -422
  634. package/src/session/__tests__/deviceSwitcherRows.test.ts +0 -223
  635. package/src/session/__tests__/identityPin.test.ts +0 -131
  636. package/src/session/__tests__/identitySession.test.ts +0 -194
  637. package/src/session/__tests__/projectSessionState.test.ts +0 -105
  638. package/src/session/__tests__/refresh.identityPin.test.ts +0 -307
  639. package/src/session/__tests__/refresh.test.ts +0 -606
  640. package/src/session/__tests__/sessionIntegration.test.ts +0 -209
  641. package/src/session/__tests__/sharedDeviceCredential.test.ts +0 -300
  642. package/src/utils/__tests__/accountUtils.test.ts +0 -151
  643. package/src/utils/__tests__/activityId.test.ts +0 -45
  644. package/src/utils/__tests__/asyncUtils.test.ts +0 -279
  645. package/src/utils/__tests__/authWebUrl.test.ts +0 -15
  646. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  647. package/src/utils/__tests__/cacheLifecycle.test.ts +0 -65
  648. package/src/utils/__tests__/coldBoot.test.ts +0 -496
  649. package/src/utils/__tests__/commonsApproval.test.ts +0 -60
  650. package/src/utils/__tests__/identityCacheSweep.test.ts +0 -151
  651. package/src/utils/__tests__/languageUtils.test.ts +0 -244
  652. package/src/utils/__tests__/oauthPkce.test.ts +0 -303
  653. package/src/utils/__tests__/officialOrigins.test.ts +0 -31
  654. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +0 -7
  655. package/src/utils/__tests__/profileLinks.test.ts +0 -180
  656. package/src/utils/__tests__/redactUrl.test.ts +0 -33
  657. package/src/utils/__tests__/registrableApex.test.ts +0 -62
  658. package/src/utils/__tests__/requestUtilsAbort.test.ts +0 -155
  659. package/src/utils/__tests__/textNormalization.test.ts +0 -205
  660. package/src/utils/__tests__/validationUtils.test.ts +0 -703
  661. package/src/utils/__tests__/webauthnOrigin.test.ts +0 -83
  662. package/src/utils/webauthnOrigin.ts +0 -52
@@ -12,16 +12,16 @@
12
12
  * - Error handling
13
13
  * - Request queuing
14
14
  */
15
- import { TTLCache, registerCacheForCleanup } from './utils/cache.js';
15
+ import { TTLCache, registerCacheForCleanup, unregisterCacheFromCleanup } from './utils/cache.js';
16
16
  import { RequestDeduplicator, RequestQueue, SimpleLogger } from './utils/requestUtils.js';
17
17
  import { retryAsync } from './utils/asyncUtils.js';
18
18
  import { createCancelledError, ErrorCodes, handleHttpError, parseHttpErrorBody } from './utils/errorUtils.js';
19
- import { jwtDecode } from 'jwt-decode';
20
- import { isReactNative } from '@oxy.so/protocol';
19
+ import { decodeTokenClaims } from './utils/tokenClaims.js';
20
+ import { isReactNative } from '@oxy.so/protocol/random';
21
21
  import { computeIdentityTag, fnv1a32 } from './utils/cacheKey.js';
22
22
  import { redactUrlQuery } from './utils/redactUrl.js';
23
23
  import { OxyAuthenticationError } from './OxyServices.errors.js';
24
- import { getBrowserEdgeRegionHeader } from './utils/edgeRegion.js';
24
+ import { peekBrowserEdgeRegionHeader } from './utils/edgeRegion.js';
25
25
  import { getBrowserActivityIdHeader } from './utils/activityId.js';
26
26
  /**
27
27
  * Default per-request timeout (ms) when neither the call site nor
@@ -29,6 +29,26 @@ import { getBrowserActivityIdHeader } from './utils/activityId.js';
29
29
  * endpoint surfaces as an `AbortError` quickly rather than blocking the
30
30
  * request queue.
31
31
  */
32
+ /**
33
+ * Strip leading or trailing `/`s without a regex: `/\/+$/` backtracks
34
+ * polynomially on a long run of slashes (CodeQL js/polynomial-redos), and this
35
+ * runs on every request.
36
+ */
37
+ function trimSlashes(value, side) {
38
+ let start = 0;
39
+ let end = value.length;
40
+ if (side === 'start')
41
+ while (start < end && value.charCodeAt(start) === 47)
42
+ start++;
43
+ else
44
+ while (end > start && value.charCodeAt(end - 1) === 47)
45
+ end--;
46
+ return value.slice(start, end);
47
+ }
48
+ /** Methods whose calls concurrent callers may share (read-only). */
49
+ const SAFE_METHODS = new Set(['GET']);
50
+ /** Methods safe to re-send after a transient failure (RFC 9110 §9.2.2). */
51
+ const IDEMPOTENT_METHODS = new Set(['GET', 'PUT', 'DELETE']);
32
52
  const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
33
53
  /**
34
54
  * Cooldown (ms) applied after a failed access-token refresh before another
@@ -94,18 +114,13 @@ const TOKEN_REFRESH_LEAD_SECONDS = 60;
94
114
  * lead window. `false` for an expired, opaque or no-`exp` token.
95
115
  */
96
116
  function isInsideRefreshLeadWindow(token) {
97
- try {
98
- const decoded = jwtDecode(token);
99
- if (typeof decoded.exp !== 'number') {
100
- return false;
101
- }
102
- const now = Math.floor(Date.now() / 1000);
103
- // `<=`: the proactive scheduler fires at exactly `exp - lead`.
104
- return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
105
- }
106
- catch {
117
+ const decoded = decodeTokenClaims(token);
118
+ if (typeof decoded?.exp !== 'number') {
107
119
  return false;
108
120
  }
121
+ const now = Math.floor(Date.now() / 1000);
122
+ // `<=`: the proactive scheduler fires at exactly `exp - lead`.
123
+ return decoded.exp > now && decoded.exp - now <= TOKEN_REFRESH_LEAD_SECONDS;
109
124
  }
110
125
  /**
111
126
  * Soft ceiling on the number of live entries in the identity-scoped GET
@@ -233,6 +248,7 @@ export class HttpService {
233
248
  this.noFresherTokenThan = null;
234
249
  this.authRefreshHandler = null;
235
250
  this.accessTokenProvider = null;
251
+ this.anonymousAuthProvider = null;
236
252
  this.deviceSecretMintInFlight = null;
237
253
  /**
238
254
  * Bumped by every {@link endSession}. A re-mint captures it before its first
@@ -375,7 +391,15 @@ export class HttpService {
375
391
  * Main request method - handles everything in one place
376
392
  */
377
393
  async request(config) {
378
- const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL, deduplicate = true, retry = this.config.enableRetry !== false, maxRetries = this.config.maxRetries || 3, } = config;
394
+ const { method, url, data, params, timeout = this.config.requestTimeout || DEFAULT_REQUEST_TIMEOUT_MS, signal, cache: cacheRequested = method === 'GET', cacheTTL,
395
+ // Only reads are shared by default. A write's body can be opaque
396
+ // (`FormData`, `URLSearchParams` key as empty objects), so two different
397
+ // uploads used to collapse into one call and the second caller got the
398
+ // first file's result.
399
+ deduplicate = SAFE_METHODS.has(method),
400
+ // Only idempotent methods are re-sent by default: re-sending a POST after a
401
+ // 5xx or a dropped connection can apply it twice.
402
+ retry = this.config.enableRetry !== false && IDEMPOTENT_METHODS.has(method), maxRetries = this.config.maxRetries || 3, } = config;
379
403
  // A per-instance disabled cache (`enableCache:false` / `cacheTTL<=0`)
380
404
  // overrides any per-request `cache:true`: nothing is read from nor written
381
405
  // to the response cache. Request deduplication below is unaffected.
@@ -405,7 +429,9 @@ export class HttpService {
405
429
  // 401 retry re-enters request() with a fresh config, so it re-resolves
406
430
  // this here with the refreshed token.
407
431
  const authHeader = config.skipAuth ? null : await this.getAuthHeader();
408
- const edgeRegionHeader = await getBrowserEdgeRegionHeader();
432
+ // Never awaited: the PoP is a hint, and waiting on its trace fetch put up
433
+ // to a second in front of requests.
434
+ const edgeRegionHeader = peekBrowserEdgeRegionHeader();
409
435
  const activityIdHeader = getBrowserActivityIdHeader();
410
436
  // A request the caller has ALREADY abandoned takes no queue slot and makes
411
437
  // no network call. Checked here, before enqueue, because a slot is the
@@ -414,40 +440,30 @@ export class HttpService {
414
440
  if (signal?.aborted) {
415
441
  throw createCancelledError('Request cancelled before it was sent');
416
442
  }
417
- // ONE abort domain for the whole call, linked to the caller's signal ONCE.
418
- //
419
- // The bug this replaces: the controller used to be built INSIDE `requestFn`
420
- // — the function `retryAsync` re-invokes — and the caller's signal was
421
- // linked to each new controller with a bare `addEventListener`. An `abort`
422
- // event fires once, so on attempt 2 the caller's already-fired signal could
423
- // not abort the freshly built controller, and the request the caller had
424
- // cancelled went out for real. Hoisting the linkage means a cancellation
425
- // arrives once and is then true for every attempt, including ones not yet
426
- // started.
427
- const callController = new AbortController();
428
- const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
429
- /**
430
- * Which of our own timers fired, so a timeout can be told apart from a
431
- * cancellation. Both reach us from `fetch` as an indistinguishable
432
- * `AbortError`, and collapsing them (as this used to) is what let the retry
433
- * predicate treat an abandoned request as a transient failure.
434
- */
435
- let timedOut = false;
436
- // Request function
437
- const requestFn = async () => {
443
+ // One network attempt, inside the call's abort domain `domain`: the caller's
444
+ // own signal, or — when deduplicated — the shared work's, which aborts only
445
+ // once every caller waiting on it has cancelled.
446
+ const attempt = async (domain) => {
438
447
  const startTime = Date.now();
439
448
  // Re-checked per attempt so no retry can issue a network call after the
440
449
  // caller gave up — belt to `retryAsync`'s braces, and the one that holds
441
450
  // if a custom `shouldRetry` ever says yes to a cancellation.
442
- if (callController.signal.aborted) {
451
+ if (domain.aborted) {
443
452
  throw createCancelledError('Request cancelled');
444
453
  }
454
+ /**
455
+ * Whether OUR timer fired, so a timeout can be told apart from a
456
+ * cancellation. Both reach us from `fetch` as an indistinguishable
457
+ * `AbortError`, and collapsing them is what let the retry predicate treat
458
+ * an abandoned request as a transient failure.
459
+ */
460
+ let timedOut = false;
445
461
  // This attempt's controller carries its own timeout and inherits the
446
462
  // call-wide abort domain. Declared OUTSIDE the `try` so the `finally`
447
463
  // that releases them can see them — the timer and the listener are
448
464
  // exactly what leaked when they lived inside it.
449
465
  const controller = new AbortController();
450
- const disposeCallLink = linkAbort(callController.signal, controller);
466
+ const disposeCallLink = linkAbort(domain, controller);
451
467
  const timeoutId = timeout
452
468
  ? setTimeout(() => {
453
469
  timedOut = true;
@@ -473,19 +489,19 @@ export class HttpService {
473
489
  }
474
490
  // Add authorization header if available
475
491
  if (authHeader) {
476
- headers['Authorization'] = authHeader;
492
+ headers.Authorization = authHeader;
477
493
  }
478
494
  // Merge custom headers if provided
479
495
  if (config.headers) {
480
- Object.entries(config.headers).forEach(([key, value]) => {
496
+ for (const [key, value] of Object.entries(config.headers)) {
481
497
  // For FormData, explicitly remove Content-Type if user tries to set it
482
498
  // The browser/fetch API will set it automatically with the boundary
483
499
  if (isFormData && key.toLowerCase() === 'content-type') {
484
500
  this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');
485
- return;
501
+ continue;
486
502
  }
487
503
  headers[key] = value;
488
- });
504
+ }
489
505
  }
490
506
  // This is Cloudflare's coarse serving PoP (for example `mad`), never an
491
507
  // IP or coordinate. Set it after caller headers so request code cannot
@@ -533,7 +549,12 @@ export class HttpService {
533
549
  // deduplicated retry would resolve to the still-pending original
534
550
  // and await itself (deadlock). Opting the retry out of dedupe makes
535
551
  // it a fresh request.
536
- return this.request({ ...config, _isAuthRetry: true, retry: false, deduplicate: false });
552
+ //
553
+ // `bypassQueue: true` is REQUIRED too: this attempt still holds its
554
+ // queue slot, so a queued retry waits for a slot while holding one.
555
+ // With every slot held by a 401 (a revoked session under load) no
556
+ // retry could ever start and the whole client stalled.
557
+ return this.request({ ...config, _isAuthRetry: true, retry: false, deduplicate: false, bypassQueue: true });
537
558
  }
538
559
  // Refresh failed or no token — clear tokens
539
560
  this.tokenStore.clearTokens();
@@ -578,7 +599,7 @@ export class HttpService {
578
599
  if (config.responseType === 'blob') {
579
600
  responseData = await response.blob();
580
601
  }
581
- else if (contentType && contentType.includes('application/json')) {
602
+ else if (contentType?.includes('application/json')) {
582
603
  // Use response.json() directly for better performance
583
604
  try {
584
605
  responseData = await response.json();
@@ -661,47 +682,55 @@ export class HttpService {
661
682
  disposeCallLink();
662
683
  }
663
684
  };
664
- // Wrap with retry if enabled.
685
+ // Composition: dedupe(retry(queue(attempt))). A queue slot is network
686
+ // occupancy only — each attempt takes one and releases it — so neither the
687
+ // retry backoff sleep nor a deduplicated caller waiting on shared work holds
688
+ // a slot while doing nothing.
665
689
  //
666
- // `retryOnTimeout` defaults to false in `retryAsync`, which is what makes
667
- // the pathological total unreachable: a timeout now costs ONE attempt
668
- // instead of four-plus-backoff (~28s at the 5s default), and a cancellation
669
- // costs none. `deadline` bounds whatever retries do happen by wall clock
670
- // rather than by attempts x timeout + backoff.
671
- const requestWithRetry = retry
672
- ? () => retryAsync(requestFn, {
690
+ // `retryOnTimeout` defaults to false in `retryAsync`: a timeout costs ONE
691
+ // attempt, a cancellation none. `deadline` bounds whatever retries do happen
692
+ // by wall clock rather than by attempts x timeout + backoff.
693
+ const runAttempt = (domain) =>
694
+ // Control-plane calls the auth lane depends on (`bypassQueue`, e.g. the
695
+ // device-secret mint) run DIRECTLY — a queued mint could never acquire a
696
+ // slot when every slot is parked awaiting it.
697
+ config.bypassQueue ? attempt(domain) : this.requestQueue.enqueue(() => attempt(domain), domain);
698
+ const execute = (domain) => retry
699
+ ? retryAsync(() => runAttempt(domain), {
673
700
  maxRetries,
674
701
  baseDelay: this.config.retryDelay || 1000,
675
702
  retryOnTimeout: config.retryOnTimeout ?? false,
676
703
  deadline: config.deadline !== undefined ? Date.now() + config.deadline : undefined,
677
704
  })
678
- : requestFn;
679
- // Wrap with deduplication if enabled (use optimized key generation)
680
- const dedupeKey = deduplicate ? this.generateCacheKey(method, url, data || params) : null;
681
- const finalRequest = dedupeKey
682
- ? () => this.deduplicator.deduplicate(dedupeKey, requestWithRetry, callController.signal)
683
- : requestWithRetry;
684
- try {
685
- // Execute the request. Control-plane calls the auth lane depends on
686
- // (`bypassQueue`, e.g. the device-secret mint) run DIRECTLY — a queued mint
687
- // could never acquire a slot when every slot is parked awaiting it.
688
- const result = config.bypassQueue
689
- ? await finalRequest()
690
- : await this.requestQueue.enqueue(finalRequest, callController.signal);
691
- // Cache the result if caching is enabled
692
- if (cache && cacheKey && result) {
693
- this.cache.set(cacheKey, result, cacheTTL);
694
- this.warnIfCacheOversized();
705
+ : runAttempt(domain);
706
+ let result;
707
+ if (deduplicate) {
708
+ // The cache key IS the dedupe key (same method, url, payload, identity);
709
+ // computed once per call.
710
+ const dedupeKey = cacheKey ?? this.generateCacheKey(method, url, data || params);
711
+ result = await this.deduplicator.deduplicate(dedupeKey, execute, signal);
712
+ }
713
+ else {
714
+ // The call's own abort domain, linked to the caller's signal ONCE, so a
715
+ // cancellation arrives once and is then true for every attempt, including
716
+ // ones not yet started. Released however the call ends: a caller signal
717
+ // that outlives the request (a React Query signal) would otherwise accrue
718
+ // one listener per request.
719
+ const callController = new AbortController();
720
+ const disposeCallerLink = signal ? linkAbort(signal, callController) : undefined;
721
+ try {
722
+ result = await execute(callController.signal);
723
+ }
724
+ finally {
725
+ disposeCallerLink?.();
695
726
  }
696
- return result;
697
727
  }
698
- finally {
699
- // The call-wide link to the CALLER's signal, released once the call is
700
- // over however it ended. Without this a caller signal that outlives the
701
- // request — the normal case for a React Query query signal — accrues one
702
- // listener per request for its whole lifetime.
703
- disposeCallerLink?.();
728
+ // Cache the result if caching is enabled
729
+ if (cache && cacheKey && result) {
730
+ this.cache.set(cacheKey, result, cacheTTL);
731
+ this.warnIfCacheOversized();
704
732
  }
733
+ return result;
705
734
  }
706
735
  /**
707
736
  * Soft cache-size guard. Emits a single throttled telemetry warning when the
@@ -888,16 +917,16 @@ export class HttpService {
888
917
  buildURL(url, params) {
889
918
  const base = /^https?:\/\//i.test(url)
890
919
  ? url
891
- : `${this.baseURL.replace(/\/+$/, '')}/${url.replace(/^\/+/, '')}`;
920
+ : `${trimSlashes(this.baseURL, 'end')}/${trimSlashes(url, 'start')}`;
892
921
  if (!params || Object.keys(params).length === 0) {
893
922
  return base;
894
923
  }
895
924
  const searchParams = new URLSearchParams();
896
- Object.entries(params).forEach(([key, value]) => {
925
+ for (const [key, value] of Object.entries(params)) {
897
926
  if (value !== undefined && value !== null) {
898
927
  searchParams.append(key, String(value));
899
928
  }
900
- });
929
+ }
901
930
  const queryString = searchParams.toString();
902
931
  return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;
903
932
  }
@@ -918,10 +947,12 @@ export class HttpService {
918
947
  async getAuthHeader() {
919
948
  const accessToken = this.syncAccessTokenFromProvider();
920
949
  if (!accessToken) {
921
- return null;
950
+ return this.getAnonymousAuthHeader();
922
951
  }
923
952
  try {
924
- const decoded = jwtDecode(accessToken);
953
+ const decoded = decodeTokenClaims(accessToken);
954
+ if (!decoded)
955
+ throw new Error('opaque token');
925
956
  const currentTime = Math.floor(Date.now() / 1000);
926
957
  // If the token expires within the refresh lead window, refresh it.
927
958
  if (decoded.exp && decoded.exp - currentTime < TOKEN_REFRESH_LEAD_SECONDS) {
@@ -947,6 +978,24 @@ export class HttpService {
947
978
  return null;
948
979
  }
949
980
  }
981
+ /**
982
+ * The bearer for a request that has no user session behind it, from the
983
+ * {@link AnonymousAuthProvider} if one is installed. Never throws: a provider
984
+ * that fails sends the request anonymous, exactly as it went before any
985
+ * provider existed.
986
+ */
987
+ async getAnonymousAuthHeader() {
988
+ if (!this.anonymousAuthProvider)
989
+ return null;
990
+ try {
991
+ const token = await this.anonymousAuthProvider();
992
+ return token ? `Bearer ${token}` : null;
993
+ }
994
+ catch (error) {
995
+ this.logger.debug('Anonymous auth provider failed; sending the request anonymous:', error);
996
+ return null;
997
+ }
998
+ }
950
999
  async refreshAccessToken(reason) {
951
1000
  if (!this.authRefreshHandler) {
952
1001
  return null;
@@ -1049,26 +1098,22 @@ export class HttpService {
1049
1098
  if (!token) {
1050
1099
  return false;
1051
1100
  }
1052
- try {
1053
- const decoded = jwtDecode(token);
1054
- return typeof decoded.exp === 'number' && decoded.exp <= Math.floor(Date.now() / 1000);
1055
- }
1056
- catch {
1057
- return false;
1058
- }
1101
+ const exp = decodeTokenClaims(token)?.exp;
1102
+ return typeof exp === 'number' && exp <= Math.floor(Date.now() / 1000);
1059
1103
  }
1060
1104
  /**
1061
- * PROCESS-WIDE single-flight for the rotating device-secret mint
1105
+ * PROCESS-WIDE single-flight for the device-secret mint
1062
1106
  * (`POST /session/device/token`).
1063
1107
  *
1064
- * The server rotates the presented `deviceSecret` on every successful mint, so
1065
- * two concurrent mints would double-rotate and the durable store could end up
1066
- * holding a superseded secret → a later cold-boot mint 401s → the user is
1067
- * signed out. Every mint lane (the re-mint handler behind `refreshAccessToken`,
1068
- * the device-first cold boot, the socket token transport, the tab-focus
1069
- * reconcile) funnels its `refreshDeviceSecretArm` call through here, so
1070
- * concurrent callers await the SAME in-flight mint and all receive its result —
1071
- * exactly one server rotation.
1108
+ * The server does not rotate the presented `deviceSecret` (it echoes it back
1109
+ * as `nextDeviceSecret`; each holder of a shared DeviceSession has its own
1110
+ * stable credential), so this is no longer what keeps the store's secret
1111
+ * valid. It still collapses concurrent callers onto one request and one
1112
+ * persisted write. Every mint lane (the re-mint handler behind
1113
+ * `refreshAccessToken`, the device-first cold boot, the socket token
1114
+ * transport, the tab-focus reconcile) funnels its `refreshDeviceSecretArm`
1115
+ * call through here, so concurrent callers await the SAME in-flight mint and
1116
+ * all receive its result.
1072
1117
  *
1073
1118
  * Distinct from {@link tokenRefreshPromise} (which dedups the FULL re-mint
1074
1119
  * handler incl. the native shared-key arm + the failure cooldown): this inner
@@ -1165,7 +1210,9 @@ export class HttpService {
1165
1210
  // Authentication is owned by this SDK instance. A caller cannot replace
1166
1211
  // the bearer with a different session or leak one across linked apps.
1167
1212
  headers.set('Authorization', authHeader);
1168
- const edgeRegionHeader = await getBrowserEdgeRegionHeader();
1213
+ // Never awaited: the PoP is a hint, and waiting on its trace fetch put up
1214
+ // to a second in front of requests.
1215
+ const edgeRegionHeader = peekBrowserEdgeRegionHeader();
1169
1216
  for (const [name, value] of Object.entries(edgeRegionHeader))
1170
1217
  headers.set(name, value);
1171
1218
  const activityIdHeader = getBrowserActivityIdHeader();
@@ -1255,6 +1302,16 @@ export class HttpService {
1255
1302
  setAccessTokenProvider(provider) {
1256
1303
  this.accessTokenProvider = provider;
1257
1304
  }
1305
+ /**
1306
+ * Authenticate requests that carry no user session with the bearer this
1307
+ * provider returns — in practice a backend's own service token (see
1308
+ * `OxyConfig.serviceIdentity`). A user session always wins: the provider is
1309
+ * consulted only when there is no access token, and never for `skipAuth`
1310
+ * requests. `null` removes it.
1311
+ */
1312
+ setAnonymousAuthProvider(provider) {
1313
+ this.anonymousAuthProvider = provider;
1314
+ }
1258
1315
  clearTokens() {
1259
1316
  this.tokenStore.clearTokens();
1260
1317
  // Drop the response cache on logout. The cache is identity-scoped, so a
@@ -1331,13 +1388,7 @@ export class HttpService {
1331
1388
  * identity-scoped variant `<key> id=*`.
1332
1389
  */
1333
1390
  clearCacheEntry(key) {
1334
- this.cache.delete(key);
1335
- const identityVariantPrefix = `${key}${HttpService.CACHE_IDENTITY_DELIM}`;
1336
- for (const existing of this.cache.keys()) {
1337
- if (existing.startsWith(identityVariantPrefix)) {
1338
- this.cache.delete(existing);
1339
- }
1340
- }
1391
+ this.invalidateCache({ keys: [key] });
1341
1392
  }
1342
1393
  /**
1343
1394
  * Delete every cache entry whose key starts with `prefix`.
@@ -1348,14 +1399,40 @@ export class HttpService {
1348
1399
  * deleted entries (for observability in tests).
1349
1400
  */
1350
1401
  clearCacheByPrefix(prefix) {
1351
- let removed = 0;
1352
- for (const key of this.cache.keys()) {
1353
- if (key.startsWith(prefix)) {
1354
- this.cache.delete(key);
1355
- removed++;
1402
+ return this.invalidateCache({ prefixes: [prefix] });
1403
+ }
1404
+ /**
1405
+ * Invalidate a set of LOGICAL keys (each with every identity-scoped variant,
1406
+ * see `clearCacheEntry`) and key prefixes in ONE pass over the cache. A
1407
+ * mutation touching many resources (a bulk follow) costs one scan, not one
1408
+ * per resource.
1409
+ * @returns Number of entries deleted
1410
+ */
1411
+ invalidateCache({ keys = [], prefixes = [] }) {
1412
+ if (keys.length === 0 && prefixes.length === 0)
1413
+ return 0;
1414
+ const exact = new Set(keys);
1415
+ const delim = HttpService.CACHE_IDENTITY_DELIM;
1416
+ return this.cache.deleteWhere((stored) => {
1417
+ const cut = stored.lastIndexOf(delim);
1418
+ if (exact.has(cut === -1 ? stored : stored.slice(0, cut)))
1419
+ return true;
1420
+ for (const prefix of prefixes) {
1421
+ if (stored.startsWith(prefix))
1422
+ return true;
1356
1423
  }
1357
- }
1358
- return removed;
1424
+ return false;
1425
+ });
1426
+ }
1427
+ /**
1428
+ * Release this client: its response cache leaves the global cleanup sweep and
1429
+ * is emptied, pending shared calls are forgotten, and the session ends.
1430
+ */
1431
+ dispose() {
1432
+ unregisterCacheFromCleanup(this.cache);
1433
+ this.cache.clear();
1434
+ this.deduplicator.clear();
1435
+ this.endSession();
1359
1436
  }
1360
1437
  getCacheStats() {
1361
1438
  const cacheStats = this.cache.getStats();
@@ -1,3 +1,4 @@
1
+ import { handleHttpError } from './utils/errorUtils.js';
1
2
  /**
2
3
  * Custom error types for better error handling
3
4
  */
@@ -112,3 +113,47 @@ export class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
112
113
  this.name = 'OxyAuthenticationTimeoutError';
113
114
  }
114
115
  }
116
+ /**
117
+ * The one error every `OxyServices` call rejects with.
118
+ *
119
+ * `status` is the HTTP status (0 when no response arrived: a network failure,
120
+ * a timeout or a cancellation), `code` the API's machine code when it sent one
121
+ * (else a transport code such as `TIMEOUT`, `NETWORK_ERROR`, `CANCELLED`), and
122
+ * `details` the API's structured detail. The original error is `cause`.
123
+ */
124
+ export class OxyApiError extends Error {
125
+ constructor(message, init) {
126
+ super(message);
127
+ this.name = 'OxyApiError';
128
+ this.status = init.status;
129
+ this.code = init.code;
130
+ this.details = init.details;
131
+ this.response = init.response;
132
+ this.cancelled = init.cancelled ?? false;
133
+ this.timeout = init.timeout ?? false;
134
+ if (init.cause !== undefined) {
135
+ this.cause = init.cause;
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * Normalise anything a request rejected with into an `OxyApiError`. An error
141
+ * that already is one (or a typed SDK error such as `OxyAuthenticationError`)
142
+ * passes through unchanged.
143
+ */
144
+ export function toOxyApiError(error) {
145
+ if (error instanceof OxyApiError || error instanceof OxyAuthenticationError) {
146
+ return error;
147
+ }
148
+ const api = handleHttpError(error);
149
+ const source = (error && typeof error === 'object' ? error : {});
150
+ return new OxyApiError(api.message?.trim() || 'An unexpected error occurred', {
151
+ status: api.status,
152
+ code: api.code,
153
+ details: api.details,
154
+ response: source.response,
155
+ cancelled: source.cancelled === true,
156
+ timeout: source.timeout === true,
157
+ cause: error,
158
+ });
159
+ }