@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,404 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
4
+ const config_1 = require("../../src/common/config");
5
+ const wsSql_1 = require("../../src/sql/wsSql");
6
+ const constant_1 = require("../../src/tmq/constant");
7
+ const wsTmq_1 = require("../../src/tmq/wsTmq");
8
+ const utils_1 = require("../helpers/utils");
9
+ const wsProxy_1 = require("../helpers/wsProxy");
10
+ function parseJsonAction(rawData) {
11
+ if (typeof rawData !== "string") {
12
+ return null;
13
+ }
14
+ try {
15
+ const parsed = JSON.parse(rawData);
16
+ return typeof parsed.action === "string" ? parsed.action : null;
17
+ }
18
+ catch (_err) {
19
+ return null;
20
+ }
21
+ }
22
+ describe("tmq failover", () => {
23
+ jest.setTimeout(120 * 1000);
24
+ afterEach(async () => {
25
+ wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
26
+ jest.restoreAllMocks();
27
+ });
28
+ test("tmq failover recovers subscribe context and replays inflight poll", async () => {
29
+ const dbName = "test_1774096925";
30
+ const tableName = "t0";
31
+ const topicName = "topic_1774096925";
32
+ const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
33
+ let setupSql = null;
34
+ let cleanupSql = null;
35
+ let consumer = null;
36
+ let restartTriggered = false;
37
+ let proxyBHadActivity = false;
38
+ setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
39
+ try {
40
+ await setupSql.exec(`drop topic if exists ${topicName}`);
41
+ await setupSql.exec(`drop database if exists ${dbName}`);
42
+ await setupSql.exec(`create database ${dbName}`);
43
+ await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
44
+ await setupSql.exec(`insert into ${dbName}.${tableName} values(now - 1s, 1) (now, 2)`);
45
+ await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
46
+ }
47
+ finally {
48
+ await setupSql.close();
49
+ setupSql = null;
50
+ }
51
+ const proxyA = await wsProxy_1.WsProxy.create({
52
+ host: "127.0.0.1",
53
+ port: 0,
54
+ onEvent: (event, control) => {
55
+ if (event.type !== "message") {
56
+ return;
57
+ }
58
+ if (event.direction !== "client_to_upstream") {
59
+ return;
60
+ }
61
+ const action = parseJsonAction(event.rawData);
62
+ if (action === "poll" && !restartTriggered) {
63
+ restartTriggered = true;
64
+ void control.restart({
65
+ downtimeMs: 350,
66
+ reason: "trigger tmq poll failover",
67
+ });
68
+ }
69
+ },
70
+ });
71
+ const proxyB = await wsProxy_1.WsProxy.create({
72
+ host: "127.0.0.1",
73
+ port: 0,
74
+ onEvent: (event) => {
75
+ if (event.type === "client_connected") {
76
+ proxyBHadActivity = true;
77
+ return;
78
+ }
79
+ if (event.type === "message" &&
80
+ event.direction === "client_to_upstream") {
81
+ proxyBHadActivity = true;
82
+ }
83
+ },
84
+ });
85
+ const tmqConf = new Map([
86
+ [constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
87
+ [constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
88
+ [constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
89
+ [constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
90
+ [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
91
+ [constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
92
+ [constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
93
+ [constant_1.TMQConstants.WS_URL,
94
+ `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
95
+ `@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()}` +
96
+ `?retries=6&retry_backoff_ms=20&retry_backoff_max_ms=60`
97
+ ],
98
+ ]);
99
+ const randomSpy = jest.spyOn(Math, "random").mockReturnValue(0);
100
+ try {
101
+ consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
102
+ await consumer.subscribe([topicName]);
103
+ let rows = 0;
104
+ for (let i = 0; i < 8 && rows === 0; i++) {
105
+ const res = await consumer.poll(800);
106
+ for (const [, value] of res) {
107
+ const data = value.getData();
108
+ rows += data?.length || 0;
109
+ }
110
+ }
111
+ expect(restartTriggered).toBe(true);
112
+ expect(proxyBHadActivity).toBe(true);
113
+ expect(rows).toBeGreaterThan(0);
114
+ }
115
+ finally {
116
+ if (consumer) {
117
+ try {
118
+ await consumer.unsubscribe();
119
+ }
120
+ catch (_err) {
121
+ // ignore cleanup error
122
+ }
123
+ await consumer.close();
124
+ }
125
+ await Promise.all([
126
+ proxyA.stop("test cleanup"),
127
+ proxyB.stop("test cleanup"),
128
+ ]);
129
+ randomSpy.mockRestore();
130
+ cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
131
+ try {
132
+ await cleanupSql.exec(`drop topic if exists ${topicName}`);
133
+ await cleanupSql.exec(`drop database if exists ${dbName}`);
134
+ }
135
+ finally {
136
+ await cleanupSql.close();
137
+ cleanupSql = null;
138
+ }
139
+ }
140
+ }, 180 * 1000);
141
+ test("tmq single-address reconnect resumes poll and consumes all 5000 rows", async () => {
142
+ const targetRows = 5000;
143
+ const batchSize = 1000;
144
+ const baseTs = 1700020000000;
145
+ const dbName = "test_1774186545";
146
+ const tableName = "t0";
147
+ const topicName = "topic_1774186545";
148
+ const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
149
+ let setupSql = null;
150
+ let cleanupSql = null;
151
+ let consumer = null;
152
+ let pollRequestCount = 0;
153
+ let restartInFlight = false;
154
+ let restartCount = 0;
155
+ setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
156
+ try {
157
+ await setupSql.exec(`drop topic if exists ${topicName}`);
158
+ await setupSql.exec(`drop database if exists ${dbName}`);
159
+ await setupSql.exec(`create database ${dbName}`);
160
+ await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
161
+ for (let start = 0; start < targetRows; start += batchSize) {
162
+ const end = Math.min(start + batchSize, targetRows);
163
+ const values = [];
164
+ for (let i = start; i < end; i++) {
165
+ values.push(`(${baseTs + i}, ${i})`);
166
+ }
167
+ await setupSql.exec(`insert into ${dbName}.${tableName} values ${values.join(" ")}`);
168
+ }
169
+ await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
170
+ }
171
+ finally {
172
+ await setupSql.close();
173
+ setupSql = null;
174
+ }
175
+ const proxy = await wsProxy_1.WsProxy.create({
176
+ host: "127.0.0.1",
177
+ port: 0,
178
+ onEvent: (event, control) => {
179
+ if (event.type !== "message") {
180
+ return;
181
+ }
182
+ if (event.direction !== "client_to_upstream") {
183
+ return;
184
+ }
185
+ const action = parseJsonAction(event.rawData);
186
+ if (action !== "poll") {
187
+ return;
188
+ }
189
+ pollRequestCount += 1;
190
+ if (restartInFlight) {
191
+ return;
192
+ }
193
+ const shouldRestart = Math.random() < 0.18 ||
194
+ (restartCount === 0 && pollRequestCount >= 1);
195
+ if (!shouldRestart) {
196
+ return;
197
+ }
198
+ restartInFlight = true;
199
+ restartCount += 1;
200
+ const downtimeMs = 20 + Math.floor(Math.random() * 90);
201
+ void control.restart({
202
+ downtimeMs,
203
+ reason: `random poll restart #${restartCount}`,
204
+ }).finally(() => {
205
+ restartInFlight = false;
206
+ });
207
+ },
208
+ });
209
+ const tmqConf = new Map([
210
+ [constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
211
+ [constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
212
+ [constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
213
+ [constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
214
+ [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
215
+ [constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
216
+ [constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
217
+ [constant_1.TMQConstants.WS_URL,
218
+ `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
219
+ `@127.0.0.1:${proxy.getPort()}` +
220
+ `?retries=60&retry_backoff_ms=10&retry_backoff_max_ms=40`
221
+ ],
222
+ ]);
223
+ try {
224
+ consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
225
+ await consumer.subscribe([topicName]);
226
+ let consumedRows = 0;
227
+ const deadline = Date.now() + 120 * 1000;
228
+ while (Date.now() < deadline && consumedRows < targetRows) {
229
+ const res = await consumer.poll(1200);
230
+ for (const [, value] of res) {
231
+ const data = value.getData();
232
+ consumedRows += data?.length || 0;
233
+ }
234
+ }
235
+ expect(pollRequestCount).toBeGreaterThan(0);
236
+ expect(restartCount).toBeGreaterThan(0);
237
+ expect(consumedRows).toBe(targetRows);
238
+ }
239
+ finally {
240
+ if (consumer) {
241
+ try {
242
+ await consumer.unsubscribe();
243
+ }
244
+ catch (_err) {
245
+ // ignore cleanup error
246
+ }
247
+ await consumer.close();
248
+ }
249
+ await proxy.stop("test cleanup");
250
+ cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
251
+ try {
252
+ await cleanupSql.exec(`drop topic if exists ${topicName}`);
253
+ await cleanupSql.exec(`drop database if exists ${dbName}`);
254
+ }
255
+ finally {
256
+ await cleanupSql.close();
257
+ cleanupSql = null;
258
+ }
259
+ }
260
+ }, 300 * 1000);
261
+ test("tmq three-address failover resumes poll and consumes all 5000 rows", async () => {
262
+ const targetRows = 5000;
263
+ const batchSize = 1000;
264
+ const baseTs = 1700021000000;
265
+ const dbName = "test_1774187557";
266
+ const tableName = "t0";
267
+ const topicName = "topic_1774187557";
268
+ const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
269
+ let setupSql = null;
270
+ let cleanupSql = null;
271
+ let consumer = null;
272
+ let totalPollRequestCount = 0;
273
+ let totalRestartCount = 0;
274
+ const proxyStates = new Map();
275
+ setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
276
+ try {
277
+ await setupSql.exec(`drop topic if exists ${topicName}`);
278
+ await setupSql.exec(`drop database if exists ${dbName}`);
279
+ await setupSql.exec(`create database ${dbName}`);
280
+ await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
281
+ for (let start = 0; start < targetRows; start += batchSize) {
282
+ const end = Math.min(start + batchSize, targetRows);
283
+ const values = [];
284
+ for (let i = start; i < end; i++) {
285
+ values.push(`(${baseTs + i}, ${i})`);
286
+ }
287
+ await setupSql.exec(`insert into ${dbName}.${tableName} values ${values.join(" ")}`);
288
+ }
289
+ await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
290
+ }
291
+ finally {
292
+ await setupSql.close();
293
+ setupSql = null;
294
+ }
295
+ const createPollRestartProxy = async (name) => {
296
+ proxyStates.set(name, {
297
+ pollRequests: 0,
298
+ restarts: 0,
299
+ restartInFlight: false,
300
+ });
301
+ return wsProxy_1.WsProxy.create({
302
+ host: "127.0.0.1",
303
+ port: 0,
304
+ onEvent: (event, control) => {
305
+ if (event.type !== "message") {
306
+ return;
307
+ }
308
+ if (event.direction !== "client_to_upstream") {
309
+ return;
310
+ }
311
+ const action = parseJsonAction(event.rawData);
312
+ if (action !== "poll") {
313
+ return;
314
+ }
315
+ const state = proxyStates.get(name);
316
+ if (!state) {
317
+ return;
318
+ }
319
+ state.pollRequests += 1;
320
+ totalPollRequestCount += 1;
321
+ if (state.restartInFlight) {
322
+ return;
323
+ }
324
+ const shouldRestart = Math.random() < 0.18 ||
325
+ (totalRestartCount === 0 && totalPollRequestCount >= 1);
326
+ if (!shouldRestart) {
327
+ return;
328
+ }
329
+ state.restartInFlight = true;
330
+ state.restarts += 1;
331
+ totalRestartCount += 1;
332
+ const downtimeMs = 20 + Math.floor(Math.random() * 90);
333
+ void control.restart({
334
+ downtimeMs,
335
+ reason: `${name} random poll restart #${state.restarts}`,
336
+ }).finally(() => {
337
+ const latest = proxyStates.get(name);
338
+ if (latest) {
339
+ latest.restartInFlight = false;
340
+ }
341
+ });
342
+ },
343
+ });
344
+ };
345
+ const proxyA = await createPollRestartProxy("proxy_a");
346
+ const proxyB = await createPollRestartProxy("proxy_b");
347
+ const proxyC = await createPollRestartProxy("proxy_c");
348
+ const tmqConf = new Map([
349
+ [constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
350
+ [constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
351
+ [constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
352
+ [constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
353
+ [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
354
+ [constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
355
+ [constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
356
+ [constant_1.TMQConstants.WS_URL,
357
+ `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
358
+ `@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()},127.0.0.1:${proxyC.getPort()}` +
359
+ `?retries=60&retry_backoff_ms=10&retry_backoff_max_ms=40`
360
+ ],
361
+ ]);
362
+ try {
363
+ consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
364
+ await consumer.subscribe([topicName]);
365
+ let consumedRows = 0;
366
+ const deadline = Date.now() + 120 * 1000;
367
+ while (Date.now() < deadline && consumedRows < targetRows) {
368
+ const res = await consumer.poll(1200);
369
+ for (const [, value] of res) {
370
+ const data = value.getData();
371
+ consumedRows += data?.length || 0;
372
+ }
373
+ }
374
+ expect(totalPollRequestCount).toBeGreaterThan(0);
375
+ expect(totalRestartCount).toBeGreaterThan(0);
376
+ expect(consumedRows).toBe(targetRows);
377
+ }
378
+ finally {
379
+ if (consumer) {
380
+ try {
381
+ await consumer.unsubscribe();
382
+ }
383
+ catch (_err) {
384
+ // ignore cleanup error
385
+ }
386
+ await consumer.close();
387
+ }
388
+ await Promise.all([
389
+ proxyA.stop("test cleanup"),
390
+ proxyB.stop("test cleanup"),
391
+ proxyC.stop("test cleanup"),
392
+ ]);
393
+ cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
394
+ try {
395
+ await cleanupSql.exec(`drop topic if exists ${topicName}`);
396
+ await cleanupSql.exec(`drop database if exists ${dbName}`);
397
+ }
398
+ finally {
399
+ await cleanupSql.close();
400
+ cleanupSql = null;
401
+ }
402
+ }
403
+ }, 300 * 1000);
404
+ });
@@ -11,13 +11,10 @@ const log_1 = require("../../src/common/log");
11
11
  const stable = "st";
12
12
  const db = "ws_tmq_test";
13
13
  const topics = ["topic_ws_bean"];
14
- // const topic2 = 'topic_ws_bean_2'
15
- // let createTopic = `create topic if not exists ${topic} as select ts, c1, c2, c3, c4, c5, t1 from ${db}.${stable}`
16
- // let createTopic2 = `create topic if not exists ${topic2} as select ts, c1, c4, c5, t1 from ${db}.${stable}`
14
+ const tokenTopic = "topic_token_test";
17
15
  let createTopic = `create topic if not exists ${topics[0]} as select * from ${db}.${stable}`;
18
16
  let dropTopic = `DROP TOPIC IF EXISTS ${topics[0]};`;
19
- // let dropTopic2 = `DROP TOPIC IF EXISTS ${topic2};`
20
- let dsn = "ws://root:taosdata@localhost:6041";
17
+ let dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@localhost:6041`;
21
18
  let tmqDsn = "ws://localhost:6041";
22
19
  beforeAll(async () => {
23
20
  let conf = new config_1.WSConfig(dsn);
@@ -235,25 +232,24 @@ beforeAll(async () => {
235
232
  ];
236
233
  let ws = await wsSql_1.WsSql.open(conf);
237
234
  await ws.exec(dropTopic);
238
- // await ws.Exec(dropTopic2);
239
235
  await ws.exec(dropDB);
240
236
  await ws.exec(createDB);
241
237
  await ws.exec(useDB);
242
238
  await ws.exec((0, utils_1.createSTable)(stable));
243
239
  await ws.exec(createTopic);
244
- // await ws.Exec(createTopic2);
245
240
  let insert = (0, utils_1.insertStable)(tableValues, stableTags, stable);
246
241
  let insertRes = await ws.exec(insert);
247
242
  insert = (0, utils_1.insertStable)(tableCNValues, stableTags, stable);
248
243
  insertRes = await ws.exec(insert);
244
+ await ws.exec(`create topic if not exists ${tokenTopic} as select * from ${db}.${stable}`);
249
245
  await ws.close();
250
246
  });
251
247
  describe("TDWebSocket.Tmq()", () => {
252
248
  jest.setTimeout(20 * 1000);
253
249
  let configMap = new Map([
254
250
  [constant_1.TMQConstants.GROUP_ID, "gId"],
255
- [constant_1.TMQConstants.CONNECT_USER, "root"],
256
- [constant_1.TMQConstants.CONNECT_PASS, "taosdata"],
251
+ [constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
252
+ [constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
257
253
  [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
258
254
  [constant_1.TMQConstants.CLIENT_ID, "test_tmq_client"],
259
255
  [constant_1.TMQConstants.WS_URL, tmqDsn],
@@ -290,7 +286,7 @@ describe("TDWebSocket.Tmq()", () => {
290
286
  }
291
287
  catch (e) {
292
288
  console.log(e);
293
- expect(e.code).toBe(280);
289
+ expect([280, 65535]).toContain(e.code);
294
290
  }
295
291
  finally {
296
292
  if (consumer) {
@@ -320,7 +316,6 @@ describe("TDWebSocket.Tmq()", () => {
320
316
  console.log("-----===>>", record);
321
317
  }
322
318
  }
323
- // await Sleep(100)
324
319
  }
325
320
  await consumer.seekToBeginning(assignment);
326
321
  for (let i = 0; i < 5; i++) {
@@ -336,7 +331,6 @@ describe("TDWebSocket.Tmq()", () => {
336
331
  }
337
332
  counts += data.length;
338
333
  }
339
- // await Sleep(100)
340
334
  }
341
335
  let topicArray = await consumer.subscription();
342
336
  expect(topics.length).toEqual(topicArray.length);
@@ -380,12 +374,139 @@ describe("TDWebSocket.Tmq()", () => {
380
374
  await consumer.unsubscribe();
381
375
  await consumer.close();
382
376
  });
377
+ (0, utils_1.testEnterprise)("connect with token", async () => {
378
+ const conf = new config_1.WSConfig(dsn);
379
+ const wsSql = await wsSql_1.WsSql.open(conf);
380
+ await wsSql.exec("drop token if exists test_tmq_token");
381
+ const wsRows = await wsSql.query(`create token test_tmq_token from user ${(0, utils_1.testUsername)()}`);
382
+ await wsRows.next();
383
+ const token = wsRows.getData()?.[0];
384
+ expect(token).toBeTruthy();
385
+ await wsRows.close();
386
+ const tmqConf = new Map([
387
+ [constant_1.TMQConstants.WS_URL, "ws://localhost:6041"],
388
+ [constant_1.TMQConstants.CONNECT_USER, "invalid_user"],
389
+ [constant_1.TMQConstants.CONNECT_PASS, "invalid_pass"],
390
+ [constant_1.TMQConstants.CONNECT_TOKEN, token],
391
+ [constant_1.TMQConstants.GROUP_ID, "g1101"],
392
+ [constant_1.TMQConstants.CLIENT_ID, "c1101"],
393
+ [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
394
+ [constant_1.TMQConstants.ENABLE_AUTO_COMMIT, "false"],
395
+ [constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, "1000"],
396
+ ]);
397
+ const consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
398
+ await consumer.subscribe([tokenTopic]);
399
+ let count = 0;
400
+ for (let i = 0; i < 5; i++) {
401
+ const res = await consumer.poll(500);
402
+ for (const [, value] of res) {
403
+ const data = value.getData();
404
+ if (data == null || data.length == 0) {
405
+ break;
406
+ }
407
+ count += data.length;
408
+ }
409
+ }
410
+ expect(count).toEqual(10);
411
+ await (0, utils_1.Sleep)(3000);
412
+ await consumer.unsubscribe();
413
+ await consumer.close();
414
+ await wsSql.exec("drop token if exists test_tmq_token");
415
+ await wsSql.close();
416
+ });
417
+ (0, utils_1.testEnterprise)("connect with token url", async () => {
418
+ const conf = new config_1.WSConfig(dsn);
419
+ const wsSql = await wsSql_1.WsSql.open(conf);
420
+ await wsSql.exec("drop token if exists test_tmq_token_url");
421
+ const wsRows = await wsSql.query(`create token test_tmq_token_url from user ${(0, utils_1.testUsername)()}`);
422
+ await wsRows.next();
423
+ const token = wsRows.getData()?.[0];
424
+ expect(token).toBeTruthy();
425
+ await wsRows.close();
426
+ const tmqConf = new Map([
427
+ [constant_1.TMQConstants.WS_URL, `ws://localhost:6041?bearer_token=${token}`],
428
+ [constant_1.TMQConstants.CONNECT_USER, "invalid_user"],
429
+ [constant_1.TMQConstants.CONNECT_PASS, "invalid_pass"],
430
+ [constant_1.TMQConstants.GROUP_ID, "g1103"],
431
+ [constant_1.TMQConstants.CLIENT_ID, "c1103"],
432
+ [constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
433
+ [constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
434
+ [constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
435
+ ]);
436
+ const consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
437
+ await consumer.subscribe([tokenTopic]);
438
+ let count = 0;
439
+ for (let i = 0; i < 5; i++) {
440
+ const res = await consumer.poll(500);
441
+ for (const [, value] of res) {
442
+ const data = value.getData();
443
+ if (data == null || data.length == 0) {
444
+ break;
445
+ }
446
+ count += data.length;
447
+ }
448
+ }
449
+ expect(count).toEqual(10);
450
+ await (0, utils_1.Sleep)(3000);
451
+ await consumer.unsubscribe();
452
+ await consumer.close();
453
+ await wsSql.exec("drop token if exists test_tmq_token_url");
454
+ await wsSql.close();
455
+ });
456
+ (0, utils_1.testEnterprise)("connect with invalid token", async () => {
457
+ const conf = new Map([
458
+ [constant_1.TMQConstants.GROUP_ID, "g1102"],
459
+ [constant_1.TMQConstants.CLIENT_ID, "c1102"],
460
+ [constant_1.TMQConstants.WS_URL, "ws://localhost:6041?bearer_token=invalid_token"],
461
+ ]);
462
+ await expect(wsTmq_1.WsConsumer.newConsumer(conf)).rejects.toMatchObject({
463
+ message: expect.stringMatching(/invalid token/i),
464
+ });
465
+ conf.set(constant_1.TMQConstants.WS_URL, "ws://localhost:6041");
466
+ conf.set(constant_1.TMQConstants.CONNECT_TOKEN, "invalid_token1");
467
+ await expect(wsTmq_1.WsConsumer.newConsumer(conf)).rejects.toMatchObject({
468
+ message: expect.stringMatching(/invalid token/i),
469
+ });
470
+ conf.set(constant_1.TMQConstants.WS_URL, "ws://localhost:6041?bearer_token=");
471
+ conf.delete(constant_1.TMQConstants.CONNECT_TOKEN);
472
+ await expect(wsTmq_1.WsConsumer.newConsumer(conf)).rejects.toMatchObject({
473
+ message: expect.stringMatching(/invalid url/i),
474
+ });
475
+ conf.set(constant_1.TMQConstants.WS_URL, "ws://localhost:6041");
476
+ conf.set(constant_1.TMQConstants.CONNECT_TOKEN, "");
477
+ await expect(wsTmq_1.WsConsumer.newConsumer(conf)).rejects.toMatchObject({
478
+ message: expect.stringMatching(/invalid url/i),
479
+ });
480
+ });
481
+ (0, utils_1.testNon3360)("connector version info", async () => {
482
+ const consumer = await wsTmq_1.WsConsumer.newConsumer(configMap);
483
+ await consumer.subscribe(topics);
484
+ const conf = new config_1.WSConfig("ws://localhost:6041");
485
+ conf.setUser((0, utils_1.testUsername)());
486
+ conf.setPwd((0, utils_1.testPassword)());
487
+ const wsSql = await wsSql_1.WsSql.open(conf);
488
+ await (0, utils_1.Sleep)(2000);
489
+ const wsRows = await wsSql.query("show connections");
490
+ let count = 0;
491
+ while (await wsRows.next()) {
492
+ const data = wsRows.getData();
493
+ if (Array.isArray(data) && data.some(v => typeof v === "string" && v.includes("nodejs-ws"))) {
494
+ count++;
495
+ }
496
+ }
497
+ expect(count).toBeGreaterThanOrEqual(2);
498
+ await wsRows.close();
499
+ await wsSql.close();
500
+ await consumer.unsubscribe();
501
+ await consumer.close();
502
+ });
383
503
  });
384
504
  afterAll(async () => {
385
505
  const dropDB = `drop database if exists ${db}`;
386
- let conf = new config_1.WSConfig(dsn);
387
- let ws = await wsSql_1.WsSql.open(conf);
506
+ const conf = new config_1.WSConfig(dsn);
507
+ const ws = await wsSql_1.WsSql.open(conf);
388
508
  await ws.exec(dropTopic);
509
+ await ws.exec(`drop topic if exists ${tokenTopic}`);
389
510
  await ws.exec(dropDB);
390
511
  await ws.close();
391
512
  wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=urlParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlParser.test.d.ts","sourceRoot":"","sources":["../../../test/bulkPulling/urlParser.test.ts"],"names":[],"mappings":""}