@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,341 @@
|
|
|
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("@test-helpers/utils");
|
|
7
|
+
const wsProxy_1 = require("@test-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 || restartCount === 0) {
|
|
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
|
+
let forcedRestartTriggered = false;
|
|
226
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
227
|
+
const setupConf = new config_1.WSConfig(localDsn);
|
|
228
|
+
setupConf.setTimeOut(6000);
|
|
229
|
+
setupSql = await wsSql_1.WsSql.open(setupConf);
|
|
230
|
+
try {
|
|
231
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
232
|
+
await setupSql.exec(`create database if not exists ${dbName}`);
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
await setupSql.close();
|
|
236
|
+
setupSql = null;
|
|
237
|
+
}
|
|
238
|
+
const createRandomRestartProxy = async (name) => {
|
|
239
|
+
proxyStates.set(name, {
|
|
240
|
+
forwarded: 0,
|
|
241
|
+
restarting: false,
|
|
242
|
+
restarts: 0,
|
|
243
|
+
});
|
|
244
|
+
return wsProxy_1.WsProxy.create({
|
|
245
|
+
host: "127.0.0.1",
|
|
246
|
+
port: 0,
|
|
247
|
+
onEvent: (event, control) => {
|
|
248
|
+
if (!writePhase) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (event.type !== "message") {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (event.direction !== "client_to_upstream" || !event.isBinary) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const action = parseBinaryAction(event.rawData);
|
|
258
|
+
if (action !== 6n) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const state = proxyStates.get(name);
|
|
262
|
+
if (!state) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
state.forwarded += 1;
|
|
266
|
+
if (state.restarting) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const shouldRestart = !forcedRestartTriggered || Math.random() < 0.003;
|
|
270
|
+
if (!shouldRestart) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
forcedRestartTriggered = true;
|
|
274
|
+
state.restarting = true;
|
|
275
|
+
state.restarts += 1;
|
|
276
|
+
const downtimeMs = 80 + Math.floor(Math.random() * 120);
|
|
277
|
+
void control
|
|
278
|
+
.restart({
|
|
279
|
+
downtimeMs,
|
|
280
|
+
reason: `${name} random restart #${state.restarts}`,
|
|
281
|
+
})
|
|
282
|
+
.finally(() => {
|
|
283
|
+
const latestState = proxyStates.get(name);
|
|
284
|
+
if (latestState) {
|
|
285
|
+
latestState.restarting = false;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
const proxyA = await createRandomRestartProxy("proxy_a");
|
|
292
|
+
const proxyB = await createRandomRestartProxy("proxy_b");
|
|
293
|
+
const proxyC = await createRandomRestartProxy("proxy_c");
|
|
294
|
+
try {
|
|
295
|
+
const dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
296
|
+
`@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()},127.0.0.1:${proxyC.getPort()}` +
|
|
297
|
+
`?retries=24&retry_backoff_ms=8&retry_backoff_max_ms=25`;
|
|
298
|
+
const conf = new config_1.WSConfig(dsn);
|
|
299
|
+
conf.setDb(dbName);
|
|
300
|
+
conf.setTimeOut(10000);
|
|
301
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
302
|
+
await wsSql.exec(`create table ${tableName}(ts timestamp, c1 int)`);
|
|
303
|
+
writePhase = true;
|
|
304
|
+
for (let i = 0; i < targetRows; i++) {
|
|
305
|
+
await wsSql.exec(`insert into ${tableName} values(${baseTs + i}, ${i})`);
|
|
306
|
+
}
|
|
307
|
+
writePhase = false;
|
|
308
|
+
const countResult = await wsSql.exec(`select count(*) from ${tableName}`);
|
|
309
|
+
const countValue = countResult.getData()?.[0]?.[0];
|
|
310
|
+
const rowCount = typeof countValue === "bigint"
|
|
311
|
+
? Number(countValue)
|
|
312
|
+
: Number(countValue || 0);
|
|
313
|
+
const totalForwarded = Array.from(proxyStates.values()).reduce((sum, state) => sum + state.forwarded, 0);
|
|
314
|
+
const totalRestarts = Array.from(proxyStates.values()).reduce((sum, state) => sum + state.restarts, 0);
|
|
315
|
+
expect(rowCount).toBe(targetRows);
|
|
316
|
+
expect(totalForwarded).toBeGreaterThanOrEqual(targetRows);
|
|
317
|
+
expect(totalRestarts).toBeGreaterThan(0);
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
writePhase = false;
|
|
321
|
+
if (wsSql) {
|
|
322
|
+
await wsSql.close();
|
|
323
|
+
}
|
|
324
|
+
await Promise.all([
|
|
325
|
+
proxyA.stop("test cleanup"),
|
|
326
|
+
proxyB.stop("test cleanup"),
|
|
327
|
+
proxyC.stop("test cleanup"),
|
|
328
|
+
]);
|
|
329
|
+
const cleanupConf = new config_1.WSConfig(localDsn);
|
|
330
|
+
cleanupConf.setTimeOut(6000);
|
|
331
|
+
cleanupSql = await wsSql_1.WsSql.open(cleanupConf);
|
|
332
|
+
try {
|
|
333
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
await cleanupSql.close();
|
|
337
|
+
cleanupSql = null;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}, 300 * 1000);
|
|
341
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.test.d.ts","sourceRoot":"","sources":["../../../test/sql/sql.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,324 @@
|
|
|
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("@test-helpers/utils");
|
|
7
|
+
const log_1 = require("@src/common/log");
|
|
8
|
+
let dsn = "ws://localhost:6041";
|
|
9
|
+
let password1 = "Ab1!@#$%,.:?<>;~";
|
|
10
|
+
let password2 = "Bc%^&*()-_+=[]{}";
|
|
11
|
+
(0, log_1.setLevel)("debug");
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
let conf = new config_1.WSConfig(dsn);
|
|
14
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
15
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
16
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
17
|
+
await wsSql.exec("drop database if exists sql_test");
|
|
18
|
+
await wsSql.exec("drop database if exists sql_create");
|
|
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'");
|
|
22
|
+
await wsSql.exec("create database if not exists sql_test KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
23
|
+
await (0, utils_1.Sleep)(100);
|
|
24
|
+
await wsSql.exec("use sql_test");
|
|
25
|
+
await wsSql.exec("CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);");
|
|
26
|
+
await wsSql.close();
|
|
27
|
+
});
|
|
28
|
+
describe("TDWebSocket.WsSql()", () => {
|
|
29
|
+
jest.setTimeout(20 * 1000);
|
|
30
|
+
test("normal connect", async () => {
|
|
31
|
+
let wsSql = null;
|
|
32
|
+
let conf = new config_1.WSConfig("");
|
|
33
|
+
conf.setUrl(dsn);
|
|
34
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
35
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
36
|
+
conf.setDb("sql_test");
|
|
37
|
+
conf.setTimezone("America/New_York");
|
|
38
|
+
conf.setTimeOut(6000);
|
|
39
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
40
|
+
expect(wsSql.state()).toBeGreaterThan(0);
|
|
41
|
+
let wsRows = await wsSql.query("select timezone()");
|
|
42
|
+
while (await wsRows.next()) {
|
|
43
|
+
let result = wsRows.getData();
|
|
44
|
+
console.log(result);
|
|
45
|
+
expect(result).toBeTruthy();
|
|
46
|
+
expect(JSON.stringify(result)).toContain("America/New_York");
|
|
47
|
+
}
|
|
48
|
+
await wsSql.close();
|
|
49
|
+
});
|
|
50
|
+
test("special characters connect1", async () => {
|
|
51
|
+
let wsSql = null;
|
|
52
|
+
let conf = new config_1.WSConfig(dsn);
|
|
53
|
+
conf.setUser("user1");
|
|
54
|
+
conf.setPwd(password1);
|
|
55
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
56
|
+
expect(wsSql.state()).toBeGreaterThan(0);
|
|
57
|
+
let version = await wsSql.version();
|
|
58
|
+
expect(version).not.toBeNull();
|
|
59
|
+
expect(version).not.toBeUndefined();
|
|
60
|
+
await wsSql.close();
|
|
61
|
+
});
|
|
62
|
+
test("special characters connect2", async () => {
|
|
63
|
+
let wsSql = null;
|
|
64
|
+
let conf = new config_1.WSConfig(dsn);
|
|
65
|
+
conf.setUser("user2");
|
|
66
|
+
conf.setPwd(password2);
|
|
67
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
68
|
+
expect(wsSql.state()).toBeGreaterThan(0);
|
|
69
|
+
let version = await wsSql.version();
|
|
70
|
+
expect(version).not.toBeNull();
|
|
71
|
+
expect(version).not.toBeUndefined();
|
|
72
|
+
await wsSql.close();
|
|
73
|
+
});
|
|
74
|
+
test("connect db with error", async () => {
|
|
75
|
+
expect.assertions(1);
|
|
76
|
+
let wsSql = null;
|
|
77
|
+
try {
|
|
78
|
+
let conf = new config_1.WSConfig(dsn);
|
|
79
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
80
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
81
|
+
conf.setDb("jest");
|
|
82
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
let err = e;
|
|
86
|
+
expect(err.message).toMatch("Database not exist");
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
if (wsSql) {
|
|
90
|
+
await wsSql.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
test("connect url", async () => {
|
|
95
|
+
let url = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@localhost:6041/information_schema?timezone=Asia/Shanghai`;
|
|
96
|
+
let conf = new config_1.WSConfig(url);
|
|
97
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
98
|
+
let version = await wsSql.version();
|
|
99
|
+
console.log(version);
|
|
100
|
+
expect(version).toBeTruthy();
|
|
101
|
+
let wsRows = await wsSql.query("select timezone()");
|
|
102
|
+
while (await wsRows.next()) {
|
|
103
|
+
let result = wsRows.getData();
|
|
104
|
+
console.log(result);
|
|
105
|
+
expect(result).toBeTruthy();
|
|
106
|
+
expect(JSON.stringify(result)).toContain("Asia/Shanghai");
|
|
107
|
+
}
|
|
108
|
+
await wsSql.close();
|
|
109
|
+
});
|
|
110
|
+
test("get taosc version", async () => {
|
|
111
|
+
let conf = new config_1.WSConfig(dsn);
|
|
112
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
113
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
114
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
115
|
+
let version = await wsSql.version();
|
|
116
|
+
await wsSql.close();
|
|
117
|
+
console.log(version);
|
|
118
|
+
expect(version).toBeTruthy();
|
|
119
|
+
});
|
|
120
|
+
test("show databases", async () => {
|
|
121
|
+
let conf = new config_1.WSConfig(dsn);
|
|
122
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
123
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
124
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
125
|
+
let taosResult = await wsSql.exec("show databases");
|
|
126
|
+
await wsSql.close();
|
|
127
|
+
console.log(taosResult);
|
|
128
|
+
expect(taosResult).toBeTruthy();
|
|
129
|
+
});
|
|
130
|
+
test("create databases", async () => {
|
|
131
|
+
let conf = new config_1.WSConfig(dsn);
|
|
132
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
133
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
134
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
135
|
+
let taosResult = await wsSql.exec("create database if not exists sql_create KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
136
|
+
await wsSql.close();
|
|
137
|
+
console.log(taosResult);
|
|
138
|
+
expect(taosResult).toBeTruthy();
|
|
139
|
+
});
|
|
140
|
+
test("create stable", async () => {
|
|
141
|
+
let conf = new config_1.WSConfig(dsn);
|
|
142
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
143
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
144
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
145
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
146
|
+
console.log(taosResult);
|
|
147
|
+
expect(taosResult).toBeTruthy();
|
|
148
|
+
taosResult = await wsSql.exec("CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);");
|
|
149
|
+
await wsSql.close();
|
|
150
|
+
console.log(taosResult);
|
|
151
|
+
expect(taosResult).toBeTruthy();
|
|
152
|
+
});
|
|
153
|
+
test("insert recoder", async () => {
|
|
154
|
+
let conf = new config_1.WSConfig(dsn);
|
|
155
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
156
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
157
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
158
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
159
|
+
console.log(taosResult);
|
|
160
|
+
expect(taosResult).toBeTruthy();
|
|
161
|
+
taosResult = await wsSql.exec("describe meters");
|
|
162
|
+
console.log(taosResult);
|
|
163
|
+
taosResult = await wsSql.exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California", 3) VALUES (NOW, 10.2, 219, 0.32)');
|
|
164
|
+
console.log(taosResult);
|
|
165
|
+
expect(taosResult.getAffectRows()).toBeGreaterThanOrEqual(1);
|
|
166
|
+
await wsSql.close();
|
|
167
|
+
});
|
|
168
|
+
test("query sql", async () => {
|
|
169
|
+
let conf = new config_1.WSConfig(dsn);
|
|
170
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
171
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
172
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
173
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
174
|
+
console.log(taosResult);
|
|
175
|
+
expect(taosResult).toBeTruthy();
|
|
176
|
+
for (let i = 0; i < 10; i++) {
|
|
177
|
+
let wsRows = await wsSql.query("select * from meters limit 3");
|
|
178
|
+
expect(wsRows).toBeTruthy();
|
|
179
|
+
let meta = wsRows.getMeta();
|
|
180
|
+
expect(meta).toBeTruthy();
|
|
181
|
+
console.log("wsRow:meta:=>", meta);
|
|
182
|
+
while (await wsRows.next()) {
|
|
183
|
+
let result = await wsRows.getData();
|
|
184
|
+
expect(result).toBeTruthy();
|
|
185
|
+
}
|
|
186
|
+
await wsRows.close();
|
|
187
|
+
}
|
|
188
|
+
await wsSql.close();
|
|
189
|
+
});
|
|
190
|
+
test("query sql no getdata", async () => {
|
|
191
|
+
let conf = new config_1.WSConfig(dsn);
|
|
192
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
193
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
194
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
195
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
196
|
+
console.log(taosResult);
|
|
197
|
+
expect(taosResult).toBeTruthy();
|
|
198
|
+
let wsRows = await wsSql.query("select * from meters");
|
|
199
|
+
await wsRows.close();
|
|
200
|
+
await wsSql.close();
|
|
201
|
+
});
|
|
202
|
+
test("timestamp order check", async () => {
|
|
203
|
+
const conf = new config_1.WSConfig(dsn);
|
|
204
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
205
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
206
|
+
const wsSql = await wsSql_1.WsSql.open(conf);
|
|
207
|
+
await wsSql.exec("use sql_test");
|
|
208
|
+
await wsSql.exec("drop table if exists t_order");
|
|
209
|
+
await wsSql.exec("create table t_order (ts timestamp, c1 int)");
|
|
210
|
+
await wsSql.exec("insert into t_order values (1726803356466, 1)");
|
|
211
|
+
await wsSql.exec("insert into t_order values (1726803357466, 2)");
|
|
212
|
+
await wsSql.exec("insert into t_order values (1726803358466, 3)");
|
|
213
|
+
const expectRowsAsc = [
|
|
214
|
+
[1726803356466n, 1],
|
|
215
|
+
[1726803357466n, 2],
|
|
216
|
+
[1726803358466n, 3],
|
|
217
|
+
];
|
|
218
|
+
const expectRowsDesc = expectRowsAsc.slice().reverse();
|
|
219
|
+
const actualRowsAsc = [];
|
|
220
|
+
const actualRowsDesc = [];
|
|
221
|
+
const rowsAsc = await wsSql.query("select * from t_order order by ts asc");
|
|
222
|
+
while (await rowsAsc.next()) {
|
|
223
|
+
const data = rowsAsc.getData();
|
|
224
|
+
if (!data)
|
|
225
|
+
break;
|
|
226
|
+
actualRowsAsc.push(data);
|
|
227
|
+
}
|
|
228
|
+
await rowsAsc.close();
|
|
229
|
+
expect(actualRowsAsc).toEqual(expectRowsAsc);
|
|
230
|
+
const rowsDesc = await wsSql.query("select * from t_order order by ts desc");
|
|
231
|
+
while (await rowsDesc.next()) {
|
|
232
|
+
const data = rowsDesc.getData();
|
|
233
|
+
if (!data)
|
|
234
|
+
break;
|
|
235
|
+
actualRowsDesc.push(data);
|
|
236
|
+
}
|
|
237
|
+
await rowsDesc.close();
|
|
238
|
+
expect(actualRowsDesc).toEqual(expectRowsDesc);
|
|
239
|
+
await wsSql.close();
|
|
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
|
+
});
|
|
311
|
+
});
|
|
312
|
+
afterAll(async () => {
|
|
313
|
+
let conf = new config_1.WSConfig(dsn);
|
|
314
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
315
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
316
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
317
|
+
await wsSql.exec("drop database sql_test");
|
|
318
|
+
await wsSql.exec("drop database sql_create");
|
|
319
|
+
await wsSql.exec("drop user user1");
|
|
320
|
+
await wsSql.exec("drop user user2");
|
|
321
|
+
await wsSql.exec("drop user token_user");
|
|
322
|
+
await wsSql.close();
|
|
323
|
+
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
324
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stmt2.failover.mock.test.d.ts","sourceRoot":"","sources":["../../../../test/stmt/failover/stmt2.failover.mock.test.ts"],"names":[],"mappings":""}
|