@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
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@tdengine/websocket",
3
+ "version": "3.3.0",
4
+ "description": "The websocket Node.js connector for TDengine. TDengine versions 3.3.2.0 and above are recommended to use this connector.",
5
+ "source": "index.ts",
6
+ "main": "lib/index.js",
7
+ "module": "lib/index.js",
8
+ "types": "lib/index.d.ts",
9
+ "directories": {
10
+ "example": "example",
11
+ "test": "test"
12
+ },
13
+ "scripts": {
14
+ "test": "jest --coverage --coverageDirectory=../coverage",
15
+ "example": "tsc && node lib/example/basicSql.js",
16
+ "build": "tsc",
17
+ "prepublish": "node ./prepare.js"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/taosdata/taos-connector-node.git"
22
+ },
23
+ "keywords": [
24
+ "taosdata",
25
+ "taos",
26
+ "IOT",
27
+ "TypeScript",
28
+ "TDengine",
29
+ "database"
30
+ ],
31
+ "author": "TaosData Inc.",
32
+ "license": "MIT",
33
+ "bugs": {
34
+ "url": "https://github.com/taosdata/taos-connector-node/issues"
35
+ },
36
+ "files": [
37
+ "lib"
38
+ ],
39
+ "homepage": "https://github.com/taosdata/taos-connector-node#readme",
40
+ "dependencies": {
41
+ "async-mutex": "^0.5.0",
42
+ "json-bigint": "^1.0.0",
43
+ "moment-timezone": "^0.5.45",
44
+ "typescript": "^5.3.3",
45
+ "uuid": "^9.0.1",
46
+ "websocket": "^1.0.34",
47
+ "winston": "^3.17.0",
48
+ "winston-daily-rotate-file": "^5.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@parcel/packager-ts": "^2.7.0",
52
+ "@parcel/transformer-typescript-types": "^2.7.0",
53
+ "@types/jest": "^29.2.1",
54
+ "@types/json-bigint": "^1.0.1",
55
+ "@types/node": "^18.0.0",
56
+ "@types/uuid": "^9.0.8",
57
+ "@types/websocket": "^1.0",
58
+ "jest": "^29.7.0",
59
+ "parcel": "^2.7.0",
60
+ "qingwa": "^1.0.7",
61
+ "ts-jest": "^29.0.3",
62
+ "typescript": "^5.3.3"
63
+ }
64
+ }
@@ -0,0 +1,10 @@
1
+ import { Dsn } from "../common/dsn";
2
+ export declare class RetryConfig {
3
+ readonly retries: number;
4
+ readonly retryBackoffMs: number;
5
+ readonly retryBackoffMaxMs: number;
6
+ constructor(retries: number, retryBackoffMs: number, retryBackoffMaxMs: number);
7
+ getBackoffDelay(attempt: number): number;
8
+ static fromDsn(dsn: Dsn): RetryConfig;
9
+ }
10
+ //# sourceMappingURL=retryConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryConfig.d.ts","sourceRoot":"","sources":["../../../src/client/retryConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAkCpC,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"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RetryConfig = void 0;
4
+ const DEFAULT_RETRIES = 3;
5
+ const DEFAULT_BACKOFF_MS = 100;
6
+ const DEFAULT_BACKOFF_MAX_MS = 10000;
7
+ function parseNonNegativeInt(value, fallback) {
8
+ if (value === undefined || value === null || value.length === 0) {
9
+ return fallback;
10
+ }
11
+ const parsed = Number.parseInt(value, 10);
12
+ if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed < 0) {
13
+ return fallback;
14
+ }
15
+ return parsed;
16
+ }
17
+ function parsePositiveInt(value, fallback) {
18
+ if (value === undefined || value === null || value.length === 0) {
19
+ return fallback;
20
+ }
21
+ const parsed = Number.parseInt(value, 10);
22
+ if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) {
23
+ return fallback;
24
+ }
25
+ return parsed;
26
+ }
27
+ class RetryConfig {
28
+ constructor(retries, retryBackoffMs, retryBackoffMaxMs) {
29
+ this.retries = retries;
30
+ this.retryBackoffMs = retryBackoffMs;
31
+ this.retryBackoffMaxMs = Math.max(retryBackoffMs, retryBackoffMaxMs);
32
+ }
33
+ getBackoffDelay(attempt) {
34
+ const safeAttempt = Math.max(0, attempt);
35
+ const rawDelay = this.retryBackoffMs * Math.pow(2, safeAttempt);
36
+ const finiteDelay = Number.isFinite(rawDelay) ? rawDelay : this.retryBackoffMaxMs;
37
+ return Math.min(finiteDelay, this.retryBackoffMaxMs);
38
+ }
39
+ static fromDsn(dsn) {
40
+ const retries = parseNonNegativeInt(dsn.params.get("retries"), DEFAULT_RETRIES);
41
+ const retryBackoffMs = parsePositiveInt(dsn.params.get("retry_backoff_ms"), DEFAULT_BACKOFF_MS);
42
+ const retryBackoffMaxMs = parsePositiveInt(dsn.params.get("retry_backoff_max_ms"), DEFAULT_BACKOFF_MAX_MS);
43
+ return new RetryConfig(retries, retryBackoffMs, retryBackoffMaxMs);
44
+ }
45
+ }
46
+ exports.RetryConfig = RetryConfig;
@@ -1,25 +1,42 @@
1
+ import type { SessionRecoveryHook } from "./wsConnector";
2
+ import { Dsn } from "../common/dsn";
1
3
  import { WSQueryResponse } from "./wsResponse";
