@lifi/perps-sdk 0.0.0-preview-64fca0d

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 (675) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cjs/client/PerpsClient.d.ts +63 -0
  3. package/dist/cjs/client/PerpsClient.d.ts.map +1 -0
  4. package/dist/cjs/client/PerpsClient.js +269 -0
  5. package/dist/cjs/client/PerpsClient.js.map +1 -0
  6. package/dist/cjs/client/bindProvider.d.ts +3 -0
  7. package/dist/cjs/client/bindProvider.d.ts.map +1 -0
  8. package/dist/cjs/client/bindProvider.js +9 -0
  9. package/dist/cjs/client/bindProvider.js.map +1 -0
  10. package/dist/cjs/client/createPerpsClient.d.ts +10 -0
  11. package/dist/cjs/client/createPerpsClient.d.ts.map +1 -0
  12. package/dist/cjs/client/createPerpsClient.js +54 -0
  13. package/dist/cjs/client/createPerpsClient.js.map +1 -0
  14. package/dist/cjs/client/requireProvider.d.ts +3 -0
  15. package/dist/cjs/client/requireProvider.d.ts.map +1 -0
  16. package/dist/cjs/client/requireProvider.js +16 -0
  17. package/dist/cjs/client/requireProvider.js.map +1 -0
  18. package/dist/cjs/errors/PerpsError.d.ts +8 -0
  19. package/dist/cjs/errors/PerpsError.d.ts.map +1 -0
  20. package/dist/cjs/errors/PerpsError.js +15 -0
  21. package/dist/cjs/errors/PerpsError.js.map +1 -0
  22. package/dist/cjs/errors/constants.d.ts +5 -0
  23. package/dist/cjs/errors/constants.d.ts.map +1 -0
  24. package/dist/cjs/errors/constants.js +9 -0
  25. package/dist/cjs/errors/constants.js.map +1 -0
  26. package/dist/cjs/index.d.ts +78 -0
  27. package/dist/cjs/index.d.ts.map +1 -0
  28. package/dist/cjs/index.js +168 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/package.json +1 -0
  31. package/dist/cjs/registry/assetRegistry.d.ts +11 -0
  32. package/dist/cjs/registry/assetRegistry.d.ts.map +1 -0
  33. package/dist/cjs/registry/assetRegistry.js +39 -0
  34. package/dist/cjs/registry/assetRegistry.js.map +1 -0
  35. package/dist/cjs/registry/marketRegistry.d.ts +13 -0
  36. package/dist/cjs/registry/marketRegistry.d.ts.map +1 -0
  37. package/dist/cjs/registry/marketRegistry.js +58 -0
  38. package/dist/cjs/registry/marketRegistry.js.map +1 -0
  39. package/dist/cjs/registry/referenceDataRegistry.d.ts +20 -0
  40. package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -0
  41. package/dist/cjs/registry/referenceDataRegistry.js +59 -0
  42. package/dist/cjs/registry/referenceDataRegistry.js.map +1 -0
  43. package/dist/cjs/services/createAction.d.ts +13 -0
  44. package/dist/cjs/services/createAction.d.ts.map +1 -0
  45. package/dist/cjs/services/createAction.js +17 -0
  46. package/dist/cjs/services/createAction.js.map +1 -0
  47. package/dist/cjs/services/executeAction.d.ts +13 -0
  48. package/dist/cjs/services/executeAction.d.ts.map +1 -0
  49. package/dist/cjs/services/executeAction.js +18 -0
  50. package/dist/cjs/services/executeAction.js.map +1 -0
  51. package/dist/cjs/services/getAccount.d.ts +10 -0
  52. package/dist/cjs/services/getAccount.d.ts.map +1 -0
  53. package/dist/cjs/services/getAccount.js +8 -0
  54. package/dist/cjs/services/getAccount.js.map +1 -0
  55. package/dist/cjs/services/getActivity.d.ts +15 -0
  56. package/dist/cjs/services/getActivity.d.ts.map +1 -0
  57. package/dist/cjs/services/getActivity.js +15 -0
  58. package/dist/cjs/services/getActivity.js.map +1 -0
  59. package/dist/cjs/services/getAssets.d.ts +8 -0
  60. package/dist/cjs/services/getAssets.d.ts.map +1 -0
  61. package/dist/cjs/services/getAssets.js +11 -0
  62. package/dist/cjs/services/getAssets.js.map +1 -0
  63. package/dist/cjs/services/getFills.d.ts +14 -0
  64. package/dist/cjs/services/getFills.d.ts.map +1 -0
  65. package/dist/cjs/services/getFills.js +14 -0
  66. package/dist/cjs/services/getFills.js.map +1 -0
  67. package/dist/cjs/services/getMarket.d.ts +9 -0
  68. package/dist/cjs/services/getMarket.d.ts.map +1 -0
  69. package/dist/cjs/services/getMarket.js +13 -0
  70. package/dist/cjs/services/getMarket.js.map +1 -0
  71. package/dist/cjs/services/getMarkets.d.ts +9 -0
  72. package/dist/cjs/services/getMarkets.d.ts.map +1 -0
  73. package/dist/cjs/services/getMarkets.js +12 -0
  74. package/dist/cjs/services/getMarkets.js.map +1 -0
  75. package/dist/cjs/services/getMeta.d.ts +5 -0
  76. package/dist/cjs/services/getMeta.d.ts.map +1 -0
  77. package/dist/cjs/services/getMeta.js +8 -0
  78. package/dist/cjs/services/getMeta.js.map +1 -0
  79. package/dist/cjs/services/getOhlcv.d.ts +13 -0
  80. package/dist/cjs/services/getOhlcv.d.ts.map +1 -0
  81. package/dist/cjs/services/getOhlcv.js +16 -0
  82. package/dist/cjs/services/getOhlcv.js.map +1 -0
  83. package/dist/cjs/services/getOrder.d.ts +11 -0
  84. package/dist/cjs/services/getOrder.d.ts.map +1 -0
  85. package/dist/cjs/services/getOrder.js +8 -0
  86. package/dist/cjs/services/getOrder.js.map +1 -0
  87. package/dist/cjs/services/getOrderbook.d.ts +10 -0
  88. package/dist/cjs/services/getOrderbook.d.ts.map +1 -0
  89. package/dist/cjs/services/getOrderbook.js +13 -0
  90. package/dist/cjs/services/getOrderbook.js.map +1 -0
  91. package/dist/cjs/services/getOrders.d.ts +13 -0
  92. package/dist/cjs/services/getOrders.d.ts.map +1 -0
  93. package/dist/cjs/services/getOrders.js +13 -0
  94. package/dist/cjs/services/getOrders.js.map +1 -0
  95. package/dist/cjs/services/getPositions.d.ts +13 -0
  96. package/dist/cjs/services/getPositions.d.ts.map +1 -0
  97. package/dist/cjs/services/getPositions.js +13 -0
  98. package/dist/cjs/services/getPositions.js.map +1 -0
  99. package/dist/cjs/services/getPrices.d.ts +9 -0
  100. package/dist/cjs/services/getPrices.d.ts.map +1 -0
  101. package/dist/cjs/services/getPrices.js +12 -0
  102. package/dist/cjs/services/getPrices.js.map +1 -0
  103. package/dist/cjs/services/getProviders.d.ts +5 -0
  104. package/dist/cjs/services/getProviders.d.ts.map +1 -0
  105. package/dist/cjs/services/getProviders.js +8 -0
  106. package/dist/cjs/services/getProviders.js.map +1 -0
  107. package/dist/cjs/services/getQuote.d.ts +12 -0
  108. package/dist/cjs/services/getQuote.d.ts.map +1 -0
  109. package/dist/cjs/services/getQuote.js +13 -0
  110. package/dist/cjs/services/getQuote.js.map +1 -0
  111. package/dist/cjs/services/getTermsAcceptance.d.ts +6 -0
  112. package/dist/cjs/services/getTermsAcceptance.d.ts.map +1 -0
  113. package/dist/cjs/services/getTermsAcceptance.js +9 -0
  114. package/dist/cjs/services/getTermsAcceptance.js.map +1 -0
  115. package/dist/cjs/services/resolveQuote.d.ts +6 -0
  116. package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
  117. package/dist/cjs/services/resolveQuote.js +36 -0
  118. package/dist/cjs/services/resolveQuote.js.map +1 -0
  119. package/dist/cjs/services/resolveSubscribeQuote.d.ts +6 -0
  120. package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -0
  121. package/dist/cjs/services/resolveSubscribeQuote.js +63 -0
  122. package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -0
  123. package/dist/cjs/storage/parseStoredRecord.d.ts +4 -0
  124. package/dist/cjs/storage/parseStoredRecord.d.ts.map +1 -0
  125. package/dist/cjs/storage/parseStoredRecord.js +26 -0
  126. package/dist/cjs/storage/parseStoredRecord.js.map +1 -0
  127. package/dist/cjs/storage/storage.d.ts +4 -0
  128. package/dist/cjs/storage/storage.d.ts.map +1 -0
  129. package/dist/cjs/storage/storage.js +47 -0
  130. package/dist/cjs/storage/storage.js.map +1 -0
  131. package/dist/cjs/storage/types.d.ts +6 -0
  132. package/dist/cjs/storage/types.d.ts.map +1 -0
  133. package/dist/cjs/storage/types.js +3 -0
  134. package/dist/cjs/storage/types.js.map +1 -0
  135. package/dist/cjs/transport/fetchWithRetry.d.ts +8 -0
  136. package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -0
  137. package/dist/cjs/transport/fetchWithRetry.js +81 -0
  138. package/dist/cjs/transport/fetchWithRetry.js.map +1 -0
  139. package/dist/cjs/transport/request.d.ts +8 -0
  140. package/dist/cjs/transport/request.d.ts.map +1 -0
  141. package/dist/cjs/transport/request.js +75 -0
  142. package/dist/cjs/transport/request.js.map +1 -0
  143. package/dist/cjs/transport/retryPolicy.d.ts +37 -0
  144. package/dist/cjs/transport/retryPolicy.d.ts.map +1 -0
  145. package/dist/cjs/transport/retryPolicy.js +79 -0
  146. package/dist/cjs/transport/retryPolicy.js.map +1 -0
  147. package/dist/cjs/types/api.d.ts +85 -0
  148. package/dist/cjs/types/api.d.ts.map +1 -0
  149. package/dist/cjs/types/api.js +3 -0
  150. package/dist/cjs/types/api.js.map +1 -0
  151. package/dist/cjs/types/config.d.ts +26 -0
  152. package/dist/cjs/types/config.d.ts.map +1 -0
  153. package/dist/cjs/types/config.js +3 -0
  154. package/dist/cjs/types/config.js.map +1 -0
  155. package/dist/cjs/types/provider.d.ts +84 -0
  156. package/dist/cjs/types/provider.d.ts.map +1 -0
  157. package/dist/cjs/types/provider.js +3 -0
  158. package/dist/cjs/types/provider.js.map +1 -0
  159. package/dist/cjs/utils/accountSummary.d.ts +3 -0
  160. package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
  161. package/dist/cjs/utils/accountSummary.js +25 -0
  162. package/dist/cjs/utils/accountSummary.js.map +1 -0
  163. package/dist/cjs/utils/assertNever.d.ts +2 -0
  164. package/dist/cjs/utils/assertNever.d.ts.map +1 -0
  165. package/dist/cjs/utils/assertNever.js +7 -0
  166. package/dist/cjs/utils/assertNever.js.map +1 -0
  167. package/dist/cjs/utils/calculations.d.ts +51 -0
  168. package/dist/cjs/utils/calculations.d.ts.map +1 -0
  169. package/dist/cjs/utils/calculations.js +149 -0
  170. package/dist/cjs/utils/calculations.js.map +1 -0
  171. package/dist/cjs/utils/depositChain.d.ts +6 -0
  172. package/dist/cjs/utils/depositChain.d.ts.map +1 -0
  173. package/dist/cjs/utils/depositChain.js +13 -0
  174. package/dist/cjs/utils/depositChain.js.map +1 -0
  175. package/dist/cjs/utils/explorer.d.ts +9 -0
  176. package/dist/cjs/utils/explorer.d.ts.map +1 -0
  177. package/dist/cjs/utils/explorer.js +23 -0
  178. package/dist/cjs/utils/explorer.js.map +1 -0
  179. package/dist/cjs/utils/fillClassification.d.ts +3 -0
  180. package/dist/cjs/utils/fillClassification.d.ts.map +1 -0
  181. package/dist/cjs/utils/fillClassification.js +37 -0
  182. package/dist/cjs/utils/fillClassification.js.map +1 -0
  183. package/dist/cjs/utils/format.d.ts +13 -0
  184. package/dist/cjs/utils/format.d.ts.map +1 -0
  185. package/dist/cjs/utils/format.js +117 -0
  186. package/dist/cjs/utils/format.js.map +1 -0
  187. package/dist/cjs/utils/orderClassification.d.ts +10 -0
  188. package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
  189. package/dist/cjs/utils/orderClassification.js +49 -0
  190. package/dist/cjs/utils/orderClassification.js.map +1 -0
  191. package/dist/cjs/utils/orderMath.d.ts +6 -0
  192. package/dist/cjs/utils/orderMath.d.ts.map +1 -0
  193. package/dist/cjs/utils/orderMath.js +71 -0
  194. package/dist/cjs/utils/orderMath.js.map +1 -0
  195. package/dist/cjs/utils/parse.d.ts +2 -0
  196. package/dist/cjs/utils/parse.d.ts.map +1 -0
  197. package/dist/cjs/utils/parse.js +14 -0
  198. package/dist/cjs/utils/parse.js.map +1 -0
  199. package/dist/cjs/utils/positionMath.d.ts +32 -0
  200. package/dist/cjs/utils/positionMath.d.ts.map +1 -0
  201. package/dist/cjs/utils/positionMath.js +52 -0
  202. package/dist/cjs/utils/positionMath.js.map +1 -0
  203. package/dist/cjs/utils/signTypedData.d.ts +5 -0
  204. package/dist/cjs/utils/signTypedData.d.ts.map +1 -0
  205. package/dist/cjs/utils/signTypedData.js +23 -0
  206. package/dist/cjs/utils/signTypedData.js.map +1 -0
  207. package/dist/cjs/utils/sleep.d.ts +2 -0
  208. package/dist/cjs/utils/sleep.d.ts.map +1 -0
  209. package/dist/cjs/utils/sleep.js +6 -0
  210. package/dist/cjs/utils/sleep.js.map +1 -0
  211. package/dist/cjs/utils/units.d.ts +3 -0
  212. package/dist/cjs/utils/units.d.ts.map +1 -0
  213. package/dist/cjs/utils/units.js +18 -0
  214. package/dist/cjs/utils/units.js.map +1 -0
  215. package/dist/cjs/utils/validation.d.ts +2 -0
  216. package/dist/cjs/utils/validation.d.ts.map +1 -0
  217. package/dist/cjs/utils/validation.js +16 -0
  218. package/dist/cjs/utils/validation.js.map +1 -0
  219. package/dist/cjs/version.d.ts +3 -0
  220. package/dist/cjs/version.d.ts.map +1 -0
  221. package/dist/cjs/version.js +6 -0
  222. package/dist/cjs/version.js.map +1 -0
  223. package/dist/cjs/websocket/PerpsWsClient.d.ts +27 -0
  224. package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -0
  225. package/dist/cjs/websocket/PerpsWsClient.js +84 -0
  226. package/dist/cjs/websocket/PerpsWsClient.js.map +1 -0
  227. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts +52 -0
  228. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  229. package/dist/cjs/websocket/ReconnectingWebSocket.js +213 -0
  230. package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -0
  231. package/dist/cjs/websocket/WsProviderBase.d.ts +31 -0
  232. package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -0
  233. package/dist/cjs/websocket/WsProviderBase.js +197 -0
  234. package/dist/cjs/websocket/WsProviderBase.js.map +1 -0
  235. package/dist/cjs/websocket/cachePromise.d.ts +2 -0
  236. package/dist/cjs/websocket/cachePromise.d.ts.map +1 -0
  237. package/dist/cjs/websocket/cachePromise.js +18 -0
  238. package/dist/cjs/websocket/cachePromise.js.map +1 -0
  239. package/dist/cjs/websocket/types.d.ts +15 -0
  240. package/dist/cjs/websocket/types.d.ts.map +1 -0
  241. package/dist/cjs/websocket/types.js +3 -0
  242. package/dist/cjs/websocket/types.js.map +1 -0
  243. package/dist/cjs/websocket/wsLog.d.ts +10 -0
  244. package/dist/cjs/websocket/wsLog.d.ts.map +1 -0
  245. package/dist/cjs/websocket/wsLog.js +31 -0
  246. package/dist/cjs/websocket/wsLog.js.map +1 -0
  247. package/dist/esm/client/PerpsClient.d.ts +285 -0
  248. package/dist/esm/client/PerpsClient.d.ts.map +1 -0
  249. package/dist/esm/client/PerpsClient.js +498 -0
  250. package/dist/esm/client/PerpsClient.js.map +1 -0
  251. package/dist/esm/client/bindProvider.d.ts +13 -0
  252. package/dist/esm/client/bindProvider.d.ts.map +1 -0
  253. package/dist/esm/client/bindProvider.js +16 -0
  254. package/dist/esm/client/bindProvider.js.map +1 -0
  255. package/dist/esm/client/createPerpsClient.d.ts +37 -0
  256. package/dist/esm/client/createPerpsClient.d.ts.map +1 -0
  257. package/dist/esm/client/createPerpsClient.js +76 -0
  258. package/dist/esm/client/createPerpsClient.js.map +1 -0
  259. package/dist/esm/client/requireProvider.d.ts +12 -0
  260. package/dist/esm/client/requireProvider.d.ts.map +1 -0
  261. package/dist/esm/client/requireProvider.js +22 -0
  262. package/dist/esm/client/requireProvider.js.map +1 -0
  263. package/dist/esm/errors/PerpsError.d.ts +16 -0
  264. package/dist/esm/errors/PerpsError.d.ts.map +1 -0
  265. package/dist/esm/errors/PerpsError.js +19 -0
  266. package/dist/esm/errors/PerpsError.js.map +1 -0
  267. package/dist/esm/errors/constants.d.ts +11 -0
  268. package/dist/esm/errors/constants.d.ts.map +1 -0
  269. package/dist/esm/errors/constants.js +12 -0
  270. package/dist/esm/errors/constants.js.map +1 -0
  271. package/dist/esm/index.d.ts +86 -0
  272. package/dist/esm/index.d.ts.map +1 -0
  273. package/dist/esm/index.js +63 -0
  274. package/dist/esm/index.js.map +1 -0
  275. package/dist/esm/package.json +1 -0
  276. package/dist/esm/registry/assetRegistry.d.ts +25 -0
  277. package/dist/esm/registry/assetRegistry.d.ts.map +1 -0
  278. package/dist/esm/registry/assetRegistry.js +48 -0
  279. package/dist/esm/registry/assetRegistry.js.map +1 -0
  280. package/dist/esm/registry/marketRegistry.d.ts +42 -0
  281. package/dist/esm/registry/marketRegistry.d.ts.map +1 -0
  282. package/dist/esm/registry/marketRegistry.js +81 -0
  283. package/dist/esm/registry/marketRegistry.js.map +1 -0
  284. package/dist/esm/registry/referenceDataRegistry.d.ts +44 -0
  285. package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -0
  286. package/dist/esm/registry/referenceDataRegistry.js +79 -0
  287. package/dist/esm/registry/referenceDataRegistry.js.map +1 -0
  288. package/dist/esm/services/createAction.d.ts +26 -0
  289. package/dist/esm/services/createAction.d.ts.map +1 -0
  290. package/dist/esm/services/createAction.js +22 -0
  291. package/dist/esm/services/createAction.js.map +1 -0
  292. package/dist/esm/services/executeAction.d.ts +26 -0
  293. package/dist/esm/services/executeAction.d.ts.map +1 -0
  294. package/dist/esm/services/executeAction.js +26 -0
  295. package/dist/esm/services/executeAction.js.map +1 -0
  296. package/dist/esm/services/getAccount.d.ts +35 -0
  297. package/dist/esm/services/getAccount.d.ts.map +1 -0
  298. package/dist/esm/services/getAccount.js +25 -0
  299. package/dist/esm/services/getAccount.js.map +1 -0
  300. package/dist/esm/services/getActivity.d.ts +39 -0
  301. package/dist/esm/services/getActivity.d.ts.map +1 -0
  302. package/dist/esm/services/getActivity.js +29 -0
  303. package/dist/esm/services/getActivity.js.map +1 -0
  304. package/dist/esm/services/getAssets.d.ts +27 -0
  305. package/dist/esm/services/getAssets.d.ts.map +1 -0
  306. package/dist/esm/services/getAssets.js +22 -0
  307. package/dist/esm/services/getAssets.js.map +1 -0
  308. package/dist/esm/services/getFills.d.ts +38 -0
  309. package/dist/esm/services/getFills.d.ts.map +1 -0
  310. package/dist/esm/services/getFills.js +28 -0
  311. package/dist/esm/services/getFills.js.map +1 -0
  312. package/dist/esm/services/getMarket.d.ts +34 -0
  313. package/dist/esm/services/getMarket.d.ts.map +1 -0
  314. package/dist/esm/services/getMarket.js +25 -0
  315. package/dist/esm/services/getMarket.js.map +1 -0
  316. package/dist/esm/services/getMarkets.d.ts +28 -0
  317. package/dist/esm/services/getMarkets.d.ts.map +1 -0
  318. package/dist/esm/services/getMarkets.js +22 -0
  319. package/dist/esm/services/getMarkets.js.map +1 -0
  320. package/dist/esm/services/getMeta.d.ts +21 -0
  321. package/dist/esm/services/getMeta.d.ts.map +1 -0
  322. package/dist/esm/services/getMeta.js +21 -0
  323. package/dist/esm/services/getMeta.js.map +1 -0
  324. package/dist/esm/services/getOhlcv.d.ts +36 -0
  325. package/dist/esm/services/getOhlcv.d.ts.map +1 -0
  326. package/dist/esm/services/getOhlcv.js +28 -0
  327. package/dist/esm/services/getOhlcv.js.map +1 -0
  328. package/dist/esm/services/getOrder.d.ts +33 -0
  329. package/dist/esm/services/getOrder.d.ts.map +1 -0
  330. package/dist/esm/services/getOrder.js +22 -0
  331. package/dist/esm/services/getOrder.js.map +1 -0
  332. package/dist/esm/services/getOrderbook.d.ts +24 -0
  333. package/dist/esm/services/getOrderbook.d.ts.map +1 -0
  334. package/dist/esm/services/getOrderbook.js +17 -0
  335. package/dist/esm/services/getOrderbook.js.map +1 -0
  336. package/dist/esm/services/getOrders.d.ts +35 -0
  337. package/dist/esm/services/getOrders.d.ts.map +1 -0
  338. package/dist/esm/services/getOrders.js +26 -0
  339. package/dist/esm/services/getOrders.js.map +1 -0
  340. package/dist/esm/services/getPositions.d.ts +35 -0
  341. package/dist/esm/services/getPositions.d.ts.map +1 -0
  342. package/dist/esm/services/getPositions.js +26 -0
  343. package/dist/esm/services/getPositions.js.map +1 -0
  344. package/dist/esm/services/getPrices.d.ts +21 -0
  345. package/dist/esm/services/getPrices.d.ts.map +1 -0
  346. package/dist/esm/services/getPrices.js +15 -0
  347. package/dist/esm/services/getPrices.js.map +1 -0
  348. package/dist/esm/services/getProviders.d.ts +22 -0
  349. package/dist/esm/services/getProviders.d.ts.map +1 -0
  350. package/dist/esm/services/getProviders.js +22 -0
  351. package/dist/esm/services/getProviders.js.map +1 -0
  352. package/dist/esm/services/getQuote.d.ts +42 -0
  353. package/dist/esm/services/getQuote.d.ts.map +1 -0
  354. package/dist/esm/services/getQuote.js +33 -0
  355. package/dist/esm/services/getQuote.js.map +1 -0
  356. package/dist/esm/services/getTermsAcceptance.d.ts +26 -0
  357. package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
  358. package/dist/esm/services/getTermsAcceptance.js +26 -0
  359. package/dist/esm/services/getTermsAcceptance.js.map +1 -0
  360. package/dist/esm/services/resolveQuote.d.ts +26 -0
  361. package/dist/esm/services/resolveQuote.d.ts.map +1 -0
  362. package/dist/esm/services/resolveQuote.js +52 -0
  363. package/dist/esm/services/resolveQuote.js.map +1 -0
  364. package/dist/esm/services/resolveSubscribeQuote.d.ts +31 -0
  365. package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -0
  366. package/dist/esm/services/resolveSubscribeQuote.js +84 -0
  367. package/dist/esm/services/resolveSubscribeQuote.js.map +1 -0
  368. package/dist/esm/storage/parseStoredRecord.d.ts +29 -0
  369. package/dist/esm/storage/parseStoredRecord.d.ts.map +1 -0
  370. package/dist/esm/storage/parseStoredRecord.js +47 -0
  371. package/dist/esm/storage/parseStoredRecord.js.map +1 -0
  372. package/dist/esm/storage/storage.d.ts +15 -0
  373. package/dist/esm/storage/storage.d.ts.map +1 -0
  374. package/dist/esm/storage/storage.js +56 -0
  375. package/dist/esm/storage/storage.js.map +1 -0
  376. package/dist/esm/storage/types.d.ts +14 -0
  377. package/dist/esm/storage/types.d.ts.map +1 -0
  378. package/dist/esm/storage/types.js +2 -0
  379. package/dist/esm/storage/types.js.map +1 -0
  380. package/dist/esm/transport/fetchWithRetry.d.ts +22 -0
  381. package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -0
  382. package/dist/esm/transport/fetchWithRetry.js +87 -0
  383. package/dist/esm/transport/fetchWithRetry.js.map +1 -0
  384. package/dist/esm/transport/request.d.ts +25 -0
  385. package/dist/esm/transport/request.d.ts.map +1 -0
  386. package/dist/esm/transport/request.js +82 -0
  387. package/dist/esm/transport/request.js.map +1 -0
  388. package/dist/esm/transport/retryPolicy.d.ts +106 -0
  389. package/dist/esm/transport/retryPolicy.d.ts.map +1 -0
  390. package/dist/esm/transport/retryPolicy.js +99 -0
  391. package/dist/esm/transport/retryPolicy.js.map +1 -0
  392. package/dist/esm/types/api.d.ts +214 -0
  393. package/dist/esm/types/api.d.ts.map +1 -0
  394. package/dist/esm/types/api.js +2 -0
  395. package/dist/esm/types/api.js.map +1 -0
  396. package/dist/esm/types/config.d.ts +70 -0
  397. package/dist/esm/types/config.d.ts.map +1 -0
  398. package/dist/esm/types/config.js +2 -0
  399. package/dist/esm/types/config.js.map +1 -0
  400. package/dist/esm/types/provider.d.ts +330 -0
  401. package/dist/esm/types/provider.d.ts.map +1 -0
  402. package/dist/esm/types/provider.js +2 -0
  403. package/dist/esm/types/provider.js.map +1 -0
  404. package/dist/esm/utils/accountSummary.d.ts +13 -0
  405. package/dist/esm/utils/accountSummary.d.ts.map +1 -0
  406. package/dist/esm/utils/accountSummary.js +32 -0
  407. package/dist/esm/utils/accountSummary.js.map +1 -0
  408. package/dist/esm/utils/assertNever.d.ts +20 -0
  409. package/dist/esm/utils/assertNever.d.ts.map +1 -0
  410. package/dist/esm/utils/assertNever.js +22 -0
  411. package/dist/esm/utils/assertNever.js.map +1 -0
  412. package/dist/esm/utils/calculations.d.ts +223 -0
  413. package/dist/esm/utils/calculations.d.ts.map +1 -0
  414. package/dist/esm/utils/calculations.js +291 -0
  415. package/dist/esm/utils/calculations.js.map +1 -0
  416. package/dist/esm/utils/depositChain.d.ts +25 -0
  417. package/dist/esm/utils/depositChain.d.ts.map +1 -0
  418. package/dist/esm/utils/depositChain.js +23 -0
  419. package/dist/esm/utils/depositChain.js.map +1 -0
  420. package/dist/esm/utils/explorer.d.ts +33 -0
  421. package/dist/esm/utils/explorer.d.ts.map +1 -0
  422. package/dist/esm/utils/explorer.js +38 -0
  423. package/dist/esm/utils/explorer.js.map +1 -0
  424. package/dist/esm/utils/fillClassification.d.ts +13 -0
  425. package/dist/esm/utils/fillClassification.d.ts.map +1 -0
  426. package/dist/esm/utils/fillClassification.js +44 -0
  427. package/dist/esm/utils/fillClassification.js.map +1 -0
  428. package/dist/esm/utils/format.d.ts +66 -0
  429. package/dist/esm/utils/format.d.ts.map +1 -0
  430. package/dist/esm/utils/format.js +171 -0
  431. package/dist/esm/utils/format.js.map +1 -0
  432. package/dist/esm/utils/orderClassification.d.ts +47 -0
  433. package/dist/esm/utils/orderClassification.d.ts.map +1 -0
  434. package/dist/esm/utils/orderClassification.js +78 -0
  435. package/dist/esm/utils/orderClassification.js.map +1 -0
  436. package/dist/esm/utils/orderMath.d.ts +44 -0
  437. package/dist/esm/utils/orderMath.d.ts.map +1 -0
  438. package/dist/esm/utils/orderMath.js +103 -0
  439. package/dist/esm/utils/orderMath.js.map +1 -0
  440. package/dist/esm/utils/parse.d.ts +22 -0
  441. package/dist/esm/utils/parse.d.ts.map +1 -0
  442. package/dist/esm/utils/parse.js +31 -0
  443. package/dist/esm/utils/parse.js.map +1 -0
  444. package/dist/esm/utils/positionMath.d.ts +107 -0
  445. package/dist/esm/utils/positionMath.d.ts.map +1 -0
  446. package/dist/esm/utils/positionMath.js +119 -0
  447. package/dist/esm/utils/positionMath.js.map +1 -0
  448. package/dist/esm/utils/signTypedData.d.ts +18 -0
  449. package/dist/esm/utils/signTypedData.d.ts.map +1 -0
  450. package/dist/esm/utils/signTypedData.js +32 -0
  451. package/dist/esm/utils/signTypedData.js.map +1 -0
  452. package/dist/esm/utils/sleep.d.ts +7 -0
  453. package/dist/esm/utils/sleep.d.ts.map +1 -0
  454. package/dist/esm/utils/sleep.js +7 -0
  455. package/dist/esm/utils/sleep.js.map +1 -0
  456. package/dist/esm/utils/units.d.ts +27 -0
  457. package/dist/esm/utils/units.d.ts.map +1 -0
  458. package/dist/esm/utils/units.js +38 -0
  459. package/dist/esm/utils/units.js.map +1 -0
  460. package/dist/esm/utils/validation.d.ts +18 -0
  461. package/dist/esm/utils/validation.d.ts.map +1 -0
  462. package/dist/esm/utils/validation.js +29 -0
  463. package/dist/esm/utils/validation.js.map +1 -0
  464. package/dist/esm/version.d.ts +3 -0
  465. package/dist/esm/version.d.ts.map +1 -0
  466. package/dist/esm/version.js +3 -0
  467. package/dist/esm/version.js.map +1 -0
  468. package/dist/esm/websocket/PerpsWsClient.d.ts +100 -0
  469. package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -0
  470. package/dist/esm/websocket/PerpsWsClient.js +121 -0
  471. package/dist/esm/websocket/PerpsWsClient.js.map +1 -0
  472. package/dist/esm/websocket/ReconnectingWebSocket.d.ts +130 -0
  473. package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  474. package/dist/esm/websocket/ReconnectingWebSocket.js +288 -0
  475. package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -0
  476. package/dist/esm/websocket/WsProviderBase.d.ts +89 -0
  477. package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -0
  478. package/dist/esm/websocket/WsProviderBase.js +246 -0
  479. package/dist/esm/websocket/WsProviderBase.js.map +1 -0
  480. package/dist/esm/websocket/cachePromise.d.ts +14 -0
  481. package/dist/esm/websocket/cachePromise.d.ts.map +1 -0
  482. package/dist/esm/websocket/cachePromise.js +27 -0
  483. package/dist/esm/websocket/cachePromise.js.map +1 -0
  484. package/dist/esm/websocket/types.d.ts +60 -0
  485. package/dist/esm/websocket/types.d.ts.map +1 -0
  486. package/dist/esm/websocket/types.js +2 -0
  487. package/dist/esm/websocket/types.js.map +1 -0
  488. package/dist/esm/websocket/wsLog.d.ts +50 -0
  489. package/dist/esm/websocket/wsLog.d.ts.map +1 -0
  490. package/dist/esm/websocket/wsLog.js +68 -0
  491. package/dist/esm/websocket/wsLog.js.map +1 -0
  492. package/dist/types/client/PerpsClient.d.ts +285 -0
  493. package/dist/types/client/PerpsClient.d.ts.map +1 -0
  494. package/dist/types/client/bindProvider.d.ts +13 -0
  495. package/dist/types/client/bindProvider.d.ts.map +1 -0
  496. package/dist/types/client/createPerpsClient.d.ts +37 -0
  497. package/dist/types/client/createPerpsClient.d.ts.map +1 -0
  498. package/dist/types/client/requireProvider.d.ts +12 -0
  499. package/dist/types/client/requireProvider.d.ts.map +1 -0
  500. package/dist/types/errors/PerpsError.d.ts +16 -0
  501. package/dist/types/errors/PerpsError.d.ts.map +1 -0
  502. package/dist/types/errors/constants.d.ts +11 -0
  503. package/dist/types/errors/constants.d.ts.map +1 -0
  504. package/dist/types/index.d.ts +86 -0
  505. package/dist/types/index.d.ts.map +1 -0
  506. package/dist/types/registry/assetRegistry.d.ts +25 -0
  507. package/dist/types/registry/assetRegistry.d.ts.map +1 -0
  508. package/dist/types/registry/marketRegistry.d.ts +42 -0
  509. package/dist/types/registry/marketRegistry.d.ts.map +1 -0
  510. package/dist/types/registry/referenceDataRegistry.d.ts +44 -0
  511. package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -0
  512. package/dist/types/services/createAction.d.ts +26 -0
  513. package/dist/types/services/createAction.d.ts.map +1 -0
  514. package/dist/types/services/executeAction.d.ts +26 -0
  515. package/dist/types/services/executeAction.d.ts.map +1 -0
  516. package/dist/types/services/getAccount.d.ts +35 -0
  517. package/dist/types/services/getAccount.d.ts.map +1 -0
  518. package/dist/types/services/getActivity.d.ts +39 -0
  519. package/dist/types/services/getActivity.d.ts.map +1 -0
  520. package/dist/types/services/getAssets.d.ts +27 -0
  521. package/dist/types/services/getAssets.d.ts.map +1 -0
  522. package/dist/types/services/getFills.d.ts +38 -0
  523. package/dist/types/services/getFills.d.ts.map +1 -0
  524. package/dist/types/services/getMarket.d.ts +34 -0
  525. package/dist/types/services/getMarket.d.ts.map +1 -0
  526. package/dist/types/services/getMarkets.d.ts +28 -0
  527. package/dist/types/services/getMarkets.d.ts.map +1 -0
  528. package/dist/types/services/getMeta.d.ts +21 -0
  529. package/dist/types/services/getMeta.d.ts.map +1 -0
  530. package/dist/types/services/getOhlcv.d.ts +36 -0
  531. package/dist/types/services/getOhlcv.d.ts.map +1 -0
  532. package/dist/types/services/getOrder.d.ts +33 -0
  533. package/dist/types/services/getOrder.d.ts.map +1 -0
  534. package/dist/types/services/getOrderbook.d.ts +24 -0
  535. package/dist/types/services/getOrderbook.d.ts.map +1 -0
  536. package/dist/types/services/getOrders.d.ts +35 -0
  537. package/dist/types/services/getOrders.d.ts.map +1 -0
  538. package/dist/types/services/getPositions.d.ts +35 -0
  539. package/dist/types/services/getPositions.d.ts.map +1 -0
  540. package/dist/types/services/getPrices.d.ts +21 -0
  541. package/dist/types/services/getPrices.d.ts.map +1 -0
  542. package/dist/types/services/getProviders.d.ts +22 -0
  543. package/dist/types/services/getProviders.d.ts.map +1 -0
  544. package/dist/types/services/getQuote.d.ts +42 -0
  545. package/dist/types/services/getQuote.d.ts.map +1 -0
  546. package/dist/types/services/getTermsAcceptance.d.ts +26 -0
  547. package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
  548. package/dist/types/services/resolveQuote.d.ts +26 -0
  549. package/dist/types/services/resolveQuote.d.ts.map +1 -0
  550. package/dist/types/services/resolveSubscribeQuote.d.ts +31 -0
  551. package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -0
  552. package/dist/types/storage/parseStoredRecord.d.ts +29 -0
  553. package/dist/types/storage/parseStoredRecord.d.ts.map +1 -0
  554. package/dist/types/storage/storage.d.ts +15 -0
  555. package/dist/types/storage/storage.d.ts.map +1 -0
  556. package/dist/types/storage/types.d.ts +14 -0
  557. package/dist/types/storage/types.d.ts.map +1 -0
  558. package/dist/types/transport/fetchWithRetry.d.ts +22 -0
  559. package/dist/types/transport/fetchWithRetry.d.ts.map +1 -0
  560. package/dist/types/transport/request.d.ts +25 -0
  561. package/dist/types/transport/request.d.ts.map +1 -0
  562. package/dist/types/transport/retryPolicy.d.ts +106 -0
  563. package/dist/types/transport/retryPolicy.d.ts.map +1 -0
  564. package/dist/types/types/api.d.ts +214 -0
  565. package/dist/types/types/api.d.ts.map +1 -0
  566. package/dist/types/types/config.d.ts +70 -0
  567. package/dist/types/types/config.d.ts.map +1 -0
  568. package/dist/types/types/provider.d.ts +330 -0
  569. package/dist/types/types/provider.d.ts.map +1 -0
  570. package/dist/types/utils/accountSummary.d.ts +13 -0
  571. package/dist/types/utils/accountSummary.d.ts.map +1 -0
  572. package/dist/types/utils/assertNever.d.ts +20 -0
  573. package/dist/types/utils/assertNever.d.ts.map +1 -0
  574. package/dist/types/utils/calculations.d.ts +223 -0
  575. package/dist/types/utils/calculations.d.ts.map +1 -0
  576. package/dist/types/utils/depositChain.d.ts +25 -0
  577. package/dist/types/utils/depositChain.d.ts.map +1 -0
  578. package/dist/types/utils/explorer.d.ts +33 -0
  579. package/dist/types/utils/explorer.d.ts.map +1 -0
  580. package/dist/types/utils/fillClassification.d.ts +13 -0
  581. package/dist/types/utils/fillClassification.d.ts.map +1 -0
  582. package/dist/types/utils/format.d.ts +66 -0
  583. package/dist/types/utils/format.d.ts.map +1 -0
  584. package/dist/types/utils/orderClassification.d.ts +47 -0
  585. package/dist/types/utils/orderClassification.d.ts.map +1 -0
  586. package/dist/types/utils/orderMath.d.ts +44 -0
  587. package/dist/types/utils/orderMath.d.ts.map +1 -0
  588. package/dist/types/utils/parse.d.ts +22 -0
  589. package/dist/types/utils/parse.d.ts.map +1 -0
  590. package/dist/types/utils/positionMath.d.ts +107 -0
  591. package/dist/types/utils/positionMath.d.ts.map +1 -0
  592. package/dist/types/utils/signTypedData.d.ts +18 -0
  593. package/dist/types/utils/signTypedData.d.ts.map +1 -0
  594. package/dist/types/utils/sleep.d.ts +7 -0
  595. package/dist/types/utils/sleep.d.ts.map +1 -0
  596. package/dist/types/utils/units.d.ts +27 -0
  597. package/dist/types/utils/units.d.ts.map +1 -0
  598. package/dist/types/utils/validation.d.ts +18 -0
  599. package/dist/types/utils/validation.d.ts.map +1 -0
  600. package/dist/types/version.d.ts +3 -0
  601. package/dist/types/version.d.ts.map +1 -0
  602. package/dist/types/websocket/PerpsWsClient.d.ts +100 -0
  603. package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -0
  604. package/dist/types/websocket/ReconnectingWebSocket.d.ts +130 -0
  605. package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -0
  606. package/dist/types/websocket/WsProviderBase.d.ts +89 -0
  607. package/dist/types/websocket/WsProviderBase.d.ts.map +1 -0
  608. package/dist/types/websocket/cachePromise.d.ts +14 -0
  609. package/dist/types/websocket/cachePromise.d.ts.map +1 -0
  610. package/dist/types/websocket/types.d.ts +60 -0
  611. package/dist/types/websocket/types.d.ts.map +1 -0
  612. package/dist/types/websocket/wsLog.d.ts +50 -0
  613. package/dist/types/websocket/wsLog.d.ts.map +1 -0
  614. package/package.json +63 -0
  615. package/src/client/PerpsClient.ts +686 -0
  616. package/src/client/bindProvider.ts +24 -0
  617. package/src/client/createPerpsClient.ts +100 -0
  618. package/src/client/requireProvider.ts +29 -0
  619. package/src/errors/PerpsError.ts +23 -0
  620. package/src/errors/constants.ts +10 -0
  621. package/src/index.ts +215 -0
  622. package/src/registry/assetRegistry.ts +62 -0
  623. package/src/registry/marketRegistry.ts +100 -0
  624. package/src/registry/referenceDataRegistry.ts +95 -0
  625. package/src/services/createAction.ts +52 -0
  626. package/src/services/executeAction.ts +56 -0
  627. package/src/services/getAccount.ts +46 -0
  628. package/src/services/getActivity.ts +57 -0
  629. package/src/services/getAssets.ts +38 -0
  630. package/src/services/getFills.ts +55 -0
  631. package/src/services/getMarket.ts +52 -0
  632. package/src/services/getMarkets.ts +40 -0
  633. package/src/services/getMeta.ts +32 -0
  634. package/src/services/getOhlcv.ts +52 -0
  635. package/src/services/getOrder.ts +44 -0
  636. package/src/services/getOrderbook.ts +37 -0
  637. package/src/services/getOrders.ts +51 -0
  638. package/src/services/getPositions.ts +51 -0
  639. package/src/services/getPrices.ts +33 -0
  640. package/src/services/getProviders.ts +33 -0
  641. package/src/services/getQuote.ts +58 -0
  642. package/src/services/getTermsAcceptance.ts +34 -0
  643. package/src/services/resolveQuote.ts +90 -0
  644. package/src/services/resolveSubscribeQuote.ts +107 -0
  645. package/src/storage/parseStoredRecord.ts +55 -0
  646. package/src/storage/storage.ts +60 -0
  647. package/src/storage/types.ts +13 -0
  648. package/src/transport/fetchWithRetry.ts +116 -0
  649. package/src/transport/request.ts +123 -0
  650. package/src/transport/retryPolicy.ts +202 -0
  651. package/src/types/api.ts +239 -0
  652. package/src/types/config.ts +79 -0
  653. package/src/types/provider.ts +429 -0
  654. package/src/utils/accountSummary.ts +46 -0
  655. package/src/utils/assertNever.ts +23 -0
  656. package/src/utils/calculations.ts +407 -0
  657. package/src/utils/depositChain.ts +37 -0
  658. package/src/utils/explorer.ts +51 -0
  659. package/src/utils/fillClassification.ts +51 -0
  660. package/src/utils/format.ts +212 -0
  661. package/src/utils/orderClassification.ts +96 -0
  662. package/src/utils/orderMath.ts +134 -0
  663. package/src/utils/parse.ts +30 -0
  664. package/src/utils/positionMath.ts +149 -0
  665. package/src/utils/signTypedData.ts +41 -0
  666. package/src/utils/sleep.ts +7 -0
  667. package/src/utils/units.ts +39 -0
  668. package/src/utils/validation.ts +38 -0
  669. package/src/version.ts +2 -0
  670. package/src/websocket/PerpsWsClient.ts +204 -0
  671. package/src/websocket/ReconnectingWebSocket.ts +353 -0
  672. package/src/websocket/WsProviderBase.ts +333 -0
  673. package/src/websocket/cachePromise.ts +30 -0
  674. package/src/websocket/types.ts +75 -0
  675. package/src/websocket/wsLog.ts +82 -0
