@tdengine/websocket 3.2.2 → 3.3.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 (275) hide show
  1. package/lib/package.json +64 -0
  2. package/lib/src/client/retryConfig.d.ts +10 -0
  3. package/lib/src/client/retryConfig.d.ts.map +1 -0
  4. package/lib/src/client/retryConfig.js +46 -0
  5. package/lib/src/client/wsClient.d.ts +24 -7
  6. package/lib/src/client/wsClient.d.ts.map +1 -1
  7. package/lib/src/client/wsClient.js +164 -137
  8. package/lib/src/client/wsConnector.d.ts +55 -9
  9. package/lib/src/client/wsConnector.d.ts.map +1 -1
  10. package/lib/src/client/wsConnector.js +522 -102
  11. package/lib/src/client/wsConnectorPool.d.ts +5 -1
  12. package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
  13. package/lib/src/client/wsConnectorPool.js +67 -52
  14. package/lib/src/client/wsEventCallback.d.ts +3 -0
  15. package/lib/src/client/wsEventCallback.d.ts.map +1 -1
  16. package/lib/src/client/wsEventCallback.js +67 -8
  17. package/lib/src/client/wsResponse.d.ts +0 -3
  18. package/lib/src/client/wsResponse.d.ts.map +1 -1
  19. package/lib/src/client/wsResponse.js +0 -3
  20. package/lib/src/common/addressConnectionTracker.d.ts +11 -0
  21. package/lib/src/common/addressConnectionTracker.d.ts.map +1 -0
  22. package/lib/src/common/addressConnectionTracker.js +53 -0
  23. package/lib/src/common/config.d.ts +3 -0
  24. package/lib/src/common/config.d.ts.map +1 -1
  25. package/lib/src/common/config.js +6 -0
  26. package/lib/src/common/constant.d.ts +1 -0
  27. package/lib/src/common/constant.d.ts.map +1 -1
  28. package/lib/src/common/constant.js +6 -1
  29. package/lib/src/common/dsn.d.ts +30 -0
  30. package/lib/src/common/dsn.d.ts.map +1 -0
  31. package/lib/src/common/dsn.js +221 -0
  32. package/lib/src/common/taosResult.d.ts.map +1 -1
  33. package/lib/src/common/taosResult.js +0 -5
  34. package/lib/src/common/urlParser.d.ts +32 -0
  35. package/lib/src/common/urlParser.d.ts.map +1 -0
  36. package/lib/src/common/urlParser.js +201 -0
  37. package/lib/src/common/utils.d.ts +6 -1
  38. package/lib/src/common/utils.d.ts.map +1 -1
  39. package/lib/src/common/utils.js +74 -22
  40. package/lib/src/index.d.ts.map +1 -1
  41. package/lib/src/sql/wsSql.d.ts.map +1 -1
  42. package/lib/src/sql/wsSql.js +2 -2
  43. package/lib/src/stmt/FieldBindParams.d.ts.map +1 -1
  44. package/lib/src/stmt/wsColumnInfo.d.ts.map +1 -1
  45. package/lib/src/stmt/wsParams1.d.ts.map +1 -1
  46. package/lib/src/stmt/wsParams1.js +26 -26
  47. package/lib/src/stmt/wsParams2.d.ts.map +1 -1
  48. package/lib/src/stmt/wsParams2.js +0 -3
  49. package/lib/src/stmt/wsParamsBase.d.ts.map +1 -1
  50. package/lib/src/stmt/wsProto.d.ts.map +1 -1
  51. package/lib/src/stmt/wsProto.js +16 -16
  52. package/lib/src/stmt/wsStmt1.d.ts.map +1 -1
  53. package/lib/src/stmt/wsStmt2.d.ts +12 -4
  54. package/lib/src/stmt/wsStmt2.d.ts.map +1 -1
  55. package/lib/src/stmt/wsStmt2.js +182 -64
  56. package/lib/src/stmt/wsTableInfo.d.ts.map +1 -1
  57. package/lib/src/tmq/config.d.ts +4 -2
  58. package/lib/src/tmq/config.d.ts.map +1 -1
  59. package/lib/src/tmq/config.js +30 -13
  60. package/lib/src/tmq/constant.d.ts +4 -0
  61. package/lib/src/tmq/constant.d.ts.map +1 -1
  62. package/lib/src/tmq/constant.js +4 -0
  63. package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
  64. package/lib/src/tmq/tmqResponse.js +1 -4
  65. package/lib/src/tmq/wsTmq.d.ts +4 -1
  66. package/lib/src/tmq/wsTmq.d.ts.map +1 -1
  67. package/lib/src/tmq/wsTmq.js +55 -27
  68. package/lib/test/bulkPulling/a.test.d.ts +2 -0
  69. package/lib/test/bulkPulling/a.test.d.ts.map +1 -0
  70. package/lib/test/bulkPulling/a.test.js +166 -0
  71. package/lib/test/bulkPulling/cloud.tmq.test.js +3 -2
  72. package/lib/test/bulkPulling/decimal.test.js +8 -8
  73. package/lib/test/bulkPulling/dsn.test.d.ts +2 -0
  74. package/lib/test/bulkPulling/dsn.test.d.ts.map +1 -0
  75. package/lib/test/bulkPulling/dsn.test.js +397 -0
  76. package/lib/test/bulkPulling/queryTables.test.js +1 -1
  77. package/lib/test/bulkPulling/retryConfig.test.d.ts +2 -0
  78. package/lib/test/bulkPulling/retryConfig.test.d.ts.map +1 -0
  79. package/lib/test/bulkPulling/retryConfig.test.js +34 -0
  80. package/lib/test/bulkPulling/schemaless.test.js +15 -14
  81. package/lib/test/bulkPulling/sql.failover.test.d.ts +2 -0
  82. package/lib/test/bulkPulling/sql.failover.test.d.ts.map +1 -0
  83. package/lib/test/bulkPulling/sql.failover.test.js +338 -0
  84. package/lib/test/bulkPulling/sql.test.js +116 -44
  85. package/lib/test/bulkPulling/stmt1.func.test.js +31 -30
  86. package/lib/test/bulkPulling/stmt1.type.test.js +1 -1
  87. package/lib/test/bulkPulling/stmt2.failover.test.d.ts +2 -0
  88. package/lib/test/bulkPulling/stmt2.failover.test.d.ts.map +1 -0
  89. package/lib/test/bulkPulling/stmt2.failover.test.js +313 -0
  90. package/lib/test/bulkPulling/stmt2.func.test.js +37 -36
  91. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts +2 -0
  92. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts.map +1 -0
  93. package/lib/test/bulkPulling/stmt2.init.failover.test.js +50 -0
  94. package/lib/test/bulkPulling/stmt2.type.test.js +1 -1
  95. package/lib/test/bulkPulling/tmq.config.test.d.ts +2 -0
  96. package/lib/test/bulkPulling/tmq.config.test.d.ts.map +1 -0
  97. package/lib/test/bulkPulling/tmq.config.test.js +77 -0
  98. package/lib/test/bulkPulling/tmq.failover.test.d.ts +2 -0
  99. package/lib/test/bulkPulling/tmq.failover.test.d.ts.map +1 -0
  100. package/lib/test/bulkPulling/tmq.failover.test.js +404 -0
  101. package/lib/test/bulkPulling/tmq.test.js +135 -14
  102. package/lib/test/bulkPulling/urlParser.test.d.ts +2 -0
  103. package/lib/test/bulkPulling/urlParser.test.d.ts.map +1 -0
  104. package/lib/test/bulkPulling/urlParser.test.js +452 -0
  105. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts +2 -0
  106. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts.map +1 -0
  107. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +184 -0
  108. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts +2 -0
  109. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts.map +1 -0
  110. package/lib/test/bulkPulling/wsClient.recovery.test.js +104 -0
  111. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts +2 -0
  112. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts.map +1 -0
  113. package/lib/test/bulkPulling/wsConfig.dsn.test.js +39 -0
  114. package/lib/test/bulkPulling/wsConnectPool.test.js +7 -7
  115. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts +2 -0
  116. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts.map +1 -0
  117. package/lib/test/bulkPulling/wsConnector.failover.test.js +497 -0
  118. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts +2 -0
  119. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts.map +1 -0
  120. package/lib/test/bulkPulling/wsConnectorPool.key.test.js +52 -0
  121. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts +2 -0
  122. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts.map +1 -0
  123. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.js +28 -0
  124. package/lib/test/bulkPulling/wsEventCallback.test.d.ts +2 -0
  125. package/lib/test/bulkPulling/wsEventCallback.test.d.ts.map +1 -0
  126. package/lib/test/bulkPulling/wsEventCallback.test.js +54 -0
  127. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts +2 -0
  128. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts.map +1 -0
  129. package/lib/test/bulkPulling/wsProxy.failover.integration.test.js +120 -0
  130. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts +2 -0
  131. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts.map +1 -0
  132. package/lib/test/bulkPulling/wsProxy.failover.test.js +465 -0
  133. package/lib/test/client/wsClient.recovery.test.d.ts +2 -0
  134. package/lib/test/client/wsClient.recovery.test.d.ts.map +1 -0
  135. package/lib/test/client/wsClient.recovery.test.js +122 -0
  136. package/lib/test/client/wsConnectPool.test.d.ts +2 -0
  137. package/lib/test/client/wsConnectPool.test.d.ts.map +1 -0
  138. package/lib/test/client/wsConnectPool.test.js +147 -0
  139. package/lib/test/client/wsConnector.failover.test.d.ts +2 -0
  140. package/lib/test/client/wsConnector.failover.test.d.ts.map +1 -0
  141. package/lib/test/client/wsConnector.failover.test.js +681 -0
  142. package/lib/test/client/wsConnector.leastConnections.test.d.ts +2 -0
  143. package/lib/test/client/wsConnector.leastConnections.test.d.ts.map +1 -0
  144. package/lib/test/client/wsConnector.leastConnections.test.js +71 -0
  145. package/lib/test/client/wsConnectorPool.key.test.d.ts +2 -0
  146. package/lib/test/client/wsConnectorPool.key.test.d.ts.map +1 -0
  147. package/lib/test/client/wsConnectorPool.key.test.js +127 -0
  148. package/lib/test/client/wsEventCallback.test.d.ts +2 -0
  149. package/lib/test/client/wsEventCallback.test.d.ts.map +1 -0
  150. package/lib/test/client/wsEventCallback.test.js +98 -0
  151. package/lib/test/common/addressConnectionTracker.test.d.ts +2 -0
  152. package/lib/test/common/addressConnectionTracker.test.d.ts.map +1 -0
  153. package/lib/test/common/addressConnectionTracker.test.js +74 -0
  154. package/lib/test/common/dsn.test.d.ts +2 -0
  155. package/lib/test/common/dsn.test.d.ts.map +1 -0
  156. package/lib/test/common/dsn.test.js +406 -0
  157. package/lib/test/common/log.test.d.ts +2 -0
  158. package/lib/test/common/log.test.d.ts.map +1 -0
  159. package/lib/test/common/log.test.js +54 -0
  160. package/lib/test/common/utils.test.d.ts +2 -0
  161. package/lib/test/common/utils.test.d.ts.map +1 -0
  162. package/lib/test/common/utils.test.js +13 -0
  163. package/lib/test/common/wsConfig.dsn.test.d.ts +2 -0
  164. package/lib/test/common/wsConfig.dsn.test.d.ts.map +1 -0
  165. package/lib/test/common/wsConfig.dsn.test.js +39 -0
  166. package/lib/test/helpers/utils.d.ts +27 -0
  167. package/lib/test/helpers/utils.d.ts.map +1 -0
  168. package/lib/test/helpers/utils.js +341 -0
  169. package/lib/test/helpers/wsFailoverProxy.d.ts +109 -0
  170. package/lib/test/helpers/wsFailoverProxy.d.ts.map +1 -0
  171. package/lib/test/helpers/wsFailoverProxy.js +420 -0
  172. package/lib/test/helpers/wsProxy.d.ts +110 -0
  173. package/lib/test/helpers/wsProxy.d.ts.map +1 -0
  174. package/lib/test/helpers/wsProxy.js +429 -0
  175. package/lib/test/sql/core/decimal.test.d.ts +2 -0
  176. package/lib/test/sql/core/decimal.test.d.ts.map +1 -0
  177. package/lib/test/sql/core/decimal.test.js +153 -0
  178. package/lib/test/sql/core/queryTables.test.d.ts +2 -0
  179. package/lib/test/sql/core/queryTables.test.d.ts.map +1 -0
  180. package/lib/test/sql/core/queryTables.test.js +506 -0
  181. package/lib/test/sql/core/schemaless.test.d.ts +2 -0
  182. package/lib/test/sql/core/schemaless.test.d.ts.map +1 -0
  183. package/lib/test/sql/core/schemaless.test.js +102 -0
  184. package/lib/test/sql/core/sql.test.d.ts +2 -0
  185. package/lib/test/sql/core/sql.test.d.ts.map +1 -0
  186. package/lib/test/sql/core/sql.test.js +324 -0
  187. package/lib/test/sql/decimal.test.d.ts +2 -0
  188. package/lib/test/sql/decimal.test.d.ts.map +1 -0
  189. package/lib/test/sql/decimal.test.js +153 -0
  190. package/lib/test/sql/failover/sql.failover.test.d.ts +2 -0
  191. package/lib/test/sql/failover/sql.failover.test.d.ts.map +1 -0
  192. package/lib/test/sql/failover/sql.failover.test.js +341 -0
  193. package/lib/test/sql/queryTables.test.d.ts +2 -0
  194. package/lib/test/sql/queryTables.test.d.ts.map +1 -0
  195. package/lib/test/sql/queryTables.test.js +506 -0
  196. package/lib/test/sql/schemaless.test.d.ts +2 -0
  197. package/lib/test/sql/schemaless.test.d.ts.map +1 -0
  198. package/lib/test/sql/schemaless.test.js +102 -0
  199. package/lib/test/sql/sql.failover.test.d.ts +2 -0
  200. package/lib/test/sql/sql.failover.test.d.ts.map +1 -0
  201. package/lib/test/sql/sql.failover.test.js +341 -0
  202. package/lib/test/sql/sql.test.d.ts +2 -0
  203. package/lib/test/sql/sql.test.d.ts.map +1 -0
  204. package/lib/test/sql/sql.test.js +324 -0
  205. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts +2 -0
  206. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts.map +1 -0
  207. package/lib/test/stmt/failover/stmt2.failover.mock.test.js +341 -0
  208. package/lib/test/stmt/failover/stmt2.failover.test.d.ts +2 -0
  209. package/lib/test/stmt/failover/stmt2.failover.test.d.ts.map +1 -0
  210. package/lib/test/stmt/failover/stmt2.failover.test.js +384 -0
  211. package/lib/test/stmt/stmt1.func.test.d.ts +2 -0
  212. package/lib/test/stmt/stmt1.func.test.d.ts.map +1 -0
  213. package/lib/test/stmt/stmt1.func.test.js +418 -0
  214. package/lib/test/stmt/stmt1.type.test.d.ts +2 -0
  215. package/lib/test/stmt/stmt1.type.test.d.ts.map +1 -0
  216. package/lib/test/stmt/stmt1.type.test.js +399 -0
  217. package/lib/test/stmt/stmt2.failover.mock.test.d.ts +2 -0
  218. package/lib/test/stmt/stmt2.failover.mock.test.d.ts.map +1 -0
  219. package/lib/test/stmt/stmt2.failover.mock.test.js +341 -0
  220. package/lib/test/stmt/stmt2.failover.test.d.ts +2 -0
  221. package/lib/test/stmt/stmt2.failover.test.d.ts.map +1 -0
  222. package/lib/test/stmt/stmt2.failover.test.js +384 -0
  223. package/lib/test/stmt/stmt2.func.test.d.ts +2 -0
  224. package/lib/test/stmt/stmt2.func.test.d.ts.map +1 -0
  225. package/lib/test/stmt/stmt2.func.test.js +537 -0
  226. package/lib/test/stmt/stmt2.type.test.d.ts +2 -0
  227. package/lib/test/stmt/stmt2.type.test.d.ts.map +1 -0
  228. package/lib/test/stmt/stmt2.type.test.js +401 -0
  229. package/lib/test/stmt/v1/stmt1.func.test.d.ts +2 -0
  230. package/lib/test/stmt/v1/stmt1.func.test.d.ts.map +1 -0
  231. package/lib/test/stmt/v1/stmt1.func.test.js +418 -0
  232. package/lib/test/stmt/v1/stmt1.type.test.d.ts +2 -0
  233. package/lib/test/stmt/v1/stmt1.type.test.d.ts.map +1 -0
  234. package/lib/test/stmt/v1/stmt1.type.test.js +399 -0
  235. package/lib/test/stmt/v2/stmt2.func.test.d.ts +2 -0
  236. package/lib/test/stmt/v2/stmt2.func.test.d.ts.map +1 -0
  237. package/lib/test/stmt/v2/stmt2.func.test.js +537 -0
  238. package/lib/test/stmt/v2/stmt2.type.test.d.ts +2 -0
  239. package/lib/test/stmt/v2/stmt2.type.test.d.ts.map +1 -0
  240. package/lib/test/stmt/v2/stmt2.type.test.js +401 -0
  241. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts +2 -0
  242. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts.map +1 -0
  243. package/lib/test/tmq/cloud/cloud.tmq.test.js +84 -0
  244. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts +2 -0
  245. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts.map +1 -0
  246. package/lib/test/tmq/cloud/tmq.cloud.test.js +82 -0
  247. package/lib/test/tmq/core/tmq.config.test.d.ts +2 -0
  248. package/lib/test/tmq/core/tmq.config.test.d.ts.map +1 -0
  249. package/lib/test/tmq/core/tmq.config.test.js +83 -0
  250. package/lib/test/tmq/core/tmq.test.d.ts +2 -0
  251. package/lib/test/tmq/core/tmq.test.d.ts.map +1 -0
  252. package/lib/test/tmq/core/tmq.test.js +513 -0
  253. package/lib/test/tmq/failover/tmq.failover.test.d.ts +2 -0
  254. package/lib/test/tmq/failover/tmq.failover.test.d.ts.map +1 -0
  255. package/lib/test/tmq/failover/tmq.failover.test.js +404 -0
  256. package/lib/test/tmq/tmq.cloud.test.d.ts +2 -0
  257. package/lib/test/tmq/tmq.cloud.test.d.ts.map +1 -0
  258. package/lib/test/tmq/tmq.cloud.test.js +82 -0
  259. package/lib/test/tmq/tmq.config.test.d.ts +2 -0
  260. package/lib/test/tmq/tmq.config.test.d.ts.map +1 -0
  261. package/lib/test/tmq/tmq.config.test.js +94 -0
  262. package/lib/test/tmq/tmq.failover.test.d.ts +2 -0
  263. package/lib/test/tmq/tmq.failover.test.d.ts.map +1 -0
  264. package/lib/test/tmq/tmq.failover.test.js +404 -0
  265. package/lib/test/tmq/tmq.test.d.ts +2 -0
  266. package/lib/test/tmq/tmq.test.d.ts.map +1 -0
  267. package/lib/test/tmq/tmq.test.js +513 -0
  268. package/lib/test/unit/connectionManager.test.d.ts +2 -0
  269. package/lib/test/unit/connectionManager.test.d.ts.map +1 -0
  270. package/lib/test/unit/connectionManager.test.js +91 -0
  271. package/lib/test/utils.d.ts +4 -0
  272. package/lib/test/utils.d.ts.map +1 -1
  273. package/lib/test/utils.js +11 -17
  274. package/package.json +1 -1
  275. package/readme.md +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"wsConnector.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnector.ts"],"names":[],"mappings":"AAUA,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,QAAQ,SAAQ;gBAGJ,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAuClD,KAAK;YA6BG,QAAQ;IAItB,OAAO,CAAC,UAAU;IA4BlB,KAAK;IAWL,UAAU,IAAI,MAAM;IAId,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB7C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc;IAqCjD,aAAa,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,QAAQ,GAAE,OAAc;IAkCrB,QAAQ,IAAI,GAAG;CAGzB"}