2
4
  import { TSDB_OPTION_CONNECTION } from "../common/constant";
3
5
  export declare class WsClient {
4
6
  private _wsConnector?;
5
7
  private _timeout?;
6
8
  private _timezone?;
7
- private readonly _url;
9
+ private readonly _dsn;
8
10
  private static readonly _minVersion;
9
11
  private _version?;
10
- constructor(url: URL, timeout?: number | undefined | null);
12
+ private _bearerToken?;
13
+ private _connectedDatabase;
14
+ private _connectionOptions;
15
+ private _customRecoveryHook;
16
+ constructor(dsn: Dsn, timeout?: number | undefined | null);
17
+ private buildConnMessage;
18
+ private getWsConnector;
19
+ private bindReconnectRecoveryHook;
20
+ private isSqlPath;
21
+ private normalizeConnectedDatabase;
22
+ private recoverSqlSessionContext;
23
+ setSessionRecoveryHook(hook: SessionRecoveryHook | null | undefined): void;
11
24
  connect(database?: string | undefined | null): Promise<void>;
12
25
  setOptionConnection(option: TSDB_OPTION_CONNECTION, value: string | null): Promise<void>;
13
- execNoResp(queryMsg: string): Promise<void>;
14
- exec(queryMsg: string, bSqlQuery?: boolean): Promise<any>;
26
+ execNoResp(message: string): Promise<void>;
27
+ exec(message: string, bSqlQuery?: boolean): Promise<any>;
28
+ sendMsgDirect(message: string, bSqlQuery?: boolean): Promise<any>;
15
29
  sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer, bSqlQuery?: boolean, bResultBinary?: boolean): Promise<any>;
16
30
  getState(): number;
17
31
  ready(): Promise<void>;
18
- sendMsg(msg: string): Promise<any>;
19
- freeResult(res: WSQueryResponse): Promise<unknown>;
32
+ waitForReady(): Promise<void>;
33
+ isNetworkError(err: unknown): boolean;
34
+ getReconnectRetries(): number;
35
+ sendMsg(message: string): Promise<any>;
36
+ freeResult(res: WSQueryResponse): Promise<void>;
20
37
  version(): Promise<string>;
21
38
  close(): Promise<void>;
22
- checkURL(url: URL): void;
39
+ private checkAuth;
23
40
  checkVersion(): Promise<void>;
24
41
  }
25
42
  //# sourceMappingURL=wsClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../../src/client/wsClient.ts"],"names":[],"mappings":"AASA,OAAO,EAAqB,eAAe,EAAE,MAAM,cAAc,CAAC;AAKlE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,qBAAa,QAAQ;IACjB,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAC,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,CAA4B;gBAEjC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAWnD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C5D,mBAAmB,CACrB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAyBV,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAwC/D,aAAa,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,SAAS,GAAE,OAAc,EACzB,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,GAAG,CAAC;IA0Cf,QAAQ;IAOF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBlC,UAAU,CAAC,GAAG,EAAE,eAAe;IAkC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAwC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,QAAQ,CAAC,GAAG,EAAE,GAAG;IAYX,YAAY;CAarB"}
