@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
|
@@ -5,12 +5,13 @@ const config_1 = require("../../src/common/config");
|
|
|
5
5
|
const log_1 = require("../../src/common/log");
|
|
6
6
|
const wsSql_1 = require("../../src/sql/wsSql");
|
|
7
7
|
const wsStmt1_1 = require("../../src/stmt/wsStmt1");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
8
9
|
let dns = "ws://localhost:6041";
|
|
9
10
|
(0, log_1.setLevel)("debug");
|
|
10
11
|
beforeAll(async () => {
|
|
11
12
|
let conf = new config_1.WSConfig(dns);
|
|
12
|
-
conf.setUser(
|
|
13
|
-
conf.setPwd(
|
|
13
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
14
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
14
15
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
15
16
|
await wsSql.exec("drop database if exists power_func_stmt1;");
|
|
16
17
|
await wsSql.exec("create database if not exists power_func_stmt1 KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
@@ -32,8 +33,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
32
33
|
];
|
|
33
34
|
test("normal connect", async () => {
|
|
34
35
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
35
|
-
conf.setUser(
|
|
36
|
-
conf.setPwd(
|
|
36
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
37
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
37
38
|
conf.setDb("power_func_stmt1");
|
|
38
39
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
39
40
|
let stmt = await connector.stmtInit();
|
|
@@ -48,8 +49,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
48
49
|
let connector = null;
|
|
49
50
|
try {
|
|
50
51
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
51
|
-
conf.setUser(
|
|
52
|
-
conf.setPwd(
|
|
52
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
53
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
53
54
|
conf.setDb("jest");
|
|
54
55
|
connector = await wsSql_1.WsSql.open(conf);
|
|
55
56
|
let stmt = await connector.stmtInit();
|
|
@@ -67,8 +68,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
67
68
|
});
|
|
68
69
|
test("normal Prepare", async () => {
|
|
69
70
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
70
|
-
conf.setUser(
|
|
71
|
-
conf.setPwd(
|
|
71
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
72
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
72
73
|
conf.setDb("power_func_stmt1");
|
|
73
74
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
74
75
|
let stmt = await connector.stmtInit();
|
|
@@ -86,8 +87,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
86
87
|
});
|
|
87
88
|
test("set tag error", async () => {
|
|
88
89
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
89
|
-
conf.setUser(
|
|
90
|
-
conf.setPwd(
|
|
90
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
91
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
91
92
|
conf.setDb("power_func_stmt1");
|
|
92
93
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
93
94
|
let stmt = await connector.stmtInit();
|
|
@@ -109,8 +110,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
109
110
|
});
|
|
110
111
|
test("error Prepare table", async () => {
|
|
111
112
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
112
|
-
conf.setUser(
|
|
113
|
-
conf.setPwd(
|
|
113
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
114
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
114
115
|
conf.setDb("power_func_stmt1");
|
|
115
116
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
116
117
|
let stmt = await connector.stmtInit();
|
|
@@ -130,8 +131,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
130
131
|
});
|
|
131
132
|
test("error Prepare tag", async () => {
|
|
132
133
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
133
|
-
conf.setUser(
|
|
134
|
-
conf.setPwd(
|
|
134
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
135
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
135
136
|
conf.setDb("power_func_stmt1");
|
|
136
137
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
137
138
|
let stmt = await connector.stmtInit();
|
|
@@ -151,8 +152,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
151
152
|
});
|
|
152
153
|
test("Bind a single table", async () => {
|
|
153
154
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
154
|
-
conf.setUser(
|
|
155
|
-
conf.setPwd(
|
|
155
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
156
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
156
157
|
conf.setDb("power_func_stmt1");
|
|
157
158
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
158
159
|
let stmt = await connector.stmtInit();
|
|
@@ -186,8 +187,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
186
187
|
});
|
|
187
188
|
test("error BindParam", async () => {
|
|
188
189
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
189
|
-
conf.setUser(
|
|
190
|
-
conf.setPwd(
|
|
190
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
191
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
191
192
|
conf.setDb("power_func_stmt1");
|
|
192
193
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
193
194
|
let stmt = await connector.stmtInit();
|
|
@@ -225,8 +226,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
225
226
|
});
|
|
226
227
|
test("no Batch", async () => {
|
|
227
228
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
228
|
-
conf.setUser(
|
|
229
|
-
conf.setPwd(
|
|
229
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
230
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
230
231
|
conf.setDb("power_func_stmt1");
|
|
231
232
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
232
233
|
let stmt = await connector.stmtInit();
|
|
@@ -263,8 +264,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
263
264
|
});
|
|
264
265
|
test("Batch after BindParam", async () => {
|
|
265
266
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
266
|
-
conf.setUser(
|
|
267
|
-
conf.setPwd(
|
|
267
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
268
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
268
269
|
conf.setDb("power_func_stmt1");
|
|
269
270
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
270
271
|
let stmt = await connector.stmtInit();
|
|
@@ -315,8 +316,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
315
316
|
});
|
|
316
317
|
test("no set tag", async () => {
|
|
317
318
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
318
|
-
conf.setUser(
|
|
319
|
-
conf.setPwd(
|
|
319
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
320
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
320
321
|
conf.setDb("power_func_stmt1");
|
|
321
322
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
322
323
|
let stmt = await connector.stmtInit();
|
|
@@ -345,8 +346,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
345
346
|
});
|
|
346
347
|
test("normal binary BindParam", async () => {
|
|
347
348
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
348
|
-
conf.setUser(
|
|
349
|
-
conf.setPwd(
|
|
349
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
350
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
350
351
|
conf.setDb("power_func_stmt1");
|
|
351
352
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
352
353
|
let stmt = await connector.stmtInit();
|
|
@@ -374,8 +375,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
374
375
|
});
|
|
375
376
|
test("normal json BindParam", async () => {
|
|
376
377
|
let conf = new config_1.WSConfig(dns, "100.100.100.100");
|
|
377
|
-
conf.setUser(
|
|
378
|
-
conf.setPwd(
|
|
378
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
379
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
379
380
|
conf.setDb("power_func_stmt1");
|
|
380
381
|
let connector = await wsSql_1.WsSql.open(conf);
|
|
381
382
|
let stmt = await connector.stmtInit();
|
|
@@ -408,8 +409,8 @@ describe("TDWebSocket.Stmt()", () => {
|
|
|
408
409
|
});
|
|
409
410
|
afterAll(async () => {
|
|
410
411
|
let conf = new config_1.WSConfig(dns);
|
|
411
|
-
conf.setUser(
|
|
412
|
-
conf.setPwd(
|
|
412
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
413
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
413
414
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
414
415
|
await wsSql.exec("drop database power_func_stmt1");
|
|
415
416
|
await wsSql.close();
|
|
@@ -148,7 +148,7 @@ const selectTable = `select * from ${table}`;
|
|
|
148
148
|
const selectTableCN = `select * from ${tableCN}`;
|
|
149
149
|
const selectJsonTable = `select * from ${jsonTable}`;
|
|
150
150
|
const selectJsonTableCN = `select * from ${jsonTableCN}`;
|
|
151
|
-
let dsn =
|
|
151
|
+
let dsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@localhost:6041`;
|
|
152
152
|
(0, log_1.setLevel)("debug");
|
|
153
153
|
beforeAll(async () => {
|
|
154
154
|
let conf = new config_1.WSConfig(dsn);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stmt2.failover.test.d.ts","sourceRoot":"","sources":["../../../test/bulkPulling/stmt2.failover.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const wsStmt2_1 = require("../../src/stmt/wsStmt2");
|
|
37
|
+
const wsProto = __importStar(require("../../src/stmt/wsProto"));
|
|
38
|
+
const Step = {
|
|
39
|
+
INIT: 0,
|
|
40
|
+
PREPARE: 1,
|
|
41
|
+
BIND: 2,
|
|
42
|
+
EXEC: 3,
|
|
43
|
+
RESULT: 4,
|
|
44
|
+
};
|
|
45
|
+
function createMockWsClient() {
|
|
46
|
+
return {
|
|
47
|
+
getState: jest.fn(() => 1),
|
|
48
|
+
connect: jest.fn(async () => { }),
|
|
49
|
+
checkVersion: jest.fn(async () => { }),
|
|
50
|
+
exec: jest.fn(async () => ({
|
|
51
|
+
totalTime: 0,
|
|
52
|
+
msg: {
|
|
53
|
+
code: 0,
|
|
54
|
+
message: "",
|
|
55
|
+
timing: 0,
|
|
56
|
+
stmt_id: 1,
|
|
57
|
+
is_insert: false,
|
|
58
|
+
fields_count: 1,
|
|
59
|
+
},
|
|
60
|
+
})),
|
|
61
|
+
execNoResp: jest.fn(async () => { }),
|
|
62
|
+
sendBinaryMsg: jest.fn(async () => ({
|
|
63
|
+
totalTime: 0,
|
|
64
|
+
msg: {
|
|
65
|
+
code: 0,
|
|
66
|
+
message: "",
|
|
67
|
+
timing: 0,
|
|
68
|
+
stmt_id: 1,
|
|
69
|
+
affected: 0,
|
|
70
|
+
},
|
|
71
|
+
})),
|
|
72
|
+
waitForReady: jest.fn(async () => { }),
|
|
73
|
+
isNetworkError: jest.fn((_err) => false),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function createBareStmt() {
|
|
77
|
+
const wsClient = createMockWsClient();
|
|
78
|
+
const stmt = new wsStmt2_1.WsStmt2(wsClient);
|
|
79
|
+
stmt._stmt_id = 1n;
|
|
80
|
+
return {
|
|
81
|
+
stmt,
|
|
82
|
+
wsClient,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function makeExecReady(stmt) {
|
|
86
|
+
const tableInfo = {
|
|
87
|
+
getParams: () => ({ ok: true }),
|
|
88
|
+
};
|
|
89
|
+
stmt._currentTableInfo = tableInfo;
|
|
90
|
+
stmt._stmtTableInfoList = [tableInfo];
|
|
91
|
+
stmt._toBeBindTagCount = 0;
|
|
92
|
+
stmt._toBeBindColCount = 0;
|
|
93
|
+
stmt._toBeBindTableNameIndex = undefined;
|
|
94
|
+
}
|
|
95
|
+
function makeSavedBindBytes(reqId = 0n, stmtId = 1n) {
|
|
96
|
+
const bytes = new ArrayBuffer(16);
|
|
97
|
+
const view = new DataView(bytes);
|
|
98
|
+
view.setBigUint64(0, reqId, true);
|
|
99
|
+
view.setBigUint64(8, stmtId, true);
|
|
100
|
+
return bytes;
|
|
101
|
+
}
|
|
102
|
+
describe("WsStmt2 failover", () => {
|
|
103
|
+
afterEach(() => {
|
|
104
|
+
jest.restoreAllMocks();
|
|
105
|
+
});
|
|
106
|
+
test("prepare caches sql and rebuilds on network error", async () => {
|
|
107
|
+
const { stmt, wsClient } = createBareStmt();
|
|
108
|
+
const networkError = new Error("socket closed");
|
|
109
|
+
wsClient.isNetworkError.mockReturnValue(true);
|
|
110
|
+
jest.spyOn(stmt, "doPrepare").mockRejectedValueOnce(networkError);
|
|
111
|
+
const rebuildSpy = jest
|
|
112
|
+
.spyOn(stmt, "rebuildContext")
|
|
113
|
+
.mockResolvedValue(undefined);
|
|
114
|
+
const sql = "select * from meters where ts > ?";
|
|
115
|
+
await stmt.prepare(sql);
|
|
116
|
+
expect(stmt._savedSql).toBe(sql);
|
|
117
|
+
expect(rebuildSpy).toHaveBeenCalledWith(Step.PREPARE);
|
|
118
|
+
});
|
|
119
|
+
test("exec caches bind bytes and rebuilds on network error", async () => {
|
|
120
|
+
const { stmt, wsClient } = createBareStmt();
|
|
121
|
+
const networkError = new Error("cannot call send() while not connected");
|
|
122
|
+
const bindBytes = new Uint8Array([1, 2, 3]).buffer;
|
|
123
|
+
makeExecReady(stmt);
|
|
124
|
+
stmt._isInsert = false;
|
|
125
|
+
wsClient.isNetworkError.mockReturnValue(true);
|
|
126
|
+
jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
|
|
127
|
+
jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(networkError);
|
|
128
|
+
jest.spyOn(stmt, "rebuildContext").mockResolvedValue(undefined);
|
|
129
|
+
const cleanupSpy = jest.spyOn(stmt, "cleanup");
|
|
130
|
+
await stmt.exec();
|
|
131
|
+
expect(stmt._savedBindBytes).toBe(bindBytes);
|
|
132
|
+
expect(stmt.rebuildContext).toHaveBeenCalledWith(Step.BIND);
|
|
133
|
+
expect(cleanupSpy).not.toHaveBeenCalled();
|
|
134
|
+
});
|
|
135
|
+
test("exec only cleans up immediately for insert statements", async () => {
|
|
136
|
+
const bindBytes = new Uint8Array([7, 8, 9]).buffer;
|
|
137
|
+
const insertCtx = createBareStmt();
|
|
138
|
+
const insertStmt = insertCtx.stmt;
|
|
139
|
+
makeExecReady(insertStmt);
|
|
140
|
+
insertStmt._isInsert = true;
|
|
141
|
+
jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
|
|
142
|
+
jest.spyOn(insertStmt, "doSendBindBytes").mockResolvedValue(undefined);
|
|
143
|
+
jest.spyOn(insertStmt, "doExec").mockResolvedValue(undefined);
|
|
144
|
+
const insertCleanupSpy = jest.spyOn(insertStmt, "cleanup");
|
|
145
|
+
await insertStmt.exec();
|
|
146
|
+
expect(insertCleanupSpy).toHaveBeenCalledTimes(1);
|
|
147
|
+
const queryCtx = createBareStmt();
|
|
148
|
+
const queryStmt = queryCtx.stmt;
|
|
149
|
+
makeExecReady(queryStmt);
|
|
150
|
+
queryStmt._isInsert = false;
|
|
151
|
+
jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
|
|
152
|
+
jest.spyOn(queryStmt, "doSendBindBytes").mockResolvedValue(undefined);
|
|
153
|
+
jest.spyOn(queryStmt, "doExec").mockResolvedValue(undefined);
|
|
154
|
+
const queryCleanupSpy = jest.spyOn(queryStmt, "cleanup");
|
|
155
|
+
await queryStmt.exec();
|
|
156
|
+
expect(queryCleanupSpy).not.toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
test("exec cleans up insert cache even when failover rebuild fails", async () => {
|
|
159
|
+
const { stmt, wsClient } = createBareStmt();
|
|
160
|
+
const networkError = new Error("cannot call send() while not connected");
|
|
161
|
+
const rebuildError = new Error("rebuild failed");
|
|
162
|
+
const bindBytes = new Uint8Array([1, 2, 3]).buffer;
|
|
163
|
+
makeExecReady(stmt);
|
|
164
|
+
stmt._isInsert = true;
|
|
165
|
+
wsClient.isNetworkError.mockReturnValue(true);
|
|
166
|
+
jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
|
|
167
|
+
jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(networkError);
|
|
168
|
+
jest.spyOn(stmt, "rebuildContext").mockRejectedValueOnce(rebuildError);
|
|
169
|
+
const cleanupSpy = jest.spyOn(stmt, "cleanup");
|
|
170
|
+
await expect(stmt.exec()).rejects.toThrow("rebuild failed");
|
|
171
|
+
expect(cleanupSpy).toHaveBeenCalledTimes(1);
|
|
172
|
+
});
|
|
173
|
+
test("resultSet rebuilds on network error and cleans up", async () => {
|
|
174
|
+
const { stmt, wsClient } = createBareStmt();
|
|
175
|
+
const networkError = new Error("connection reset");
|
|
176
|
+
const rebuiltRows = { id: "rebuilt" };
|
|
177
|
+
wsClient.isNetworkError.mockReturnValue(true);
|
|
178
|
+
jest.spyOn(stmt, "doResult").mockRejectedValueOnce(networkError);
|
|
179
|
+
const rebuildSpy = jest
|
|
180
|
+
.spyOn(stmt, "rebuildContext")
|
|
181
|
+
.mockResolvedValue(rebuiltRows);
|
|
182
|
+
const cleanupSpy = jest.spyOn(stmt, "cleanup");
|
|
183
|
+
const result = await stmt.resultSet();
|
|
184
|
+
expect(result).toBe(rebuiltRows);
|
|
185
|
+
expect(rebuildSpy).toHaveBeenCalledWith(Step.RESULT);
|
|
186
|
+
expect(cleanupSpy).toHaveBeenCalledTimes(1);
|
|
187
|
+
});
|
|
188
|
+
test("non-network errors are rethrown without rebuild in prepare", async () => {
|
|
189
|
+
const { stmt, wsClient } = createBareStmt();
|
|
190
|
+
const nonNetworkError = new Error("invalid sql");
|
|
191
|
+
wsClient.isNetworkError.mockReturnValue(false);
|
|
192
|
+
jest.spyOn(stmt, "doPrepare").mockRejectedValueOnce(nonNetworkError);
|
|
193
|
+
const rebuildSpy = jest
|
|
194
|
+
.spyOn(stmt, "rebuildContext")
|
|
195
|
+
.mockResolvedValue(undefined);
|
|
196
|
+
await expect(stmt.prepare("bad sql")).rejects.toThrow("invalid sql");
|
|
197
|
+
expect(rebuildSpy).not.toHaveBeenCalled();
|
|
198
|
+
});
|
|
199
|
+
test("non-network errors are rethrown without rebuild in exec", async () => {
|
|
200
|
+
const { stmt, wsClient } = createBareStmt();
|
|
201
|
+
const bindBytes = new Uint8Array([4, 5, 6]).buffer;
|
|
202
|
+
const nonNetworkError = new Error("invalid bind");
|
|
203
|
+
makeExecReady(stmt);
|
|
204
|
+
stmt._isInsert = false;
|
|
205
|
+
wsClient.isNetworkError.mockReturnValue(false);
|
|
206
|
+
jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
|
|
207
|
+
jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(nonNetworkError);
|
|
208
|
+
const rebuildSpy = jest
|
|
209
|
+
.spyOn(stmt, "rebuildContext")
|
|
210
|
+
.mockResolvedValue(undefined);
|
|
211
|
+
await expect(stmt.exec()).rejects.toThrow("invalid bind");
|
|
212
|
+
expect(rebuildSpy).not.toHaveBeenCalled();
|
|
213
|
+
});
|
|
214
|
+
test("non-network errors are rethrown without rebuild in resultSet", async () => {
|
|
215
|
+
const { stmt, wsClient } = createBareStmt();
|
|
216
|
+
const nonNetworkError = new Error("result failed");
|
|
217
|
+
wsClient.isNetworkError.mockReturnValue(false);
|
|
218
|
+
jest.spyOn(stmt, "doResult").mockRejectedValueOnce(nonNetworkError);
|
|
219
|
+
const rebuildSpy = jest
|
|
220
|
+
.spyOn(stmt, "rebuildContext")
|
|
221
|
+
.mockResolvedValue(undefined);
|
|
222
|
+
await expect(stmt.resultSet()).rejects.toThrow("result failed");
|
|
223
|
+
expect(rebuildSpy).not.toHaveBeenCalled();
|
|
224
|
+
});
|
|
225
|
+
test("rebuildContext replays steps in order to EXEC", async () => {
|
|
226
|
+
const { stmt } = createBareStmt();
|
|
227
|
+
const callOrder = [];
|
|
228
|
+
stmt._savedSql = "insert into t values(?, ?)";
|
|
229
|
+
stmt._savedBindBytes = makeSavedBindBytes();
|
|
230
|
+
jest.spyOn(stmt, "doInit").mockImplementation(async () => {
|
|
231
|
+
callOrder.push("init");
|
|
232
|
+
});
|
|
233
|
+
jest.spyOn(stmt, "doPrepare").mockImplementation(async () => {
|
|
234
|
+
callOrder.push("prepare");
|
|
235
|
+
});
|
|
236
|
+
jest.spyOn(stmt, "doSendBindBytes").mockImplementation(async () => {
|
|
237
|
+
callOrder.push("bind");
|
|
238
|
+
});
|
|
239
|
+
jest.spyOn(stmt, "doExec").mockImplementation(async () => {
|
|
240
|
+
callOrder.push("exec");
|
|
241
|
+
});
|
|
242
|
+
jest.spyOn(stmt, "doResult").mockImplementation(async () => {
|
|
243
|
+
callOrder.push("result");
|
|
244
|
+
return { rows: 1 };
|
|
245
|
+
});
|
|
246
|
+
await stmt.rebuildContext(Step.EXEC);
|
|
247
|
+
expect(callOrder).toEqual(["init", "prepare", "bind", "exec"]);
|
|
248
|
+
});
|
|
249
|
+
test("rebuildContext can rebuild to RESULT and return rows", async () => {
|
|
250
|
+
const { stmt } = createBareStmt();
|
|
251
|
+
const rows = { data: [1, 2, 3] };
|
|
252
|
+
stmt._savedSql = "select * from t where ts > ?";
|
|
253
|
+
stmt._savedBindBytes = makeSavedBindBytes();
|
|
254
|
+
jest.spyOn(stmt, "doInit").mockResolvedValue(undefined);
|
|
255
|
+
jest.spyOn(stmt, "doPrepare").mockResolvedValue(undefined);
|
|
256
|
+
jest.spyOn(stmt, "doSendBindBytes").mockResolvedValue(undefined);
|
|
257
|
+
jest.spyOn(stmt, "doExec").mockResolvedValue(undefined);
|
|
258
|
+
jest.spyOn(stmt, "doResult").mockResolvedValue(rows);
|
|
259
|
+
const result = await stmt.rebuildContext(Step.RESULT);
|
|
260
|
+
expect(result).toBe(rows);
|
|
261
|
+
});
|
|
262
|
+
test("buildReplayBindBytes rewrites req_id and stmt_id", () => {
|
|
263
|
+
const { stmt } = createBareStmt();
|
|
264
|
+
const originalBytes = makeSavedBindBytes(0n, 5n);
|
|
265
|
+
stmt._savedBindBytes = originalBytes;
|
|
266
|
+
stmt._stmt_id = 42n;
|
|
267
|
+
const replayBytes = stmt.buildReplayBindBytes();
|
|
268
|
+
const originalView = new DataView(originalBytes);
|
|
269
|
+
const replayView = new DataView(replayBytes);
|
|
270
|
+
expect(replayBytes).not.toBe(originalBytes);
|
|
271
|
+
expect(originalView.getBigUint64(8, true)).toBe(5n);
|
|
272
|
+
expect(replayView.getBigUint64(8, true)).toBe(42n);
|
|
273
|
+
expect(replayView.getBigUint64(0, true)).not.toBe(0n);
|
|
274
|
+
});
|
|
275
|
+
test("rebuildContext retries when rebuild gets another network error", async () => {
|
|
276
|
+
const { stmt, wsClient } = createBareStmt();
|
|
277
|
+
const networkError = new Error("connection reset");
|
|
278
|
+
stmt._savedSql = "select * from t";
|
|
279
|
+
stmt._savedBindBytes = new Uint8Array([2, 4, 6]).buffer;
|
|
280
|
+
wsClient.isNetworkError.mockImplementation((err) => err === networkError);
|
|
281
|
+
const initSpy = jest
|
|
282
|
+
.spyOn(stmt, "doInit")
|
|
283
|
+
.mockRejectedValueOnce(networkError)
|
|
284
|
+
.mockResolvedValue(undefined);
|
|
285
|
+
const prepareSpy = jest.spyOn(stmt, "doPrepare").mockResolvedValue(undefined);
|
|
286
|
+
await stmt.rebuildContext(Step.PREPARE);
|
|
287
|
+
expect(initSpy).toHaveBeenCalledTimes(2);
|
|
288
|
+
expect(prepareSpy).toHaveBeenCalledTimes(1);
|
|
289
|
+
expect(wsClient.waitForReady).toHaveBeenCalledTimes(2);
|
|
290
|
+
});
|
|
291
|
+
test("rebuildContext throws after max network retry attempts", async () => {
|
|
292
|
+
const { stmt, wsClient } = createBareStmt();
|
|
293
|
+
const networkError = new Error("connection reset");
|
|
294
|
+
stmt._savedSql = "select * from t";
|
|
295
|
+
stmt._savedBindBytes = makeSavedBindBytes();
|
|
296
|
+
wsClient.isNetworkError.mockReturnValue(true);
|
|
297
|
+
const initSpy = jest
|
|
298
|
+
.spyOn(stmt, "doInit")
|
|
299
|
+
.mockRejectedValue(networkError);
|
|
300
|
+
await expect(stmt.rebuildContext(Step.INIT)).rejects.toThrow("connection reset");
|
|
301
|
+
expect(initSpy).toHaveBeenCalledTimes(3);
|
|
302
|
+
expect(wsClient.waitForReady).toHaveBeenCalledTimes(3);
|
|
303
|
+
});
|
|
304
|
+
test("rebuildContext throws on non-network error", async () => {
|
|
305
|
+
const { stmt, wsClient } = createBareStmt();
|
|
306
|
+
const nonNetworkError = new Error("permission denied");
|
|
307
|
+
stmt._savedSql = "select * from t";
|
|
308
|
+
stmt._savedBindBytes = new Uint8Array([9, 9, 9]).buffer;
|
|
309
|
+
wsClient.isNetworkError.mockReturnValue(false);
|
|
310
|
+
jest.spyOn(stmt, "doInit").mockRejectedValueOnce(nonNetworkError);
|
|
311
|
+
await expect(stmt.rebuildContext(Step.INIT)).rejects.toThrow("permission denied");
|
|
312
|
+
});
|
|
313
|
+
});
|