1
+ {"version":3,"file":"wsConnector.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnector.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,GAAG,EAAE,MAAM,eAAe,CAAC;AA0D7C,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AA0DtD,qBAAa,WAAW;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAM9E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAOxC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;CAexC;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwC;IAC3E,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAS;gBAGrB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAoB/B,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAIzC,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,gBAAgB;IAmExB,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,mBAAmB;YAOb,qCAAqC;YAcrC,gBAAgB;IAkB9B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,uBAAuB;IAIxB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IA4B5C,OAAO,CAAC,IAAI;IAcN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,2BAA2B;YAWrB,KAAK;IAInB,OAAO,CAAC,kBAAkB;YAIZ,gBAAgB;YAkBhB,YAAY;YAkBZ,SAAS;YAUT,gBAAgB;YAsChB,cAAc;IAiB5B,OAAO,CAAC,uBAAuB;IAO/B,KAAK;IAiBL,UAAU,IAAI,MAAM;IAIb,sBAAsB,CACzB,IAAI,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI,GAC7C,IAAI;YAIO,qBAAqB;IAOtB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAmCnD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,OAAO,CAAC,OAAO,EAAE,MAAM;IAgBvB,aAAa,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW;YAWV,oBAAoB;IAgF3B,UAAU,IAAI,MAAM;IAIpB,mBAAmB,IAAI,MAAM;CAGvC"}
@@ -3,61 +3,193 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WebSocketConnector = void 0;
6
+ exports.WebSocketConnector = exports.RetryConfig = void 0;
7
7
  const websocket_1 = require("websocket");
