@tdengine/websocket 3.2.3 → 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 (224) hide show
  1. package/lib/package.json +1 -1
  2. package/lib/src/client/wsClient.d.ts +23 -7
  3. package/lib/src/client/wsClient.d.ts.map +1 -1
  4. package/lib/src/client/wsClient.js +154 -139
  5. package/lib/src/client/wsConnector.d.ts +55 -9
  6. package/lib/src/client/wsConnector.d.ts.map +1 -1
  7. package/lib/src/client/wsConnector.js +519 -100
  8. package/lib/src/client/wsConnectorPool.d.ts +5 -1
  9. package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
  10. package/lib/src/client/wsConnectorPool.js +61 -43
  11. package/lib/src/client/wsEventCallback.d.ts +3 -0
  12. package/lib/src/client/wsEventCallback.d.ts.map +1 -1
  13. package/lib/src/client/wsEventCallback.js +67 -8
  14. package/lib/src/common/addressConnectionTracker.d.ts +11 -0
  15. package/lib/src/common/addressConnectionTracker.d.ts.map +1 -0
  16. package/lib/src/common/addressConnectionTracker.js +53 -0
  17. package/lib/src/common/dsn.d.ts +14 -2
  18. package/lib/src/common/dsn.d.ts.map +1 -1
  19. package/lib/src/common/dsn.js +91 -22
  20. package/lib/src/common/taosResult.d.ts.map +1 -1
  21. package/lib/src/common/taosResult.js +0 -5
  22. package/lib/src/common/urlParser.d.ts +32 -0
  23. package/lib/src/common/urlParser.d.ts.map +1 -0
  24. package/lib/src/common/urlParser.js +201 -0
  25. package/lib/src/common/utils.d.ts +2 -1
  26. package/lib/src/common/utils.d.ts.map +1 -1
  27. package/lib/src/common/utils.js +35 -34
  28. package/lib/src/sql/wsSql.js +2 -2
  29. package/lib/src/stmt/FieldBindParams.d.ts.map +1 -1
  30. package/lib/src/stmt/wsColumnInfo.d.ts.map +1 -1
  31. package/lib/src/stmt/wsParams1.d.ts.map +1 -1
  32. package/lib/src/stmt/wsParams1.js +26 -26
  33. package/lib/src/stmt/wsParams2.d.ts.map +1 -1
  34. package/lib/src/stmt/wsParams2.js +0 -3
  35. package/lib/src/stmt/wsParamsBase.d.ts.map +1 -1
  36. package/lib/src/stmt/wsProto.d.ts.map +1 -1
  37. package/lib/src/stmt/wsProto.js +16 -16
  38. package/lib/src/stmt/wsStmt1.d.ts.map +1 -1
  39. package/lib/src/stmt/wsStmt2.d.ts +12 -4
  40. package/lib/src/stmt/wsStmt2.d.ts.map +1 -1
  41. package/lib/src/stmt/wsStmt2.js +182 -64
  42. package/lib/src/stmt/wsTableInfo.d.ts.map +1 -1
  43. package/lib/src/tmq/config.d.ts +3 -2
  44. package/lib/src/tmq/config.d.ts.map +1 -1
  45. package/lib/src/tmq/config.js +15 -15
  46. package/lib/src/tmq/wsTmq.d.ts +4 -1
  47. package/lib/src/tmq/wsTmq.d.ts.map +1 -1
  48. package/lib/src/tmq/wsTmq.js +50 -27
  49. package/lib/test/bulkPulling/a.test.d.ts +2 -0
  50. package/lib/test/bulkPulling/a.test.d.ts.map +1 -0
  51. package/lib/test/bulkPulling/a.test.js +166 -0
  52. package/lib/test/bulkPulling/dsn.test.js +19 -0
  53. package/lib/test/bulkPulling/retryConfig.test.js +11 -11
  54. package/lib/test/bulkPulling/sql.failover.test.d.ts +2 -0
  55. package/lib/test/bulkPulling/sql.failover.test.d.ts.map +1 -0
  56. package/lib/test/bulkPulling/sql.failover.test.js +338 -0
  57. package/lib/test/bulkPulling/stmt2.failover.test.d.ts +2 -0
  58. package/lib/test/bulkPulling/stmt2.failover.test.d.ts.map +1 -0
  59. package/lib/test/bulkPulling/stmt2.failover.test.js +313 -0
  60. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts +2 -0
  61. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts.map +1 -0
  62. package/lib/test/bulkPulling/stmt2.init.failover.test.js +50 -0
  63. package/lib/test/bulkPulling/tmq.failover.test.d.ts +2 -0
  64. package/lib/test/bulkPulling/tmq.failover.test.d.ts.map +1 -0
  65. package/lib/test/bulkPulling/tmq.failover.test.js +404 -0
  66. package/lib/test/bulkPulling/urlParser.test.d.ts +2 -0
  67. package/lib/test/bulkPulling/urlParser.test.d.ts.map +1 -0
  68. package/lib/test/bulkPulling/urlParser.test.js +452 -0
  69. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +2 -2
  70. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts +2 -0
  71. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts.map +1 -0
  72. package/lib/test/bulkPulling/wsClient.recovery.test.js +104 -0
  73. package/lib/test/bulkPulling/wsConfig.dsn.test.js +2 -0
  74. package/lib/test/bulkPulling/wsConnector.failover.test.js +396 -27
  75. package/lib/test/bulkPulling/wsConnectorPool.key.test.js +12 -10
  76. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts +2 -0
  77. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts.map +1 -0
  78. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.js +28 -0
  79. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts +2 -0
  80. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts.map +1 -0
  81. package/lib/test/bulkPulling/wsProxy.failover.integration.test.js +120 -0
  82. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts +2 -0
  83. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts.map +1 -0
  84. package/lib/test/bulkPulling/wsProxy.failover.test.js +465 -0
  85. package/lib/test/client/wsClient.recovery.test.d.ts +2 -0
  86. package/lib/test/client/wsClient.recovery.test.d.ts.map +1 -0
  87. package/lib/test/client/wsClient.recovery.test.js +122 -0
  88. package/lib/test/client/wsConnectPool.test.d.ts +2 -0
  89. package/lib/test/client/wsConnectPool.test.d.ts.map +1 -0
  90. package/lib/test/client/wsConnectPool.test.js +147 -0
  91. package/lib/test/client/wsConnector.failover.test.d.ts +2 -0
  92. package/lib/test/client/wsConnector.failover.test.d.ts.map +1 -0
  93. package/lib/test/client/wsConnector.failover.test.js +681 -0
  94. package/lib/test/client/wsConnector.leastConnections.test.d.ts +2 -0
  95. package/lib/test/client/wsConnector.leastConnections.test.d.ts.map +1 -0
  96. package/lib/test/client/wsConnector.leastConnections.test.js +71 -0
  97. package/lib/test/client/wsConnectorPool.key.test.d.ts +2 -0
  98. package/lib/test/client/wsConnectorPool.key.test.d.ts.map +1 -0
  99. package/lib/test/client/wsConnectorPool.key.test.js +127 -0
  100. package/lib/test/client/wsEventCallback.test.d.ts +2 -0
  101. package/lib/test/client/wsEventCallback.test.d.ts.map +1 -0
  102. package/lib/test/client/wsEventCallback.test.js +98 -0
  103. package/lib/test/common/addressConnectionTracker.test.d.ts +2 -0
  104. package/lib/test/common/addressConnectionTracker.test.d.ts.map +1 -0
  105. package/lib/test/common/addressConnectionTracker.test.js +74 -0
  106. package/lib/test/common/dsn.test.d.ts +2 -0
  107. package/lib/test/common/dsn.test.d.ts.map +1 -0
  108. package/lib/test/common/dsn.test.js +406 -0
  109. package/lib/test/common/log.test.d.ts +2 -0
  110. package/lib/test/common/log.test.d.ts.map +1 -0
  111. package/lib/test/common/log.test.js +54 -0
  112. package/lib/test/common/utils.test.d.ts +2 -0
  113. package/lib/test/common/utils.test.d.ts.map +1 -0
  114. package/lib/test/common/utils.test.js +13 -0
  115. package/lib/test/common/wsConfig.dsn.test.d.ts +2 -0
  116. package/lib/test/common/wsConfig.dsn.test.d.ts.map +1 -0
  117. package/lib/test/common/wsConfig.dsn.test.js +39 -0
  118. package/lib/test/helpers/utils.d.ts +27 -0
  119. package/lib/test/helpers/utils.d.ts.map +1 -0
  120. package/lib/test/helpers/utils.js +341 -0
  121. package/lib/test/helpers/wsFailoverProxy.d.ts +109 -0
  122. package/lib/test/helpers/wsFailoverProxy.d.ts.map +1 -0
  123. package/lib/test/helpers/wsFailoverProxy.js +420 -0
  124. package/lib/test/helpers/wsProxy.d.ts +110 -0
  125. package/lib/test/helpers/wsProxy.d.ts.map +1 -0
  126. package/lib/test/helpers/wsProxy.js +429 -0
  127. package/lib/test/sql/core/decimal.test.d.ts +2 -0
  128. package/lib/test/sql/core/decimal.test.d.ts.map +1 -0
  129. package/lib/test/sql/core/decimal.test.js +153 -0
  130. package/lib/test/sql/core/queryTables.test.d.ts +2 -0
  131. package/lib/test/sql/core/queryTables.test.d.ts.map +1 -0
  132. package/lib/test/sql/core/queryTables.test.js +506 -0
  133. package/lib/test/sql/core/schemaless.test.d.ts +2 -0
  134. package/lib/test/sql/core/schemaless.test.d.ts.map +1 -0
  135. package/lib/test/sql/core/schemaless.test.js +102 -0
  136. package/lib/test/sql/core/sql.test.d.ts +2 -0
  137. package/lib/test/sql/core/sql.test.d.ts.map +1 -0
  138. package/lib/test/sql/core/sql.test.js +324 -0
  139. package/lib/test/sql/decimal.test.d.ts +2 -0
  140. package/lib/test/sql/decimal.test.d.ts.map +1 -0
  141. package/lib/test/sql/decimal.test.js +153 -0
  142. package/lib/test/sql/failover/sql.failover.test.d.ts +2 -0
  143. package/lib/test/sql/failover/sql.failover.test.d.ts.map +1 -0
  144. package/lib/test/sql/failover/sql.failover.test.js +341 -0
  145. package/lib/test/sql/queryTables.test.d.ts +2 -0
  146. package/lib/test/sql/queryTables.test.d.ts.map +1 -0
  147. package/lib/test/sql/queryTables.test.js +506 -0
  148. package/lib/test/sql/schemaless.test.d.ts +2 -0
  149. package/lib/test/sql/schemaless.test.d.ts.map +1 -0
  150. package/lib/test/sql/schemaless.test.js +102 -0
  151. package/lib/test/sql/sql.failover.test.d.ts +2 -0
  152. package/lib/test/sql/sql.failover.test.d.ts.map +1 -0
  153. package/lib/test/sql/sql.failover.test.js +341 -0
  154. package/lib/test/sql/sql.test.d.ts +2 -0
  155. package/lib/test/sql/sql.test.d.ts.map +1 -0
  156. package/lib/test/sql/sql.test.js +324 -0
  157. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts +2 -0
  158. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts.map +1 -0
  159. package/lib/test/stmt/failover/stmt2.failover.mock.test.js +341 -0
  160. package/lib/test/stmt/failover/stmt2.failover.test.d.ts +2 -0
  161. package/lib/test/stmt/failover/stmt2.failover.test.d.ts.map +1 -0
  162. package/lib/test/stmt/failover/stmt2.failover.test.js +384 -0
  163. package/lib/test/stmt/stmt1.func.test.d.ts +2 -0
  164. package/lib/test/stmt/stmt1.func.test.d.ts.map +1 -0
  165. package/lib/test/stmt/stmt1.func.test.js +418 -0
  166. package/lib/test/stmt/stmt1.type.test.d.ts +2 -0
  167. package/lib/test/stmt/stmt1.type.test.d.ts.map +1 -0
  168. package/lib/test/stmt/stmt1.type.test.js +399 -0
  169. package/lib/test/stmt/stmt2.failover.mock.test.d.ts +2 -0
  170. package/lib/test/stmt/stmt2.failover.mock.test.d.ts.map +1 -0
  171. package/lib/test/stmt/stmt2.failover.mock.test.js +341 -0
  172. package/lib/test/stmt/stmt2.failover.test.d.ts +2 -0
  173. package/lib/test/stmt/stmt2.failover.test.d.ts.map +1 -0
  174. package/lib/test/stmt/stmt2.failover.test.js +384 -0
  175. package/lib/test/stmt/stmt2.func.test.d.ts +2 -0
  176. package/lib/test/stmt/stmt2.func.test.d.ts.map +1 -0
  177. package/lib/test/stmt/stmt2.func.test.js +537 -0
  178. package/lib/test/stmt/stmt2.type.test.d.ts +2 -0
  179. package/lib/test/stmt/stmt2.type.test.d.ts.map +1 -0
  180. package/lib/test/stmt/stmt2.type.test.js +401 -0
  181. package/lib/test/stmt/v1/stmt1.func.test.d.ts +2 -0
  182. package/lib/test/stmt/v1/stmt1.func.test.d.ts.map +1 -0
  183. package/lib/test/stmt/v1/stmt1.func.test.js +418 -0
  184. package/lib/test/stmt/v1/stmt1.type.test.d.ts +2 -0
  185. package/lib/test/stmt/v1/stmt1.type.test.d.ts.map +1 -0
  186. package/lib/test/stmt/v1/stmt1.type.test.js +399 -0
  187. package/lib/test/stmt/v2/stmt2.func.test.d.ts +2 -0
  188. package/lib/test/stmt/v2/stmt2.func.test.d.ts.map +1 -0
  189. package/lib/test/stmt/v2/stmt2.func.test.js +537 -0
  190. package/lib/test/stmt/v2/stmt2.type.test.d.ts +2 -0
  191. package/lib/test/stmt/v2/stmt2.type.test.d.ts.map +1 -0
  192. package/lib/test/stmt/v2/stmt2.type.test.js +401 -0
  193. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts +2 -0
  194. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts.map +1 -0
  195. package/lib/test/tmq/cloud/cloud.tmq.test.js +84 -0
  196. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts +2 -0
  197. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts.map +1 -0
  198. package/lib/test/tmq/cloud/tmq.cloud.test.js +82 -0
  199. package/lib/test/tmq/core/tmq.config.test.d.ts +2 -0
  200. package/lib/test/tmq/core/tmq.config.test.d.ts.map +1 -0
  201. package/lib/test/tmq/core/tmq.config.test.js +83 -0
  202. package/lib/test/tmq/core/tmq.test.d.ts +2 -0
  203. package/lib/test/tmq/core/tmq.test.d.ts.map +1 -0
  204. package/lib/test/tmq/core/tmq.test.js +513 -0
  205. package/lib/test/tmq/failover/tmq.failover.test.d.ts +2 -0
  206. package/lib/test/tmq/failover/tmq.failover.test.d.ts.map +1 -0
  207. package/lib/test/tmq/failover/tmq.failover.test.js +404 -0
  208. package/lib/test/tmq/tmq.cloud.test.d.ts +2 -0
  209. package/lib/test/tmq/tmq.cloud.test.d.ts.map +1 -0
  210. package/lib/test/tmq/tmq.cloud.test.js +82 -0
  211. package/lib/test/tmq/tmq.config.test.d.ts +2 -0
  212. package/lib/test/tmq/tmq.config.test.d.ts.map +1 -0
  213. package/lib/test/tmq/tmq.config.test.js +94 -0
  214. package/lib/test/tmq/tmq.failover.test.d.ts +2 -0
  215. package/lib/test/tmq/tmq.failover.test.d.ts.map +1 -0
  216. package/lib/test/tmq/tmq.failover.test.js +404 -0
  217. package/lib/test/tmq/tmq.test.d.ts +2 -0
  218. package/lib/test/tmq/tmq.test.d.ts.map +1 -0
  219. package/lib/test/tmq/tmq.test.js +513 -0
  220. package/lib/test/unit/connectionManager.test.d.ts +2 -0
  221. package/lib/test/unit/connectionManager.test.d.ts.map +1 -0
  222. package/lib/test/unit/connectionManager.test.js +91 -0
  223. package/package.json +1 -1
  224. package/readme.md +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"wsConnectorPool.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnectorPool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQnD,qBAAa,uBAAuB;IAChC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAA0B;IACnD,OAAO,CAAC,IAAI,CAAgD;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAoB;IAC/C,OAAO,CAAC,MAAM,CAAC,WAAW,CAAa;IAEvC,OAAO;WAOO,QAAQ,CAAC,cAAc,GAAE,MAAW,GAAG,uBAAuB;IAOtE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDxF,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BrE,SAAS;CAmBZ"}
