@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
package/lib/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tdengine/websocket",
|
|
3
|
+
"version": "3.3.0",
|
|
4
|
+
"description": "The websocket Node.js connector for TDengine. TDengine versions 3.3.2.0 and above are recommended to use this connector.",
|
|
5
|
+
"source": "index.ts",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"module": "lib/index.js",
|
|
8
|
+
"types": "lib/index.d.ts",
|
|
9
|
+
"directories": {
|
|
10
|
+
"example": "example",
|
|
11
|
+
"test": "test"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"test": "jest --coverage --coverageDirectory=../coverage",
|
|
15
|
+
"example": "tsc && node lib/example/basicSql.js",
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"prepublish": "node ./prepare.js"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/taosdata/taos-connector-node.git"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"taosdata",
|
|
25
|
+
"taos",
|
|
26
|
+
"IOT",
|
|
27
|
+
"TypeScript",
|
|
28
|
+
"TDengine",
|
|
29
|
+
"database"
|
|
30
|
+
],
|
|
31
|
+
"author": "TaosData Inc.",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/taosdata/taos-connector-node/issues"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"lib"
|
|
38
|
+
],
|
|
39
|
+
"homepage": "https://github.com/taosdata/taos-connector-node#readme",
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"async-mutex": "^0.5.0",
|
|
42
|
+
"json-bigint": "^1.0.0",
|
|
43
|
+
"moment-timezone": "^0.5.45",
|
|
44
|
+
"typescript": "^5.3.3",
|
|
45
|
+
"uuid": "^9.0.1",
|
|
46
|
+
"websocket": "^1.0.34",
|
|
47
|
+
"winston": "^3.17.0",
|
|
48
|
+
"winston-daily-rotate-file": "^5.0.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@parcel/packager-ts": "^2.7.0",
|
|
52
|
+
"@parcel/transformer-typescript-types": "^2.7.0",
|
|
53
|
+
"@types/jest": "^29.2.1",
|
|
54
|
+
"@types/json-bigint": "^1.0.1",
|
|
55
|
+
"@types/node": "^18.0.0",
|
|
56
|
+
"@types/uuid": "^9.0.8",
|
|
57
|
+
"@types/websocket": "^1.0",
|
|
58
|
+
"jest": "^29.7.0",
|
|
59
|
+
"parcel": "^2.7.0",
|
|
60
|
+
"qingwa": "^1.0.7",
|
|
61
|
+
"ts-jest": "^29.0.3",
|
|
62
|
+
"typescript": "^5.3.3"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Dsn } from "../common/dsn";
|
|
2
|
+
export declare class RetryConfig {
|
|
3
|
+
readonly retries: number;
|
|
4
|
+
readonly retryBackoffMs: number;
|
|
5
|
+
readonly retryBackoffMaxMs: number;
|
|
6
|
+
constructor(retries: number, retryBackoffMs: number, retryBackoffMaxMs: number);
|
|
7
|
+
getBackoffDelay(attempt: number): number;
|
|
8
|
+
static fromDsn(dsn: Dsn): RetryConfig;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=retryConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retryConfig.d.ts","sourceRoot":"","sources":["../../../src/client/retryConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAkCpC,qBAAa,WAAW;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAM9E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAOxC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;CAexC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RetryConfig = void 0;
|
|
4
|
+
const DEFAULT_RETRIES = 3;
|
|
5
|
+
const DEFAULT_BACKOFF_MS = 100;
|
|
6
|
+
const DEFAULT_BACKOFF_MAX_MS = 10000;
|
|
7
|
+
function parseNonNegativeInt(value, fallback) {
|
|
8
|
+
if (value === undefined || value === null || value.length === 0) {
|
|
9
|
+
return fallback;
|
|
10
|
+
}
|
|
11
|
+
const parsed = Number.parseInt(value, 10);
|
|
12
|
+
if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed < 0) {
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
function parsePositiveInt(value, fallback) {
|
|
18
|
+
if (value === undefined || value === null || value.length === 0) {
|
|
19
|
+
return fallback;
|
|
20
|
+
}
|
|
21
|
+
const parsed = Number.parseInt(value, 10);
|
|
22
|
+
if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) {
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
class RetryConfig {
|
|
28
|
+
constructor(retries, retryBackoffMs, retryBackoffMaxMs) {
|
|
29
|
+
this.retries = retries;
|
|
30
|
+
this.retryBackoffMs = retryBackoffMs;
|
|
31
|
+
this.retryBackoffMaxMs = Math.max(retryBackoffMs, retryBackoffMaxMs);
|
|
32
|
+
}
|
|
33
|
+
getBackoffDelay(attempt) {
|
|
34
|
+
const safeAttempt = Math.max(0, attempt);
|
|
35
|
+
const rawDelay = this.retryBackoffMs * Math.pow(2, safeAttempt);
|
|
36
|
+
const finiteDelay = Number.isFinite(rawDelay) ? rawDelay : this.retryBackoffMaxMs;
|
|
37
|
+
return Math.min(finiteDelay, this.retryBackoffMaxMs);
|
|
38
|
+
}
|
|
39
|
+
static fromDsn(dsn) {
|
|
40
|
+
const retries = parseNonNegativeInt(dsn.params.get("retries"), DEFAULT_RETRIES);
|
|
41
|
+
const retryBackoffMs = parsePositiveInt(dsn.params.get("retry_backoff_ms"), DEFAULT_BACKOFF_MS);
|
|
42
|
+
const retryBackoffMaxMs = parsePositiveInt(dsn.params.get("retry_backoff_max_ms"), DEFAULT_BACKOFF_MAX_MS);
|
|
43
|
+
return new RetryConfig(retries, retryBackoffMs, retryBackoffMaxMs);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.RetryConfig = RetryConfig;
|
|
@@ -1,25 +1,42 @@
|
|
|
1
|
+
import type { SessionRecoveryHook } from "./wsConnector";
|
|
2
|
+
import { Dsn } from "../common/dsn";
|
|
1
3
|
import { WSQueryResponse } from "./wsResponse";
|
|
2
4
|
import { TSDB_OPTION_CONNECTION } from "../common/constant";
|
|
3
5
|
export declare class WsClient {
|
|
4
6
|
private _wsConnector?;
|
|
5
7
|
private _timeout?;
|
|
6
8
|
private _timezone?;
|
|
7
|
-
private readonly
|
|
9
|
+
private readonly _dsn;
|
|
8
10
|
private static readonly _minVersion;
|
|
9
11
|
private _version?;
|
|
10
|
-
|
|
12
|
+
private _bearerToken?;
|
|
13
|
+
private _connectedDatabase;
|
|
14
|
+
private _connectionOptions;
|
|
15
|
+
private _customRecoveryHook;
|
|
16
|
+
constructor(dsn: Dsn, timeout?: number | undefined | null);
|
|
17
|
+
private buildConnMessage;
|
|
18
|
+
private getWsConnector;
|
|
19
|
+
private bindReconnectRecoveryHook;
|
|
20
|
+
private isSqlPath;
|
|
21
|
+
private normalizeConnectedDatabase;
|
|
22
|
+
private recoverSqlSessionContext;
|
|
23
|
+
setSessionRecoveryHook(hook: SessionRecoveryHook | null | undefined): void;
|
|
11
24
|
connect(database?: string | undefined | null): Promise<void>;
|
|
12
25
|
setOptionConnection(option: TSDB_OPTION_CONNECTION, value: string | null): Promise<void>;
|
|
13
|
-
execNoResp(
|
|
14
|
-
exec(
|
|
26
|
+
execNoResp(message: string): Promise<void>;
|
|
27
|
+
exec(message: string, bSqlQuery?: boolean): Promise<any>;
|
|
28
|
+
sendMsgDirect(message: string, bSqlQuery?: boolean): Promise<any>;
|
|
15
29
|
sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer, bSqlQuery?: boolean, bResultBinary?: boolean): Promise<any>;
|
|
16
30
|
getState(): number;
|
|
17
31
|
ready(): Promise<void>;
|
|
18
|
-
|
|
19
|
-
|
|
32
|
+
waitForReady(): Promise<void>;
|
|
33
|
+
isNetworkError(err: unknown): boolean;
|
|
34
|
+
getReconnectRetries(): number;
|
|
35
|
+
sendMsg(message: string): Promise<any>;
|
|
36
|
+
freeResult(res: WSQueryResponse): Promise<void>;
|
|
20
37
|
version(): Promise<string>;
|
|
21
38
|
close(): Promise<void>;
|
|
22
|
-
|
|
39
|
+
private checkAuth;
|
|
23
40
|
checkVersion(): Promise<void>;
|
|
24
41
|
}
|
|
25
42
|
//# sourceMappingURL=wsClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../../src/client/wsClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../../src/client/wsClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,GAAG,EAAmB,MAAM,eAAe,CAAC;AAOrD,OAAO,EAAqB,eAAe,EAAE,MAAM,cAAc,CAAC;AASlE,OAAO,EAEH,sBAAsB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,QAAQ;IACjB,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAAC,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,CAA4B;IAC7C,OAAO,CAAC,YAAY,CAAC,CAA4B;IACjD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAAyD;IACnF,OAAO,CAAC,mBAAmB,CAAoC;gBAEnD,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAYzD,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,0BAA0B;YAOpB,wBAAwB;IA6B/B,sBAAsB,CACzB,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAC7C,IAAI;IAKD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC5D,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAmB9D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAmBvE,aAAa,CACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,SAAS,GAAE,OAAc,EACzB,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,GAAG,CAAC;IAmBf,QAAQ;IAOF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BtB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAIrC,mBAAmB,IAAI,MAAM;IAIvB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAKtC,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,SAAS;IAYX,YAAY;CAarB"}
|
|
@@ -6,44 +6,113 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.WsClient = void 0;
|
|
7
7
|
const json_bigint_1 = __importDefault(require("json-bigint"));
|
|
8
8
|
const wsConnectorPool_1 = require("./wsConnectorPool");
|
|
9
|
+
const dsn_1 = require("../common/dsn");
|
|
9
10
|
const wsError_1 = require("../common/wsError");
|
|
10
11
|
const wsResponse_1 = require("./wsResponse");
|
|
11
12
|
const reqid_1 = require("../common/reqid");
|
|
12
13
|
const log_1 = __importDefault(require("../common/log"));
|
|
13
14
|
const utils_1 = require("../common/utils");
|
|
14
15
|
const websocket_1 = require("websocket");
|
|
16
|
+
const constant_1 = require("../common/constant");
|
|
15
17
|
class WsClient {
|
|
16
|
-
constructor(
|
|
17
|
-
this.
|
|
18
|
-
this.
|
|
18
|
+
constructor(dsn, timeout) {
|
|
19
|
+
this._connectedDatabase = null;
|
|
20
|
+
this._connectionOptions = new Map();
|
|
21
|
+
this._customRecoveryHook = null;
|
|
22
|
+
this.checkAuth(dsn);
|
|
23
|
+
this._dsn = dsn;
|
|
19
24
|
this._timeout = timeout;
|
|
20
|
-
if (this.
|
|
21
|
-
this._timezone =
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
if (this._dsn.params.has("timezone")) {
|
|
26
|
+
this._timezone = this._dsn.params.get("timezone") || undefined;
|
|
27
|
+
}
|
|
28
|
+
if (this._dsn.params.has("bearer_token")) {
|
|
29
|
+
this._bearerToken = this._dsn.params.get("bearer_token") || undefined;
|
|
24
30
|
}
|
|
25
31
|
}
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
buildConnMessage(database) {
|
|
33
|
+
return {
|
|
28
34
|
action: "conn",
|
|
29
35
|
args: {
|
|
30
36
|
req_id: reqid_1.ReqId.getReqID(),
|
|
31
|
-
user: (0, utils_1.safeDecodeURIComponent)(this.
|
|
32
|
-
password: (0, utils_1.safeDecodeURIComponent)(this.
|
|
37
|
+
user: (0, utils_1.safeDecodeURIComponent)(this._dsn.username),
|
|
38
|
+
password: (0, utils_1.safeDecodeURIComponent)(this._dsn.password),
|
|
33
39
|
db: database,
|
|
40
|
+
connector: constant_1.ConnectorInfo,
|
|
34
41
|
...(this._timezone && { tz: this._timezone }),
|
|
42
|
+
...(this._bearerToken && { bearer_token: this._bearerToken }),
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
getWsConnector() {
|
|
47
|
+
if (!this._wsConnector) {
|
|
48
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "Invalid websocket connection");
|
|
49
|
+
}
|
|
50
|
+
return this._wsConnector;
|
|
51
|
+
}
|
|
52
|
+
bindReconnectRecoveryHook() {
|
|
53
|
+
if (!this._wsConnector) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this._wsConnector.setSessionRecoveryHook(async () => {
|
|
57
|
+
if (this.isSqlPath()) {
|
|
58
|
+
await this.recoverSqlSessionContext();
|
|
59
|
+
}
|
|
60
|
+
if (this._customRecoveryHook) {
|
|
61
|
+
await this._customRecoveryHook();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
isSqlPath() {
|
|
66
|
+
return this._dsn.endpoint === dsn_1.WS_SQL_ENDPOINT;
|
|
67
|
+
}
|
|
68
|
+
normalizeConnectedDatabase(database) {
|
|
69
|
+
if (database && database.length > 0) {
|
|
70
|
+
return database;
|
|
71
|
+
}
|
|
72
|
+
return this.isSqlPath() ? "information_schema" : null;
|
|
73
|
+
}
|
|
74
|
+
async recoverSqlSessionContext() {
|
|
75
|
+
if (!this._wsConnector) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const connMsg = this.buildConnMessage(this.normalizeConnectedDatabase(this._connectedDatabase));
|
|
79
|
+
await this.sendMsgDirect(JSON.stringify(connMsg), false);
|
|
80
|
+
if (this._connectionOptions.size <= 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const options = Array.from(this._connectionOptions.entries()).map(([option, value]) => ({
|
|
84
|
+
option,
|
|
85
|
+
value,
|
|
86
|
+
}));
|
|
87
|
+
const optionsMsg = {
|
|
88
|
+
action: "options_connection",
|
|
89
|
+
args: {
|
|
90
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
91
|
+
options,
|
|
35
92
|
},
|
|
36
93
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
94
|
+
await this.sendMsgDirect(json_bigint_1.default.stringify(optionsMsg), false);
|
|
95
|
+
}
|
|
96
|
+
setSessionRecoveryHook(hook) {
|
|
97
|
+
this._customRecoveryHook = hook || null;
|
|
98
|
+
this.bindReconnectRecoveryHook();
|
|
99
|
+
}
|
|
100
|
+
async connect(database) {
|
|
101
|
+
const connMsg = this.buildConnMessage(database);
|
|
102
|
+
if (log_1.default.isDebugEnabled()) {
|
|
103
|
+
log_1.default.debug("[wsClient.connect.connMsg]===>" + json_bigint_1.default.stringify(connMsg, (key, value) => (key === "password" || key === "bearer_token") ? "[REDACTED]" : value));
|
|
104
|
+
}
|
|
105
|
+
this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._dsn, this._timeout);
|
|
106
|
+
this.bindReconnectRecoveryHook();
|
|
40
107
|
if (this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
|
|
108
|
+
this._connectedDatabase = this.normalizeConnectedDatabase(database ?? null);
|
|
41
109
|
return;
|
|
42
110
|
}
|
|
43
111
|
try {
|
|
44
112
|
await this._wsConnector.ready();
|
|
45
113
|
let result = await this._wsConnector.sendMsg(JSON.stringify(connMsg));
|
|
46
114
|
if (result.msg.code == 0) {
|
|
115
|
+
this._connectedDatabase = this.normalizeConnectedDatabase(database ?? null);
|
|
47
116
|
return;
|
|
48
117
|
}
|
|
49
118
|
await this.close();
|
|
@@ -51,8 +120,8 @@ class WsClient {
|
|
|
51
120
|
}
|
|
52
121
|
catch (e) {
|
|
53
122
|
await this.close();
|
|
54
|
-
log_1.default.error(`connection creation failed,
|
|
55
|
-
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed,
|
|
123
|
+
log_1.default.error(`connection creation failed, dsn:${this._dsn}, code:${e.code}, msg:${e.message}`);
|
|
124
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn:${this._dsn}, code:${e.code}, msg:${e.message}`);
|
|
56
125
|
}
|
|
57
126
|
}
|
|
58
127
|
async setOptionConnection(option, value) {
|
|
@@ -71,82 +140,55 @@ class WsClient {
|
|
|
71
140
|
};
|
|
72
141
|
try {
|
|
73
142
|
await this.exec(json_bigint_1.default.stringify(connMsg), false);
|
|
143
|
+
this._connectionOptions.set(option, value);
|
|
74
144
|
}
|
|
75
145
|
catch (e) {
|
|
76
146
|
log_1.default.error("[wsClient.setOptionConnection] failed: " + e.message);
|
|
77
147
|
throw e;
|
|
78
148
|
}
|
|
79
149
|
}
|
|
80
|
-
async execNoResp(
|
|
81
|
-
log_1.default.debug("[
|
|
82
|
-
|
|
83
|
-
this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
|
|
84
|
-
await this._wsConnector.sendMsgNoResp(queryMsg);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect");
|
|
150
|
+
async execNoResp(message) {
|
|
151
|
+
log_1.default.debug("[wsClient.execNoResp]===>" + message);
|
|
152
|
+
await this.getWsConnector().sendMsgNoResp(message);
|
|
88
153
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.then((e) => {
|
|
98
|
-
if (e.msg.code == 0) {
|
|
99
|
-
if (bSqlQuery) {
|
|
100
|
-
resolve(new wsResponse_1.WSQueryResponse(e));
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
resolve(e);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
|
|
108
|
-
}
|
|
109
|
-
})
|
|
110
|
-
.catch((e) => {
|
|
111
|
-
reject(e);
|
|
112
|
-
});
|
|
154
|
+
async exec(message, bSqlQuery = true) {
|
|
155
|
+
if (log_1.default.isDebugEnabled()) {
|
|
156
|
+
log_1.default.debug("[wsClient.exec]===>" + (0, utils_1.maskSensitiveForLog)(message));
|
|
157
|
+
}
|
|
158
|
+
const resp = await this.getWsConnector().sendMsg(message);
|
|
159
|
+
if (resp.msg.code == 0) {
|
|
160
|
+
if (bSqlQuery) {
|
|
161
|
+
return new wsResponse_1.WSQueryResponse(resp);
|
|
113
162
|
}
|
|
114
|
-
|
|
115
|
-
|
|
163
|
+
return resp;
|
|
164
|
+
}
|
|
165
|
+
throw new wsError_1.WebSocketInterfaceError(resp.msg.code, resp.msg.message);
|
|
166
|
+
}
|
|
167
|
+
async sendMsgDirect(message, bSqlQuery = true) {
|
|
168
|
+
if (log_1.default.isDebugEnabled()) {
|
|
169
|
+
log_1.default.debug("[wsClient.sendMsgDirect]===>" + (0, utils_1.maskSensitiveForLog)(message));
|
|
170
|
+
}
|
|
171
|
+
const resp = await this.getWsConnector().sendMsgDirect(message);
|
|
172
|
+
if (resp.msg.code == 0) {
|
|
173
|
+
if (bSqlQuery) {
|
|
174
|
+
return new wsResponse_1.WSQueryResponse(resp);
|
|
116
175
|
}
|
|
117
|
-
|
|
176
|
+
return resp;
|
|
177
|
+
}
|
|
178
|
+
throw new wsError_1.WebSocketQueryError(resp.msg.code, resp.msg.message);
|
|
118
179
|
}
|
|
119
|
-
// need to construct Response.
|
|
120
180
|
async sendBinaryMsg(reqId, action, message, bSqlQuery = true, bResultBinary = false) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
resolve(e);
|
|
129
|
-
}
|
|
130
|
-
if (e.msg.code == 0) {
|
|
131
|
-
if (bSqlQuery) {
|
|
132
|
-
resolve(new wsResponse_1.WSQueryResponse(e));
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
resolve(e);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
.catch((e) => {
|
|
143
|
-
reject(e);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
181
|
+
const resp = await this.getWsConnector().sendBinaryMsg(reqId, action, message);
|
|
182
|
+
if (bResultBinary) {
|
|
183
|
+
return resp;
|
|
184
|
+
}
|
|
185
|
+
if (resp.msg.code == 0) {
|
|
186
|
+
if (bSqlQuery) {
|
|
187
|
+
return new wsResponse_1.WSQueryResponse(resp);
|
|
148
188
|
}
|
|
149
|
-
|
|
189
|
+
return resp;
|
|
190
|
+
}
|
|
191
|
+
throw new wsError_1.WebSocketInterfaceError(resp.msg.code, resp.msg.message);
|
|
150
192
|
}
|
|
151
193
|
getState() {
|
|
152
194
|
if (this._wsConnector) {
|
|
@@ -156,60 +198,45 @@ class WsClient {
|
|
|
156
198
|
}
|
|
157
199
|
async ready() {
|
|
158
200
|
try {
|
|
159
|
-
this._wsConnector =
|
|
160
|
-
|
|
201
|
+
this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._dsn, this._timeout);
|
|
202
|
+
this.bindReconnectRecoveryHook();
|
|
161
203
|
if (this._wsConnector.readyState() !== websocket_1.w3cwebsocket.OPEN) {
|
|
162
204
|
await this._wsConnector.ready();
|
|
163
205
|
}
|
|
164
|
-
log_1.default.
|
|
206
|
+
if (log_1.default.isDebugEnabled()) {
|
|
207
|
+
log_1.default.debug(`ready status, dsn: ${this._dsn}, state: ${this._wsConnector.readyState()}`);
|
|
208
|
+
}
|
|
165
209
|
return;
|
|
166
210
|
}
|
|
167
211
|
catch (e) {
|
|
168
|
-
log_1.default.error(`connection creation failed,
|
|
169
|
-
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed,
|
|
212
|
+
log_1.default.error(`connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
|
|
213
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
|
|
170
214
|
}
|
|
171
215
|
}
|
|
172
|
-
async
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
else {
|
|
185
|
-
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
186
|
-
}
|
|
187
|
-
});
|
|
216
|
+
async waitForReady() {
|
|
217
|
+
await this.getWsConnector().ready();
|
|
218
|
+
}
|
|
219
|
+
isNetworkError(err) {
|
|
220
|
+
return this.getWsConnector().isNetworkError(err);
|
|
221
|
+
}
|
|
222
|
+
getReconnectRetries() {
|
|
223
|
+
return this.getWsConnector().getReconnectRetries();
|
|
224
|
+
}
|
|
225
|
+
async sendMsg(message) {
|
|
226
|
+
log_1.default.debug("[wsClient.sendMsg]===>" + message);
|
|
227
|
+
return this.getWsConnector().sendMsg(message);
|
|
188
228
|
}
|
|
189
229
|
async freeResult(res) {
|
|
190
|
-
|
|
230
|
+
const freeResultMsg = {
|
|
191
231
|
action: "free_result",
|
|
192
232
|
args: {
|
|
193
233
|
req_id: reqid_1.ReqId.getReqID(),
|
|
194
234
|
id: res.id,
|
|
195
235
|
},
|
|
196
236
|
};
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
if (this._wsConnector &&
|
|
201
|
-
this._wsConnector.readyState() === websocket_1.w3cwebsocket.OPEN) {
|
|
202
|
-
this._wsConnector
|
|
203
|
-
.sendMsgNoResp(jsonStr)
|
|
204
|
-
.then((e) => {
|
|
205
|
-
resolve(e);
|
|
206
|
-
})
|
|
207
|
-
.catch((e) => reject(e));
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
211
|
-
}
|
|
212
|
-
});
|
|
237
|
+
const jsonStr = json_bigint_1.default.stringify(freeResultMsg);
|
|
238
|
+
log_1.default.debug("[wsClient.freeResult]===>" + jsonStr);
|
|
239
|
+
await this.getWsConnector().sendMsgNoResp(jsonStr);
|
|
213
240
|
}
|
|
214
241
|
async version() {
|
|
215
242
|
if (this._version) {
|
|
@@ -221,35 +248,35 @@ class WsClient {
|
|
|
221
248
|
req_id: reqid_1.ReqId.getReqID(),
|
|
222
249
|
},
|
|
223
250
|
};
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
let result = await this._wsConnector.sendMsg(json_bigint_1.default.stringify(versionMsg));
|
|
230
|
-
if (result.msg.code == 0) {
|
|
231
|
-
return new wsResponse_1.WSVersionResponse(result).version;
|
|
232
|
-
}
|
|
233
|
-
throw new wsError_1.WebSocketInterfaceError(result.msg.code, result.msg.message);
|
|
251
|
+
try {
|
|
252
|
+
const connector = this.getWsConnector();
|
|
253
|
+
if (connector.readyState() !== websocket_1.w3cwebsocket.OPEN) {
|
|
254
|
+
await connector.ready();
|
|
234
255
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
256
|
+
let result = await connector.sendMsg(json_bigint_1.default.stringify(versionMsg));
|
|
257
|
+
if (result.msg.code == 0) {
|
|
258
|
+
return new wsResponse_1.WSVersionResponse(result).version;
|
|
238
259
|
}
|
|
260
|
+
throw new wsError_1.WebSocketInterfaceError(result.msg.code, result.msg.message);
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
log_1.default.error(`connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
|
|
264
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, dsn: ${this._dsn}, code: ${e.code}, message: ${e.message}`);
|
|
239
265
|
}
|
|
240
|
-
throw (wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect");
|
|
241
266
|
}
|
|
242
267
|
async close() {
|
|
243
268
|
if (this._wsConnector) {
|
|
269
|
+
this._wsConnector.setSessionRecoveryHook(null);
|
|
244
270
|
await wsConnectorPool_1.WebSocketConnectionPool.instance().releaseConnection(this._wsConnector);
|
|
245
271
|
this._wsConnector = undefined;
|
|
246
272
|
}
|
|
273
|
+
this._customRecoveryHook = null;
|
|
247
274
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if (!
|
|
251
|
-
if (!(
|
|
252
|
-
throw new wsError_1.WebSocketInterfaceError(wsError_1.ErrorCode.ERR_INVALID_AUTHENTICATION,
|
|
275
|
+
checkAuth(dsn) {
|
|
276
|
+
const hasToken = dsn.params.get("token") || dsn.params.get("bearer_token");
|
|
277
|
+
if (!hasToken) {
|
|
278
|
+
if (!(dsn.username || dsn.password)) {
|
|
279
|
+
throw new wsError_1.WebSocketInterfaceError(wsError_1.ErrorCode.ERR_INVALID_AUTHENTICATION, `invalid url, provide non-empty "token" or "bearer_token", or provide username/password`);
|
|
253
280
|
}
|
|
254
281
|
}
|
|
255
282
|
}
|
|
@@ -1,16 +1,62 @@
|
|
|
1
|
+
import { Dsn } from "../common/dsn";
|
|
2
|
+
export type SessionRecoveryHook = () => Promise<void>;
|
|
3
|
+
export declare class RetryConfig {
|
|
4
|
+
readonly retries: number;
|
|
5
|
+
readonly retryBackoffMs: number;
|
|
6
|
+
readonly retryBackoffMaxMs: number;
|
|
7
|
+
constructor(retries: number, retryBackoffMs: number, retryBackoffMaxMs: number);
|
|
8
|
+
getBackoffDelay(attempt: number): number;
|
|
9
|
+
static fromDsn(dsn: Dsn): RetryConfig;
|
|
10
|
+
}
|
|
1
11
|
export declare class WebSocketConnector {
|
|
2
|
-
private
|
|
3
|
-
private
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
private
|
|
12
|
+
private _conn;
|
|
13
|
+
private readonly _poolKey;
|
|
14
|
+
private readonly _dsn;
|
|
15
|
+
private _currentAddress;
|
|
16
|
+
private _retryConfig;
|
|
17
|
+
private _inflightStore;
|
|
18
|
+
private readonly _suppressedSockets;
|
|
19
|
+
private _reconnectLock;
|
|
20
|
+
private _isReconnecting;
|
|
21
|
+
private _allowReconnect;
|
|
22
|
+
private _connectionReady;
|
|
23
|
+
private _sessionRecoveryHook;
|
|
24
|
+
private _timeout;
|
|
25
|
+
constructor(dsn: Dsn, poolKey: string, timeout: number | undefined | null);
|
|
26
|
+
refreshRetryConfig(dsn: Dsn): void;
|
|
27
|
+
private buildUrl;
|
|
28
|
+
private createConnection;
|
|
8
29
|
private _onmessage;
|
|
30
|
+
private shouldSkipReconnect;
|
|
31
|
+
private failNonRetriableCallbacksOnDisconnect;
|
|
32
|
+
private handleDisconnect;
|
|
33
|
+
private extractReqId;
|
|
34
|
+
private isRetriableAction;
|
|
35
|
+
private extractBinaryAction;
|
|
36
|
+
private isRetriableBinaryAction;
|
|
37
|
+
isNetworkError(err: unknown): boolean;
|
|
38
|
+
private send;
|
|
39
|
+
ready(): Promise<void>;
|
|
40
|
+
private getCurrentAddress;
|
|
41
|
+
private selectLeastConnectedAddress;
|
|
42
|
+
private sleep;
|
|
43
|
+
private isReconnectAllowed;
|
|
44
|
+
private triggerReconnect;
|
|
45
|
+
private _doReconnect;
|
|
46
|
+
private reconnect;
|
|
47
|
+
private attemptReconnect;
|
|
48
|
+
private replayRequests;
|
|
49
|
+
private failAllInflightRequests;
|
|
9
50
|
close(): void;
|
|
10
51
|
readyState(): number;
|
|
52
|
+
setSessionRecoveryHook(hook: SessionRecoveryHook | undefined | null): void;
|
|
53
|
+
private recoverSessionContext;
|
|
54
|
+
sendMsgDirect(message: string): Promise<any>;
|
|
11
55
|
sendMsgNoResp(message: string): Promise<void>;
|
|
12
|
-
sendMsg(message: string
|
|
13
|
-
sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer
|
|
14
|
-
|
|
56
|
+
sendMsg(message: string): Promise<unknown>;
|
|
57
|
+
sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer): Promise<unknown>;
|
|
58
|
+
private sendAndTrackResponse;
|
|
59
|
+
getPoolKey(): string;
|
|
60
|
+
getReconnectRetries(): number;
|
|
15
61
|
}
|
|
16
62
|
//# sourceMappingURL=wsConnector.d.ts.map
|