8
+ const addressConnectionTracker_1 = require("../common/addressConnectionTracker");
8
9
  const wsError_1 = require("../common/wsError");
9
10
  const wsEventCallback_1 = require("./wsEventCallback");
10
11
  const log_1 = __importDefault(require("../common/log"));
11
- const reqid_1 = require("../common/reqid");
12
- class WebSocketConnector {
13
- // create ws
14
- constructor(url, timeout) {
15
- this._timeout = 5000;
16
- // return w3bsocket3
17
- if (url) {
18
- this._wsURL = url;
19
- let origin = url.origin;
20
- let pathname = url.pathname;
21
- let search = url.search;
22
- if (timeout) {
23
- this._timeout = timeout;
24
- }
25
- this._wsConn = new websocket_1.w3cwebsocket(origin.concat(pathname).concat(search), undefined, undefined, undefined, undefined, {
26
- maxReceivedFrameSize: 0x60000000,
27
- maxReceivedMessageSize: 0x60000000,
28
- });
29
- this._wsConn.onerror = function (err) {
30
- log_1.default.error(`webSocket connection failed, url: ${this.url}, error: ${err.message}`);
31
- };
32
- this._wsConn.onclose = this._onclose;
33
- this._wsConn.onmessage = this._onmessage;
34
- this._wsConn._binaryType = "arraybuffer";
12
+ const utils_1 = require("../common/utils");
13
+ class InflightRequestStore {
14
+ constructor() {
15
+ this.nextMsgId = 1n;
16
+ this.reqIdToMsgId = new Map();
17
+ this.msgIdToRequest = new Map();
18
+ }
19
+ insert(req) {
20
+ const msgId = this.nextMsgId;
21
+ this.nextMsgId += 1n;
22
+ this.reqIdToMsgId.set(req.reqId, msgId);
23
+ this.msgIdToRequest.set(msgId, req);
24
+ }
25
+ remove(reqId) {
26
+ const msgId = this.reqIdToMsgId.get(reqId);
27
+ if (msgId === undefined) {
28
+ return;
35
29
  }
36
- else {
30
+ this.reqIdToMsgId.delete(reqId);
31
+ this.msgIdToRequest.delete(msgId);
32
+ }
33
+ getRequests() {
34
+ return Array.from(this.msgIdToRequest.entries())
35
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
36
+ .map(([, req]) => req);
37
+ }
38
+ clear() {
39
+ this.nextMsgId = 1n;
40
+ this.reqIdToMsgId.clear();
41
+ this.msgIdToRequest.clear();
42
+ }
43
+ }
44
+ const RETRIABLE_ACTIONS = new Set(["insert", "options_connection", "poll", "subscribe"]);
45
+ // TDengine websocket binary op codes that are safe to replay after reconnect.
46
+ const BINARY_RETRIABLE_ACTIONS = new Set([4n, 5n, 6n, 10n]);
47
+ const DEFAULT_RETRIES = 5;
48
+ const DEFAULT_BACKOFF_MS = 200;
49
+ const DEFAULT_BACKOFF_MAX_MS = 2000;
50
+ const NETWORK_ERROR_CODES = new Set([
51
+ "econnreset",
52
+ "econnrefused",
53
+ "ehostunreach",
54
+ "enotfound",
55
+ "eai_again",
56
+ "epipe",
57
+ "etimedout",
58
+ "err_socket_closed",
59
+ "err_stream_write_after_end",
60
+ ]);
61
+ const NETWORK_ERROR_MESSAGE_PATTERNS = [
62
+ "not connected",
63
+ "socket",
64
+ "network",
65
+ "econnreset",
66
+ "econnrefused",
67
+ "epipe",
68
+ "etimedout",
69
+ "write after end",
70
+ "broken pipe",
71
+ "connection reset",
72
+ "connection closed",
73
+ ];
74
+ function parseNonNegativeInt(value, fallback) {
75
+ return parseIntWithValidation(value, fallback, (parsed) => parsed >= 0);
76
+ }
77
+ function parsePositiveInt(value, fallback) {
78
+ return parseIntWithValidation(value, fallback, (parsed) => parsed > 0);
79
+ }
80
+ function parseIntWithValidation(value, fallback, isValid) {
81
+ if (value === undefined || value === null || value.length === 0) {
82
+ return fallback;
83
+ }
84
+ const parsed = Number.parseInt(value, 10);
85
+ if (Number.isNaN(parsed) || !isValid(parsed)) {
86
+ return fallback;
87
+ }
88
+ return parsed;
89
+ }
90
+ class RetryConfig {
91
+ constructor(retries, retryBackoffMs, retryBackoffMaxMs) {
92
+ this.retries = retries;
93
+ this.retryBackoffMs = retryBackoffMs;
94
+ this.retryBackoffMaxMs = Math.max(retryBackoffMs, retryBackoffMaxMs);
95
+ }
96
+ getBackoffDelay(attempt) {
97
+ const safeAttempt = Math.max(0, attempt);
98
+ const rawDelay = this.retryBackoffMs * Math.pow(2, safeAttempt);
99
+ const finiteDelay = Number.isFinite(rawDelay) ? rawDelay : this.retryBackoffMaxMs;
100
+ return Math.min(finiteDelay, this.retryBackoffMaxMs);
101
+ }
102
+ static fromDsn(dsn) {
103
+ const retries = parseNonNegativeInt(dsn.params.get("retries"), DEFAULT_RETRIES);
104
+ const retryBackoffMs = parsePositiveInt(dsn.params.get("retry_backoff_ms"), DEFAULT_BACKOFF_MS);
105
+ const retryBackoffMaxMs = parsePositiveInt(dsn.params.get("retry_backoff_max_ms"), DEFAULT_BACKOFF_MAX_MS);
106
+ return new RetryConfig(retries, retryBackoffMs, retryBackoffMaxMs);
107
+ }
108
+ }
109
+ exports.RetryConfig = RetryConfig;
110
+ class WebSocketConnector {
111
+ constructor(dsn, poolKey, timeout) {
112
+ this._suppressedSockets = new WeakSet();
113
+ this._reconnectLock = null;
114
+ this._isReconnecting = false;
115
+ this._allowReconnect = true;
116
+ this._connectionReady = Promise.resolve();
117
+ this._sessionRecoveryHook = null;
118
+ this._timeout = 60000;
119
+ if (!dsn || dsn.addresses.length === 0) {
37
120
  throw new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_INVALID_URL, "websocket URL must be defined");
38
121
  }
122
+ this._poolKey = poolKey;
123
+ this._dsn = dsn;
124
+ this._currentAddress = this.selectLeastConnectedAddress();
125
+ this._retryConfig = RetryConfig.fromDsn(dsn);
126
+ this._inflightStore = new InflightRequestStore();
127
+ if (timeout) {
128
+ this._timeout = timeout;
129
+ }
130
+ log_1.default.info(`Initial websocket address selected: ${this.getCurrentAddress()}`);
131
+ this.createConnection();
39
132
  }
40
- async ready() {
41
- return new Promise((resolve, reject) => {
42
- let reqId = reqid_1.ReqId.getReqID();
43
- wsEventCallback_1.WsEventCallback.instance().registerCallback({
44
- action: "websocket_connection",
45
- req_id: BigInt(reqId),
46
- timeout: this._timeout,
47
- id: BigInt(reqId),
48
- }, resolve, reject);
49
- this._wsConn.onopen = () => {
133
+ refreshRetryConfig(dsn) {
134
+ this._retryConfig = RetryConfig.fromDsn(dsn);
135
+ }
136
+ buildUrl(addr) {
137
+ const path = this._dsn.path();
138
+ const url = new URL(`${this._dsn.scheme}://${addr.host}:${addr.port}/${path}`);
139
+ const forwardedParams = ["token", "bearer_token"];
140
+ for (const key of forwardedParams) {
141
+ const value = this._dsn.params.get(key);
142
+ if (value !== undefined) {
143
+ url.searchParams.set(key, value);
144
+ }
145
+ }
146
+ return url.toString();
147
+ }
148
+ createConnection() {
149
+ const conn = new websocket_1.w3cwebsocket(this.buildUrl(this._currentAddress), undefined, undefined, undefined, undefined, {
150
+ maxReceivedFrameSize: 0x60000000,
151
+ maxReceivedMessageSize: 0x60000000,
152
+ });
153
+ conn._binaryType = "arraybuffer";
154
+ conn.onmessage = this._onmessage;
155
+ this._connectionReady = new Promise((resolve, reject) => {
156
+ let settled = false;
157
+ const settle = (handler) => {
158
+ if (settled) {
159
+ return;
160
+ }
161
+ settled = true;
162
+ clearTimeout(timeoutId);
163
+ handler();
164
+ };
165
+ const timeoutId = setTimeout(() => {
166
+ settle(() => {
167
+ reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_QUERY_TIMEOUT, `websocket connection timeout with ${this._timeout} milliseconds`));
168
+ });
169
+ }, this._timeout);
170
+ conn.onopen = () => {
50
171
  log_1.default.debug("websocket connection opened");
51
- wsEventCallback_1.WsEventCallback.instance().handleEventCallback({
52
- id: BigInt(reqId),
53
- action: "websocket_connection",
54
- req_id: BigInt(reqId),
55
- }, wsEventCallback_1.OnMessageType.MESSAGE_TYPE_CONNECTION, this);
172
+ addressConnectionTracker_1.AddressConnectionTracker.instance().increment(this.getCurrentAddress());
173
+ settle(resolve);
174
+ };
175
+ conn.onerror = (err) => {
176
+ log_1.default.error(`webSocket connection failed, url: ${(0, utils_1.maskUrlForLog)(new URL(conn.url))}, error: ${err.message}`);
177
+ if (conn.readyState !== websocket_1.w3cwebsocket.OPEN) {
178
+ settle(() => reject(err));
179
+ }
180
+ void this.handleDisconnect(conn);
181
+ };
182
+ conn.onclose = (e) => {
183
+ log_1.default.info(`websocket connection closed, code: ${e.code}, reason: ${e.reason}`);
184
+ if (conn.readyState !== websocket_1.w3cwebsocket.OPEN) {
185
+ settle(() => {
186
+ reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `websocket connection closed: ${e.code} ${e.reason}`));
187
+ });
188
+ }
189
+ void this.handleDisconnect(conn, e);
56
190
  };
57
191
  });
58
- }
59
- async _onclose(e) {
60
- log_1.default.info("websocket connection closed");
192
+ this._conn = conn;
61
193
  }
62
194
  _onmessage(event) {
63
195
  let data = event.data;
@@ -75,83 +207,371 @@ class WebSocketConnector {
75
207
  throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_MESSAGE_TYPE, `invalid message type ${Object.prototype.toString.call(data)}`);
76
208
  }
77
209
  }
78
- close() {
79
- if (this._wsConn) {
80
- this._wsConn.close();
210
+ shouldSkipReconnect(conn) {
211
+ if (!this.isReconnectAllowed()) {
212
+ return true;
81
213
  }
82
- else {
83
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, "WebSocket connection is undefined.");
214
+ return this._suppressedSockets.has(conn);
215
+ }
216
+ async failNonRetriableCallbacksOnDisconnect() {
217
+ const keepReqIds = new Set(this._inflightStore.getRequests().map((req) => req.reqId));
218
+ await wsEventCallback_1.WsEventCallback.instance().rejectCallbacksExceptReqIds(keepReqIds, new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "websocket connection closed before response was received"), this._poolKey);
219
+ }
220
+ async handleDisconnect(conn, event) {
221
+ if (this.shouldSkipReconnect(conn) || this._isReconnecting) {
222
+ return;
223
+ }
224
+ if (event && event.code === 1000) {
225
+ log_1.default.info("Websocket closed normally, skipping reconnect.");
226
+ return;
227
+ }
228
+ await this.failNonRetriableCallbacksOnDisconnect();
229
+ try {
230
+ await this.triggerReconnect();
231
+ }
232
+ catch (err) {
233
+ const type = event ? 'close' : 'error';
234
+ const message = err instanceof Error ? err.message : String(err);
235
+ log_1.default.error(`Reconnect failed after websocket ${type}: ${message}`);
84
236
  }
85
237
  }
86
- readyState() {
87
- return this._wsConn.readyState;
238
+ extractReqId(reqId) {
239
+ if (reqId === undefined || reqId === null) {
240
+ return null;
241
+ }
242
+ try {
243
+ return BigInt(reqId);
244
+ }
245
+ catch (err) {
246
+ return null;
247
+ }
88
248
  }
89
- async sendMsgNoResp(message) {
90
- log_1.default.debug("[wsClient.sendMsgNoResp()]===>" + message);
91
- let msg = JSON.parse(message);
92
- if (msg.args.id !== undefined) {
93
- msg.args.id = BigInt(msg.args.id);
249
+ isRetriableAction(action) {
250
+ return RETRIABLE_ACTIONS.has(action);
251
+ }
252
+ extractBinaryAction(message) {
253
+ if (message.byteLength < 24) {
254
+ return -1n;
94
255
  }
95
- return new Promise((resolve, reject) => {
96
- if (this._wsConn && this._wsConn.readyState === websocket_1.w3cwebsocket.OPEN) {
97
- this._wsConn.send(message);
98
- resolve();
256
+ return new DataView(message, 16, 8).getBigInt64(0, true);
257
+ }
258
+ isRetriableBinaryAction(action) {
259
+ return BINARY_RETRIABLE_ACTIONS.has(action);
260
+ }
261
+ isNetworkError(err) {
262
+ if (!this._conn || this._conn.readyState !== websocket_1.w3cwebsocket.OPEN) {
263
+ return true;
264
+ }
265
+ const errObj = err;
266
+ const code = errObj?.code;
267
+ if (typeof code === "number" && code === wsError_1.ErrorCode.ERR_CONNECTION_CLOSED) {
268
+ return true;
269
+ }
270
+ if (typeof code === "string") {
271
+ const loweredCode = code.toLowerCase();
272
+ if (loweredCode.length > 0 && NETWORK_ERROR_CODES.has(loweredCode)) {
273
+ return true;
274
+ }
275
+ }
276
+ const message = err instanceof Error
277
+ ? err.message
278
+ : typeof errObj?.message === "string"
279
+ ? errObj.message
280
+ : String(err);
281
+ const lowered = message.toLowerCase();
282
+ return NETWORK_ERROR_MESSAGE_PATTERNS.some((pattern) => lowered.includes(pattern));
283
+ }
284
+ send(message, triggerReconnect = true) {
285
+ try {
286
+ this._conn.send(message);
287
+ }
288
+ catch (err) {
289
+ if (triggerReconnect && this.isNetworkError(err)) {
290
+ void this.triggerReconnect().catch((err) => {
291
+ const message = err instanceof Error ? err.message : String(err);
292
+ log_1.default.error(`Reconnect trigger failed: ${message}`);
293
+ });
99
294
  }
100
- else {
101
- reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
295
+ throw err;
296
+ }
297
+ }
298
+ async ready() {
299
+ if (this._conn && this._conn.readyState === websocket_1.w3cwebsocket.OPEN) {
300
+ return;
301
+ }
302
+ if (this._reconnectLock) {
303
+ await this._reconnectLock;
304
+ return;
305
+ }
306
+ try {
307
+ await this._connectionReady;
308
+ }
309
+ catch (err) {
310
+ if (this._reconnectLock) {
311
+ await this._reconnectLock;
312
+ return;
102
313
  }
314
+ throw err;
315
+ }
316
+ }
317
+ getCurrentAddress() {
318
+ return `${this._currentAddress.host}:${this._currentAddress.port}`;
319
+ }
320
+ selectLeastConnectedAddress(excludedAddresses = new Set()) {
321
+ const candidates = this._dsn.addresses.filter((address) => {
322
+ const addressKey = `${address.host}:${address.port}`;
323
+ return !excludedAddresses.has(addressKey);
103
324
  });
325
+ const selectableAddresses = candidates.length > 0 ? candidates : this._dsn.addresses;
326
+ const selectedIndex = addressConnectionTracker_1.AddressConnectionTracker.instance()
327
+ .selectLeastConnected(selectableAddresses);
328
+ return selectableAddresses[selectedIndex];
329
+ }
330
+ async sleep(ms) {
331
+ await new Promise((resolve) => setTimeout(resolve, ms));
104
332
  }
105
- async sendMsg(message, register = true) {
106
- log_1.default.debug("[wsClient.sendMessage()]===>" + message);
107
- let msg = JSON.parse(message);
108
- if (msg.args.id !== undefined) {
109
- msg.args.id = BigInt(msg.args.id);
333
+ isReconnectAllowed() {
334
+ return this._allowReconnect;
335
+ }
336
+ async triggerReconnect() {
337
+ if (!this.isReconnectAllowed()) {
338
+ return;
110
339
  }
111
- return new Promise((resolve, reject) => {
112
- if (this._wsConn && this._wsConn.readyState === websocket_1.w3cwebsocket.OPEN) {
113
- if (register) {
114
- wsEventCallback_1.WsEventCallback.instance().registerCallback({
115
- action: msg.action,
116
- req_id: msg.args.req_id,
117
- timeout: this._timeout,
118
- id: msg.args.id === undefined
119
- ? msg.args.id
120
- : BigInt(msg.args.id),
121
- }, resolve, reject);
340
+ if (!this._reconnectLock) {
341
+ this._reconnectLock = this._doReconnect();
342
+ }
343
+ const lock = this._reconnectLock;
344
+ try {
345
+ await lock;
346
+ }
347
+ finally {
348
+ if (this._reconnectLock === lock) {
349
+ this._reconnectLock = null;
350
+ }
351
+ }
352
+ }
353
+ async _doReconnect() {
354
+ if (!this.isReconnectAllowed()) {
355
+ return;
356
+ }
357
+ this._isReconnecting = true;
358
+ try {
359
+ await this.attemptReconnect();
360
+ }
361
+ catch (err) {
362
+ const reconnectError = err instanceof Error
363
+ ? err
364
+ : new Error("unknown reconnect error");
365
+ this.failAllInflightRequests(reconnectError);
366
+ throw reconnectError;
367
+ }
368
+ finally {
369
+ this._isReconnecting = false;
370
+ }
371
+ }
372
+ async reconnect() {
373
+ if (this._conn) {
374
+ addressConnectionTracker_1.AddressConnectionTracker.instance().decrement(this.getCurrentAddress());
375
+ this._suppressedSockets.add(this._conn);
376
+ this._conn.close();
377
+ }
378
+ this.createConnection();
379
+ await this._connectionReady;
380
+ }
381
+ async attemptReconnect() {
382
+ const totalAddresses = this._dsn.addresses.length;
383
+ const failedAddresses = new Set();
384
+ for (let i = 0; i < totalAddresses; i++) {
385
+ for (let retry = 0; retry < this._retryConfig.retries; retry++) {
386
+ if (!this.isReconnectAllowed()) {
387
+ return;
388
+ }
389
+ try {
390
+ log_1.default.info(`Reconnecting to ${this.getCurrentAddress()}, attempt ${retry + 1}`);
391
+ await this.reconnect();
392
+ await this.recoverSessionContext();
393
+ await this.replayRequests();
394
+ log_1.default.info(`Reconnection successful to ${this.getCurrentAddress()}`);
395
+ return;
396
+ }
397
+ catch (err) {
398
+ log_1.default.warn(`Reconnect failed: ${err.message}`);
399
+ if (retry < this._retryConfig.retries - 1) {
400
+ const delay = this._retryConfig.getBackoffDelay(retry);
401
+ await this.sleep(delay);
402
+ }
122
403
  }
123
- log_1.default.debug(`[wsClient.sendMessage.msg]===> ${message}`);
124
- this._wsConn.send(message);
125
404
  }
126
- else {
127
- reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
405
+ if (i < totalAddresses - 1) {
406
+ failedAddresses.add(this.getCurrentAddress());
407
+ this._currentAddress = this.selectLeastConnectedAddress(failedAddresses);
408
+ log_1.default.info(`Switching to least-connected address: ${this.getCurrentAddress()}`);
409
+ }
410
+ }
411
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, "Failed to reconnect to any available address");
412
+ }
413
+ async replayRequests() {
414
+ log_1.default.info("Replaying requests after reconnection");
415
+ for (const req of this._inflightStore.getRequests()) {
416
+ try {
417
+ this.send(req.message, false);
418
+ }
419
+ catch (err) {
420
+ const message = err instanceof Error ? err.message : String(err);
421
+ if (this.isNetworkError(err)) {
422
+ log_1.default.warn(`Network error while replaying inflight request, stopping current replay round: ${message}`);
423
+ throw err;
424
+ }
425
+ log_1.default.error(`Failed to replay inflight request: ${req}, error: ${message}`);
426
+ req.reject(err);
128
427
  }
428
+ }
429
+ }
430
+ failAllInflightRequests(error) {
431
+ for (const req of this._inflightStore.getRequests()) {
432
+ req.reject(error);
433
+ }
434
+ this._inflightStore.clear();
435
+ }
436
+ close() {
437
+ this._allowReconnect = false;
438
+ this.failAllInflightRequests(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "websocket connection closed"));
439
+ if (this._conn) {
440
+ addressConnectionTracker_1.AddressConnectionTracker.instance().decrement(this.getCurrentAddress());
441
+ this._suppressedSockets.add(this._conn);
442
+ this._conn.close();
443
+ }
444
+ else {
445
+ log_1.default.warn("close() called but websocket connection is undefined");
446
+ }
447
+ }
448
+ readyState() {
449
+ return this._conn.readyState;
450
+ }
451
+ setSessionRecoveryHook(hook) {
452
+ this._sessionRecoveryHook = hook || null;
453
+ }
454
+ async recoverSessionContext() {
455
+ if (!this._sessionRecoveryHook) {
456
+ return;
457
+ }
458
+ await this._sessionRecoveryHook();
459
+ }
460
+ async sendMsgDirect(message) {
461
+ if (log_1.default.isDebugEnabled()) {
462
+ log_1.default.debug("[wsClient.sendMsgDirect]===>" + (0, utils_1.maskSensitiveForLog)(message));
463
+ }
464
+ const msg = JSON.parse(message);
465
+ const reqId = this.extractReqId(msg?.args?.req_id) ?? BigInt(0);
466
+ let resolveResp = () => { };
467
+ let rejectResp = () => { };
468
+ const responsePromise = new Promise((resolve, reject) => {
469
+ resolveResp = resolve;
470
+ rejectResp = reject;
129
471
  });
472
+ await wsEventCallback_1.WsEventCallback.instance().registerCallback({
473
+ action: msg.action,
474
+ req_id: reqId,
475
+ timeout: this._timeout,
476
+ poolKey: this._poolKey,
477
+ }, resolveResp, rejectResp);
478
+ try {
479
+ this.send(message, false);
480
+ return await responsePromise;
481
+ }
482
+ catch (err) {
483
+ await wsEventCallback_1.WsEventCallback.instance().unregisterCallback(reqId);
484
+ throw err;
485
+ }
486
+ }
487
+ async sendMsgNoResp(message) {
488
+ log_1.default.debug("[wsClient.sendMsgNoResp]===>" + message);
489
+ if (this._reconnectLock) {
490
+ await this._reconnectLock;
491
+ }
492
+ this.send(message);
493
+ }
494
+ async sendMsg(message) {
495
+ if (log_1.default.isDebugEnabled()) {
496
+ log_1.default.debug("[wsConnector.sendMsg]===>" + (0, utils_1.maskSensitiveForLog)(message));
497
+ }
498
+ const msg = JSON.parse(message);
499
+ const id = msg?.args?.id !== undefined ? BigInt(msg.args.id) : undefined;
500
+ const reqId = this.extractReqId(msg?.args?.req_id) ?? BigInt(0);
501
+ return this.sendAndTrackResponse(reqId, msg.action, message, this.isRetriableAction(msg.action), id);
502
+ }
503
+ async sendBinaryMsg(reqId, action, message) {
504
+ return this.sendAndTrackResponse(reqId, action, message, this.isRetriableBinaryAction(this.extractBinaryAction(message)), reqId);
130
505
  }
131
- async sendBinaryMsg(reqId, action, message, register = true) {
506
+ async sendAndTrackResponse(reqId, action, message, retriable, callbackId) {
507
+ if (this._reconnectLock) {
508
+ await this._reconnectLock;
509
+ }
132
510
  return new Promise((resolve, reject) => {
133
- if (this._wsConn && this._wsConn.readyState === websocket_1.w3cwebsocket.OPEN) {
134
- if (register) {
135
- wsEventCallback_1.WsEventCallback.instance().registerCallback({
136
- action: action,
137
- req_id: reqId,
138
- timeout: this._timeout,
139
- id: reqId,
140
- }, resolve, reject);
511
+ let settled = false;
512
+ const safeResolve = (result) => {
513
+ if (settled) {
514
+ return;
141
515
  }
142
- log_1.default.debug("[wsClient.sendBinaryMsg()]===>" +
143
- reqId +
144
- action +
145
- message.byteLength);
146
- this._wsConn.send(message);
147
- }
148
- else {
149
- reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
150
- }
516
+ settled = true;
517
+ if (retriable) {
518
+ this._inflightStore.remove(reqId);
519
+ }
520
+ resolve(result);
521
+ };
522
+ const safeReject = (error) => {
523
+ if (settled) {
524
+ return;
525
+ }
526
+ settled = true;
527
+ if (retriable) {
528
+ this._inflightStore.remove(reqId);
529
+ }
530
+ void wsEventCallback_1.WsEventCallback.instance().unregisterCallback(reqId);
531
+ reject(error);
532
+ };
533
+ const registerAndSend = async () => {
534
+ if (retriable) {
535
+ this._inflightStore.insert({
536
+ reqId,
537
+ action,
538
+ id: callbackId,
539
+ message,
540
+ resolve: safeResolve,
541
+ reject: safeReject,
542
+ });
543
+ }
544
+ await wsEventCallback_1.WsEventCallback.instance().registerCallback({
545
+ action,
546
+ req_id: reqId,
547
+ timeout: this._timeout,
548
+ id: callbackId,
549
+ poolKey: this._poolKey,
550
+ }, safeResolve, safeReject);
551
+ if (settled) {
552
+ await wsEventCallback_1.WsEventCallback.instance().unregisterCallback(reqId);
553
+ return;
554
+ }
555
+ try {
556
+ this.send(message);
557
+ }
558
+ catch (err) {
559
+ if (retriable && this.isNetworkError(err)) {
560
+ return;
561
+ }
562
+ safeReject(err);
563
+ }
564
+ };
565
+ void registerAndSend().catch((error) => {
566
+ safeReject(error);
567
+ });
151
568
  });
152
569
  }
153
- getWsURL() {
154
- return this._wsURL;
570
+ getPoolKey() {
571
+ return this._poolKey;
572
+ }
573
+ getReconnectRetries() {
574
+ return this._retryConfig.retries;
155
575
  }
156
576
  }
157
577
  exports.WebSocketConnector = WebSocketConnector;