1
+ {"version":3,"file":"wsConnectorPool.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnectorPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAInD,qBAAa,uBAAuB;IAChC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAA0B;IACnD,OAAO,CAAC,IAAI,CAAgD;IAC5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAoB;IAC/C,OAAO,CAAC,MAAM,CAAC,WAAW,CAAa;IAEvC,OAAO;WAOO,QAAQ,CAAC,cAAc,GAAE,MAAW,GAAG,uBAAuB;IAO5E,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAUZ,aAAa,CACf,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GACnC,OAAO,CAAC,kBAAkB,CAAC;IA0DxB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE,SAAS;CAiBZ"}
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WebSocketConnectionPool = void 0;
7
+ const crypto_1 = require("crypto");
7
8
  const async_mutex_1 = require("async-mutex");
8
- const wsConnector_1 = require("./wsConnector");
9
9
  const wsError_1 = require("../common/wsError");
10
10
  const log_1 = __importDefault(require("../common/log"));
11
11
  const websocket_1 = require("websocket");
12
- const utils_1 = require("../common/utils");
12
+ const wsConnector_1 = require("./wsConnector");
13
13
  const mutex = new async_mutex_1.Mutex();
14
14
  class WebSocketConnectionPool {
15
15
  constructor(maxConnections = -1) {
@@ -25,27 +25,50 @@ class WebSocketConnectionPool {
25
25
  }
26
26
  return WebSocketConnectionPool._instance;
27
27
  }
28
- async getConnection(url, timeout) {
29
- let connectAddr = url.origin.concat(url.pathname).concat(url.search);
28
+ maskPoolKeyForLog(poolKey) {
29
+ return poolKey.replace(/#auth=[^#]*/, "#auth=[REDACTED]");
30
+ }
31
+ buildAuthScope(dsn) {
32
+ const token = dsn.params.get("token") || "";
33
+ const bearerToken = dsn.params.get("bearer_token") || "";
34
+ const raw = JSON.stringify({
35
+ username: dsn.username,
36
+ password: dsn.password,
37
+ token,
38
+ bearerToken,
39
+ });
40
+ return (0, crypto_1.createHash)("sha256").update(raw).digest("hex");
41
+ }
42
+ getPoolKey(dsn) {
43
+ const addrs = [...dsn.addresses]
44
+ .sort((a, b) => `${a.host}:${a.port}`.localeCompare(`${b.host}:${b.port}`))
45
+ .map((addr) => `${addr.host}:${addr.port}`)
46
+ .join(",");
47
+ const auth = this.buildAuthScope(dsn);
48
+ const path = dsn.path();
49
+ return `${dsn.scheme}://${addrs}/${path}#auth=${auth}`;
50
+ }
51
+ async getConnection(dsn, timeout) {
52
+ const poolKey = this.getPoolKey(dsn);
53
+ const poolKeyForLog = this.maskPoolKeyForLog(poolKey);
30
54
  let connector;
31
55
  const unlock = await mutex.acquire();
32
56
  try {
33
- if (this.pool.has(connectAddr)) {
34
- const connectors = this.pool.get(connectAddr);
57
+ if (this.pool.has(poolKey)) {
58
+ const connectors = this.pool.get(poolKey);
35
59
  while (connectors && connectors.length > 0) {
36
60
  const candidate = connectors.pop();
37
61
  if (!candidate) {
38
62
  continue;
39
63
  }
40
- if (candidate && candidate.readyState() === websocket_1.w3cwebsocket.OPEN) {
64
+ if (candidate.readyState() === websocket_1.w3cwebsocket.OPEN) {
65
+ candidate.refreshRetryConfig(dsn);
41
66
  connector = candidate;
42
67
  break;
43
68
  }
44
- else if (candidate) {
45
- Atomics.add(WebSocketConnectionPool.sharedArray, 0, -1);
46
- candidate.close();
47
- log_1.default.error(`getConnection, current connection status fail, url: ${(0, utils_1.maskUrlForLog)(new URL(connectAddr))}`);
48
- }
69
+ Atomics.add(WebSocketConnectionPool.sharedArray, 0, -1);
70
+ candidate.close();
71
+ log_1.default.error("getConnection, current connection status fail, poolKey: " + poolKeyForLog);
49
72
  }
50
73
  }
51
74
  if (connector) {
@@ -62,44 +85,41 @@ class WebSocketConnectionPool {
62
85
  if (log_1.default.isInfoEnabled()) {
63
86
  log_1.default.info("getConnection, new connection count:" +
64
87
  Atomics.load(WebSocketConnectionPool.sharedArray, 0) +
65
- ", connectAddr:" +
66
- connectAddr.replace(/(token=)[^&]*/i, "$1[REDACTED]"));
88
+ ", poolKey:" +
89
+ poolKeyForLog);
67
90
  }
68
- return new wsConnector_1.WebSocketConnector(url, timeout);
91
+ return new wsConnector_1.WebSocketConnector(dsn, poolKey, timeout);
69
92
  }
70
93
  finally {
71
94
  unlock();
72
95
  }
73
96
  }
74
97
  async releaseConnection(connector) {
75
- if (connector) {
76
- const unlock = await mutex.acquire();
77
- try {
78
- if (connector.readyState() === websocket_1.w3cwebsocket.OPEN) {
79
- let url = connector.getWsURL();
80
- let connectAddr = url.origin.concat(url.pathname).concat(url.search);
81
- let connectors = this.pool.get(connectAddr);
82
- if (!connectors) {
83
- connectors = new Array();
84
- connectors.push(connector);
85
- this.pool.set(connectAddr, connectors);
86
- }
87
- else {
88
- connectors.push(connector);
89
- }
90
- log_1.default.info("releaseConnection, current connection count:" + connectors.length);
91
- }
92
- else {
93
- Atomics.add(WebSocketConnectionPool.sharedArray, 0, -1);
94
- connector.close();
95
- log_1.default.info("releaseConnection, current connection status fail:" +
96
- Atomics.load(WebSocketConnectionPool.sharedArray, 0));
98
+ if (!connector) {
99
+ return;
100
+ }
101
+ const unlock = await mutex.acquire();
102
+ try {
103
+ if (connector.readyState() === websocket_1.w3cwebsocket.OPEN) {
104
+ const poolKey = connector.getPoolKey();
105
+ let connectors = this.pool.get(poolKey);
106
+ if (!connectors) {
107
+ connectors = [];
108
+ this.pool.set(poolKey, connectors);
97
109
  }
110
+ connectors.push(connector);
111
+ log_1.default.info("releaseConnection, current connection count:" + connectors.length);
98
112
  }
99
- finally {
100
- unlock();
113
+ else {
114
+ Atomics.add(WebSocketConnectionPool.sharedArray, 0, -1);
115
+ connector.close();
116
+ log_1.default.info("releaseConnection, current connection status fail:" +
117
+ Atomics.load(WebSocketConnectionPool.sharedArray, 0));
101
118
  }
102
119
  }
120
+ finally {
121
+ unlock();
122
+ }
103
123
  }
104
124
  destroyed() {
105
125
  let num = 0;
@@ -111,10 +131,8 @@ class WebSocketConnectionPool {
111
131
  }
112
132
  }
113
133
  }
114
- log_1.default.info("destroyed connect:" +
115
- Atomics.load(WebSocketConnectionPool.sharedArray, 0) +
116
- " current count:" +
117
- num);
134
+ log_1.default.info("destroyed connect: " + Atomics.load(WebSocketConnectionPool.sharedArray, 0) +
135
+ ", current count:" + num);
118
136
  Atomics.store(WebSocketConnectionPool.sharedArray, 0, 0);
119
137
  this.pool = new Map();
120
138
  }
@@ -3,6 +3,7 @@ interface MessageId {
3
3
  req_id: bigint;
4
4
  id?: bigint;
5
5
  timeout?: number;
6
+ poolKey?: string;
6
7
  }
7
8
  export declare enum OnMessageType {
8
9
  MESSAGE_TYPE_ARRAYBUFFER = 1,
@@ -17,6 +18,8 @@ export declare class WsEventCallback {
17
18
  static instance(): WsEventCallback;
18
19
  registerCallback(id: MessageId, res: (args: unknown) => void, rej: (reason: any) => void): Promise<void>;
19
20
  handleEventCallback(msg: MessageId, messageType: OnMessageType, data: any): Promise<void>;
21
+ unregisterCallback(reqId: bigint): Promise<void>;
22
+ rejectCallbacksExceptReqIds(keepReqIds: Set<bigint>, error: Error, poolKey?: string): Promise<void>;
20
23
  }
21
24
  export {};
22
25
  //# sourceMappingURL=wsEventCallback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wsEventCallback.d.ts","sourceRoot":"","sources":["../../../src/client/wsEventCallback.ts"],"names":[],"mappings":"AASA,UAAU,SAAS;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,oBAAY,aAAa;IACrB,wBAAwB,IAAI;IAC5B,iBAAiB,IAAI;IACrB,mBAAmB,IAAI;IACvB,uBAAuB,IAAI;CAC9B;AAID,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAkB;IAC3C,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4C;IAE7E,OAAO;WAEO,QAAQ,IAAI,eAAe;IAOnC,gBAAgB,CAClB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAC5B,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI;IAwBxB,mBAAmB,CACrB,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,aAAa,EAC1B,IAAI,EAAE,GAAG;CA0DhB"}
1
+ {"version":3,"file":"wsEventCallback.d.ts","sourceRoot":"","sources":["../../../src/client/wsEventCallback.ts"],"names":[],"mappings":"AASA,UAAU,SAAS;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,oBAAY,aAAa;IACrB,wBAAwB,IAAI;IAC5B,iBAAiB,IAAI;IACrB,mBAAmB,IAAI;IACvB,uBAAuB,IAAI;CAC9B;AAID,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAkB;IAC3C,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4C;IAE7E,OAAO;WAEO,QAAQ,IAAI,eAAe;IAOnC,gBAAgB,CAClB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAC5B,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI;IAkCxB,mBAAmB,CACrB,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,aAAa,EAC1B,IAAI,EAAE,GAAG;IA+DP,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD,2BAA2B,CAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAyBnB"}
@@ -26,11 +26,25 @@ class WsEventCallback {
26
26
  async registerCallback(id, res, rej) {
27
27
  let release = await eventMutex.acquire();
28
28
  try {
29
+ const timer = setTimeout(async () => {
30
+ let removed = false;
31
+ const timeoutRelease = await eventMutex.acquire();
32
+ try {
33
+ removed = WsEventCallback._msgActionRegister.delete(id);
34
+ }
35
+ finally {
36
+ timeoutRelease();
37
+ }
38
+ if (!removed) {
39
+ return;
40
+ }
41
+ rej(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_QUERY_TIMEOUT, `action:${id.action},req_id:${id.req_id} timeout with ${id.timeout} milliseconds`));
42
+ }, id.timeout);
29
43
  WsEventCallback._msgActionRegister.set(id, {
30
44
  sendTime: new Date().getTime(),
31
45
  reject: rej,
32
46
  resolve: res,
33
- timer: setTimeout(() => rej(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_QUERY_TIMEOUT, `action:${id.action},req_id:${id.req_id} timeout with ${id.timeout} milliseconds`)), id.timeout),
47
+ timer,
34
48
  });
35
49
  }
36
50
  finally {
@@ -39,6 +53,7 @@ class WsEventCallback {
39
53
  }
40
54
  async handleEventCallback(msg, messageType, data) {
41
55
  let action = undefined;
56
+ let keyToDelete = undefined;
42
57
  let release = await eventMutex.acquire();
43
58
  log_1.default.debug(`HandleEventCallback get lock msg=${msg}, ${messageType}`);
44
59
  log_1.default.debug(WsEventCallback._msgActionRegister);
@@ -47,32 +62,36 @@ class WsEventCallback {
47
62
  if (messageType == OnMessageType.MESSAGE_TYPE_ARRAYBUFFER) {
48
63
  if (k.id == msg.id || k.req_id == msg.id) {
49
64
  action = v;
50
- WsEventCallback._msgActionRegister.delete(k);
65
+ keyToDelete = k;
51
66
  break;
52
67
  }
53
68
  }
54
69
  else if (messageType == OnMessageType.MESSAGE_TYPE_BLOB) {
55
70
  if (k.id == msg.id || k.req_id == msg.id) {
56
71
  action = v;
57
- WsEventCallback._msgActionRegister.delete(k);
72
+ keyToDelete = k;
58
73
  break;
59
74
  }
60
75
  }
61
76
  else if (messageType == OnMessageType.MESSAGE_TYPE_STRING) {
62
77
  if (k.req_id == msg.req_id && k.action == msg.action) {
63
78
  action = v;
64
- WsEventCallback._msgActionRegister.delete(k);
79
+ keyToDelete = k;
65
80
  break;
66
81
  }
67
82
  }
68
83
  else if (messageType == OnMessageType.MESSAGE_TYPE_CONNECTION) {
69
84
  if (k.req_id == msg.req_id && k.action == msg.action) {
70
85
  action = v;
71
- WsEventCallback._msgActionRegister.delete(k);
86
+ keyToDelete = k;
72
87
  break;
73
88
  }
74
89
  }
75
90
  }
91
+ if (action && keyToDelete) {
92
+ clearTimeout(action.timer);
93
+ WsEventCallback._msgActionRegister.delete(keyToDelete);
94
+ }
76
95
  }
77
96
  finally {
78
97
  release();
@@ -86,13 +105,53 @@ class WsEventCallback {
86
105
  action.resolve(resp);
87
106
  }
88
107
  else {
89
- log_1.default.error("no find callback msg:=", msg);
90
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WS_NO_CALLBACK, "no callback registered for fetch_block with req_id=" +
108
+ log_1.default.error("no find callback msg: ", msg);
109
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WS_NO_CALLBACK, "no callback registered with req_id: " +
91
110
  msg.req_id +
92
- " action" +
111
+ ", action: " +
93
112
  msg.action);
94
113
  }
95
114
  }
115
+ async unregisterCallback(reqId) {
116
+ const release = await eventMutex.acquire();
117
+ try {
118
+ for (let [k, v] of WsEventCallback._msgActionRegister) {
119
+ if (k.req_id === reqId || k.id === reqId) {
120
+ clearTimeout(v.timer);
121
+ WsEventCallback._msgActionRegister.delete(k);
122
+ break;
123
+ }
124
+ }
125
+ }
126
+ finally {
127
+ release();
128
+ }
129
+ }
130
+ async rejectCallbacksExceptReqIds(keepReqIds, error, poolKey) {
131
+ const toReject = [];
132
+ const release = await eventMutex.acquire();
133
+ try {
134
+ for (const [k, v] of WsEventCallback._msgActionRegister) {
135
+ if (poolKey !== undefined && k.poolKey !== poolKey) {
136
+ continue;
137
+ }
138
+ const keepByReqId = keepReqIds.has(k.req_id);
139
+ const keepByCallbackId = k.id !== undefined && keepReqIds.has(k.id);
140
+ if (keepByReqId || keepByCallbackId) {
141
+ continue;
142
+ }
143
+ clearTimeout(v.timer);
144
+ WsEventCallback._msgActionRegister.delete(k);
145
+ toReject.push(v.reject);
146
+ }
147
+ }
148
+ finally {
149
+ release();
150
+ }
151
+ for (const reject of toReject) {
152
+ reject(error);
153
+ }
154
+ }
96
155
  }
97
156
  exports.WsEventCallback = WsEventCallback;
98
157
  WsEventCallback._msgActionRegister = new Map();
@@ -0,0 +1,11 @@
1
+ import { Address } from "./dsn";
2
+ export declare class AddressConnectionTracker {
3
+ private static _instance;
4
+ private _counts;
5
+ static instance(): AddressConnectionTracker;
6
+ increment(address: string): void;
7
+ decrement(address: string): void;
8
+ selectLeastConnected(addresses: Address[]): number;
9
+ getCount(address: string): number;
10
+ }
11
+ //# sourceMappingURL=addressConnectionTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressConnectionTracker.d.ts","sourceRoot":"","sources":["../../../src/common/addressConnectionTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,qBAAa,wBAAwB;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS,CAA2B;IACnD,OAAO,CAAC,OAAO,CAAkC;IAEjD,MAAM,CAAC,QAAQ,IAAI,wBAAwB;IAO3C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAShC,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM;IA6BlD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAGpC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddressConnectionTracker = void 0;
4
+ class AddressConnectionTracker {
5
+ constructor() {
6
+ this._counts = new Map();
7
+ }
8
+ static instance() {
9
+ if (!AddressConnectionTracker._instance) {
10
+ AddressConnectionTracker._instance = new AddressConnectionTracker();
11
+ }
12
+ return AddressConnectionTracker._instance;
13
+ }
14
+ increment(address) {
15
+ const current = this.getCount(address);
16
+ this._counts.set(address, current + 1);
17
+ }
18
+ decrement(address) {
19
+ const current = this.getCount(address);
20
+ if (current <= 1) {
21
+ this._counts.delete(address);
22
+ return;
23
+ }
24
+ this._counts.set(address, current - 1);
25
+ }
26
+ selectLeastConnected(addresses) {
27
+ if (addresses.length === 0) {
28
+ return 0;
29
+ }
30
+ let minCount = Number.MAX_SAFE_INTEGER;
31
+ const candidateIndexes = [];
32
+ for (let i = 0; i < addresses.length; i++) {
33
+ const addr = addresses[i];
34
+ const key = `${addr.host}:${addr.port}`;
35
+ const count = this.getCount(key);
36
+ if (count < minCount) {
37
+ minCount = count;
38
+ candidateIndexes.length = 0;
39
+ candidateIndexes.push(i);
40
+ continue;
41
+ }
42
+ if (count === minCount) {
43
+ candidateIndexes.push(i);
44
+ }
45
+ }
46
+ const selected = Math.floor(Math.random() * candidateIndexes.length);
47
+ return candidateIndexes[selected];
48
+ }
49
+ getCount(address) {
50
+ return this._counts.get(address) ?? 0;
51
+ }
52
+ }
53
+ exports.AddressConnectionTracker = AddressConnectionTracker;
@@ -1,18 +1,30 @@
1
- export interface Address {
1
+ export type WebSocketEndpoint = "sql" | "tmq";
2
+ export declare const WS_SQL_ENDPOINT: WebSocketEndpoint;
3
+ export declare const WS_TMQ_ENDPOINT: WebSocketEndpoint;
4
+ export declare class Address {
2
5
  host: string;
3
6
  port: number;
7
+ constructor(host: string, port: number);
4
8
  }
5
- export interface Dsn {
9
+ export declare class Dsn {
6
10
  scheme: string;
7
11
  username: string;
8
12
  password: string;
9
13
  addresses: Address[];
10
14
  database: string;
11
15
  params: Map<string, string>;
16
+ endpoint: WebSocketEndpoint;
17
+ constructor(scheme: string, username: string, password: string, addresses: Address[], database: string, params: Map<string, string>, endpoint?: WebSocketEndpoint);
18
+ toString(): string;
19
+ path(): string;
12
20
  }
13
21
  /**
14
22
  * Parse a multi-host TDengine WebSocket URL.
15
23
  * Format: ws://username:password@host1:port1,host2:port2,[::1]:port3/db?key=value
16
24
  */
17
25
  export declare function parse(url: string): Dsn;
26
+ export declare const DEFAULT_PORT = 6041;
27
+ export declare const CLOUD_DEFAULT_PORT = 443;
28
+ export declare function isCloudServiceHost(host: string): boolean;
29
+ export declare function getDefaultPortForHost(host: string): number;
18
30
  //# sourceMappingURL=dsn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dsn.d.ts","sourceRoot":"","sources":["../../../src/common/dsn.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAqFtC"}
1
+ {"version":3,"file":"dsn.d.ts","sourceRoot":"","sources":["../../../src/common/dsn.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9C,eAAO,MAAM,eAAe,EAAE,iBAAyB,CAAC;AACxD,eAAO,MAAM,eAAe,EAAE,iBAAyB,CAAC;AAKxD,qBAAa,OAAO;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAIzC;AAaD,qBAAa,GAAG;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;gBAGxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,QAAQ,GAAE,iBAAmC;IAajD,QAAQ,IAAI,MAAM;IAiBlB,IAAI,IAAI,MAAM;CAGjB;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAoGtC;AAED,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -1,7 +1,60 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLOUD_DEFAULT_PORT = exports.DEFAULT_PORT = exports.Dsn = exports.Address = exports.WS_TMQ_ENDPOINT = exports.WS_SQL_ENDPOINT = void 0;
3
4
  exports.parse = parse;
5
+ exports.isCloudServiceHost = isCloudServiceHost;
6
+ exports.getDefaultPortForHost = getDefaultPortForHost;
4
7
  const wsError_1 = require("./wsError");
8
+ exports.WS_SQL_ENDPOINT = "sql";
9
+ exports.WS_TMQ_ENDPOINT = "tmq";
10
+ const WS_SQL_PATH = "ws";
11
+ const WS_TMQ_PATH = "rest/tmq";
12
+ class Address {
13
+ constructor(host, port) {
14
+ this.host = host;
15
+ this.port = port;
16
+ }
17
+ }
18
+ exports.Address = Address;
19
+ const REDACTED = "[REDACTED]";
20
+ const SENSITIVE_PARAM_KEYS = new Set([
21
+ "token",
22
+ "bearer_token",
23
+ "td.connect.token",
24
+ ]);
25
+ function shouldMaskParam(key) {
26
+ return SENSITIVE_PARAM_KEYS.has(key.toLowerCase());
27
+ }
28
+ class Dsn {
29
+ constructor(scheme, username, password, addresses, database, params, endpoint = exports.WS_SQL_ENDPOINT) {
30
+ this.scheme = scheme;
31
+ this.username = username;
32
+ this.password = password;
33
+ this.addresses = addresses.map((address) => new Address(address.host, address.port));
34
+ this.database = database;
35
+ this.params = new Map(params);
36
+ this.endpoint = endpoint;
37
+ }
38
+ toString() {
39
+ const params = {};
40
+ for (const [key, value] of this.params.entries()) {
41
+ params[key] = shouldMaskParam(key) ? REDACTED : value;
42
+ }
43
+ return JSON.stringify({
44
+ scheme: this.scheme,
45
+ username: this.username,
46
+ password: this.password.length > 0 ? REDACTED : this.password,
47
+ addresses: this.addresses,
48
+ database: this.database,
49
+ params,
50
+ endpoint: this.endpoint,
51
+ });
52
+ }
53
+ path() {
54
+ return this.endpoint === exports.WS_TMQ_ENDPOINT ? WS_TMQ_PATH : WS_SQL_PATH;
55
+ }
56
+ }
57
+ exports.Dsn = Dsn;
5
58
  /**
6
59
  * Parse a multi-host TDengine WebSocket URL.
7
60
  * Format: ws://username:password@host1:port1,host2:port2,[::1]:port3/db?key=value
@@ -13,17 +66,30 @@ function parse(url) {
13
66
  // Extract scheme
14
67
  const schemeMatch = url.match(/^(wss?):\/\//i);
15
68
  if (!schemeMatch) {
16
- throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_URL, `Invalid URL scheme, expected ws:// or wss://, got: ${url}`);
69
+ throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_URL, "Invalid URL scheme, expected ws:// or wss://");
17
70
  }
18
71
  const scheme = schemeMatch[1].toLowerCase();
19
72
  let remainder = url.slice(schemeMatch[0].length);
20
- // Extract username:password@ if present
73
+ // Isolate authority from path/query before parsing userinfo.
74
+ const slashIndex = remainder.indexOf("/");
75
+ const queryMarkIndex = remainder.indexOf("?");
76
+ let authorityEndIndex = remainder.length;
77
+ if (slashIndex !== -1) {
78
+ authorityEndIndex = Math.min(authorityEndIndex, slashIndex);
79
+ }
80
+ if (queryMarkIndex !== -1) {
81
+ authorityEndIndex = Math.min(authorityEndIndex, queryMarkIndex);
82
+ }
83
+ const authority = remainder.slice(0, authorityEndIndex);
84
+ const suffix = remainder.slice(authorityEndIndex);
85
+ // Extract username:password@ from authority only.
21
86
  let username = "";
22
87
  let password = "";
23
- const atIndex = remainder.indexOf("@");
88
+ const atIndex = authority.lastIndexOf("@");
89
+ let hostPort = authority;
24
90
  if (atIndex !== -1) {
25
- const userInfo = remainder.slice(0, atIndex);
26
- remainder = remainder.slice(atIndex + 1);
91
+ const userInfo = authority.slice(0, atIndex);
92
+ hostPort = authority.slice(atIndex + 1);
27
93
  const colonIndex = userInfo.indexOf(":");
28
94
  if (colonIndex !== -1) {
29
95
  username = userInfo.slice(0, colonIndex);
@@ -33,6 +99,7 @@ function parse(url) {
33
99
  username = userInfo;
34
100
  }
35
101
  }
102
+ remainder = `${hostPort}${suffix}`;
36
103
  // Extract query params (after ?)
37
104
  let params = new Map();
38
105
  const queryIndex = remainder.indexOf("?");
@@ -67,16 +134,18 @@ function parse(url) {
67
134
  dedupedHosts.push(h);
68
135
  }
69
136
  }
70
- return {
71
- addresses: dedupedHosts,
72
- scheme,
73
- username,
74
- password,
75
- database,
76
- params,
77
- };
137
+ return new Dsn(scheme, username, password, dedupedHosts, database, params);
138
+ }
139
+ exports.DEFAULT_PORT = 6041;
140
+ exports.CLOUD_DEFAULT_PORT = 443;
141
+ function isCloudServiceHost(host) {
142
+ const normalizedHost = host.toLowerCase();
143
+ return (normalizedHost.includes("cloud.tdengine.com") ||
144
+ normalizedHost.includes("cloud.taosdata.com"));
145
+ }
146
+ function getDefaultPortForHost(host) {
147
+ return isCloudServiceHost(host) ? exports.CLOUD_DEFAULT_PORT : exports.DEFAULT_PORT;
78
148
  }
79
- const DEFAULT_PORT = 6041;
80
149
  /**
81
150
  * Parse comma-separated host list. Supports IPv6 in brackets.
82
151
  * Examples: "host1:6041,host2:6042", "[::1]:6041,host2:6042"
@@ -100,20 +169,20 @@ function parseHostList(hostStr) {
100
169
  throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_URL, `Unclosed bracket in IPv6 address: ${hostStr.slice(i)}`);
101
170
  }
102
171
  const ipv6Host = hostStr.slice(i + 1, closeBracket);
103
- let port = DEFAULT_PORT;
172
+ let port = getDefaultPortForHost(ipv6Host);
104
173
  let next = closeBracket + 1;
105
174
  if (next < hostStr.length && hostStr[next] === ":") {
106
175
  const portEnd = hostStr.indexOf(",", next);
107
176
  const portStr = portEnd === -1
108
177
  ? hostStr.slice(next + 1)
109
178
  : hostStr.slice(next + 1, portEnd);
110
- port = parsePort(portStr, hostStr);
179
+ port = parsePort(portStr, hostStr, ipv6Host);
111
180
  i = portEnd === -1 ? hostStr.length : portEnd;
112
181
  }
113
182
  else {
114
183
  i = next;
115
184
  }
116
- hosts.push({ host: `[${ipv6Host}]`, port });
185
+ hosts.push(new Address(`[${ipv6Host}]`, port));
117
186
  }
118
187
  else {
119
188
  // Regular host or IPv4
@@ -124,21 +193,21 @@ function parseHostList(hostStr) {
124
193
  const lastColon = segment.lastIndexOf(":");
125
194
  if (lastColon !== -1) {
126
195
  const host = segment.slice(0, lastColon);
127
- const port = parsePort(segment.slice(lastColon + 1), hostStr);
128
- hosts.push({ host, port });
196
+ const port = parsePort(segment.slice(lastColon + 1), hostStr, host);
197
+ hosts.push(new Address(host, port));
129
198
  }
130
199
  else {
131
- hosts.push({ host: segment, port: DEFAULT_PORT });
200
+ hosts.push(new Address(segment, getDefaultPortForHost(segment)));
132
201
  }
133
202
  i = commaIndex === -1 ? hostStr.length : commaIndex;
134
203
  }
135
204
  }
136
205
  return hosts;
137
206
  }
138
- function parsePort(portStr, context) {
207
+ function parsePort(portStr, context, host) {
139
208
  // If port string is empty, use default port
140
209
  if (portStr.length === 0) {
141
- return DEFAULT_PORT;
210
+ return getDefaultPortForHost(host);
142
211
  }
143
212
  // Validate that port string contains only digits
144
213
  if (!/^\d+$/.test(portStr)) {
@@ -1 +1 @@
1
- {"version":3,"file":"taosResult.d.ts","sourceRoot":"","sources":["../../../src/common/taosResult.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taosResult.d.ts","sourceRoot":"","sources":["../../../src/common/taosResult.ts"],"names":[],"mappings":"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"}