@tdengine/websocket 3.2.2 → 3.2.3

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 (79) 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 +1 -0
  6. package/lib/src/client/wsClient.d.ts.map +1 -1
  7. package/lib/src/client/wsClient.js +31 -19
  8. package/lib/src/client/wsConnector.d.ts.map +1 -1
  9. package/lib/src/client/wsConnector.js +12 -11
  10. package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
  11. package/lib/src/client/wsConnectorPool.js +13 -16
  12. package/lib/src/client/wsEventCallback.d.ts.map +1 -1
  13. package/lib/src/client/wsResponse.d.ts +0 -3
  14. package/lib/src/client/wsResponse.d.ts.map +1 -1
  15. package/lib/src/client/wsResponse.js +0 -3
  16. package/lib/src/common/config.d.ts +3 -0
  17. package/lib/src/common/config.d.ts.map +1 -1
  18. package/lib/src/common/config.js +6 -0
  19. package/lib/src/common/constant.d.ts +1 -0
  20. package/lib/src/common/constant.d.ts.map +1 -1
  21. package/lib/src/common/constant.js +6 -1
  22. package/lib/src/common/dsn.d.ts +18 -0
  23. package/lib/src/common/dsn.d.ts.map +1 -0
  24. package/lib/src/common/dsn.js +152 -0
  25. package/lib/src/common/taosResult.d.ts.map +1 -1
  26. package/lib/src/common/utils.d.ts +4 -0
  27. package/lib/src/common/utils.d.ts.map +1 -1
  28. package/lib/src/common/utils.js +54 -3
  29. package/lib/src/index.d.ts.map +1 -1
  30. package/lib/src/sql/wsSql.d.ts.map +1 -1
  31. package/lib/src/tmq/config.d.ts +1 -0
  32. package/lib/src/tmq/config.d.ts.map +1 -1
  33. package/lib/src/tmq/config.js +18 -1
  34. package/lib/src/tmq/constant.d.ts +4 -0
  35. package/lib/src/tmq/constant.d.ts.map +1 -1
  36. package/lib/src/tmq/constant.js +4 -0
  37. package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
  38. package/lib/src/tmq/tmqResponse.js +1 -4
  39. package/lib/src/tmq/wsTmq.d.ts.map +1 -1
  40. package/lib/src/tmq/wsTmq.js +10 -5
  41. package/lib/test/bulkPulling/cloud.tmq.test.js +3 -2
  42. package/lib/test/bulkPulling/decimal.test.js +8 -8
  43. package/lib/test/bulkPulling/dsn.test.d.ts +2 -0
  44. package/lib/test/bulkPulling/dsn.test.d.ts.map +1 -0
  45. package/lib/test/bulkPulling/dsn.test.js +378 -0
  46. package/lib/test/bulkPulling/queryTables.test.js +1 -1
  47. package/lib/test/bulkPulling/retryConfig.test.d.ts +2 -0
  48. package/lib/test/bulkPulling/retryConfig.test.d.ts.map +1 -0
  49. package/lib/test/bulkPulling/retryConfig.test.js +34 -0
  50. package/lib/test/bulkPulling/schemaless.test.js +15 -14
  51. package/lib/test/bulkPulling/sql.test.js +116 -44
  52. package/lib/test/bulkPulling/stmt1.func.test.js +31 -30
  53. package/lib/test/bulkPulling/stmt1.type.test.js +1 -1
  54. package/lib/test/bulkPulling/stmt2.func.test.js +37 -36
  55. package/lib/test/bulkPulling/stmt2.type.test.js +1 -1
  56. package/lib/test/bulkPulling/tmq.config.test.d.ts +2 -0
  57. package/lib/test/bulkPulling/tmq.config.test.d.ts.map +1 -0
  58. package/lib/test/bulkPulling/tmq.config.test.js +77 -0
  59. package/lib/test/bulkPulling/tmq.test.js +135 -14
  60. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts +2 -0
  61. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts.map +1 -0
  62. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +184 -0
  63. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts +2 -0
  64. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts.map +1 -0
  65. package/lib/test/bulkPulling/wsConfig.dsn.test.js +37 -0
  66. package/lib/test/bulkPulling/wsConnectPool.test.js +7 -7
  67. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts +2 -0
  68. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts.map +1 -0
  69. package/lib/test/bulkPulling/wsConnector.failover.test.js +128 -0
  70. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts +2 -0
  71. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts.map +1 -0
  72. package/lib/test/bulkPulling/wsConnectorPool.key.test.js +50 -0
  73. package/lib/test/bulkPulling/wsEventCallback.test.d.ts +2 -0
  74. package/lib/test/bulkPulling/wsEventCallback.test.d.ts.map +1 -0
  75. package/lib/test/bulkPulling/wsEventCallback.test.js +54 -0
  76. package/lib/test/utils.d.ts +4 -0
  77. package/lib/test/utils.d.ts.map +1 -1
  78. package/lib/test/utils.js +11 -17
  79. package/package.json +1 -1