@@ -0,0 +1,333 @@
1
+ import type { Subscription, SubscriptionEvent } from '@lifi/perps-types'
2
+ import type {
3
+ ProviderGetQuoteParams,
4
+ QuoteListener,
5
+ } from '../types/provider.js'
6
+ import type { ReconnectingWebSocket } from './ReconnectingWebSocket.js'
7
+ import type {
8
+ SubscriptionListener,
9
+ WsProvider,
10
+ WsStatusListener,
11
+ } from './types.js'
12
+ import { wsLog } from './wsLog.js'
13
+
14
+ /**
15
+ * Linger before tearing a channel off the wire after its last listener
16
+ * releases. A re-subscribe to the same key within this window cancels the
17
+ * pending teardown, so React StrictMode's synchronous unmount→remount (ref
18
+ * count 1→0→1) and fast route flips collapse to one wire subscription rather
19
+ * than a subscribe→unsubscribe→subscribe churn the venue would reject.
20
+ *
21
+ * @public
22
+ */
23
+ export const WS_CHANNEL_TEARDOWN_LINGER_MS = 250
24
+
25
+ interface ChannelEntry {
26
+ /**
27
+ * Per-listener ref count — a `Map`, not a `Set`, because the same listener
28
+ * reference may subscribe twice (StrictMode) and only the matching number of
29
+ * releases may drop it; a `Set` would lose it on the first sibling release.
30
+ */
31
+ listeners: Map<SubscriptionListener, number>
32
+ /** Wire teardown from {@link WsProviderBase.openChannel}, set once the open resolves. */
33
+ teardown?: () => void
34
+ /** In-flight open, set on the 0→1 transition so concurrent subscribes share it. */
35
+ opening?: Promise<() => void>
36
+ /** Deferred-teardown timer, set on the 1→0 transition; cleared if re-subscribed within the linger. */
37
+ pendingTeardown?: ReturnType<typeof setTimeout>
38
+ }
39
+
40
+ /**
41
+ * Base for per-provider realtime transports. Owns the {@link
42
+ * ReconnectingWebSocket}, the fan-out lifecycle — ref-counted multi-listener
43
+ * subscription per channel key, deferred teardown, status fan-out — so any
44
+ * number of consumers (and StrictMode double-mounts) collapse to exactly one
45
+ * wire subscribe/unsubscribe per key, and the wire-subscription registry:
46
+ * subs recorded via {@link WsProviderBase.registerSub} are sent only while
47
+ * connected and replayed (failure-isolated) on every (re)open. Subclasses own
48
+ * everything wire-specific via {@link WsProviderBase.openChannel}, {@link
49
+ * WsProviderBase.sendSubscribe} and {@link WsProviderBase.handleMessage}:
50
+ * payload framing, frame validation and dispatch.
51
+ *
52
+ * `TSub` is the per-subscription state {@link WsProviderBase.sendSubscribe}
53
+ * needs to (re)build one subscribe frame.
54
+ *
55
+ * @public
56
+ */
57
+ export abstract class WsProviderBase<TSub = unknown> implements WsProvider {
58
+ protected readonly rws: ReconnectingWebSocket
59
+ protected readonly providerKey: string
60
+
61
+ private readonly channels = new Map<string, ChannelEntry>()
62
+ private readonly statusListeners = new Map<WsStatusListener, number>()
63
+ private readonly wireSubs = new Map<string, TSub>()
64
+
65
+ constructor(rws: ReconnectingWebSocket, providerKey: string) {
66
+ this.providerKey = providerKey
67
+ this.rws = rws
68
+ this.rws.on('message', (data) => this.handleMessage(data))
69
+ this.rws.on('open', () => {
70
+ void this.replaySubs()
71
+ })
72
+ this.rws.onStatus((status) => {
73
+ for (const fn of this.statusListeners.keys()) {
74
+ this.callListener('status', fn, status)
75
+ }
76
+ })
77
+ }
78
+
79
+ async subscribe(
80
+ sub: Subscription,
81
+ listener: SubscriptionListener,
82
+ onStatus?: WsStatusListener
83
+ ): Promise<() => void> {
84
+ this.reconnect()
85
+
86
+ const key = this.toKey(sub)
87
+ await this.acquireChannel(key, sub, listener)
88
+
89
+ if (onStatus) {
90
+ this.statusListeners.set(
91
+ onStatus,
92
+ (this.statusListeners.get(onStatus) ?? 0) + 1
93
+ )
94
+ onStatus(this.rws.getStatus())
95
+ }
96
+
97
+ return () => {
98
+ if (onStatus) {
99
+ const remaining = (this.statusListeners.get(onStatus) ?? 0) - 1
100
+ if (remaining > 0) {
101
+ this.statusListeners.set(onStatus, remaining)
102
+ } else {
103
+ this.statusListeners.delete(onStatus)
104
+ }
105
+ }
106
+ this.releaseChannel(key, listener)
107
+ }
108
+ }
109
+
110
+ reconnect(): void {
111
+ if (this.rws.getStatus() !== 'disconnected') {
112
+ return
113
+ }
114
+ this.rws.reconnect()
115
+ }
116
+
117
+ close(): void {
118
+ for (const entry of this.channels.values()) {
119
+ if (entry.pendingTeardown !== undefined) {
120
+ clearTimeout(entry.pendingTeardown)
121
+ }
122
+ }
123
+ this.onClose()
124
+ this.rws.close()
125
+ this.channels.clear()
126
+ this.statusListeners.clear()
127
+ this.wireSubs.clear()
128
+ }
129
+
130
+ /** Deliver an event to every listener on `key`. */
131
+ protected emit(key: string, event: SubscriptionEvent): void {
132
+ const entry = this.channels.get(key)
133
+ if (entry === undefined) {
134
+ return
135
+ }
136
+ for (const fn of entry.listeners.keys()) {
137
+ this.callListener(`subscription:${key}`, fn, event)
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Tear `key` off the wire immediately if no listener holds it — i.e. it is
143
+ * lingering in the deferred-teardown window (or its open is still
144
+ * unwinding). Returns `true` when the key is free (absent or just torn
145
+ * down), `false` — leaving the channel untouched — while live listeners
146
+ * hold it. Lets a subclass that enforces an exclusivity invariant across
147
+ * keys reclaim a released channel without waiting out the linger.
148
+ */
149
+ protected closeChannelIfIdle(key: string): boolean {
150
+ const entry = this.channels.get(key)
151
+ if (entry === undefined) {
152
+ return true
153
+ }
154
+ if (entry.listeners.size > 0) {
155
+ return false
156
+ }
157
+ if (entry.pendingTeardown !== undefined) {
158
+ clearTimeout(entry.pendingTeardown)
159
+ }
160
+ entry.teardown?.()
161
+ this.channels.delete(key)
162
+ return true
163
+ }
164
+
165
+ /**
166
+ * Record a wire subscription for replay-on-(re)open and, when the socket is
167
+ * already connected, send its subscribe frame via {@link sendSubscribe}.
168
+ * While the socket is down the replay loop on the next open is the sole
169
+ * sender — sending in both places would double-subscribe. A failed send
170
+ * removes the sub again so a rejected open leaves no registry entry behind.
171
+ */
172
+ protected async registerSub(key: string, state: TSub): Promise<void> {
173
+ this.wireSubs.set(key, state)
174
+ if (this.rws.getStatus() !== 'connected') {
175
+ return
176
+ }
177
+ try {
178
+ await this.sendSubscribe(state)
179
+ } catch (err) {
180
+ this.wireSubs.delete(key)
181
+ throw err
182
+ }
183
+ }
184
+
185
+ /** Forget a wire subscription so the next (re)open no longer replays it. */
186
+ protected unregisterSub(key: string): void {
187
+ this.wireSubs.delete(key)
188
+ }
189
+
190
+ private async replaySubs(): Promise<void> {
191
+ for (const [key, state] of this.wireSubs) {
192
+ // Isolate each resubscribe: a send can reject (e.g. an auth-token fetch
193
+ // after reconnect), and one sub's failure must not abort the rest of
194
+ // the loop or escape as an unhandled rejection.
195
+ try {
196
+ await this.sendSubscribe(state)
197
+ } catch (err) {
198
+ wsLog.subscribeFailure(this.providerKey, key, err)
199
+ }
200
+ }
201
+ }
202
+
203
+ /** Venue-specific {@link WsProvider.subscribeQuote}; see `resolveSubscribeQuote`. */
204
+ abstract subscribeQuote(
205
+ params: ProviderGetQuoteParams,
206
+ onQuote: QuoteListener
207
+ ): Promise<() => void>
208
+
209
+ /** Canonical fan-out key for `sub`; must match the key the subclass emits to. */
210
+ protected abstract toKey(sub: Subscription): string
211
+
212
+ /**
213
+ * Open the channel on the wire (0→1 transition only). Record the wire
214
+ * sub(s) via {@link registerSub} and return a closure that unregisters them
215
+ * and sends the unsubscribe frame(s).
216
+ */
217
+ protected abstract openChannel(sub: Subscription): Promise<() => void>
218
+
219
+ /**
220
+ * Encode and send the subscribe frame for one registered sub. Called by the
221
+ * base while connected — once on register and again on every (re)open — so
222
+ * it must be safe to invoke repeatedly with the same state (e.g. re-fetch a
223
+ * fresh auth token per call rather than embedding one in `state`).
224
+ */
225
+ protected abstract sendSubscribe(state: TSub): void | Promise<void>
226
+
227
+ /** Parse one inbound frame and route it via {@link emit}. */
228
+ protected abstract handleMessage(raw: string): void
229
+
230
+ /** Release subclass-only resources on {@link close} (keep-alive, cached state). */
231
+ protected onClose(): void {}
232
+
233
+ private callListener<TArgs extends unknown[]>(
234
+ listenerType: string,
235
+ listener: (...args: TArgs) => void,
236
+ ...args: TArgs
237
+ ): void {
238
+ try {
239
+ listener(...args)
240
+ } catch (error) {
241
+ wsLog.listenerFailure(this.providerKey, listenerType, error)
242
+ }
243
+ }
244
+
245
+ private async acquireChannel(
246
+ key: string,
247
+ sub: Subscription,
248
+ listener: SubscriptionListener
249
+ ): Promise<void> {
250
+ let entry = this.channels.get(key)
251
+ if (entry === undefined) {
252
+ entry = { listeners: new Map() }
253
+ this.channels.set(key, entry)
254
+ }
255
+
256
+ // Register first (ref-counted) so a frame arriving during an in-flight open
257
+ // is delivered; cancel any pending teardown (re-subscribe within the linger).
258
+ entry.listeners.set(listener, (entry.listeners.get(listener) ?? 0) + 1)
259
+ if (entry.pendingTeardown !== undefined) {
260
+ clearTimeout(entry.pendingTeardown)
261
+ entry.pendingTeardown = undefined
262
+ }
263
+
264
+ if (entry.teardown !== undefined) {
265
+ return
266
+ }
267
+ if (entry.opening !== undefined) {
268
+ await entry.opening
269
+ return
270
+ }
271
+
272
+ const opening = this.openChannel(sub)
273
+ entry.opening = opening
274
+ try {
275
+ const teardown = await opening
276
+ const current = this.channels.get(key)
277
+ if (current === undefined || current.listeners.size === 0) {
278
+ // Every listener released while opening — unwind immediately.
279
+ teardown()
280
+ this.channels.delete(key)
281
+ return
282
+ }
283
+ current.teardown = teardown
284
+ current.opening = undefined
285
+ } catch (err) {
286
+ // Open failed: drop the channel so all (concurrent) subscribers reject
287
+ // cleanly and a later subscribe re-opens.
288
+ this.channels.delete(key)
289
+ throw err
290
+ }
291
+ }
292
+
293
+ private releaseChannel(key: string, listener: SubscriptionListener): void {
294
+ const entry = this.channels.get(key)
295
+ if (entry === undefined) {
296
+ return
297
+ }
298
+
299
+ const remaining = (entry.listeners.get(listener) ?? 0) - 1
300
+ if (remaining > 0) {
301
+ entry.listeners.set(listener, remaining)
302
+ return
303
+ }
304
+ entry.listeners.delete(listener)
305
+ if (entry.listeners.size > 0) {
306
+ return
307
+ }
308
+
309
+ if (entry.teardown === undefined) {
310
+ // Open not resolved yet — acquireChannel's post-open check unwinds it.
311
+ if (entry.opening === undefined) {
312
+ this.channels.delete(key)
313
+ }
314
+ return
315
+ }
316
+
317
+ if (entry.pendingTeardown !== undefined) {
318
+ return
319
+ }
320
+ entry.pendingTeardown = setTimeout(() => {
321
+ const e = this.channels.get(key)
322
+ if (e === undefined) {
323
+ return
324
+ }
325
+ if (e.listeners.size > 0) {
326
+ e.pendingTeardown = undefined
327
+ return
328
+ }
329
+ e.teardown?.()
330
+ this.channels.delete(key)
331
+ }, WS_CHANNEL_TEARDOWN_LINGER_MS)
332
+ }
333
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Single-flight a promise through a caller-owned cache slot, evicting the
3
+ * cached promise if it rejects so the next call retries cleanly.
4
+ *
5
+ * Concurrent callers share the one in-flight promise; the rejection still
6
+ * propagates to every awaiter that triggered it. Only a settled rejection is
7
+ * evicted — a resolved promise stays cached.
8
+ *
9
+ * @param read - Returns the currently cached promise, or `undefined` if none.
10
+ * @param write - Stores (or with `undefined`, clears) the cached promise.
11
+ * @param factory - Creates the promise when the slot is empty.
12
+ */
13
+ export function cachePromise<T>(
14
+ read: () => Promise<T> | undefined,
15
+ write: (promise: Promise<T> | undefined) => void,
16
+ factory: () => Promise<T>
17
+ ): Promise<T> {
18
+ const cached = read()
19
+ if (cached) {
20
+ return cached
21
+ }
22
+ const promise = factory()
23
+ promise.catch(() => {
24
+ if (read() === promise) {
25
+ write(undefined)
26
+ }
27
+ })
28
+ write(promise)
29
+ return promise
30
+ }
@@ -0,0 +1,75 @@
1
+ import type { Subscription, SubscriptionEvent } from '@lifi/perps-types'
2
+ import type {
3
+ ProviderGetQuoteParams,
4
+ QuoteListener,
5
+ } from '../types/provider.js'
6
+
7
+ /**
8
+ * The concrete {@link SubscriptionEvent} variant a given subscription `S`
9
+ * emits, narrowed by its `channel`.
10
+ *
11
+ * @public
12
+ */
13
+ export type EventForSubscription<S extends Subscription> = Extract<
14
+ SubscriptionEvent,
15
+ { channel: S['channel'] }
16
+ >
17
+
18
+ /**
19
+ * Listener invoked with each realtime {@link SubscriptionEvent}.
20
+ *
21
+ * @public
22
+ */
23
+ export type SubscriptionListener = (event: SubscriptionEvent) => void
24
+
25
+ /**
26
+ * Health of a provider's underlying WS connection.
27
+ *
28
+ * - `connected` — socket open, live data flowing.
29
+ * - `reconnecting` — socket dropped; auto-reconnect with backoff in progress.
30
+ * Data may be stale until it returns to `connected`.
31
+ * - `disconnected` — reconnection abandoned after the retry cap. The
32
+ * connection is permanently dead and will not recover on its own; the
33
+ * subscription's data is stale. Terminal.
34
+ *
35
+ * @public
36
+ */
37
+ export type WsConnectionStatus = 'connected' | 'reconnecting' | 'disconnected'
38
+
39
+ /**
40
+ * Listener invoked when the underlying WS connection's health changes.
41
+ *
42
+ * @public
43
+ */
44
+ export type WsStatusListener = (status: WsConnectionStatus) => void
45
+
46
+ /**
47
+ * Per-provider realtime transport contract used by {@link PerpsWsClient}.
48
+ * Implemented by the provider packages' WS plugins.
49
+ *
50
+ * @public
51
+ */
52
+ export interface WsProvider {
53
+ subscribe(
54
+ sub: Subscription,
55
+ listener: SubscriptionListener,
56
+ onStatus?: WsStatusListener
57
+ ): Promise<() => void>
58
+ /**
59
+ * Recover a terminally exhausted connection. Safe no-op unless status is
60
+ * `disconnected`.
61
+ */
62
+ reconnect(): void
63
+ /**
64
+ * Stream live fill {@link Quote}s for `params.size` USD notional of
65
+ * `params.symbol` on this venue, layered on the orderbook channel: the
66
+ * provider resolves the symbol against its own markets and re-runs the
67
+ * one-shot quote transform on each (throttled) book update, applying its
68
+ * public base fee tier. Returns an idempotent unsubscribe.
69
+ */
70
+ subscribeQuote(
71
+ params: ProviderGetQuoteParams,
72
+ onQuote: QuoteListener
73
+ ): Promise<() => void>
74
+ close(): void
75
+ }
@@ -0,0 +1,82 @@
1
+ const MAX_PAYLOAD_CHARS = 512
2
+
3
+ const truncate = (raw: string): string =>
4
+ raw.length > MAX_PAYLOAD_CHARS
5
+ ? `${raw.slice(0, MAX_PAYLOAD_CHARS)}…(${raw.length} chars)`
6
+ : raw
7
+
8
+ /**
9
+ * Structured logger for WS message-handling and subscription failures, shared
10
+ * by the provider packages so a malformed frame, a throwing mapper, or a failed
11
+ * resubscribe never vanishes silently.
12
+ *
13
+ * @internal
14
+ */
15
+ export const wsLog = {
16
+ /**
17
+ * A single frame that could not be parsed as JSON. Expected to recur on a
18
+ * noisy stream, so logged at `warn` with a truncated payload — never fatal.
19
+ */
20
+ parseFailure(provider: string, raw: string): void {
21
+ console.warn(`[${provider}:ws] dropping unparseable frame`, truncate(raw))
22
+ },
23
+ /**
24
+ * A frame parsed but its handler threw (mapper bug, `MarketNotFound`, …).
25
+ * This is unexpected and must surface; the frame is skipped so one bad
26
+ * frame does not stall the stream or starve other channels.
27
+ */
28
+ handlerFailure(provider: string, error: unknown): void {
29
+ console.error(`[${provider}:ws] message handler threw`, error)
30
+ },
31
+ /**
32
+ * An `error`-channel frame the server pushed (e.g. a rejected or duplicate
33
+ * subscription). The frame parsed fine — this is the venue reporting a
34
+ * problem, not a malformed frame — so surface it at `error` with the
35
+ * server's own text rather than mislabelling it a parse failure.
36
+ */
37
+ serverError(provider: string, message: string): void {
38
+ console.error(`[${provider}:ws] server error`, message)
39
+ },
40
+ /**
41
+ * A channel's (re)subscribe threw while (re)opening the socket — e.g. an
42
+ * auth-token fetch rejected after a reconnect. Surfaced at `error`; the
43
+ * channel is skipped so one failure does not abort the others.
44
+ */
45
+ subscribeFailure(provider: string, channel: string, error: unknown): void {
46
+ console.error(
47
+ `[${provider}:ws] resubscribe failed for channel '${channel}'; it will not receive updates until the next reconnect.`,
48
+ error
49
+ )
50
+ },
51
+ /**
52
+ * A frame item referenced a market id missing from the registry (e.g.
53
+ * listed after the snapshot). The item is skipped — never the whole frame —
54
+ * so logged at `warn`.
55
+ */
56
+ unknownMarket(provider: string, marketId: string): void {
57
+ console.warn(
58
+ `[${provider}:ws] skipping item for unknown market '${marketId}'`
59
+ )
60
+ },
61
+ /**
62
+ * A background market-registry refetch rejected. Unknown-market items keep
63
+ * being skipped until the next cooldown-gated retry, so logged at `warn`.
64
+ */
65
+ marketRefreshFailure(provider: string, error: unknown): void {
66
+ console.warn(`[${provider}:ws] market registry refresh failed`, error)
67
+ },
68
+ /**
69
+ * A consumer listener callback threw during fan-out. Logged and skipped so
70
+ * one bad listener cannot starve sibling listeners or break socket flow.
71
+ */
72
+ listenerFailure(
73
+ provider: string,
74
+ listenerType: string,
75
+ error: unknown
76
+ ): void {
77
+ console.error(
78
+ `[${provider}:ws] listener threw during '${listenerType}' fan-out`,
79
+ error
80
+ )
81
+ },
82
+ } as const