@tdengine/websocket 3.2.2 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/package.json +64 -0
- package/lib/src/client/retryConfig.d.ts +10 -0
- package/lib/src/client/retryConfig.d.ts.map +1 -0
- package/lib/src/client/retryConfig.js +46 -0
- package/lib/src/client/wsClient.d.ts +24 -7
- package/lib/src/client/wsClient.d.ts.map +1 -1
- package/lib/src/client/wsClient.js +164 -137
- 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 +522 -102
- 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 +67 -52
- 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/client/wsResponse.d.ts +0 -3
- package/lib/src/client/wsResponse.d.ts.map +1 -1
- package/lib/src/client/wsResponse.js +0 -3
- 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/config.d.ts +3 -0
- package/lib/src/common/config.d.ts.map +1 -1
- package/lib/src/common/config.js +6 -0
- package/lib/src/common/constant.d.ts +1 -0
- package/lib/src/common/constant.d.ts.map +1 -1
- package/lib/src/common/constant.js +6 -1
- package/lib/src/common/dsn.d.ts +30 -0
- package/lib/src/common/dsn.d.ts.map +1 -0
- package/lib/src/common/dsn.js +221 -0
- 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 +6 -1
- package/lib/src/common/utils.d.ts.map +1 -1
- package/lib/src/common/utils.js +74 -22
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/sql/wsSql.d.ts.map +1 -1
- 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 +4 -2
- package/lib/src/tmq/config.d.ts.map +1 -1
- package/lib/src/tmq/config.js +30 -13
- package/lib/src/tmq/constant.d.ts +4 -0
- package/lib/src/tmq/constant.d.ts.map +1 -1
- package/lib/src/tmq/constant.js +4 -0
- package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
- package/lib/src/tmq/tmqResponse.js +1 -4
- 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 +55 -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/cloud.tmq.test.js +3 -2
- package/lib/test/bulkPulling/decimal.test.js +8 -8
- package/lib/test/bulkPulling/dsn.test.d.ts +2 -0
- package/lib/test/bulkPulling/dsn.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/dsn.test.js +397 -0
- package/lib/test/bulkPulling/queryTables.test.js +1 -1
- package/lib/test/bulkPulling/retryConfig.test.d.ts +2 -0
- package/lib/test/bulkPulling/retryConfig.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/retryConfig.test.js +34 -0
- package/lib/test/bulkPulling/schemaless.test.js +15 -14
- 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/sql.test.js +116 -44
- package/lib/test/bulkPulling/stmt1.func.test.js +31 -30
- package/lib/test/bulkPulling/stmt1.type.test.js +1 -1
- 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.func.test.js +37 -36
- 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/stmt2.type.test.js +1 -1
- package/lib/test/bulkPulling/tmq.config.test.d.ts +2 -0
- package/lib/test/bulkPulling/tmq.config.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/tmq.config.test.js +77 -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/tmq.test.js +135 -14
- 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.d.ts +2 -0
- package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +184 -0
- 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.d.ts +2 -0
- package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsConfig.dsn.test.js +39 -0
- package/lib/test/bulkPulling/wsConnectPool.test.js +7 -7
- package/lib/test/bulkPulling/wsConnector.failover.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsConnector.failover.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsConnector.failover.test.js +497 -0
- package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsConnectorPool.key.test.js +52 -0
- 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/wsEventCallback.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsEventCallback.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsEventCallback.test.js +54 -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/lib/test/utils.d.ts +4 -0
- package/lib/test/utils.d.ts.map +1 -1
- package/lib/test/utils.js +11 -17
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
|
|
4
|
+
const config_1 = require("../../src/common/config");
|
|
5
|
+
const wsSql_1 = require("../../src/sql/wsSql");
|
|
6
|
+
const utils_1 = require("../helpers/utils");
|
|
7
|
+
const wsProxy_1 = require("../helpers/wsProxy");
|
|
8
|
+
function parseBinaryAction(rawData) {
|
|
9
|
+
if (typeof rawData === "string" || rawData.byteLength < 24) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return rawData.readBigInt64LE(16);
|
|
13
|
+
}
|
|
14
|
+
describe("sql failover", () => {
|
|
15
|
+
jest.setTimeout(120 * 1000);
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
18
|
+
jest.restoreAllMocks();
|
|
19
|
+
});
|
|
20
|
+
test("switches to next address when active proxy restarts with downtime", async () => {
|
|
21
|
+
let restartTriggered = false;
|
|
22
|
+
let proxyBHadActivity = false;
|
|
23
|
+
let wsSql = null;
|
|
24
|
+
const proxyA = await wsProxy_1.WsProxy.create({
|
|
25
|
+
host: "127.0.0.1",
|
|
26
|
+
port: 0,
|
|
27
|
+
onEvent: (event, control) => {
|
|
28
|
+
if (event.type !== "message") {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (event.direction !== "client_to_upstream" || !event.isBinary) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const action = parseBinaryAction(event.rawData);
|
|
35
|
+
if (action === 6n && !restartTriggered) {
|
|
36
|
+
restartTriggered = true;
|
|
37
|
+
void control.restart({
|
|
38
|
+
downtimeMs: 800,
|
|
39
|
+
reason: "trigger dual-address failover",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
const proxyB = await wsProxy_1.WsProxy.create({
|
|
45
|
+
host: "127.0.0.1",
|
|
46
|
+
port: 0,
|
|
47
|
+
onEvent: (event) => {
|
|
48
|
+
if (event.type === "client_connected") {
|
|
49
|
+
proxyBHadActivity = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (event.type === "message" &&
|
|
53
|
+
event.direction === "client_to_upstream") {
|
|
54
|
+
proxyBHadActivity = true;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
const randomSpy = jest.spyOn(Math, "random").mockReturnValue(0);
|
|
59
|
+
try {
|
|
60
|
+
const dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
61
|
+
`@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()}` +
|
|
62
|
+
`?retries=5&retry_backoff_ms=20&retry_backoff_max_ms=20`;
|
|
63
|
+
const conf = new config_1.WSConfig(dsn);
|
|
64
|
+
conf.setTimeOut(6000);
|
|
65
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
66
|
+
const result = await wsSql.exec("select server_version()");
|
|
67
|
+
expect(result).toBeTruthy();
|
|
68
|
+
expect(restartTriggered).toBe(true);
|
|
69
|
+
expect(proxyBHadActivity).toBe(true);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
randomSpy.mockRestore();
|
|
73
|
+
if (wsSql) {
|
|
74
|
+
await wsSql.close();
|
|
75
|
+
}
|
|
76
|
+
await proxyA.stop("test cleanup");
|
|
77
|
+
await proxyB.stop("test cleanup");
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
test("reconnects to same address after single proxy hard restart", async () => {
|
|
81
|
+
let restartCount = 0;
|
|
82
|
+
let wsSql = null;
|
|
83
|
+
const proxy = await wsProxy_1.WsProxy.create({
|
|
84
|
+
host: "127.0.0.1",
|
|
85
|
+
port: 0,
|
|
86
|
+
onEvent: (event, control) => {
|
|
87
|
+
if (event.type !== "message") {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (event.direction !== "client_to_upstream" || !event.isBinary) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const action = parseBinaryAction(event.rawData);
|
|
94
|
+
if (action === 6n && restartCount === 0) {
|
|
95
|
+
restartCount += 1;
|
|
96
|
+
void control.restart({
|
|
97
|
+
downtimeMs: 120,
|
|
98
|
+
reason: "trigger single-address reconnect",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
const dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:${proxy.getPort()}` +
|
|
105
|
+
`?retries=6&retry_backoff_ms=30&retry_backoff_max_ms=60`;
|
|
106
|
+
const conf = new config_1.WSConfig(dsn);
|
|
107
|
+
conf.setTimeOut(6000);
|
|
108
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
109
|
+
const result = await wsSql.exec("select server_version()");
|
|
110
|
+
expect(result).toBeTruthy();
|
|
111
|
+
expect(restartCount).toBe(1);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
if (wsSql) {
|
|
115
|
+
await wsSql.close();
|
|
116
|
+
}
|
|
117
|
+
await proxy.stop("test cleanup");
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
test("keeps all 5000 rows with single-address random proxy restarts during inserts", async () => {
|
|
121
|
+
const targetRows = 5000;
|
|
122
|
+
const baseTs = 1700000000000;
|
|
123
|
+
const dbName = "test_1773988174";
|
|
124
|
+
const tableName = "t0";
|
|
125
|
+
let wsSql = null;
|
|
126
|
+
let setupSql = null;
|
|
127
|
+
let cleanupSql = null;
|
|
128
|
+
let writePhase = false;
|
|
129
|
+
let restartInFlight = false;
|
|
130
|
+
let restartCount = 0;
|
|
131
|
+
let forwardedInsertFrames = 0;
|
|
132
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
133
|
+
const setupConf = new config_1.WSConfig(localDsn);
|
|
134
|
+
setupConf.setTimeOut(6000);
|
|
135
|
+
setupSql = await wsSql_1.WsSql.open(setupConf);
|
|
136
|
+
try {
|
|
137
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
138
|
+
await setupSql.exec(`create database if not exists ${dbName}`);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
await setupSql.close();
|
|
142
|
+
setupSql = null;
|
|
143
|
+
}
|
|
144
|
+
const proxy = await wsProxy_1.WsProxy.create({
|
|
145
|
+
host: "127.0.0.1",
|
|
146
|
+
port: 0,
|
|
147
|
+
onEvent: (event, control) => {
|
|
148
|
+
if (!writePhase || restartInFlight) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (event.type !== "message") {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (event.direction !== "client_to_upstream" || !event.isBinary) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const action = parseBinaryAction(event.rawData);
|
|
158
|
+
if (action !== 6n) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
forwardedInsertFrames += 1;
|
|
162
|
+
if (Math.random() < 0.003) {
|
|
163
|
+
restartInFlight = true;
|
|
164
|
+
restartCount += 1;
|
|
165
|
+
const downtimeMs = 10 + Math.floor(Math.random() * 60);
|
|
166
|
+
void control.restart({
|
|
167
|
+
downtimeMs,
|
|
168
|
+
reason: `random restart #${restartCount}`,
|
|
169
|
+
}).finally(() => {
|
|
170
|
+
restartInFlight = false;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
try {
|
|
176
|
+
const dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:${proxy.getPort()}` +
|
|
177
|
+
`?retries=30&retry_backoff_ms=5&retry_backoff_max_ms=20`;
|
|
178
|
+
const conf = new config_1.WSConfig(dsn);
|
|
179
|
+
conf.setDb(dbName);
|
|
180
|
+
conf.setTimeOut(10000);
|
|
181
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
182
|
+
await wsSql.exec(`create table ${tableName}(ts timestamp, c1 int)`);
|
|
183
|
+
writePhase = true;
|
|
184
|
+
for (let i = 0; i < targetRows; i++) {
|
|
185
|
+
await wsSql.exec(`insert into ${tableName} values(${baseTs + i}, ${i})`);
|
|
186
|
+
}
|
|
187
|
+
writePhase = false;
|
|
188
|
+
const countResult = await wsSql.exec(`select count(*) from ${tableName}`);
|
|
189
|
+
const countValue = countResult.getData()?.[0]?.[0];
|
|
190
|
+
const rowCount = typeof countValue === "bigint"
|
|
191
|
+
? Number(countValue)
|
|
192
|
+
: Number(countValue || 0);
|
|
193
|
+
expect(rowCount).toBe(targetRows);
|
|
194
|
+
expect(forwardedInsertFrames).toBeGreaterThanOrEqual(targetRows);
|
|
195
|
+
expect(restartCount).toBeGreaterThan(0);
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
writePhase = false;
|
|
199
|
+
if (wsSql) {
|
|
200
|
+
await wsSql.close();
|
|
201
|
+
}
|
|
202
|
+
await proxy.stop("test cleanup");
|
|
203
|
+
const cleanupConf = new config_1.WSConfig(localDsn);
|
|
204
|
+
cleanupConf.setTimeOut(6000);
|
|
205
|
+
cleanupSql = await wsSql_1.WsSql.open(cleanupConf);
|
|
206
|
+
try {
|
|
207
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
await cleanupSql.close();
|
|
211
|
+
cleanupSql = null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}, 300 * 1000);
|
|
215
|
+
test("keeps all 5000 rows with three-address random proxy restarts during inserts", async () => {
|
|
216
|
+
const targetRows = 5000;
|
|
217
|
+
const baseTs = 1700010000000;
|
|
218
|
+
const dbName = "test_1773989170";
|
|
219
|
+
const tableName = "t0";
|
|
220
|
+
const proxyStates = new Map();
|
|
221
|
+
let wsSql = null;
|
|
222
|
+
let setupSql = null;
|
|
223
|
+
let cleanupSql = null;
|
|
224
|
+
let writePhase = false;
|
|
225
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
226
|
+
const setupConf = new config_1.WSConfig(localDsn);
|
|
227
|
+
setupConf.setTimeOut(6000);
|
|
228
|
+
setupSql = await wsSql_1.WsSql.open(setupConf);
|
|
229
|
+
try {
|
|
230
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
231
|
+
await setupSql.exec(`create database if not exists ${dbName}`);
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
await setupSql.close();
|
|
235
|
+
setupSql = null;
|
|
236
|
+
}
|
|
237
|
+
const createRandomRestartProxy = async (name) => {
|
|
238
|
+
proxyStates.set(name, {
|
|
239
|
+
forwarded: 0,
|
|
240
|
+
restarting: false,
|
|
241
|
+
restarts: 0,
|
|
242
|
+
});
|
|
243
|
+
return wsProxy_1.WsProxy.create({
|
|
244
|
+
host: "127.0.0.1",
|
|
245
|
+
port: 0,
|
|
246
|
+
onEvent: (event, control) => {
|
|
247
|
+
if (!writePhase) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (event.type !== "message") {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (event.direction !== "client_to_upstream" || !event.isBinary) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const action = parseBinaryAction(event.rawData);
|
|
257
|
+
if (action !== 6n) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const state = proxyStates.get(name);
|
|
261
|
+
if (!state) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
state.forwarded += 1;
|
|
265
|
+
if (state.restarting) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (Math.random() >= 0.003) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
state.restarting = true;
|
|
272
|
+
state.restarts += 1;
|
|
273
|
+
const downtimeMs = 80 + Math.floor(Math.random() * 120);
|
|
274
|
+
void control
|
|
275
|
+
.restart({
|
|
276
|
+
downtimeMs,
|
|
277
|
+
reason: `${name} random restart #${state.restarts}`,
|
|
278
|
+
})
|
|
279
|
+
.finally(() => {
|
|
280
|
+
const latestState = proxyStates.get(name);
|
|
281
|
+
if (latestState) {
|
|
282
|
+
latestState.restarting = false;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
const proxyA = await createRandomRestartProxy("proxy_a");
|
|
289
|
+
const proxyB = await createRandomRestartProxy("proxy_b");
|
|
290
|
+
const proxyC = await createRandomRestartProxy("proxy_c");
|
|
291
|
+
try {
|
|
292
|
+
const dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
293
|
+
`@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()},127.0.0.1:${proxyC.getPort()}` +
|
|
294
|
+
`?retries=24&retry_backoff_ms=8&retry_backoff_max_ms=25`;
|
|
295
|
+
const conf = new config_1.WSConfig(dsn);
|
|
296
|
+
conf.setDb(dbName);
|
|
297
|
+
conf.setTimeOut(10000);
|
|
298
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
299
|
+
await wsSql.exec(`create table ${tableName}(ts timestamp, c1 int)`);
|
|
300
|
+
writePhase = true;
|
|
301
|
+
for (let i = 0; i < targetRows; i++) {
|
|
302
|
+
await wsSql.exec(`insert into ${tableName} values(${baseTs + i}, ${i})`);
|
|
303
|
+
}
|
|
304
|
+
writePhase = false;
|
|
305
|
+
const countResult = await wsSql.exec(`select count(*) from ${tableName}`);
|
|
306
|
+
const countValue = countResult.getData()?.[0]?.[0];
|
|
307
|
+
const rowCount = typeof countValue === "bigint"
|
|
308
|
+
? Number(countValue)
|
|
309
|
+
: Number(countValue || 0);
|
|
310
|
+
const totalForwarded = Array.from(proxyStates.values()).reduce((sum, state) => sum + state.forwarded, 0);
|
|
311
|
+
const totalRestarts = Array.from(proxyStates.values()).reduce((sum, state) => sum + state.restarts, 0);
|
|
312
|
+
expect(rowCount).toBe(targetRows);
|
|
313
|
+
expect(totalForwarded).toBeGreaterThanOrEqual(targetRows);
|
|
314
|
+
expect(totalRestarts).toBeGreaterThan(0);
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
writePhase = false;
|
|
318
|
+
if (wsSql) {
|
|
319
|
+
await wsSql.close();
|
|
320
|
+
}
|
|
321
|
+
await Promise.all([
|
|
322
|
+
proxyA.stop("test cleanup"),
|
|
323
|
+
proxyB.stop("test cleanup"),
|
|
324
|
+
proxyC.stop("test cleanup"),
|
|
325
|
+
]);
|
|
326
|
+
const cleanupConf = new config_1.WSConfig(localDsn);
|
|
327
|
+
cleanupConf.setTimeOut(6000);
|
|
328
|
+
cleanupSql = await wsSql_1.WsSql.open(cleanupConf);
|
|
329
|
+
try {
|
|
330
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
await cleanupSql.close();
|
|
334
|
+
cleanupSql = null;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}, 300 * 1000);
|
|
338
|
+
});
|
|
@@ -5,19 +5,20 @@ const config_1 = require("../../src/common/config");
|
|
|
5
5
|
const wsSql_1 = require("../../src/sql/wsSql");
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
7
|
const log_1 = require("../../src/common/log");
|
|
8
|
-
let
|
|
8
|
+
let dsn = "ws://localhost:6041";
|
|
9
9
|
let password1 = "Ab1!@#$%,.:?<>;~";
|
|
10
10
|
let password2 = "Bc%^&*()-_+=[]{}";
|
|
11
11
|
(0, log_1.setLevel)("debug");
|
|
12
12
|
beforeAll(async () => {
|
|
13
|
-
let conf = new config_1.WSConfig(
|
|
14
|
-
conf.setUser(
|
|
15
|
-
conf.setPwd(
|
|
13
|
+
let conf = new config_1.WSConfig(dsn);
|
|
14
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
15
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
16
16
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
17
17
|
await wsSql.exec("drop database if exists sql_test");
|
|
18
18
|
await wsSql.exec("drop database if exists sql_create");
|
|
19
|
-
await wsSql.exec(`
|
|
20
|
-
await wsSql.exec(`
|
|
19
|
+
await wsSql.exec(`create user user1 pass '${password1}'`);
|
|
20
|
+
await wsSql.exec(`create user user2 pass '${password2}'`);
|
|
21
|
+
await wsSql.exec("create user token_user pass 'token_pass_1'");
|
|
21
22
|
await wsSql.exec("create database if not exists sql_test KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
22
23
|
await (0, utils_1.Sleep)(100);
|
|
23
24
|
await wsSql.exec("use sql_test");
|
|
@@ -29,9 +30,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
29
30
|
test("normal connect", async () => {
|
|
30
31
|
let wsSql = null;
|
|
31
32
|
let conf = new config_1.WSConfig("");
|
|
32
|
-
conf.setUrl(
|
|
33
|
-
conf.setUser(
|
|
34
|
-
conf.setPwd(
|
|
33
|
+
conf.setUrl(dsn);
|
|
34
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
35
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
35
36
|
conf.setDb("sql_test");
|
|
36
37
|
conf.setTimezone("America/New_York");
|
|
37
38
|
conf.setTimeOut(6000);
|
|
@@ -48,7 +49,7 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
48
49
|
});
|
|
49
50
|
test("special characters connect1", async () => {
|
|
50
51
|
let wsSql = null;
|
|
51
|
-
let conf = new config_1.WSConfig(
|
|
52
|
+
let conf = new config_1.WSConfig(dsn);
|
|
52
53
|
conf.setUser("user1");
|
|
53
54
|
conf.setPwd(password1);
|
|
54
55
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
@@ -60,7 +61,7 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
60
61
|
});
|
|
61
62
|
test("special characters connect2", async () => {
|
|
62
63
|
let wsSql = null;
|
|
63
|
-
let conf = new config_1.WSConfig(
|
|
64
|
+
let conf = new config_1.WSConfig(dsn);
|
|
64
65
|
conf.setUser("user2");
|
|
65
66
|
conf.setPwd(password2);
|
|
66
67
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
@@ -74,9 +75,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
74
75
|
expect.assertions(1);
|
|
75
76
|
let wsSql = null;
|
|
76
77
|
try {
|
|
77
|
-
let conf = new config_1.WSConfig(
|
|
78
|
-
conf.setUser(
|
|
79
|
-
conf.setPwd(
|
|
78
|
+
let conf = new config_1.WSConfig(dsn);
|
|
79
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
80
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
80
81
|
conf.setDb("jest");
|
|
81
82
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
82
83
|
}
|
|
@@ -91,7 +92,7 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
91
92
|
}
|
|
92
93
|
});
|
|
93
94
|
test("connect url", async () => {
|
|
94
|
-
let url =
|
|
95
|
+
let url = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@localhost:6041/information_schema?timezone=Asia/Shanghai`;
|
|
95
96
|
let conf = new config_1.WSConfig(url);
|
|
96
97
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
97
98
|
let version = await wsSql.version();
|
|
@@ -107,9 +108,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
107
108
|
await wsSql.close();
|
|
108
109
|
});
|
|
109
110
|
test("get taosc version", async () => {
|
|
110
|
-
let conf = new config_1.WSConfig(
|
|
111
|
-
conf.setUser(
|
|
112
|
-
conf.setPwd(
|
|
111
|
+
let conf = new config_1.WSConfig(dsn);
|
|
112
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
113
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
113
114
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
114
115
|
let version = await wsSql.version();
|
|
115
116
|
await wsSql.close();
|
|
@@ -117,9 +118,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
117
118
|
expect(version).toBeTruthy();
|
|
118
119
|
});
|
|
119
120
|
test("show databases", async () => {
|
|
120
|
-
let conf = new config_1.WSConfig(
|
|
121
|
-
conf.setUser(
|
|
122
|
-
conf.setPwd(
|
|
121
|
+
let conf = new config_1.WSConfig(dsn);
|
|
122
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
123
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
123
124
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
124
125
|
let taosResult = await wsSql.exec("show databases");
|
|
125
126
|
await wsSql.close();
|
|
@@ -127,9 +128,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
127
128
|
expect(taosResult).toBeTruthy();
|
|
128
129
|
});
|
|
129
130
|
test("create databases", async () => {
|
|
130
|
-
let conf = new config_1.WSConfig(
|
|
131
|
-
conf.setUser(
|
|
132
|
-
conf.setPwd(
|
|
131
|
+
let conf = new config_1.WSConfig(dsn);
|
|
132
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
133
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
133
134
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
134
135
|
let taosResult = await wsSql.exec("create database if not exists sql_create KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
135
136
|
await wsSql.close();
|
|
@@ -137,9 +138,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
137
138
|
expect(taosResult).toBeTruthy();
|
|
138
139
|
});
|
|
139
140
|
test("create stable", async () => {
|
|
140
|
-
let conf = new config_1.WSConfig(
|
|
141
|
-
conf.setUser(
|
|
142
|
-
conf.setPwd(
|
|
141
|
+
let conf = new config_1.WSConfig(dsn);
|
|
142
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
143
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
143
144
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
144
145
|
let taosResult = await wsSql.exec("use sql_test");
|
|
145
146
|
console.log(taosResult);
|
|
@@ -150,9 +151,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
150
151
|
expect(taosResult).toBeTruthy();
|
|
151
152
|
});
|
|
152
153
|
test("insert recoder", async () => {
|
|
153
|
-
let conf = new config_1.WSConfig(
|
|
154
|
-
conf.setUser(
|
|
155
|
-
conf.setPwd(
|
|
154
|
+
let conf = new config_1.WSConfig(dsn);
|
|
155
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
156
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
156
157
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
157
158
|
let taosResult = await wsSql.exec("use sql_test");
|
|
158
159
|
console.log(taosResult);
|
|
@@ -165,9 +166,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
165
166
|
await wsSql.close();
|
|
166
167
|
});
|
|
167
168
|
test("query sql", async () => {
|
|
168
|
-
let conf = new config_1.WSConfig(
|
|
169
|
-
conf.setUser(
|
|
170
|
-
conf.setPwd(
|
|
169
|
+
let conf = new config_1.WSConfig(dsn);
|
|
170
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
171
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
171
172
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
172
173
|
let taosResult = await wsSql.exec("use sql_test");
|
|
173
174
|
console.log(taosResult);
|
|
@@ -187,9 +188,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
187
188
|
await wsSql.close();
|
|
188
189
|
});
|
|
189
190
|
test("query sql no getdata", async () => {
|
|
190
|
-
let conf = new config_1.WSConfig(
|
|
191
|
-
conf.setUser(
|
|
192
|
-
conf.setPwd(
|
|
191
|
+
let conf = new config_1.WSConfig(dsn);
|
|
192
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
193
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
193
194
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
194
195
|
let taosResult = await wsSql.exec("use sql_test");
|
|
195
196
|
console.log(taosResult);
|
|
@@ -199,9 +200,9 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
199
200
|
await wsSql.close();
|
|
200
201
|
});
|
|
201
202
|
test("timestamp order check", async () => {
|
|
202
|
-
const conf = new config_1.WSConfig(
|
|
203
|
-
conf.setUser(
|
|
204
|
-
conf.setPwd(
|
|
203
|
+
const conf = new config_1.WSConfig(dsn);
|
|
204
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
205
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
205
206
|
const wsSql = await wsSql_1.WsSql.open(conf);
|
|
206
207
|
await wsSql.exec("use sql_test");
|
|
207
208
|
await wsSql.exec("drop table if exists t_order");
|
|
@@ -237,16 +238,87 @@ describe("TDWebSocket.WsSql()", () => {
|
|
|
237
238
|
expect(actualRowsDesc).toEqual(expectRowsDesc);
|
|
238
239
|
await wsSql.close();
|
|
239
240
|
});
|
|
241
|
+
(0, utils_1.testEnterprise)("connect with token", async () => {
|
|
242
|
+
const conf = new config_1.WSConfig(dsn);
|
|
243
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
244
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
245
|
+
const wsSql = await wsSql_1.WsSql.open(conf);
|
|
246
|
+
const wsRows = await wsSql.query("create token test_bearer_token from user token_user");
|
|
247
|
+
await wsRows.next();
|
|
248
|
+
const token = wsRows.getData()?.[0];
|
|
249
|
+
expect(token).toBeTruthy();
|
|
250
|
+
await wsRows.close();
|
|
251
|
+
await wsSql.close();
|
|
252
|
+
const assertServerVersionWithConfig = async (config) => {
|
|
253
|
+
const client = await wsSql_1.WsSql.open(config);
|
|
254
|
+
const rows = await client.query("select server_version()");
|
|
255
|
+
await rows.next();
|
|
256
|
+
const version = rows.getData()?.[0];
|
|
257
|
+
expect(version).toBeTruthy();
|
|
258
|
+
await rows.close();
|
|
259
|
+
await client.close();
|
|
260
|
+
};
|
|
261
|
+
const conf1 = new config_1.WSConfig(dsn);
|
|
262
|
+
conf1.setBearerToken(token);
|
|
263
|
+
await assertServerVersionWithConfig(conf1);
|
|
264
|
+
const conf2 = new config_1.WSConfig("ws://localhost:6041?bearer_token=" + token);
|
|
265
|
+
await assertServerVersionWithConfig(conf2);
|
|
266
|
+
});
|
|
267
|
+
(0, utils_1.testEnterprise)("connect with invalid token", async () => {
|
|
268
|
+
let conf = new config_1.WSConfig("ws://localhost:6041?bearer_token=invalid_token");
|
|
269
|
+
await expect(wsSql_1.WsSql.open(conf)).rejects.toMatchObject({
|
|
270
|
+
message: expect.stringMatching(/invalid token/i),
|
|
271
|
+
});
|
|
272
|
+
conf = new config_1.WSConfig("ws://localhost:6041");
|
|
273
|
+
conf.setBearerToken("invalid_token1");
|
|
274
|
+
await expect(wsSql_1.WsSql.open(conf)).rejects.toMatchObject({
|
|
275
|
+
message: expect.stringMatching(/invalid token/i),
|
|
276
|
+
});
|
|
277
|
+
conf = new config_1.WSConfig("ws://localhost:6041");
|
|
278
|
+
conf.setBearerToken(" ");
|
|
279
|
+
await expect(wsSql_1.WsSql.open(conf)).rejects.toMatchObject({
|
|
280
|
+
message: expect.stringMatching(/invalid token/i),
|
|
281
|
+
});
|
|
282
|
+
conf = new config_1.WSConfig("ws://localhost:6041?bearer_token=");
|
|
283
|
+
await expect(wsSql_1.WsSql.open(conf)).rejects.toMatchObject({
|
|
284
|
+
message: expect.stringMatching(/invalid url/i),
|
|
285
|
+
});
|
|
286
|
+
conf = new config_1.WSConfig("ws://localhost:6041");
|
|
287
|
+
conf.setBearerToken("");
|
|
288
|
+
await expect(wsSql_1.WsSql.open(conf)).rejects.toMatchObject({
|
|
289
|
+
message: expect.stringMatching(/invalid url/i),
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
(0, utils_1.testNon3360)("connector version info", async () => {
|
|
293
|
+
const conf = new config_1.WSConfig(dsn);
|
|
294
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
295
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
296
|
+
const wsSql = await wsSql_1.WsSql.open(conf);
|
|
297
|
+
await (0, utils_1.Sleep)(2000);
|
|
298
|
+
const wsRows = await wsSql.query("show connections");
|
|
299
|
+
let hasNodejsWs = false;
|
|
300
|
+
while (await wsRows.next()) {
|
|
301
|
+
const data = wsRows.getData();
|
|
302
|
+
if (Array.isArray(data) && data.some(v => typeof v === "string" && v.includes("nodejs-ws"))) {
|
|
303
|
+
hasNodejsWs = true;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
expect(hasNodejsWs).toBe(true);
|
|
308
|
+
await wsRows.close();
|
|
309
|
+
await wsSql.close();
|
|
310
|
+
});
|
|
240
311
|
});
|
|
241
312
|
afterAll(async () => {
|
|
242
|
-
let conf = new config_1.WSConfig(
|
|
243
|
-
conf.setUser(
|
|
244
|
-
conf.setPwd(
|
|
313
|
+
let conf = new config_1.WSConfig(dsn);
|
|
314
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
315
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
245
316
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
246
317
|
await wsSql.exec("drop database sql_test");
|
|
247
318
|
await wsSql.exec("drop database sql_create");
|
|
248
|
-
await wsSql.exec("
|
|
249
|
-
await wsSql.exec("
|
|
319
|
+
await wsSql.exec("drop user user1");
|
|
320
|
+
await wsSql.exec("drop user user2");
|
|
321
|
+
await wsSql.exec("drop user token_user");
|
|
250
322
|
await wsSql.close();
|
|
251
323
|
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
252
324
|
});
|