@@ -0,0 +1,378 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dsn_1 = require("../../src/common/dsn");
4
+ describe("dsn", () => {
5
+ describe("parse", () => {
6
+ test("single host with port", () => {
7
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041");
8
+ expect(result.scheme).toBe("ws");
9
+ expect(result.username).toBe("root");
10
+ expect(result.password).toBe("taosdata");
11
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
12
+ expect(result.database).toBe("");
13
+ expect(result.params.size).toBe(0);
14
+ });
15
+ test("single host with database", () => {
16
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041/power");
17
+ expect(result.scheme).toBe("ws");
18
+ expect(result.username).toBe("root");
19
+ expect(result.password).toBe("taosdata");
20
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
21
+ expect(result.database).toBe("power");
22
+ expect(result.params.size).toBe(0);
23
+ });
24
+ test("multiple addresses", () => {
25
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1:6041,host2:6042,host3:6043/mydb");
26
+ expect(result.scheme).toBe("ws");
27
+ expect(result.username).toBe("root");
28
+ expect(result.password).toBe("taosdata");
29
+ expect(result.addresses).toHaveLength(3);
30
+ expect(result.addresses[0]).toEqual({ host: "host1", port: 6041 });
31
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6042 });
32
+ expect(result.addresses[2]).toEqual({ host: "host3", port: 6043 });
33
+ expect(result.database).toBe("mydb");
34
+ expect(result.params.size).toBe(0);
35
+ });
36
+ test("IPv6 address in brackets", () => {
37
+ const result = (0, dsn_1.parse)("ws://root:taosdata@[::1]:6041,host2:6042/db");
38
+ expect(result.scheme).toBe("ws");
39
+ expect(result.username).toBe("root");
40
+ expect(result.password).toBe("taosdata");
41
+ expect(result.addresses).toHaveLength(2);
42
+ expect(result.addresses[0]).toEqual({ host: "[::1]", port: 6041 });
43
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6042 });
44
+ expect(result.database).toBe("db");
45
+ expect(result.params.size).toBe(0);
46
+ });
47
+ test("multiple IPv6 addresses", () => {
48
+ const result = (0, dsn_1.parse)("ws://root:taosdata@[::1]:6041,[fe80::1]:6042");
49
+ expect(result.scheme).toBe("ws");
50
+ expect(result.username).toBe("root");
51
+ expect(result.password).toBe("taosdata");
52
+ expect(result.addresses).toHaveLength(2);
53
+ expect(result.addresses[0]).toEqual({ host: "[::1]", port: 6041 });
54
+ expect(result.addresses[1]).toEqual({ host: "[fe80::1]", port: 6042 });
55
+ expect(result.database).toBe("");
56
+ expect(result.params.size).toBe(0);
57
+ });
58
+ test("wss scheme", () => {
59
+ const result = (0, dsn_1.parse)("wss://root:taosdata@localhost:6041");
60
+ expect(result.scheme).toBe("wss");
61
+ expect(result.username).toBe("root");
62
+ expect(result.password).toBe("taosdata");
63
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
64
+ expect(result.database).toBe("");
65
+ expect(result.params.size).toBe(0);
66
+ });
67
+ test("query parameters", () => {
68
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1:6041/db?retries=5&retry_backoff_ms=300&timezone=UTC");
69
+ expect(result.scheme).toBe("ws");
70
+ expect(result.username).toBe("root");
71
+ expect(result.password).toBe("taosdata");
72
+ expect(result.addresses).toEqual([{ host: "host1", port: 6041 }]);
73
+ expect(result.database).toBe("db");
74
+ expect(result.params.get("retries")).toBe("5");
75
+ expect(result.params.get("retry_backoff_ms")).toBe("300");
76
+ expect(result.params.get("timezone")).toBe("UTC");
77
+ });
78
+ test("deduplicates addresses", () => {
79
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1:6041,host2:6042,host1:6041");
80
+ expect(result.scheme).toBe("ws");
81
+ expect(result.username).toBe("root");
82
+ expect(result.password).toBe("taosdata");
83
+ expect(result.addresses).toHaveLength(2);
84
+ expect(result.addresses[0]).toEqual({ host: "host1", port: 6041 });
85
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6042 });
86
+ expect(result.database).toBe("");
87
+ expect(result.params.size).toBe(0);
88
+ });
89
+ test("no user info", () => {
90
+ const result = (0, dsn_1.parse)("ws://host1:6041?token=mytoken");
91
+ expect(result.scheme).toBe("ws");
92
+ expect(result.username).toBe("");
93
+ expect(result.password).toBe("");
94
+ expect(result.addresses).toEqual([{ host: "host1", port: 6041 }]);
95
+ expect(result.database).toBe("");
96
+ expect(result.params.get("token")).toBe("mytoken");
97
+ });
98
+ test("username only (no password)", () => {
99
+ const result = (0, dsn_1.parse)("ws://root@host1:6041");
100
+ expect(result.scheme).toBe("ws");
101
+ expect(result.username).toBe("root");
102
+ expect(result.password).toBe("");
103
+ expect(result.addresses).toEqual([{ host: "host1", port: 6041 }]);
104
+ expect(result.database).toBe("");
105
+ expect(result.params.size).toBe(0);
106
+ });
107
+ test("host without port uses default 6041", () => {
108
+ const result = (0, dsn_1.parse)("ws://root:taosdata@myhost");
109
+ expect(result.scheme).toBe("ws");
110
+ expect(result.username).toBe("root");
111
+ expect(result.password).toBe("taosdata");
112
+ expect(result.addresses).toEqual([{ host: "myhost", port: 6041 }]);
113
+ expect(result.database).toBe("");
114
+ expect(result.params.size).toBe(0);
115
+ });
116
+ test("complex URL with all features", () => {
117
+ const result = (0, dsn_1.parse)("ws://user:p%40ss@host1:6041,host2:6042,[::1]:6043/testdb?retries=5&retry_backoff_ms=100&retry_backoff_max_ms=5000&resend_write=true&token=abc");
118
+ expect(result.scheme).toBe("ws");
119
+ expect(result.username).toBe("user");
120
+ expect(result.password).toBe("p%40ss");
121
+ expect(result.addresses).toHaveLength(3);
122
+ expect(result.addresses[0]).toEqual({ host: "host1", port: 6041 });
123
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6042 });
124
+ expect(result.addresses[2]).toEqual({ host: "[::1]", port: 6043 });
125
+ expect(result.database).toBe("testdb");
126
+ expect(result.params.get("retries")).toBe("5");
127
+ expect(result.params.get("retry_backoff_ms")).toBe("100");
128
+ expect(result.params.get("retry_backoff_max_ms")).toBe("5000");
129
+ expect(result.params.get("resend_write")).toBe("true");
130
+ expect(result.params.get("token")).toBe("abc");
131
+ });
132
+ // Additional normal test cases
133
+ test("empty password with colon", () => {
134
+ const result = (0, dsn_1.parse)("ws://root:@localhost:6041");
135
+ expect(result.scheme).toBe("ws");
136
+ expect(result.username).toBe("root");
137
+ expect(result.password).toBe("");
138
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
139
+ expect(result.database).toBe("");
140
+ expect(result.params.size).toBe(0);
141
+ });
142
+ test("database with special characters", () => {
143
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041/test_db-123");
144
+ expect(result.scheme).toBe("ws");
145
+ expect(result.username).toBe("root");
146
+ expect(result.password).toBe("taosdata");
147
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
148
+ expect(result.database).toBe("test_db-123");
149
+ expect(result.params.size).toBe(0);
150
+ });
151
+ test("empty database path with slash", () => {
152
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041/");
153
+ expect(result.scheme).toBe("ws");
154
+ expect(result.username).toBe("root");
155
+ expect(result.password).toBe("taosdata");
156
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
157
+ expect(result.database).toBe("");
158
+ expect(result.params.size).toBe(0);
159
+ });
160
+ test("multiple addresses without ports use default", () => {
161
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1,host2,host3");
162
+ expect(result.scheme).toBe("ws");
163
+ expect(result.username).toBe("root");
164
+ expect(result.password).toBe("taosdata");
165
+ expect(result.addresses).toHaveLength(3);
166
+ expect(result.addresses[0]).toEqual({ host: "host1", port: 6041 });
167
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6041 });
168
+ expect(result.addresses[2]).toEqual({ host: "host3", port: 6041 });
169
+ expect(result.database).toBe("");
170
+ expect(result.params.size).toBe(0);
171
+ });
172
+ test("IPv6 without port uses default", () => {
173
+ const result = (0, dsn_1.parse)("ws://root:taosdata@[::1]");
174
+ expect(result.scheme).toBe("ws");
175
+ expect(result.username).toBe("root");
176
+ expect(result.password).toBe("taosdata");
177
+ expect(result.addresses).toEqual([{ host: "[::1]", port: 6041 }]);
178
+ expect(result.database).toBe("");
179
+ expect(result.params.size).toBe(0);
180
+ });
181
+ test("scheme is case insensitive", () => {
182
+ const result = (0, dsn_1.parse)("WS://root:taosdata@localhost:6041");
183
+ expect(result.scheme).toBe("ws");
184
+ expect(result.username).toBe("root");
185
+ expect(result.password).toBe("taosdata");
186
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
187
+ expect(result.database).toBe("");
188
+ expect(result.params.size).toBe(0);
189
+ });
190
+ test("WSS scheme is case insensitive", () => {
191
+ const result = (0, dsn_1.parse)("WSS://root:taosdata@localhost:6041");
192
+ expect(result.scheme).toBe("wss");
193
+ expect(result.username).toBe("root");
194
+ expect(result.password).toBe("taosdata");
195
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
196
+ expect(result.database).toBe("");
197
+ expect(result.params.size).toBe(0);
198
+ });
199
+ test("single query parameter", () => {
200
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041?token=abc123");
201
+ expect(result.scheme).toBe("ws");
202
+ expect(result.username).toBe("root");
203
+ expect(result.password).toBe("taosdata");
204
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
205
+ expect(result.database).toBe("");
206
+ expect(result.params.size).toBe(1);
207
+ expect(result.params.get("token")).toBe("abc123");
208
+ });
209
+ test("database with query parameters", () => {
210
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041/mydb?timezone=UTC");
211
+ expect(result.scheme).toBe("ws");
212
+ expect(result.username).toBe("root");
213
+ expect(result.password).toBe("taosdata");
214
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
215
+ expect(result.database).toBe("mydb");
216
+ expect(result.params.get("timezone")).toBe("UTC");
217
+ });
218
+ test("full IPv6 address (not abbreviated)", () => {
219
+ const result = (0, dsn_1.parse)("ws://root:taosdata@[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:6041");
220
+ expect(result.scheme).toBe("ws");
221
+ expect(result.username).toBe("root");
222
+ expect(result.password).toBe("taosdata");
223
+ expect(result.addresses).toEqual([{ host: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]", port: 6041 }]);
224
+ expect(result.database).toBe("");
225
+ expect(result.params.size).toBe(0);
226
+ });
227
+ test("full IPv6 address without port uses default", () => {
228
+ const result = (0, dsn_1.parse)("ws://root:taosdata@[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:");
229
+ expect(result.scheme).toBe("ws");
230
+ expect(result.username).toBe("root");
231
+ expect(result.password).toBe("taosdata");
232
+ expect(result.addresses).toEqual([{ host: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]", port: 6041 }]);
233
+ expect(result.database).toBe("");
234
+ expect(result.params.size).toBe(0);
235
+ });
236
+ test("no username only password", () => {
237
+ const result = (0, dsn_1.parse)("ws://:pass@localhost:6041");
238
+ expect(result.scheme).toBe("ws");
239
+ expect(result.username).toBe("");
240
+ expect(result.password).toBe("pass");
241
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
242
+ expect(result.database).toBe("");
243
+ expect(result.params.size).toBe(0);
244
+ });
245
+ test("no username only password with database", () => {
246
+ const result = (0, dsn_1.parse)("ws://:taosdata@localhost:6041/mydb");
247
+ expect(result.scheme).toBe("ws");
248
+ expect(result.username).toBe("");
249
+ expect(result.password).toBe("taosdata");
250
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
251
+ expect(result.database).toBe("mydb");
252
+ expect(result.params.size).toBe(0);
253
+ });
254
+ test("empty port uses default 6041", () => {
255
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1:");
256
+ expect(result.scheme).toBe("ws");
257
+ expect(result.username).toBe("root");
258
+ expect(result.password).toBe("taosdata");
259
+ expect(result.addresses).toEqual([{ host: "host1", port: 6041 }]);
260
+ expect(result.database).toBe("");
261
+ expect(result.params.size).toBe(0);
262
+ });
263
+ test("IPv4 with empty port uses default 6041", () => {
264
+ const result = (0, dsn_1.parse)("ws://root:taosdata@127.0.1.0:");
265
+ expect(result.scheme).toBe("ws");
266
+ expect(result.username).toBe("root");
267
+ expect(result.password).toBe("taosdata");
268
+ expect(result.addresses).toEqual([{ host: "127.0.1.0", port: 6041 }]);
269
+ expect(result.database).toBe("");
270
+ expect(result.params.size).toBe(0);
271
+ });
272
+ test("multiple addresses with empty ports use default", () => {
273
+ const result = (0, dsn_1.parse)("ws://root:taosdata@host1:,host2:,127.0.0.1:");
274
+ expect(result.scheme).toBe("ws");
275
+ expect(result.username).toBe("root");
276
+ expect(result.password).toBe("taosdata");
277
+ expect(result.addresses).toHaveLength(3);
278
+ expect(result.addresses[0]).toEqual({ host: "host1", port: 6041 });
279
+ expect(result.addresses[1]).toEqual({ host: "host2", port: 6041 });
280
+ expect(result.addresses[2]).toEqual({ host: "127.0.0.1", port: 6041 });
281
+ expect(result.database).toBe("");
282
+ expect(result.params.size).toBe(0);
283
+ });
284
+ // Boundary test cases
285
+ test("port boundary - minimum valid port 1", () => {
286
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:1");
287
+ expect(result.scheme).toBe("ws");
288
+ expect(result.username).toBe("root");
289
+ expect(result.password).toBe("taosdata");
290
+ expect(result.addresses).toEqual([{ host: "localhost", port: 1 }]);
291
+ expect(result.database).toBe("");
292
+ expect(result.params.size).toBe(0);
293
+ });
294
+ test("port boundary - maximum valid port 65535", () => {
295
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:65535");
296
+ expect(result.scheme).toBe("ws");
297
+ expect(result.username).toBe("root");
298
+ expect(result.password).toBe("taosdata");
299
+ expect(result.addresses).toEqual([{ host: "localhost", port: 65535 }]);
300
+ expect(result.database).toBe("");
301
+ expect(result.params.size).toBe(0);
302
+ });
303
+ test("very long username", () => {
304
+ const longUsername = "a".repeat(100);
305
+ const result = (0, dsn_1.parse)(`ws://${longUsername}:pass@localhost:6041`);
306
+ expect(result.scheme).toBe("ws");
307
+ expect(result.username).toBe(longUsername);
308
+ expect(result.password).toBe("pass");
309
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
310
+ expect(result.database).toBe("");
311
+ expect(result.params.size).toBe(0);
312
+ });
313
+ test("very long password", () => {
314
+ const longPassword = "p".repeat(100);
315
+ const result = (0, dsn_1.parse)(`ws://user:${longPassword}@localhost:6041`);
316
+ expect(result.scheme).toBe("ws");
317
+ expect(result.username).toBe("user");
318
+ expect(result.password).toBe(longPassword);
319
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
320
+ expect(result.database).toBe("");
321
+ expect(result.params.size).toBe(0);
322
+ });
323
+ test("many addresses", () => {
324
+ const result = (0, dsn_1.parse)("ws://root:taosdata@h1:6041,h2:6042,h3:6043,h4:6044,h5:6045,h6:6046,h7:6047,h8:6048");
325
+ expect(result.scheme).toBe("ws");
326
+ expect(result.username).toBe("root");
327
+ expect(result.password).toBe("taosdata");
328
+ expect(result.addresses).toHaveLength(8);
329
+ expect(result.database).toBe("");
330
+ expect(result.params.size).toBe(0);
331
+ });
332
+ test("many query parameters", () => {
333
+ const result = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041?p1=v1&p2=v2&p3=v3&p4=v4&p5=v5");
334
+ expect(result.scheme).toBe("ws");
335
+ expect(result.username).toBe("root");
336
+ expect(result.password).toBe("taosdata");
337
+ expect(result.addresses).toEqual([{ host: "localhost", port: 6041 }]);
338
+ expect(result.database).toBe("");
339
+ expect(result.params.size).toBe(5);
340
+ expect(result.params.get("p1")).toBe("v1");
341
+ expect(result.params.get("p5")).toBe("v5");
342
+ });
343
+ // Exception test cases
344
+ test("empty URL throws", () => {
345
+ expect(() => (0, dsn_1.parse)("")).toThrow("URL must not be empty");
346
+ });
347
+ test("whitespace only URL throws", () => {
348
+ expect(() => (0, dsn_1.parse)(" ")).toThrow("URL must not be empty");
349
+ });
350
+ test("invalid scheme throws", () => {
351
+ expect(() => (0, dsn_1.parse)("http://host:6041")).toThrow("Invalid URL scheme");
352
+ });
353
+ test("missing scheme throws", () => {
354
+ expect(() => (0, dsn_1.parse)("root:taosdata@host:6041")).toThrow("Invalid URL scheme");
355
+ });
356
+ test("unclosed IPv6 bracket throws", () => {
357
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@[::1:6041")).toThrow("Unclosed bracket");
358
+ });
359
+ test("invalid port throws", () => {
360
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:abc")).toThrow("Invalid port");
361
+ });
362
+ test("port out of range throws", () => {
363
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:70000")).toThrow("Invalid port");
364
+ });
365
+ test("port zero throws", () => {
366
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:0")).toThrow("Invalid port");
367
+ });
368
+ test("negative port throws", () => {
369
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:-1")).toThrow("Invalid port");
370
+ });
371
+ test("port with spaces throws", () => {
372
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:60 41")).toThrow("Invalid port");
373
+ });
374
+ test("IPv6 with unclosed bracket in middle of host list throws", () => {
375
+ expect(() => (0, dsn_1.parse)("ws://root:taosdata@host1:6041,[::1:6042,host2:6043")).toThrow("Unclosed bracket");
376
+ });
377
+ });
378
+ });
@@ -4,7 +4,7 @@ const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
4
4
  const config_1 = require("../../src/common/config");
5
5
  const wsSql_1 = require("../../src/sql/wsSql");
6
6
  const utils_1 = require("../utils");
7
- let dsn = "ws://root:taosdata@localhost:6041";
7
+ let dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@localhost:6041`;
8
8
  let conf = new config_1.WSConfig(dsn);
9
9
  const resultMap = new Map();
10
10
  resultMap.set("POINT (4.0 8.0)", (0, utils_1.hexToBytes)("010100000000000000000010400000000000002040"));
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=retryConfig.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryConfig.test.d.ts","sourceRoot":"","sources":["../../../test/bulkPulling/retryConfig.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dsn_1 = require("../../src/common/dsn");
4
+ const retryConfig_1 = require("../../src/client/retryConfig");
5
+ describe("RetryConfig", () => {
6
+ test("uses defaults when retry params are not provided", () => {
7
+ const dsn = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041");
8
+ const config = retryConfig_1.RetryConfig.fromDsn(dsn);
9
+ expect(config.retries).toBe(3);
10
+ expect(config.retryBackoffMs).toBe(100);
11
+ expect(config.retryBackoffMaxMs).toBe(10000);
12
+ });
13
+ test("reads retry params from dsn", () => {
14
+ const dsn = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041?retries=5&retry_backoff_ms=200&retry_backoff_max_ms=3200");
15
+ const config = retryConfig_1.RetryConfig.fromDsn(dsn);
16
+ expect(config.retries).toBe(5);
17
+ expect(config.retryBackoffMs).toBe(200);
18
+ expect(config.retryBackoffMaxMs).toBe(3200);
19
+ });
20
+ test("normalizes invalid params to safe defaults", () => {
21
+ const dsn = (0, dsn_1.parse)("ws://root:taosdata@localhost:6041?retries=-1&retry_backoff_ms=abc&retry_backoff_max_ms=0");
22
+ const config = retryConfig_1.RetryConfig.fromDsn(dsn);
23
+ expect(config.retries).toBe(3);
24
+ expect(config.retryBackoffMs).toBe(100);
25
+ expect(config.retryBackoffMaxMs).toBe(10000);
26
+ });
27
+ test("computes exponential backoff and caps at max", () => {
28
+ const config = new retryConfig_1.RetryConfig(3, 100, 350);
29
+ expect(config.getBackoffDelay(0)).toBe(100);
30
+ expect(config.getBackoffDelay(1)).toBe(200);
31
+ expect(config.getBackoffDelay(2)).toBe(350);
32
+ expect(config.getBackoffDelay(10)).toBe(350);
33
+ });
34
+ });
@@ -4,11 +4,12 @@ const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
4
4
  const config_1 = require("../../src/common/config");
5
5
  const wsProto_1 = require("../../src/sql/wsProto");
6
6
  const wsSql_1 = require("../../src/sql/wsSql");
7
+ const utils_1 = require("../utils");
7
8
  let dns = "ws://localhost:6041";
8
9
  beforeAll(async () => {
9
10
  let conf = new config_1.WSConfig(dns);
10
- conf.setUser("root");
11
- conf.setPwd("taosdata");
11
+ conf.setUser((0, utils_1.testUsername)());
12
+ conf.setPwd((0, utils_1.testPassword)());
12
13
  let wsSql = await wsSql_1.WsSql.open(conf);
13
14
  await wsSql.exec("drop database if exists power_schemaless;");
14
15
  await wsSql.exec("create database if not exists power_schemaless KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
@@ -22,8 +23,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
22
23
  let jsonData = '{"metric": "meter_current","timestamp": 1626846400,"value": 10.3, "tags": {"groupid": 2, "location": "California.SanFrancisco", "id": "d1001"}}';
23
24
  test("normal connect", async () => {
24
25
  let conf = new config_1.WSConfig(dns);
25
- conf.setUser("root");
26
- conf.setPwd("taosdata");
26
+ conf.setUser((0, utils_1.testUsername)());
27
+ conf.setPwd((0, utils_1.testPassword)());
27
28
  conf.setDb("power_schemaless");
28
29
  let wsSchemaless = await wsSql_1.WsSql.open(conf);
29
30
  expect(wsSchemaless.state()).toBeGreaterThan(0);
@@ -34,8 +35,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
34
35
  let wsSchemaless = null;
35
36
  try {
36
37
  let conf = new config_1.WSConfig(dns);
37
- conf.setUser("root");
38
- conf.setPwd("taosdata");
38
+ conf.setUser((0, utils_1.testUsername)());
39
+ conf.setPwd((0, utils_1.testPassword)());
39
40
  conf.setDb("jest");
40
41
  wsSchemaless = await wsSql_1.WsSql.open(conf);
41
42
  }
@@ -51,8 +52,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
51
52
  });
52
53
  test("normal insert", async () => {
53
54
  let conf = new config_1.WSConfig(dns);
54
- conf.setUser("root");
55
- conf.setPwd("taosdata");
55
+ conf.setUser((0, utils_1.testUsername)());
56
+ conf.setPwd((0, utils_1.testPassword)());
56
57
  conf.setDb("power_schemaless");
57
58
  let wsSchemaless = await wsSql_1.WsSql.open(conf);
58
59
  expect(wsSchemaless.state()).toBeGreaterThan(0);
@@ -63,8 +64,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
63
64
  });
64
65
  test("normal wsSql insert", async () => {
65
66
  let conf = new config_1.WSConfig(dns);
66
- conf.setUser("root");
67
- conf.setPwd("taosdata");
67
+ conf.setUser((0, utils_1.testUsername)());
68
+ conf.setPwd((0, utils_1.testPassword)());
68
69
  conf.setDb("power_schemaless");
69
70
  let wsSchemaless = await wsSql_1.WsSql.open(conf);
70
71
  expect(wsSchemaless.state()).toBeGreaterThan(0);
@@ -76,8 +77,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
76
77
  });
77
78
  test("SchemalessProto error", async () => {
78
79
  let conf = new config_1.WSConfig(dns);
79
- conf.setUser("root");
80
- conf.setPwd("taosdata");
80
+ conf.setUser((0, utils_1.testUsername)());
81
+ conf.setPwd((0, utils_1.testPassword)());
81
82
  conf.setDb("power_schemaless");
82
83
  let wsSchemaless = await wsSql_1.WsSql.open(conf);
83
84
  expect(wsSchemaless.state()).toBeGreaterThan(0);
@@ -92,8 +93,8 @@ describe("TDWebSocket.WsSchemaless()", () => {
92
93
  });
93
94
  afterAll(async () => {
94
95
  let conf = new config_1.WSConfig(dns);
95
- conf.setUser("root");
96
- conf.setPwd("taosdata");
96
+ conf.setUser((0, utils_1.testUsername)());
97
+ conf.setPwd((0, utils_1.testPassword)());
97
98
  let wsSql = await wsSql_1.WsSql.open(conf);
98
99
  await wsSql.exec("drop database if exists power_schemaless;");
99
100
  await wsSql.close();