@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.
- package/lib/package.json +1 -1
- package/lib/src/client/wsClient.d.ts +23 -7
- package/lib/src/client/wsClient.d.ts.map +1 -1
- package/lib/src/client/wsClient.js +154 -139
- package/lib/src/client/wsConnector.d.ts +55 -9
- package/lib/src/client/wsConnector.d.ts.map +1 -1
- package/lib/src/client/wsConnector.js +519 -100
- package/lib/src/client/wsConnectorPool.d.ts +5 -1
- package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
- package/lib/src/client/wsConnectorPool.js +61 -43
- package/lib/src/client/wsEventCallback.d.ts +3 -0
- package/lib/src/client/wsEventCallback.d.ts.map +1 -1
- package/lib/src/client/wsEventCallback.js +67 -8
- package/lib/src/common/addressConnectionTracker.d.ts +11 -0
- package/lib/src/common/addressConnectionTracker.d.ts.map +1 -0
- package/lib/src/common/addressConnectionTracker.js +53 -0
- package/lib/src/common/dsn.d.ts +14 -2
- package/lib/src/common/dsn.d.ts.map +1 -1
- package/lib/src/common/dsn.js +91 -22
- package/lib/src/common/taosResult.d.ts.map +1 -1
- package/lib/src/common/taosResult.js +0 -5
- package/lib/src/common/urlParser.d.ts +32 -0
- package/lib/src/common/urlParser.d.ts.map +1 -0
- package/lib/src/common/urlParser.js +201 -0
- package/lib/src/common/utils.d.ts +2 -1
- package/lib/src/common/utils.d.ts.map +1 -1
- package/lib/src/common/utils.js +35 -34
- package/lib/src/sql/wsSql.js +2 -2
- package/lib/src/stmt/FieldBindParams.d.ts.map +1 -1
- package/lib/src/stmt/wsColumnInfo.d.ts.map +1 -1
- package/lib/src/stmt/wsParams1.d.ts.map +1 -1
- package/lib/src/stmt/wsParams1.js +26 -26
- package/lib/src/stmt/wsParams2.d.ts.map +1 -1
- package/lib/src/stmt/wsParams2.js +0 -3
- package/lib/src/stmt/wsParamsBase.d.ts.map +1 -1
- package/lib/src/stmt/wsProto.d.ts.map +1 -1
- package/lib/src/stmt/wsProto.js +16 -16
- package/lib/src/stmt/wsStmt1.d.ts.map +1 -1
- package/lib/src/stmt/wsStmt2.d.ts +12 -4
- package/lib/src/stmt/wsStmt2.d.ts.map +1 -1
- package/lib/src/stmt/wsStmt2.js +182 -64
- package/lib/src/stmt/wsTableInfo.d.ts.map +1 -1
- package/lib/src/tmq/config.d.ts +3 -2
- package/lib/src/tmq/config.d.ts.map +1 -1
- package/lib/src/tmq/config.js +15 -15
- package/lib/src/tmq/wsTmq.d.ts +4 -1
- package/lib/src/tmq/wsTmq.d.ts.map +1 -1
- package/lib/src/tmq/wsTmq.js +50 -27
- package/lib/test/bulkPulling/a.test.d.ts +2 -0
- package/lib/test/bulkPulling/a.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/a.test.js +166 -0
- package/lib/test/bulkPulling/dsn.test.js +19 -0
- package/lib/test/bulkPulling/retryConfig.test.js +11 -11
- package/lib/test/bulkPulling/sql.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/sql.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/sql.failover.test.js +338 -0
- package/lib/test/bulkPulling/stmt2.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/stmt2.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/stmt2.failover.test.js +313 -0
- package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/stmt2.init.failover.test.js +50 -0
- package/lib/test/bulkPulling/tmq.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/tmq.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/tmq.failover.test.js +404 -0
- package/lib/test/bulkPulling/urlParser.test.d.ts +2 -0
- package/lib/test/bulkPulling/urlParser.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/urlParser.test.js +452 -0
- package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +2 -2
- package/lib/test/bulkPulling/wsClient.recovery.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsClient.recovery.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsClient.recovery.test.js +104 -0
- package/lib/test/bulkPulling/wsConfig.dsn.test.js +2 -0
- package/lib/test/bulkPulling/wsConnector.failover.test.js +396 -27
- package/lib/test/bulkPulling/wsConnectorPool.key.test.js +12 -10
- package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.js +28 -0
- package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsProxy.failover.integration.test.js +120 -0
- package/lib/test/bulkPulling/wsProxy.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsProxy.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsProxy.failover.test.js +465 -0
- package/lib/test/client/wsClient.recovery.test.d.ts +2 -0
- package/lib/test/client/wsClient.recovery.test.d.ts.map +1 -0
- package/lib/test/client/wsClient.recovery.test.js +122 -0
- package/lib/test/client/wsConnectPool.test.d.ts +2 -0
- package/lib/test/client/wsConnectPool.test.d.ts.map +1 -0
- package/lib/test/client/wsConnectPool.test.js +147 -0
- package/lib/test/client/wsConnector.failover.test.d.ts +2 -0
- package/lib/test/client/wsConnector.failover.test.d.ts.map +1 -0
- package/lib/test/client/wsConnector.failover.test.js +681 -0
- package/lib/test/client/wsConnector.leastConnections.test.d.ts +2 -0
- package/lib/test/client/wsConnector.leastConnections.test.d.ts.map +1 -0
- package/lib/test/client/wsConnector.leastConnections.test.js +71 -0
- package/lib/test/client/wsConnectorPool.key.test.d.ts +2 -0
- package/lib/test/client/wsConnectorPool.key.test.d.ts.map +1 -0
- package/lib/test/client/wsConnectorPool.key.test.js +127 -0
- package/lib/test/client/wsEventCallback.test.d.ts +2 -0
- package/lib/test/client/wsEventCallback.test.d.ts.map +1 -0
- package/lib/test/client/wsEventCallback.test.js +98 -0
- package/lib/test/common/addressConnectionTracker.test.d.ts +2 -0
- package/lib/test/common/addressConnectionTracker.test.d.ts.map +1 -0
- package/lib/test/common/addressConnectionTracker.test.js +74 -0
- package/lib/test/common/dsn.test.d.ts +2 -0
- package/lib/test/common/dsn.test.d.ts.map +1 -0
- package/lib/test/common/dsn.test.js +406 -0
- package/lib/test/common/log.test.d.ts +2 -0
- package/lib/test/common/log.test.d.ts.map +1 -0
- package/lib/test/common/log.test.js +54 -0
- package/lib/test/common/utils.test.d.ts +2 -0
- package/lib/test/common/utils.test.d.ts.map +1 -0
- package/lib/test/common/utils.test.js +13 -0
- package/lib/test/common/wsConfig.dsn.test.d.ts +2 -0
- package/lib/test/common/wsConfig.dsn.test.d.ts.map +1 -0
- package/lib/test/common/wsConfig.dsn.test.js +39 -0
- package/lib/test/helpers/utils.d.ts +27 -0
- package/lib/test/helpers/utils.d.ts.map +1 -0
- package/lib/test/helpers/utils.js +341 -0
- package/lib/test/helpers/wsFailoverProxy.d.ts +109 -0
- package/lib/test/helpers/wsFailoverProxy.d.ts.map +1 -0
- package/lib/test/helpers/wsFailoverProxy.js +420 -0
- package/lib/test/helpers/wsProxy.d.ts +110 -0
- package/lib/test/helpers/wsProxy.d.ts.map +1 -0
- package/lib/test/helpers/wsProxy.js +429 -0
- package/lib/test/sql/core/decimal.test.d.ts +2 -0
- package/lib/test/sql/core/decimal.test.d.ts.map +1 -0
- package/lib/test/sql/core/decimal.test.js +153 -0
- package/lib/test/sql/core/queryTables.test.d.ts +2 -0
- package/lib/test/sql/core/queryTables.test.d.ts.map +1 -0
- package/lib/test/sql/core/queryTables.test.js +506 -0
- package/lib/test/sql/core/schemaless.test.d.ts +2 -0
- package/lib/test/sql/core/schemaless.test.d.ts.map +1 -0
- package/lib/test/sql/core/schemaless.test.js +102 -0
- package/lib/test/sql/core/sql.test.d.ts +2 -0
- package/lib/test/sql/core/sql.test.d.ts.map +1 -0
- package/lib/test/sql/core/sql.test.js +324 -0
- package/lib/test/sql/decimal.test.d.ts +2 -0
- package/lib/test/sql/decimal.test.d.ts.map +1 -0
- package/lib/test/sql/decimal.test.js +153 -0
- package/lib/test/sql/failover/sql.failover.test.d.ts +2 -0
- package/lib/test/sql/failover/sql.failover.test.d.ts.map +1 -0
- package/lib/test/sql/failover/sql.failover.test.js +341 -0
- package/lib/test/sql/queryTables.test.d.ts +2 -0
- package/lib/test/sql/queryTables.test.d.ts.map +1 -0
- package/lib/test/sql/queryTables.test.js +506 -0
- package/lib/test/sql/schemaless.test.d.ts +2 -0
- package/lib/test/sql/schemaless.test.d.ts.map +1 -0
- package/lib/test/sql/schemaless.test.js +102 -0
- package/lib/test/sql/sql.failover.test.d.ts +2 -0
- package/lib/test/sql/sql.failover.test.d.ts.map +1 -0
- package/lib/test/sql/sql.failover.test.js +341 -0
- package/lib/test/sql/sql.test.d.ts +2 -0
- package/lib/test/sql/sql.test.d.ts.map +1 -0
- package/lib/test/sql/sql.test.js +324 -0
- package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts +2 -0
- package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts.map +1 -0
- package/lib/test/stmt/failover/stmt2.failover.mock.test.js +341 -0
- package/lib/test/stmt/failover/stmt2.failover.test.d.ts +2 -0
- package/lib/test/stmt/failover/stmt2.failover.test.d.ts.map +1 -0
- package/lib/test/stmt/failover/stmt2.failover.test.js +384 -0
- package/lib/test/stmt/stmt1.func.test.d.ts +2 -0
- package/lib/test/stmt/stmt1.func.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt1.func.test.js +418 -0
- package/lib/test/stmt/stmt1.type.test.d.ts +2 -0
- package/lib/test/stmt/stmt1.type.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt1.type.test.js +399 -0
- package/lib/test/stmt/stmt2.failover.mock.test.d.ts +2 -0
- package/lib/test/stmt/stmt2.failover.mock.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt2.failover.mock.test.js +341 -0
- package/lib/test/stmt/stmt2.failover.test.d.ts +2 -0
- package/lib/test/stmt/stmt2.failover.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt2.failover.test.js +384 -0
- package/lib/test/stmt/stmt2.func.test.d.ts +2 -0
- package/lib/test/stmt/stmt2.func.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt2.func.test.js +537 -0
- package/lib/test/stmt/stmt2.type.test.d.ts +2 -0
- package/lib/test/stmt/stmt2.type.test.d.ts.map +1 -0
- package/lib/test/stmt/stmt2.type.test.js +401 -0
- package/lib/test/stmt/v1/stmt1.func.test.d.ts +2 -0
- package/lib/test/stmt/v1/stmt1.func.test.d.ts.map +1 -0
- package/lib/test/stmt/v1/stmt1.func.test.js +418 -0
- package/lib/test/stmt/v1/stmt1.type.test.d.ts +2 -0
- package/lib/test/stmt/v1/stmt1.type.test.d.ts.map +1 -0
- package/lib/test/stmt/v1/stmt1.type.test.js +399 -0
- package/lib/test/stmt/v2/stmt2.func.test.d.ts +2 -0
- package/lib/test/stmt/v2/stmt2.func.test.d.ts.map +1 -0
- package/lib/test/stmt/v2/stmt2.func.test.js +537 -0
- package/lib/test/stmt/v2/stmt2.type.test.d.ts +2 -0
- package/lib/test/stmt/v2/stmt2.type.test.d.ts.map +1 -0
- package/lib/test/stmt/v2/stmt2.type.test.js +401 -0
- package/lib/test/tmq/cloud/cloud.tmq.test.d.ts +2 -0
- package/lib/test/tmq/cloud/cloud.tmq.test.d.ts.map +1 -0
- package/lib/test/tmq/cloud/cloud.tmq.test.js +84 -0
- package/lib/test/tmq/cloud/tmq.cloud.test.d.ts +2 -0
- package/lib/test/tmq/cloud/tmq.cloud.test.d.ts.map +1 -0
- package/lib/test/tmq/cloud/tmq.cloud.test.js +82 -0
- package/lib/test/tmq/core/tmq.config.test.d.ts +2 -0
- package/lib/test/tmq/core/tmq.config.test.d.ts.map +1 -0
- package/lib/test/tmq/core/tmq.config.test.js +83 -0
- package/lib/test/tmq/core/tmq.test.d.ts +2 -0
- package/lib/test/tmq/core/tmq.test.d.ts.map +1 -0
- package/lib/test/tmq/core/tmq.test.js +513 -0
- package/lib/test/tmq/failover/tmq.failover.test.d.ts +2 -0
- package/lib/test/tmq/failover/tmq.failover.test.d.ts.map +1 -0
- package/lib/test/tmq/failover/tmq.failover.test.js +404 -0
- package/lib/test/tmq/tmq.cloud.test.d.ts +2 -0
- package/lib/test/tmq/tmq.cloud.test.d.ts.map +1 -0
- package/lib/test/tmq/tmq.cloud.test.js +82 -0
- package/lib/test/tmq/tmq.config.test.d.ts +2 -0
- package/lib/test/tmq/tmq.config.test.d.ts.map +1 -0
- package/lib/test/tmq/tmq.config.test.js +94 -0
- package/lib/test/tmq/tmq.failover.test.d.ts +2 -0
- package/lib/test/tmq/tmq.failover.test.d.ts.map +1 -0
- package/lib/test/tmq/tmq.failover.test.js +404 -0
- package/lib/test/tmq/tmq.test.d.ts +2 -0
- package/lib/test/tmq/tmq.test.d.ts.map +1 -0
- package/lib/test/tmq/tmq.test.js +513 -0
- package/lib/test/unit/connectionManager.test.d.ts +2 -0
- package/lib/test/unit/connectionManager.test.d.ts.map +1 -0
- package/lib/test/unit/connectionManager.test.js +91 -0
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsConnectorPool.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnectorPool.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
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(
|
|
34
|
-
const connectors = this.pool.get(
|
|
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
|
|
64
|
+
if (candidate.readyState() === websocket_1.w3cwebsocket.OPEN) {
|
|
65
|
+
candidate.refreshRetryConfig(dsn);
|
|
41
66
|
connector = candidate;
|
|
42
67
|
break;
|
|
43
68
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
",
|
|
66
|
-
|
|
88
|
+
", poolKey:" +
|
|
89
|
+
poolKeyForLog);
|
|
67
90
|
}
|
|
68
|
-
return new wsConnector_1.WebSocketConnector(
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
90
|
-
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WS_NO_CALLBACK, "no callback registered
|
|
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;
|
package/lib/src/common/dsn.d.ts
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
|
-
export
|
|
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
|
|
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,
|
|
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"}
|
package/lib/src/common/dsn.js
CHANGED
|
@@ -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,
|
|
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
|
-
//
|
|
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 =
|
|
88
|
+
const atIndex = authority.lastIndexOf("@");
|
|
89
|
+
let hostPort = authority;
|
|
24
90
|
if (atIndex !== -1) {
|
|
25
|
-
const userInfo =
|
|
26
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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":"AAAA,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAe7E,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;CACZ;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAA2B;IAExC,OAAO,CAAC,UAAU,CAA4B;IAC9C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,iBAAiB,CAAC,CAAuB;IACjD,OAAO,CAAC,aAAa,CAAC,CAAuB;IAE7C,wBAAwB;IACxB,OAAO,CAAC,OAAO,CAA4B;gBAC/B,aAAa,CAAC,EAAE,eAAe;IA2CpC,YAAY,CAAC,SAAS,EAAE,MAAM;IAI9B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAU5C,QAAQ,IAAI,MAAM;IAMlB,QAAQ,CAAC,KAAK,GAAE,MAAW;IAG3B,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI;IAIrC,OAAO,CAAC,QAAQ,EAAE,YAAY;IAM9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;IAInC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;IAIvC,aAAa,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS;IAI1C,WAAW,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI;IAIzC,YAAY,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS;IAIzC,YAAY;IAIZ,YAAY,CAAC,SAAS,EAAE,MAAM;IAI9B,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;IAUzB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpD;;OAEG;IACH,OAAO,CAAC,eAAe;CAc1B;AAED,wBAAgB,UAAU,CACtB,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,UAAU,GACvB,UAAU,CAiIZ;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwBnD;
|
|
1
|
+
{"version":3,"file":"taosResult.d.ts","sourceRoot":"","sources":["../../../src/common/taosResult.ts"],"names":[],"mappings":"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"}
|