1
+ {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../../src/client/wsClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,GAAG,EAAmB,MAAM,eAAe,CAAC;AAOrD,OAAO,EAAqB,eAAe,EAAE,MAAM,cAAc,CAAC;AASlE,OAAO,EAEH,sBAAsB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,QAAQ;IACjB,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAC,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,YAAY,CAAC,CAA4B;IACjD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAAyD;IACnF,OAAO,CAAC,mBAAmB,CAAoC;gBAEnD,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAYzD,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,0BAA0B;YAOpB,wBAAwB;IA6B/B,sBAAsB,CACzB,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAC7C,IAAI;IAKD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC5D,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAmB9D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAmBvE,aAAa,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,SAAS,GAAE,OAAc,EACzB,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,GAAG,CAAC;IAmBf,QAAQ;IAOF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BtB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAIrC,mBAAmB,IAAI,MAAM;IAIvB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAKtC,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,SAAS;IAYX,YAAY;CAarB"}
@@ -6,44 +6,113 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WsClient = void 0;
7
7
  const json_bigint_1 = __importDefault(require("json-bigint"));
8
8
  const wsConnectorPool_1 = require("./wsConnectorPool");
9
+ const dsn_1 = require("../common/dsn");
9
10
  const wsError_1 = require("../common/wsError");
10
11
  const wsResponse_1 = require("./wsResponse");
11
12
  const reqid_1 = require("../common/reqid");
12
13
  const log_1 = __importDefault(require("../common/log"));
13
14
  const utils_1 = require("../common/utils");
14
15
  const websocket_1 = require("websocket");
16
+ const constant_1 = require("../common/constant");
15
17
  class WsClient {
16
- constructor(url, timeout) {
17
- this.checkURL(url);
18
- this._url = url;
18
+ constructor(dsn, timeout) {
19
+ this._connectedDatabase = null;
20
+ this._connectionOptions = new Map();
21
+ this._customRecoveryHook = null;
22
+ this.checkAuth(dsn);
23
+ this._dsn = dsn;
19
24
  this._timeout = timeout;
20
- if (this._url.searchParams.has("timezone")) {
21
- this._timezone =
22
- this._url.searchParams.get("timezone") || undefined;
23
- this._url.searchParams.delete("timezone");
25
+ if (this._dsn.params.has("timezone")) {
26
+ this._timezone = this._dsn.params.get("timezone") || undefined;
27
+ }
28
+ if (this._dsn.params.has("bearer_token")) {
29
+ this._bearerToken = this._dsn.params.get("bearer_token") || undefined;
24
30
  }
25
31
  }
26
- async connect(database) {
27
- let connMsg = {
32
+ buildConnMessage(database) {
33
+ return {
28
34
  action: "conn",
29
35
  args: {
30
36
  req_id: reqid_1.ReqId.getReqID(),
31
- user: (0, utils_1.safeDecodeURIComponent)(this._url.username),
32
- password: (0, utils_1.safeDecodeURIComponent)(this._url.password),
37
+ user: (0, utils_1.safeDecodeURIComponent)(this._dsn.username),
38
+ password: (0, utils_1.safeDecodeURIComponent)(this._dsn.password),
33
39
  db: database,
40
+ connector: constant_1.ConnectorInfo,
34
41
  ...(this._timezone && { tz: this._timezone }),
42
+ ...(this._bearerToken && { bearer_token: this._bearerToken }),
43
+ },
44
+ };
45
+ }
46
+ getWsConnector() {
47
+ if (!this._wsConnector) {
48
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "Invalid websocket connection");
49
+ }
50
+ return this._wsConnector;
51
+ }
52
+ bindReconnectRecoveryHook() {
53
+ if (!this._wsConnector) {
54
+ return;
55
+ }
56
+ this._wsConnector.setSessionRecoveryHook(async () => {
57
+ if (this.isSqlPath()) {
58
+ await this.recoverSqlSessionContext();
59
+ }
60
+ if (this._customRecoveryHook) {
61
+ await this._customRecoveryHook();
62
+ }
63
+ });
64
+ }
65
+ isSqlPath() {
66
+ return this._dsn.endpoint === dsn_1.WS_SQL_ENDPOINT;
67
+ }
68
+ normalizeConnectedDatabase(database) {
69
+ if (database && database.length > 0) {
70
+ return database;
71
+ }
72
+ return this.isSqlPath() ? "information_schema" : null;
73
+ }
74
+ async recoverSqlSessionContext() {
75
+ if (!this._wsConnector) {
76
+ return;
77
+ }
78
+ const connMsg = this.buildConnMessage(this.normalizeConnectedDatabase(this._connectedDatabase));
79
+ await this.sendMsgDirect(JSON.stringify(connMsg), false);
80
+ if (this._connectionOptions.size <= 0) {
81
+ return;
82
+ }
83
+ const options = Array.from(this._connectionOptions.entries()).map(([option, value]) => ({
84
+ option,
85
+ value,
86
+ }));
87
+ const optionsMsg = {
88
+ action: "options_connection",
89
+ args: {
90
+ req_id: reqid_1.ReqId.getReqID(),
91
+ options,
35
92
  },
36
93
  };
37
- log_1.default.debug("[wsClient.connect.connMsg]===>" + json_bigint_1.default.stringify(connMsg));
38
- this._wsConnector =
39
- await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._url, this._timeout);
94
+ await this.sendMsgDirect(json_bigint_1.default.stringify(optionsMsg), false);
95
+ }
96
+ setSessionRecoveryHook(hook) {
97
+ this._customRecoveryHook = hook || null;
98
+ this.bindReconnectRecoveryHook();
99
+ }
100
+ async connect(database) {
101
+ const connMsg = this.buildConnMessage(database);
102
+ if (log_1.default.isDebugEnabled()) {
103
+ log_1.default.debug("[wsClient.connect.connMsg]===>" + json_bigint_1.default.stringify(connMsg, (key, value) => (key === "password" || key === "bearer_token") ? "[REDACTED]" : value));
104
+ }
105
+ this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._dsn, this._timeout);
106
+ this.bindReconnectRecoveryHook();
40
107
  if (this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
108
+ this._connectedDatabase = this.normalizeConnectedDatabase(database ?? null);
41
109
  return;
42
110
  }
43
111
  try {
44
112
  await this._wsConnector.ready();
45
113
  let result = await this._wsConnector.sendMsg(JSON.stringify(connMsg));
46
114
  if (result.msg.code == 0) {
115
+ this._connectedDatabase = this.normalizeConnectedDatabase(database ?? null);
47
116
  return;
48
117
  }
49
118
  await this.close();
@@ -51,8 +120,8 @@ class WsClient {
51
120
  }
52
121
  catch (e) {
53
122
  await this.close();
54
- log_1.default.error(`connection creation failed, url: ${this._url}, code:${e.code}, msg:${e.message}`);
55
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}, code:${e.code}, msg:${e.message}`);
123
+ log_1.default.error(`connection creation failed, dsn:${this._dsn}, code:${e.code}, msg:${e.message}`);
124
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn:${this._dsn}, code:${e.code}, msg:${e.message}`);
56
125
  }
57
126
  }
58
127
  async setOptionConnection(option, value) {
@@ -71,82 +140,55 @@ class WsClient {
71
140
  };
72
141
  try {
73
142
  await this.exec(json_bigint_1.default.stringify(connMsg), false);
143
+ this._connectionOptions.set(option, value);
74
144
  }
75
145
  catch (e) {
76
146
  log_1.default.error("[wsClient.setOptionConnection] failed: " + e.message);
77
147
  throw e;
78
148
  }
79
149
  }
80
- async execNoResp(queryMsg) {
81
- log_1.default.debug("[wsQueryInterface.query.queryMsg]===>" + queryMsg);
82
- if (this._wsConnector &&
83
- this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
84
- await this._wsConnector.sendMsgNoResp(queryMsg);
85
- return;
86
- }
87
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect");
150
+ async execNoResp(message) {
151
+ log_1.default.debug("[wsClient.execNoResp]===>" + message);
152
+ await this.getWsConnector().sendMsgNoResp(message);
88
153
  }
89
- // need to construct Response.
90
- async exec(queryMsg, bSqlQuery = true) {
91
- return new Promise((resolve, reject) => {
92
- log_1.default.debug("[wsQueryInterface.query.queryMsg]===>" + queryMsg);
93
- if (this._wsConnector &&
94
- this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
95
- this._wsConnector
96
- .sendMsg(queryMsg)
97
- .then((e) => {
98
- if (e.msg.code == 0) {
99
- if (bSqlQuery) {
100
- resolve(new wsResponse_1.WSQueryResponse(e));
101
- }
102
- else {
103
- resolve(e);
104
- }
105
- }
106
- else {
107
- reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
108
- }
109
- })
110
- .catch((e) => {
111
- reject(e);
112
- });
154
+ async exec(message, bSqlQuery = true) {
155
+ if (log_1.default.isDebugEnabled()) {
156
+ log_1.default.debug("[wsClient.exec]===>" + (0, utils_1.maskSensitiveForLog)(message));
157
+ }
158
+ const resp = await this.getWsConnector().sendMsg(message);
159
+ if (resp.msg.code == 0) {
160
+ if (bSqlQuery) {
161
+ return new wsResponse_1.WSQueryResponse(resp);
113
162
  }
114
- else {
115
- reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
163
+ return resp;
164
+ }
165
+ throw new wsError_1.WebSocketInterfaceError(resp.msg.code, resp.msg.message);
166
+ }
167
+ async sendMsgDirect(message, bSqlQuery = true) {
168
+ if (log_1.default.isDebugEnabled()) {
169
+ log_1.default.debug("[wsClient.sendMsgDirect]===>" + (0, utils_1.maskSensitiveForLog)(message));
170
+ }
171
+ const resp = await this.getWsConnector().sendMsgDirect(message);
172
+ if (resp.msg.code == 0) {
173
+ if (bSqlQuery) {
174
+ return new wsResponse_1.WSQueryResponse(resp);
116
175
  }
117
- });
176
+ return resp;
177
+ }
178
+ throw new wsError_1.WebSocketQueryError(resp.msg.code, resp.msg.message);
118
179
  }
119
- // need to construct Response.
120
180
  async sendBinaryMsg(reqId, action, message, bSqlQuery = true, bResultBinary = false) {
121
- return new Promise((resolve, reject) => {
122
- if (this._wsConnector &&
123
- this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
124
- this._wsConnector
125
- .sendBinaryMsg(reqId, action, message)
126
- .then((e) => {
127
- if (bResultBinary) {
128
- resolve(e);
129
- }
130
- if (e.msg.code == 0) {
131
- if (bSqlQuery) {
132
- resolve(new wsResponse_1.WSQueryResponse(e));
133
- }
134
- else {
135
- resolve(e);
136
- }
137
- }
138
- else {
139
- reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
140
- }
141
- })
142
- .catch((e) => {
143
- reject(e);
144
- });
145
- }
146
- else {
147
- reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
181
+ const resp = await this.getWsConnector().sendBinaryMsg(reqId, action, message);
182
+ if (bResultBinary) {
183
+ return resp;
184
+ }
185
+ if (resp.msg.code == 0) {
186
+ if (bSqlQuery) {
187
+ return new wsResponse_1.WSQueryResponse(resp);
148
188
  }
149
- });
189
+ return resp;
190
+ }
191
+ throw new wsError_1.WebSocketInterfaceError(resp.msg.code, resp.msg.message);
150
192
  }
151
193
  getState() {
152
194
  if (this._wsConnector) {
@@ -156,60 +198,45 @@ class WsClient {
156
198
  }
157
199
  async ready() {
158
200
  try {
159
- this._wsConnector =
160
- await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._url, this._timeout);
201
+ this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._dsn, this._timeout);
202
+ this.bindReconnectRecoveryHook();
161
203
  if (this._wsConnector.readyState() !== websocket_1.w3cwebsocket.OPEN) {
162
204
  await this._wsConnector.ready();
163
205
  }
164
- log_1.default.debug("ready status ", this._url, this._wsConnector.readyState());
206
+ if (log_1.default.isDebugEnabled()) {
207
+ log_1.default.debug(`ready status, dsn: ${this._dsn}, state: ${this._wsConnector.readyState()}`);
208
+ }
165
209
  return;
166
210
  }
167
211
  catch (e) {
168
- log_1.default.error(`connection creation failed, url: ${this._url}, code: ${e.code}, message: ${e.message}`);
169
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}, code: ${e.code}, message: ${e.message}`);
212
+ log_1.default.error(`connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
213
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
170
214
  }
171
215
  }
172
- async sendMsg(msg) {
173
- return new Promise((resolve, reject) => {
174
- log_1.default.debug("[wsQueryInterface.sendMsg]===>" + msg);
175
- if (this._wsConnector &&
176
- this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
177
- this._wsConnector
178
- .sendMsg(msg)
179
- .then((e) => {
180
- resolve(e);
181
- })
182
- .catch((e) => reject(e));
183
- }
184
- else {
185
- reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
186
- }
187
- });
216
+ async waitForReady() {
217
+ await this.getWsConnector().ready();
218
+ }
219
+ isNetworkError(err) {
220
+ return this.getWsConnector().isNetworkError(err);
221
+ }
222
+ getReconnectRetries() {
223
+ return this.getWsConnector().getReconnectRetries();
224
+ }
225
+ async sendMsg(message) {
226
+ log_1.default.debug("[wsClient.sendMsg]===>" + message);
227
+ return this.getWsConnector().sendMsg(message);
188
228
  }
189
229
  async freeResult(res) {
190
- let freeResultMsg = {
230
+ const freeResultMsg = {
191
231
  action: "free_result",
192
232
  args: {
193
233
  req_id: reqid_1.ReqId.getReqID(),
194
234
  id: res.id,
195
235
  },
196
236
  };
197
- return new Promise((resolve, reject) => {
198
- let jsonStr = json_bigint_1.default.stringify(freeResultMsg);
199
- log_1.default.debug("[wsQueryInterface.freeResult.freeResultMsg]===>" + jsonStr);
200
- if (this._wsConnector &&
201
- this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
202
- this._wsConnector
203
- .sendMsgNoResp(jsonStr)
204
- .then((e) => {
205
- resolve(e);
206
- })
207
- .catch((e) => reject(e));
208
- }
209
- else {
210
- reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
211
- }
212
- });
237
+ const jsonStr = json_bigint_1.default.stringify(freeResultMsg);
238
+ log_1.default.debug("[wsClient.freeResult]===>" + jsonStr);
239
+ await this.getWsConnector().sendMsgNoResp(jsonStr);
213
240
  }
214
241
  async version() {
215
242
  if (this._version) {
@@ -221,35 +248,35 @@ class WsClient {
221
248
  req_id: reqid_1.ReqId.getReqID(),
222
249
  },
223
250
  };
224
- if (this._wsConnector) {
225
- try {
226
- if (this._wsConnector.readyState() !== websocket_1.w3cwebsocket.OPEN) {
227
- await this._wsConnector.ready();
228
- }
229
- let result = await this._wsConnector.sendMsg(json_bigint_1.default.stringify(versionMsg));
230
- if (result.msg.code == 0) {
231
- return new wsResponse_1.WSVersionResponse(result).version;
232
- }
233
- throw new wsError_1.WebSocketInterfaceError(result.msg.code, result.msg.message);
251
+ try {
252
+ const connector = this.getWsConnector();
253
+ if (connector.readyState() !== websocket_1.w3cwebsocket.OPEN) {
254
+ await connector.ready();
234
255
  }
235
- catch (e) {
236
- log_1.default.error(`connection creation failed, url: ${this._url}, code: ${e.code}, message: ${e.message}`);
237
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}, code: ${e.code}, message: ${e.message}`);
256
+ let result = await connector.sendMsg(json_bigint_1.default.stringify(versionMsg));
257
+ if (result.msg.code == 0) {
258
+ return new wsResponse_1.WSVersionResponse(result).version;
238
259
  }
260
+ throw new wsError_1.WebSocketInterfaceError(result.msg.code, result.msg.message);
261
+ }
262
+ catch (e) {
263
+ log_1.default.error(`connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
264
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
239
265
  }
240
- throw (wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect");
241
266
  }
242
267
  async close() {
243
268
  if (this._wsConnector) {
269
+ this._wsConnector.setSessionRecoveryHook(null);
244
270
  await wsConnectorPool_1.WebSocketConnectionPool.instance().releaseConnection(this._wsConnector);
245
271
  this._wsConnector = undefined;
246
272
  }
273
+ this._customRecoveryHook = null;
247
274
  }
248
- checkURL(url) {
249
- // Assert is cloud url
250
- if (!url.searchParams.has("token")) {
251
- if (!(url.username || url.password)) {
252
- throw new wsError_1.WebSocketInterfaceError(wsError_1.ErrorCode.ERR_INVALID_AUTHENTICATION, "invalid url, password or username needed.");
275
+ checkAuth(dsn) {
276
+ const hasToken = dsn.params.get("token") || dsn.params.get("bearer_token");
277
+ if (!hasToken) {
278
+ if (!(dsn.username || dsn.password)) {
279
+ throw new wsError_1.WebSocketInterfaceError(wsError_1.ErrorCode.ERR_INVALID_AUTHENTICATION, `invalid url, provide non-empty "token" or "bearer_token", or provide username/password`);
253
280
  }
254
281
  }
255
282
  }
@@ -1,16 +1,62 @@
1
+ import { Dsn } from "../common/dsn";
2
+ export type SessionRecoveryHook = () => Promise<void>;
3
+ export declare class RetryConfig {
4
+ readonly retries: number;
5
+ readonly retryBackoffMs: number;
6
+ readonly retryBackoffMaxMs: number;
7
+ constructor(retries: number, retryBackoffMs: number, retryBackoffMaxMs: number);
8
+ getBackoffDelay(attempt: number): number;
9
+ static fromDsn(dsn: Dsn): RetryConfig;
10
+ }
1
11
  export declare class WebSocketConnector {
2
- private _wsConn;
3
- private _wsURL;
4
- _timeout: number;
5
- constructor(url: URL, timeout: number | undefined | null);
6
- ready(): Promise<unknown>;
7
- private _onclose;
12
+ private _conn;
13
+ private readonly _poolKey;
14
+ private readonly _dsn;
15
+ private _currentAddress;
16
+ private _retryConfig;
17
+ private _inflightStore;
18
+ private readonly _suppressedSockets;
19
+ private _reconnectLock;
20
+ private _isReconnecting;
21
+ private _allowReconnect;
22
+ private _connectionReady;
23
+ private _sessionRecoveryHook;
24
+ private _timeout;
25
+ constructor(dsn: Dsn, poolKey: string, timeout: number | undefined | null);
26
+ refreshRetryConfig(dsn: Dsn): void;
27
+ private buildUrl;
28
+ private createConnection;
8
29
  private _onmessage;
30
+ private shouldSkipReconnect;
31
+ private failNonRetriableCallbacksOnDisconnect;
32
+ private handleDisconnect;
33
+ private extractReqId;
34
+ private isRetriableAction;
35
+ private extractBinaryAction;
36
+ private isRetriableBinaryAction;
37
+ isNetworkError(err: unknown): boolean;
38
+ private send;
39
+ ready(): Promise<void>;
40
+ private getCurrentAddress;
41
+ private selectLeastConnectedAddress;
42
+ private sleep;
43
+ private isReconnectAllowed;
44
+ private triggerReconnect;
45
+ private _doReconnect;
46
+ private reconnect;
47
+ private attemptReconnect;
48
+ private replayRequests;
49
+ private failAllInflightRequests;
9
50
  close(): void;
10
51
  readyState(): number;
52
+ setSessionRecoveryHook(hook: SessionRecoveryHook | undefined | null): void;
53
+ private recoverSessionContext;
54
+ sendMsgDirect(message: string): Promise<any>;
11
55
  sendMsgNoResp(message: string): Promise<void>;
12
- sendMsg(message: string, register?: Boolean): Promise<unknown>;
13
- sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer, register?: Boolean): Promise<unknown>;
14
- getWsURL(): URL;
56
+ sendMsg(message: string): Promise<unknown>;
57
+ sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer): Promise<unknown>;
58
+ private sendAndTrackResponse;
59
+ getPoolKey(): string;
60
+ getReconnectRetries(): number;
15
61
  }
16
62
  //# sourceMappingURL=wsConnector.d.ts.map