@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,404 @@
|
|
|
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 constant_1 = require("@src/tmq/constant");
|
|
7
|
+
const wsTmq_1 = require("@src/tmq/wsTmq");
|
|
8
|
+
const utils_1 = require("@test-helpers/utils");
|
|
9
|
+
const wsProxy_1 = require("@test-helpers/wsProxy");
|
|
10
|
+
function parseJsonAction(rawData) {
|
|
11
|
+
if (typeof rawData !== "string") {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(rawData);
|
|
16
|
+
return typeof parsed.action === "string" ? parsed.action : null;
|
|
17
|
+
}
|
|
18
|
+
catch (_err) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
describe("tmq failover", () => {
|
|
23
|
+
jest.setTimeout(120 * 1000);
|
|
24
|
+
afterEach(async () => {
|
|
25
|
+
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
26
|
+
jest.restoreAllMocks();
|
|
27
|
+
});
|
|
28
|
+
test("tmq failover recovers subscribe context and replays inflight poll", async () => {
|
|
29
|
+
const dbName = "test_1774096925";
|
|
30
|
+
const tableName = "t0";
|
|
31
|
+
const topicName = "topic_1774096925";
|
|
32
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
33
|
+
let setupSql = null;
|
|
34
|
+
let cleanupSql = null;
|
|
35
|
+
let consumer = null;
|
|
36
|
+
let restartTriggered = false;
|
|
37
|
+
let proxyAHadActivity = false;
|
|
38
|
+
setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
39
|
+
try {
|
|
40
|
+
await setupSql.exec(`drop topic if exists ${topicName}`);
|
|
41
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
42
|
+
await setupSql.exec(`create database ${dbName}`);
|
|
43
|
+
await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
|
|
44
|
+
await setupSql.exec(`insert into ${dbName}.${tableName} values(now - 1s, 1) (now, 2)`);
|
|
45
|
+
await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await setupSql.close();
|
|
49
|
+
setupSql = null;
|
|
50
|
+
}
|
|
51
|
+
const proxyA = await wsProxy_1.WsProxy.create({
|
|
52
|
+
host: "127.0.0.1",
|
|
53
|
+
port: 0,
|
|
54
|
+
onEvent: (event) => {
|
|
55
|
+
if (event.type === "client_connected") {
|
|
56
|
+
proxyAHadActivity = true;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (event.type === "message" &&
|
|
60
|
+
event.direction === "client_to_upstream") {
|
|
61
|
+
proxyAHadActivity = true;
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
const proxyB = await wsProxy_1.WsProxy.create({
|
|
66
|
+
host: "127.0.0.1",
|
|
67
|
+
port: 0,
|
|
68
|
+
onEvent: (event, control) => {
|
|
69
|
+
if (event.type !== "message") {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (event.direction !== "client_to_upstream") {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const action = parseJsonAction(event.rawData);
|
|
76
|
+
if (action === "poll" && !restartTriggered) {
|
|
77
|
+
restartTriggered = true;
|
|
78
|
+
void control.restart({
|
|
79
|
+
downtimeMs: 800,
|
|
80
|
+
reason: "trigger tmq poll failover",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
const tmqConf = new Map([
|
|
86
|
+
[constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
|
|
87
|
+
[constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
|
|
88
|
+
[constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
|
|
89
|
+
[constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
|
|
90
|
+
[constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
|
|
91
|
+
[constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
|
|
92
|
+
[constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
|
|
93
|
+
[constant_1.TMQConstants.WS_URL,
|
|
94
|
+
`ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
95
|
+
`@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()}` +
|
|
96
|
+
`?retries=5&retry_backoff_ms=20&retry_backoff_max_ms=20`
|
|
97
|
+
],
|
|
98
|
+
]);
|
|
99
|
+
const randomSpy = jest.spyOn(Math, "random").mockReturnValue(0);
|
|
100
|
+
try {
|
|
101
|
+
consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
|
|
102
|
+
await consumer.subscribe([topicName]);
|
|
103
|
+
let rows = 0;
|
|
104
|
+
for (let i = 0; i < 8 && rows === 0; i++) {
|
|
105
|
+
const res = await consumer.poll(800);
|
|
106
|
+
for (const [, value] of res) {
|
|
107
|
+
const data = value.getData();
|
|
108
|
+
rows += data?.length || 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
expect(restartTriggered).toBe(true);
|
|
112
|
+
expect(proxyAHadActivity).toBe(true);
|
|
113
|
+
expect(rows).toBeGreaterThan(0);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
if (consumer) {
|
|
117
|
+
try {
|
|
118
|
+
await consumer.unsubscribe();
|
|
119
|
+
}
|
|
120
|
+
catch (_err) {
|
|
121
|
+
// ignore cleanup error
|
|
122
|
+
}
|
|
123
|
+
await consumer.close();
|
|
124
|
+
}
|
|
125
|
+
await Promise.all([
|
|
126
|
+
proxyA.stop("test cleanup"),
|
|
127
|
+
proxyB.stop("test cleanup"),
|
|
128
|
+
]);
|
|
129
|
+
randomSpy.mockRestore();
|
|
130
|
+
cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
131
|
+
try {
|
|
132
|
+
await cleanupSql.exec(`drop topic if exists ${topicName}`);
|
|
133
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await cleanupSql.close();
|
|
137
|
+
cleanupSql = null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}, 180 * 1000);
|
|
141
|
+
test("tmq single-address reconnect resumes poll and consumes all 5000 rows", async () => {
|
|
142
|
+
const targetRows = 5000;
|
|
143
|
+
const batchSize = 1000;
|
|
144
|
+
const baseTs = 1700020000000;
|
|
145
|
+
const dbName = "test_1774186545";
|
|
146
|
+
const tableName = "t0";
|
|
147
|
+
const topicName = "topic_1774186545";
|
|
148
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
149
|
+
let setupSql = null;
|
|
150
|
+
let cleanupSql = null;
|
|
151
|
+
let consumer = null;
|
|
152
|
+
let pollRequestCount = 0;
|
|
153
|
+
let restartInFlight = false;
|
|
154
|
+
let restartCount = 0;
|
|
155
|
+
setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
156
|
+
try {
|
|
157
|
+
await setupSql.exec(`drop topic if exists ${topicName}`);
|
|
158
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
159
|
+
await setupSql.exec(`create database ${dbName}`);
|
|
160
|
+
await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
|
|
161
|
+
for (let start = 0; start < targetRows; start += batchSize) {
|
|
162
|
+
const end = Math.min(start + batchSize, targetRows);
|
|
163
|
+
const values = [];
|
|
164
|
+
for (let i = start; i < end; i++) {
|
|
165
|
+
values.push(`(${baseTs + i}, ${i})`);
|
|
166
|
+
}
|
|
167
|
+
await setupSql.exec(`insert into ${dbName}.${tableName} values ${values.join(" ")}`);
|
|
168
|
+
}
|
|
169
|
+
await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
await setupSql.close();
|
|
173
|
+
setupSql = null;
|
|
174
|
+
}
|
|
175
|
+
const proxy = await wsProxy_1.WsProxy.create({
|
|
176
|
+
host: "127.0.0.1",
|
|
177
|
+
port: 0,
|
|
178
|
+
onEvent: (event, control) => {
|
|
179
|
+
if (event.type !== "message") {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (event.direction !== "client_to_upstream") {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const action = parseJsonAction(event.rawData);
|
|
186
|
+
if (action !== "poll") {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
pollRequestCount += 1;
|
|
190
|
+
if (restartInFlight) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const shouldRestart = Math.random() < 0.18 ||
|
|
194
|
+
(restartCount === 0 && pollRequestCount >= 1);
|
|
195
|
+
if (!shouldRestart) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
restartInFlight = true;
|
|
199
|
+
restartCount += 1;
|
|
200
|
+
const downtimeMs = 20 + Math.floor(Math.random() * 90);
|
|
201
|
+
void control.restart({
|
|
202
|
+
downtimeMs,
|
|
203
|
+
reason: `random poll restart #${restartCount}`,
|
|
204
|
+
}).finally(() => {
|
|
205
|
+
restartInFlight = false;
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
const tmqConf = new Map([
|
|
210
|
+
[constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
|
|
211
|
+
[constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
|
|
212
|
+
[constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
|
|
213
|
+
[constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
|
|
214
|
+
[constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
|
|
215
|
+
[constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
|
|
216
|
+
[constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
|
|
217
|
+
[constant_1.TMQConstants.WS_URL,
|
|
218
|
+
`ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
219
|
+
`@127.0.0.1:${proxy.getPort()}` +
|
|
220
|
+
`?retries=60&retry_backoff_ms=10&retry_backoff_max_ms=40`
|
|
221
|
+
],
|
|
222
|
+
]);
|
|
223
|
+
try {
|
|
224
|
+
consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
|
|
225
|
+
await consumer.subscribe([topicName]);
|
|
226
|
+
let consumedRows = 0;
|
|
227
|
+
const deadline = Date.now() + 120 * 1000;
|
|
228
|
+
while (Date.now() < deadline && consumedRows < targetRows) {
|
|
229
|
+
const res = await consumer.poll(1200);
|
|
230
|
+
for (const [, value] of res) {
|
|
231
|
+
const data = value.getData();
|
|
232
|
+
consumedRows += data?.length || 0;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
expect(pollRequestCount).toBeGreaterThan(0);
|
|
236
|
+
expect(restartCount).toBeGreaterThan(0);
|
|
237
|
+
expect(consumedRows).toBe(targetRows);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
if (consumer) {
|
|
241
|
+
try {
|
|
242
|
+
await consumer.unsubscribe();
|
|
243
|
+
}
|
|
244
|
+
catch (_err) {
|
|
245
|
+
// ignore cleanup error
|
|
246
|
+
}
|
|
247
|
+
await consumer.close();
|
|
248
|
+
}
|
|
249
|
+
await proxy.stop("test cleanup");
|
|
250
|
+
cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
251
|
+
try {
|
|
252
|
+
await cleanupSql.exec(`drop topic if exists ${topicName}`);
|
|
253
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
await cleanupSql.close();
|
|
257
|
+
cleanupSql = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}, 300 * 1000);
|
|
261
|
+
test("tmq three-address failover resumes poll and consumes all 5000 rows", async () => {
|
|
262
|
+
const targetRows = 5000;
|
|
263
|
+
const batchSize = 1000;
|
|
264
|
+
const baseTs = 1700021000000;
|
|
265
|
+
const dbName = "test_1774187557";
|
|
266
|
+
const tableName = "t0";
|
|
267
|
+
const topicName = "topic_1774187557";
|
|
268
|
+
const localDsn = `ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}@127.0.0.1:6041`;
|
|
269
|
+
let setupSql = null;
|
|
270
|
+
let cleanupSql = null;
|
|
271
|
+
let consumer = null;
|
|
272
|
+
let totalPollRequestCount = 0;
|
|
273
|
+
let totalRestartCount = 0;
|
|
274
|
+
const proxyStates = new Map();
|
|
275
|
+
setupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
276
|
+
try {
|
|
277
|
+
await setupSql.exec(`drop topic if exists ${topicName}`);
|
|
278
|
+
await setupSql.exec(`drop database if exists ${dbName}`);
|
|
279
|
+
await setupSql.exec(`create database ${dbName}`);
|
|
280
|
+
await setupSql.exec(`create table ${dbName}.${tableName}(ts timestamp, c1 int)`);
|
|
281
|
+
for (let start = 0; start < targetRows; start += batchSize) {
|
|
282
|
+
const end = Math.min(start + batchSize, targetRows);
|
|
283
|
+
const values = [];
|
|
284
|
+
for (let i = start; i < end; i++) {
|
|
285
|
+
values.push(`(${baseTs + i}, ${i})`);
|
|
286
|
+
}
|
|
287
|
+
await setupSql.exec(`insert into ${dbName}.${tableName} values ${values.join(" ")}`);
|
|
288
|
+
}
|
|
289
|
+
await setupSql.exec(`create topic ${topicName} as select * from ${dbName}.${tableName}`);
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
await setupSql.close();
|
|
293
|
+
setupSql = null;
|
|
294
|
+
}
|
|
295
|
+
const createPollRestartProxy = async (name) => {
|
|
296
|
+
proxyStates.set(name, {
|
|
297
|
+
pollRequests: 0,
|
|
298
|
+
restarts: 0,
|
|
299
|
+
restartInFlight: false,
|
|
300
|
+
});
|
|
301
|
+
return wsProxy_1.WsProxy.create({
|
|
302
|
+
host: "127.0.0.1",
|
|
303
|
+
port: 0,
|
|
304
|
+
onEvent: (event, control) => {
|
|
305
|
+
if (event.type !== "message") {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (event.direction !== "client_to_upstream") {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const action = parseJsonAction(event.rawData);
|
|
312
|
+
if (action !== "poll") {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const state = proxyStates.get(name);
|
|
316
|
+
if (!state) {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
state.pollRequests += 1;
|
|
320
|
+
totalPollRequestCount += 1;
|
|
321
|
+
if (state.restartInFlight) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const shouldRestart = Math.random() < 0.18 ||
|
|
325
|
+
(totalRestartCount === 0 && totalPollRequestCount >= 1);
|
|
326
|
+
if (!shouldRestart) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
state.restartInFlight = true;
|
|
330
|
+
state.restarts += 1;
|
|
331
|
+
totalRestartCount += 1;
|
|
332
|
+
const downtimeMs = 20 + Math.floor(Math.random() * 90);
|
|
333
|
+
void control.restart({
|
|
334
|
+
downtimeMs,
|
|
335
|
+
reason: `${name} random poll restart #${state.restarts}`,
|
|
336
|
+
}).finally(() => {
|
|
337
|
+
const latest = proxyStates.get(name);
|
|
338
|
+
if (latest) {
|
|
339
|
+
latest.restartInFlight = false;
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
};
|
|
345
|
+
const proxyA = await createPollRestartProxy("proxy_a");
|
|
346
|
+
const proxyB = await createPollRestartProxy("proxy_b");
|
|
347
|
+
const proxyC = await createPollRestartProxy("proxy_c");
|
|
348
|
+
const tmqConf = new Map([
|
|
349
|
+
[constant_1.TMQConstants.GROUP_ID, `g_${Date.now()}`],
|
|
350
|
+
[constant_1.TMQConstants.CLIENT_ID, `c_${Date.now()}`],
|
|
351
|
+
[constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
|
|
352
|
+
[constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
|
|
353
|
+
[constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
|
|
354
|
+
[constant_1.TMQConstants.ENABLE_AUTO_COMMIT, false],
|
|
355
|
+
[constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, 1000],
|
|
356
|
+
[constant_1.TMQConstants.WS_URL,
|
|
357
|
+
`ws://${(0, utils_1.testUsername)()}:${(0, utils_1.testPassword)()}` +
|
|
358
|
+
`@127.0.0.1:${proxyA.getPort()},127.0.0.1:${proxyB.getPort()},127.0.0.1:${proxyC.getPort()}` +
|
|
359
|
+
`?retries=60&retry_backoff_ms=10&retry_backoff_max_ms=40`
|
|
360
|
+
],
|
|
361
|
+
]);
|
|
362
|
+
try {
|
|
363
|
+
consumer = await wsTmq_1.WsConsumer.newConsumer(tmqConf);
|
|
364
|
+
await consumer.subscribe([topicName]);
|
|
365
|
+
let consumedRows = 0;
|
|
366
|
+
const deadline = Date.now() + 120 * 1000;
|
|
367
|
+
while (Date.now() < deadline && consumedRows < targetRows) {
|
|
368
|
+
const res = await consumer.poll(1200);
|
|
369
|
+
for (const [, value] of res) {
|
|
370
|
+
const data = value.getData();
|
|
371
|
+
consumedRows += data?.length || 0;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
expect(totalPollRequestCount).toBeGreaterThan(0);
|
|
375
|
+
expect(totalRestartCount).toBeGreaterThan(0);
|
|
376
|
+
expect(consumedRows).toBe(targetRows);
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
if (consumer) {
|
|
380
|
+
try {
|
|
381
|
+
await consumer.unsubscribe();
|
|
382
|
+
}
|
|
383
|
+
catch (_err) {
|
|
384
|
+
// ignore cleanup error
|
|
385
|
+
}
|
|
386
|
+
await consumer.close();
|
|
387
|
+
}
|
|
388
|
+
await Promise.all([
|
|
389
|
+
proxyA.stop("test cleanup"),
|
|
390
|
+
proxyB.stop("test cleanup"),
|
|
391
|
+
proxyC.stop("test cleanup"),
|
|
392
|
+
]);
|
|
393
|
+
cleanupSql = await wsSql_1.WsSql.open(new config_1.WSConfig(localDsn));
|
|
394
|
+
try {
|
|
395
|
+
await cleanupSql.exec(`drop topic if exists ${topicName}`);
|
|
396
|
+
await cleanupSql.exec(`drop database if exists ${dbName}`);
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
await cleanupSql.close();
|
|
400
|
+
cleanupSql = null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}, 300 * 1000);
|
|
404
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmq.cloud.test.d.ts","sourceRoot":"","sources":["../../../test/tmq/tmq.cloud.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const constant_1 = require("@src/tmq/constant");
|
|
4
|
+
const wsTmq_1 = require("@src/tmq/wsTmq");
|
|
5
|
+
const wsConnectorPool_1 = require("@src/client/wsConnectorPool");
|
|
6
|
+
const log_1 = require("@src/common/log");
|
|
7
|
+
const config_1 = require("@src/common/config");
|
|
8
|
+
const wsSql_1 = require("@src/sql/wsSql");
|
|
9
|
+
const utils_1 = require("@test-helpers/utils");
|
|
10
|
+
const url = (0, utils_1.testCloudWsUrl)();
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
if (!url) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let wsSql = null;
|
|
16
|
+
try {
|
|
17
|
+
const conf = new config_1.WSConfig(url);
|
|
18
|
+
conf.setUser((0, utils_1.testUsername)());
|
|
19
|
+
conf.setPwd((0, utils_1.testPassword)());
|
|
20
|
+
wsSql = await wsSql_1.WsSql.open(conf);
|
|
21
|
+
let sql = `INSERT INTO dmeters.d1001 USING dmeters.meters (groupid, location) TAGS(2, 'SanFrancisco')
|
|
22
|
+
VALUES (NOW + 1a, 10.30000, 219, 0.31000) (NOW + 2a, 12.60000, 218, 0.33000) (NOW + 3a, 12.30000, 221, 0.31000)
|
|
23
|
+
dmeters.d1002 USING dmeters.meters (groupid, location) TAGS(3, 'SanFrancisco')
|
|
24
|
+
VALUES (NOW + 1a, 10.30000, 218, 0.25000)`;
|
|
25
|
+
let res = await wsSql.exec(sql);
|
|
26
|
+
console.log(res);
|
|
27
|
+
expect(res.getAffectRows()).toBeGreaterThanOrEqual(3);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
if (wsSql) {
|
|
34
|
+
await wsSql.close();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
describe("TDWebSocket.Tmq()", () => {
|
|
39
|
+
jest.setTimeout(20 * 1000);
|
|
40
|
+
(0, utils_1.testCloud)("normal connect", async () => {
|
|
41
|
+
const topic = "topic_meters";
|
|
42
|
+
const topics = [topic];
|
|
43
|
+
const groupId = "group1";
|
|
44
|
+
const clientId = "client1";
|
|
45
|
+
let configMap = new Map([
|
|
46
|
+
[constant_1.TMQConstants.GROUP_ID, groupId],
|
|
47
|
+
[constant_1.TMQConstants.CLIENT_ID, clientId],
|
|
48
|
+
[constant_1.TMQConstants.AUTO_OFFSET_RESET, "earliest"],
|
|
49
|
+
[constant_1.TMQConstants.WS_URL, url],
|
|
50
|
+
[constant_1.TMQConstants.ENABLE_AUTO_COMMIT, "true"],
|
|
51
|
+
[constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS, "1000"],
|
|
52
|
+
]);
|
|
53
|
+
(0, log_1.setLevel)("debug");
|
|
54
|
+
// create consumer
|
|
55
|
+
let consumer = await wsTmq_1.WsConsumer.newConsumer(configMap);
|
|
56
|
+
console.log(`Create consumer successfully, host: ${url}, groupId: ${groupId}, clientId: ${clientId}`);
|
|
57
|
+
// subscribe
|
|
58
|
+
await consumer.subscribe(topics);
|
|
59
|
+
console.log(`Subscribe topics successfully, topics: ${topics}`);
|
|
60
|
+
let res = new Map();
|
|
61
|
+
while (res.size == 0) {
|
|
62
|
+
// poll
|
|
63
|
+
res = await consumer.poll(1000);
|
|
64
|
+
for (let [key, value] of res) {
|
|
65
|
+
// Add your data processing logic here
|
|
66
|
+
console.log(`data: ${key} ${value}`);
|
|
67
|
+
}
|
|
68
|
+
// commit
|
|
69
|
+
await consumer.commit();
|
|
70
|
+
}
|
|
71
|
+
// seek
|
|
72
|
+
let assignment = await consumer.assignment();
|
|
73
|
+
await consumer.seekToBeginning(assignment);
|
|
74
|
+
console.log("Assignment seek to beginning successfully");
|
|
75
|
+
// clean
|
|
76
|
+
await consumer.unsubscribe();
|
|
77
|
+
await consumer.close();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
afterAll(async () => {
|
|
81
|
+
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmq.config.test.d.ts","sourceRoot":"","sources":["../../../test/tmq/tmq.config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config_1 = require("@src/tmq/config");
|
|
4
|
+
const constant_1 = require("@src/tmq/constant");
|
|
5
|
+
const wsTmq_1 = require("@src/tmq/wsTmq");
|
|
6
|
+
const utils_1 = require("@test-helpers/utils");
|
|
7
|
+
const dsn_1 = require("@src/common/dsn");
|
|
8
|
+
describe("TmqConfig with dsn", () => {
|
|
9
|
+
const baseDsn = "ws://localhost:6041";
|
|
10
|
+
test("token field is null when CONNECT_TOKEN is not provided", () => {
|
|
11
|
+
const configMap = new Map([
|
|
12
|
+
[constant_1.TMQConstants.WS_URL, baseDsn],
|
|
13
|
+
[constant_1.TMQConstants.CONNECT_USER, (0, utils_1.testUsername)()],
|
|
14
|
+
[constant_1.TMQConstants.CONNECT_PASS, (0, utils_1.testPassword)()],
|
|
15
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
16
|
+
]);
|
|
17
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
18
|
+
expect(cfg.token).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
test("token field is set when CONNECT_TOKEN is provided", () => {
|
|
21
|
+
const configMap = new Map([
|
|
22
|
+
[constant_1.TMQConstants.WS_URL, baseDsn],
|
|
23
|
+
[constant_1.TMQConstants.CONNECT_TOKEN, "mytoken123"],
|
|
24
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
25
|
+
]);
|
|
26
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
27
|
+
expect(cfg.token).toBe("mytoken123");
|
|
28
|
+
});
|
|
29
|
+
test("writes token into dsn params for both tmq and sql dsn", () => {
|
|
30
|
+
const configMap = new Map([
|
|
31
|
+
[constant_1.TMQConstants.WS_URL, baseDsn],
|
|
32
|
+
[constant_1.TMQConstants.CONNECT_TOKEN, "mytoken123"],
|
|
33
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
34
|
+
]);
|
|
35
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
36
|
+
expect(cfg.dsn?.params.get("bearer_token")).toBe("mytoken123");
|
|
37
|
+
expect(cfg.sqlDsn?.params.get("bearer_token")).toBe("mytoken123");
|
|
38
|
+
});
|
|
39
|
+
test("parses multi-address dsn and keeps connector-level params", () => {
|
|
40
|
+
const configMap = new Map([
|
|
41
|
+
[
|
|
42
|
+
constant_1.TMQConstants.WS_URL,
|
|
43
|
+
"ws://u:p@host1:6041,host2:6042/topicdb?retries=5&retry_backoff_ms=120"
|
|
44
|
+
],
|
|
45
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
46
|
+
]);
|
|
47
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
48
|
+
expect(cfg.dsn?.addresses).toEqual([
|
|
49
|
+
{ host: "host1", port: 6041 },
|
|
50
|
+
{ host: "host2", port: 6042 },
|
|
51
|
+
]);
|
|
52
|
+
expect(cfg.dsn?.endpoint).toBe(dsn_1.WS_TMQ_ENDPOINT);
|
|
53
|
+
expect(cfg.sqlDsn?.endpoint).toBe(dsn_1.WS_SQL_ENDPOINT);
|
|
54
|
+
expect(cfg.dsn?.params.get("retries")).toBe("5");
|
|
55
|
+
expect(cfg.dsn?.params.get("retry_backoff_ms")).toBe("120");
|
|
56
|
+
});
|
|
57
|
+
test("applies CONNECT_USER and CONNECT_PASS overrides on top of dsn", () => {
|
|
58
|
+
const configMap = new Map([
|
|
59
|
+
[constant_1.TMQConstants.WS_URL, "ws://raw_user:raw_pass@localhost:6041"],
|
|
60
|
+
[constant_1.TMQConstants.CONNECT_USER, "override_user"],
|
|
61
|
+
[constant_1.TMQConstants.CONNECT_PASS, "override_pass"],
|
|
62
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
63
|
+
]);
|
|
64
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
65
|
+
expect(cfg.user).toBe("override_user");
|
|
66
|
+
expect(cfg.password).toBe("override_pass");
|
|
67
|
+
expect(cfg.dsn?.username).toBe("override_user");
|
|
68
|
+
expect(cfg.dsn?.password).toBe("override_pass");
|
|
69
|
+
expect(cfg.sqlDsn?.username).toBe("override_user");
|
|
70
|
+
expect(cfg.sqlDsn?.password).toBe("override_pass");
|
|
71
|
+
});
|
|
72
|
+
test("loads bearer_token from ws.url when CONNECT_TOKEN is absent", () => {
|
|
73
|
+
const configMap = new Map([
|
|
74
|
+
[constant_1.TMQConstants.WS_URL, "ws://localhost:6041?bearer_token=url_token"],
|
|
75
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
76
|
+
]);
|
|
77
|
+
const cfg = new config_1.TmqConfig(configMap);
|
|
78
|
+
expect(cfg.token).toBe("url_token");
|
|
79
|
+
expect(cfg.otherConfigs.get(constant_1.TMQConstants.CONNECT_TOKEN)).toBe("url_token");
|
|
80
|
+
});
|
|
81
|
+
test("CONNECT_TOKEN constant value is td.connect.token", () => {
|
|
82
|
+
expect(constant_1.TMQConstants.CONNECT_TOKEN).toBe("td.connect.token");
|
|
83
|
+
});
|
|
84
|
+
test("decode URL-encoded credentials for TMQ subscribe message", () => {
|
|
85
|
+
const configMap = new Map([
|
|
86
|
+
[constant_1.TMQConstants.WS_URL, "ws://u%40ser:p%40ss@localhost:6041"],
|
|
87
|
+
[constant_1.TMQConstants.GROUP_ID, "g1"],
|
|
88
|
+
]);
|
|
89
|
+
const consumer = new wsTmq_1.WsConsumer(configMap);
|
|
90
|
+
const msg = consumer.buildSubscribeMessage(["t1"], 1);
|
|
91
|
+
expect(msg.args.user).toBe("u@ser");
|
|
92
|
+
expect(msg.args.password).toBe("p@ss");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmq.failover.test.d.ts","sourceRoot":"","sources":["../../../test/tmq/tmq.failover.test.ts"],"names":[],"mappings":""}
|