@tdengine/websocket 3.0.0 → 3.1.1
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/example/all_type_query.d.ts +2 -0
- package/lib/example/all_type_query.d.ts.map +1 -0
- package/lib/example/all_type_query.js +89 -0
- package/lib/example/all_type_stmt.d.ts +2 -0
- package/lib/example/all_type_stmt.d.ts.map +1 -0
- package/lib/example/all_type_stmt.js +130 -0
- package/lib/example/basicBatchTmq.d.ts +2 -0
- package/lib/example/basicBatchTmq.d.ts.map +1 -0
- package/lib/example/basicBatchTmq.js +129 -0
- package/lib/example/basicSchemaless.d.ts +2 -0
- package/lib/example/basicSchemaless.d.ts.map +1 -0
- package/lib/example/basicSchemaless.js +47 -0
- package/lib/example/basicSql.d.ts +2 -0
- package/lib/example/basicSql.d.ts.map +1 -0
- package/lib/example/basicSql.js +54 -0
- package/lib/example/basicStmt.d.ts +2 -0
- package/lib/example/basicStmt.d.ts.map +1 -0
- package/lib/example/basicStmt.js +72 -0
- package/lib/example/basicTmq.d.ts +2 -0
- package/lib/example/basicTmq.d.ts.map +1 -0
- package/lib/example/basicTmq.js +73 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +41 -0
- package/lib/src/client/wsClient.d.ts +22 -0
- package/lib/src/client/wsClient.d.ts.map +1 -0
- package/lib/src/client/wsClient.js +256 -0
- package/lib/src/client/wsConnector.d.ts +17 -0
- package/lib/src/client/wsConnector.d.ts.map +1 -0
- package/lib/src/client/wsConnector.js +140 -0
- package/lib/src/client/wsConnectorPool.d.ts +13 -0
- package/lib/src/client/wsConnectorPool.d.ts.map +1 -0
- package/lib/src/client/wsConnectorPool.js +107 -0
- package/lib/src/client/wsEventCallback.d.ts +22 -0
- package/lib/src/client/wsEventCallback.d.ts.map +1 -0
- package/lib/src/client/wsEventCallback.js +97 -0
- package/lib/src/client/wsResponse.d.ts +74 -0
- package/lib/src/client/wsResponse.d.ts.map +1 -0
- package/lib/src/client/wsResponse.js +103 -0
- package/lib/src/common/config.d.ts +22 -0
- package/lib/src/common/config.d.ts.map +1 -0
- package/lib/src/common/config.js +45 -0
- package/lib/src/common/constant.d.ts +35 -0
- package/lib/src/common/constant.d.ts.map +1 -0
- package/lib/src/common/constant.js +78 -0
- package/lib/src/common/log.d.ts +5 -0
- package/lib/src/common/log.d.ts.map +1 -0
- package/lib/src/common/log.js +40 -0
- package/lib/src/common/reqid.d.ts +8 -0
- package/lib/src/common/reqid.d.ts.map +1 -0
- package/lib/src/common/reqid.js +59 -0
- package/lib/src/common/taosResult.d.ts +57 -0
- package/lib/src/common/taosResult.d.ts.map +1 -0
- package/lib/src/common/taosResult.js +449 -0
- package/lib/src/common/ut8Helper.d.ts +2 -0
- package/lib/src/common/ut8Helper.d.ts.map +1 -0
- package/{src/ut8Helper.ts → lib/src/common/ut8Helper.js} +22 -21
- package/lib/src/common/utils.d.ts +7 -0
- package/lib/src/common/utils.d.ts.map +1 -0
- package/lib/src/common/utils.js +66 -0
- package/lib/src/common/wsError.d.ts +29 -0
- package/lib/src/common/wsError.d.ts.map +1 -0
- package/lib/src/common/wsError.js +51 -0
- package/{src/wsOptions.ts → lib/src/common/wsOptions.d.ts} +4 -2
- package/lib/src/common/wsOptions.d.ts.map +1 -0
- package/lib/src/common/wsOptions.js +2 -0
- package/lib/src/index.d.ts +9 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/src/index.js +58 -0
- package/lib/src/sql/wsProto.d.ts +26 -0
- package/lib/src/sql/wsProto.d.ts.map +1 -0
- package/lib/src/sql/wsProto.js +19 -0
- package/lib/src/sql/wsRows.d.ts +16 -0
- package/lib/src/sql/wsRows.d.ts.map +1 -0
- package/lib/src/sql/wsRows.js +87 -0
- package/lib/src/sql/wsSql.d.ts +24 -0
- package/lib/src/sql/wsSql.d.ts.map +1 -0
- package/lib/src/sql/wsSql.js +174 -0
- package/lib/src/stmt/wsParams.d.ts +41 -0
- package/lib/src/stmt/wsParams.d.ts.map +1 -0
- package/lib/src/stmt/wsParams.js +428 -0
- package/lib/src/stmt/wsProto.d.ts +27 -0
- package/lib/src/stmt/wsProto.d.ts.map +1 -0
- package/lib/src/stmt/wsProto.js +67 -0
- package/lib/src/stmt/wsStmt.d.ts +30 -0
- package/lib/src/stmt/wsStmt.d.ts.map +1 -0
- package/lib/src/stmt/wsStmt.js +207 -0
- package/lib/src/tmq/config.d.ts +14 -0
- package/lib/src/tmq/config.d.ts.map +1 -0
- package/lib/src/tmq/config.js +42 -0
- package/lib/src/tmq/constant.d.ts +100 -0
- package/lib/src/tmq/constant.d.ts.map +1 -0
- package/lib/src/tmq/constant.js +105 -0
- package/lib/src/tmq/tmqResponse.d.ts +92 -0
- package/lib/src/tmq/tmqResponse.d.ts.map +1 -0
- package/lib/src/tmq/tmqResponse.js +329 -0
- package/lib/src/tmq/wsTmq.d.ts +32 -0
- package/lib/src/tmq/wsTmq.d.ts.map +1 -0
- package/lib/src/tmq/wsTmq.js +319 -0
- package/lib/test/bulkPulling/log.test.d.ts +2 -0
- package/lib/test/bulkPulling/log.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/log.test.js +44 -0
- package/lib/test/bulkPulling/queryTables.test.d.ts +2 -0
- package/lib/test/bulkPulling/queryTables.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/queryTables.test.js +297 -0
- package/lib/test/bulkPulling/schemaless.test.d.ts +2 -0
- package/lib/test/bulkPulling/schemaless.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/schemaless.test.js +95 -0
- package/lib/test/bulkPulling/sql.test.d.ts +2 -0
- package/lib/test/bulkPulling/sql.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/sql.test.js +144 -0
- package/lib/test/bulkPulling/stmt.func.test.d.ts +2 -0
- package/lib/test/bulkPulling/stmt.func.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/stmt.func.test.js +397 -0
- package/lib/test/bulkPulling/stmt.type.test.d.ts +2 -0
- package/lib/test/bulkPulling/stmt.type.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/stmt.type.test.js +269 -0
- package/lib/test/bulkPulling/tmq.test.d.ts +2 -0
- package/lib/test/bulkPulling/tmq.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/tmq.test.js +178 -0
- package/lib/test/bulkPulling/wsConnectPool.test.d.ts +2 -0
- package/lib/test/bulkPulling/wsConnectPool.test.d.ts.map +1 -0
- package/lib/test/bulkPulling/wsConnectPool.test.js +136 -0
- package/lib/test/utils.d.ts +18 -0
- package/lib/test/utils.d.ts.map +1 -0
- package/lib/test/utils.js +318 -0
- package/package.json +27 -14
- package/readme.md +302 -0
- package/README.md +0 -59
- package/dist/browser/index.js +0 -778
- package/dist/main/index.js +0 -711
- package/dist/main/index.js.map +0 -1
- package/dist/module/index.mjs +0 -704
- package/dist/module/index.mjs.map +0 -1
- package/dist/types.d.ts +0 -103
- package/dist/types.d.ts.map +0 -1
- package/example/basicUsageAsync.ts +0 -48
- package/example/basicUsagePrimse.ts +0 -43
- package/example/cloudUsage.ts +0 -55
- package/example/continousConnectAndVersion.ts +0 -16
- package/example/test.mjs +0 -51
- package/index.ts +0 -7
- package/jest.config.js +0 -8
- package/src/constant.ts +0 -74
- package/src/taosResult.ts +0 -269
- package/src/tdengineWebsocket.ts +0 -39
- package/src/wsClient.ts +0 -196
- package/src/wsError.ts +0 -5
- package/src/wsQuery.ts +0 -30
- package/src/wsQueryInterface.ts +0 -212
- package/src/wsQueryResponse.ts +0 -112
- package/tdengine-websocket-3.0.0.tgz +0 -0
- package/test/bulkPulling/connect.test.ts +0 -27
- package/test/bulkPulling/queryTables.test.ts +0 -274
- package/test/bulkPulling/version.test.ts +0 -19
- package/test/utils.ts +0 -235
- package/tsconfig.json +0 -101
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export * from "./src/client/wsClient";
|
|
2
|
+
export * from "./src/client/wsConnector";
|
|
3
|
+
export * from "./src/client/wsConnectorPool";
|
|
4
|
+
export * from "./src/client/wsEventCallback";
|
|
5
|
+
export * from "./src/client/wsResponse";
|
|
6
|
+
export * from "./src/common/config";
|
|
7
|
+
export * from "./src/common/constant";
|
|
8
|
+
export * from "./src/common/log";
|
|
9
|
+
export * from "./src/common/reqid";
|
|
10
|
+
export * from "./src/common/taosResult";
|
|
11
|
+
export * from "./src/common/ut8Helper";
|
|
12
|
+
export * from "./src/common/utils";
|
|
13
|
+
export * from "./src/common/wsError";
|
|
14
|
+
export * from "./src/common/wsOptions";
|
|
15
|
+
export * from "./src/index";
|
|
16
|
+
export * from "./src/sql/wsProto";
|
|
17
|
+
export * from "./src/sql/wsRows";
|
|
18
|
+
export * from "./src/sql/wsSql";
|
|
19
|
+
export * from "./src/stmt/wsParams";
|
|
20
|
+
export * from "./src/stmt/wsProto";
|
|
21
|
+
export * from "./src/stmt/wsStmt";
|
|
22
|
+
export * from "./src/tmq/config";
|
|
23
|
+
export * from "./src/tmq/constant";
|
|
24
|
+
export * from "./src/tmq/tmqResponse";
|
|
25
|
+
export * from "./src/tmq/wsTmq";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./src/client/wsClient"), exports);
|
|
18
|
+
__exportStar(require("./src/client/wsConnector"), exports);
|
|
19
|
+
__exportStar(require("./src/client/wsConnectorPool"), exports);
|
|
20
|
+
__exportStar(require("./src/client/wsEventCallback"), exports);
|
|
21
|
+
__exportStar(require("./src/client/wsResponse"), exports);
|
|
22
|
+
__exportStar(require("./src/common/config"), exports);
|
|
23
|
+
__exportStar(require("./src/common/constant"), exports);
|
|
24
|
+
__exportStar(require("./src/common/log"), exports);
|
|
25
|
+
__exportStar(require("./src/common/reqid"), exports);
|
|
26
|
+
__exportStar(require("./src/common/taosResult"), exports);
|
|
27
|
+
__exportStar(require("./src/common/ut8Helper"), exports);
|
|
28
|
+
__exportStar(require("./src/common/utils"), exports);
|
|
29
|
+
__exportStar(require("./src/common/wsError"), exports);
|
|
30
|
+
__exportStar(require("./src/common/wsOptions"), exports);
|
|
31
|
+
__exportStar(require("./src/index"), exports);
|
|
32
|
+
__exportStar(require("./src/sql/wsProto"), exports);
|
|
33
|
+
__exportStar(require("./src/sql/wsRows"), exports);
|
|
34
|
+
__exportStar(require("./src/sql/wsSql"), exports);
|
|
35
|
+
__exportStar(require("./src/stmt/wsParams"), exports);
|
|
36
|
+
__exportStar(require("./src/stmt/wsProto"), exports);
|
|
37
|
+
__exportStar(require("./src/stmt/wsStmt"), exports);
|
|
38
|
+
__exportStar(require("./src/tmq/config"), exports);
|
|
39
|
+
__exportStar(require("./src/tmq/constant"), exports);
|
|
40
|
+
__exportStar(require("./src/tmq/tmqResponse"), exports);
|
|
41
|
+
__exportStar(require("./src/tmq/wsTmq"), exports);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TaosResult } from '../common/taosResult';
|
|
2
|
+
import { WSQueryResponse, WSFetchResponse } from './wsResponse';
|
|
3
|
+
export declare class WsClient {
|
|
4
|
+
private _wsConnector?;
|
|
5
|
+
private _timeout?;
|
|
6
|
+
private readonly _url;
|
|
7
|
+
constructor(url: URL, timeout?: number | undefined | null);
|
|
8
|
+
connect(database?: string | undefined | null): Promise<void>;
|
|
9
|
+
execNoResp(queryMsg: string): Promise<void>;
|
|
10
|
+
exec(queryMsg: string, bSqlQuery?: boolean): Promise<any>;
|
|
11
|
+
sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer, bSqlQuery?: boolean, bResultBinary?: boolean): Promise<any>;
|
|
12
|
+
getState(): number;
|
|
13
|
+
ready(): Promise<void>;
|
|
14
|
+
fetch(res: WSQueryResponse): Promise<WSFetchResponse>;
|
|
15
|
+
fetchBlock(fetchResponse: WSFetchResponse, taosResult: TaosResult): Promise<TaosResult>;
|
|
16
|
+
sendMsg(msg: string): Promise<any>;
|
|
17
|
+
freeResult(res: WSQueryResponse): Promise<unknown>;
|
|
18
|
+
version(): Promise<string>;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
checkURL(url: URL): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=wsClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../../src/client/wsClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAGH,eAAe,EACf,eAAe,EAClB,MAAM,cAAc,CAAC;AAKtB,qBAAa,QAAQ;IACjB,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAA2B;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAK;gBAEd,GAAG,EAAE,GAAG,EAAE,OAAQ,CAAC,EAAC,MAAM,GAAG,SAAS,GAAG,IAAI;IAOnD,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAC,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAuB9D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,GAAC,OAAc,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IA0B/I,QAAQ;IAQF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA0BrD,UAAU,CAAC,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BvF,OAAO,CAAC,GAAG,EAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAajC,UAAU,CAAC,GAAG,EAAE,eAAe;IAqB/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA4B1B,KAAK,IAAG,OAAO,CAAC,IAAI,CAAC;IAS3B,QAAQ,CAAC,GAAG,EAAE,GAAG;CASpB"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WsClient = void 0;
|
|
7
|
+
const json_bigint_1 = __importDefault(require("json-bigint"));
|
|
8
|
+
const wsConnectorPool_1 = require("./wsConnectorPool");
|
|
9
|
+
const taosResult_1 = require("../common/taosResult");
|
|
10
|
+
const wsError_1 = require("../common/wsError");
|
|
11
|
+
const wsResponse_1 = require("./wsResponse");
|
|
12
|
+
const reqid_1 = require("../common/reqid");
|
|
13
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
14
|
+
class WsClient {
|
|
15
|
+
constructor(url, timeout) {
|
|
16
|
+
this.checkURL(url);
|
|
17
|
+
this._url = url;
|
|
18
|
+
this._timeout = timeout;
|
|
19
|
+
}
|
|
20
|
+
async connect(database) {
|
|
21
|
+
let _db = this._url.pathname.split('/')[3];
|
|
22
|
+
if (database) {
|
|
23
|
+
_db = database;
|
|
24
|
+
}
|
|
25
|
+
let connMsg = {
|
|
26
|
+
action: 'conn',
|
|
27
|
+
args: {
|
|
28
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
29
|
+
user: this._url.username,
|
|
30
|
+
password: this._url.password,
|
|
31
|
+
db: _db,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._url, this._timeout);
|
|
35
|
+
if (this._wsConnector.readyState() > 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
await this._wsConnector.ready();
|
|
40
|
+
let result = await this._wsConnector.sendMsg(JSON.stringify(connMsg));
|
|
41
|
+
if (result.msg.code == 0) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
throw (new wsError_1.WebSocketQueryError(result.msg.code, result.msg.message));
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
log_1.default.error(e.code, e.message);
|
|
48
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async execNoResp(queryMsg) {
|
|
52
|
+
log_1.default.debug('[wsQueryInterface.query.queryMsg]===>' + queryMsg);
|
|
53
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
54
|
+
await this._wsConnector.sendMsgNoResp(queryMsg);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
58
|
+
}
|
|
59
|
+
// need to construct Response.
|
|
60
|
+
async exec(queryMsg, bSqlQuery = true) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
log_1.default.debug('[wsQueryInterface.query.queryMsg]===>' + queryMsg);
|
|
63
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
64
|
+
this._wsConnector.sendMsg(queryMsg).then((e) => {
|
|
65
|
+
if (e.msg.code == 0) {
|
|
66
|
+
if (bSqlQuery) {
|
|
67
|
+
resolve(new wsResponse_1.WSQueryResponse(e));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
resolve(e);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
|
|
75
|
+
}
|
|
76
|
+
}).catch((e) => { reject(e); });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// need to construct Response.
|
|
84
|
+
async sendBinaryMsg(reqId, action, message, bSqlQuery = true, bResultBinary = false) {
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
87
|
+
this._wsConnector.sendBinaryMsg(reqId, action, message).then((e) => {
|
|
88
|
+
if (bResultBinary) {
|
|
89
|
+
resolve(e);
|
|
90
|
+
}
|
|
91
|
+
if (e.msg.code == 0) {
|
|
92
|
+
if (bSqlQuery) {
|
|
93
|
+
resolve(new wsResponse_1.WSQueryResponse(e));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
resolve(e);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
|
|
101
|
+
}
|
|
102
|
+
}).catch((e) => { reject(e); });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
getState() {
|
|
110
|
+
if (this._wsConnector) {
|
|
111
|
+
return this._wsConnector.readyState();
|
|
112
|
+
}
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
async ready() {
|
|
116
|
+
try {
|
|
117
|
+
this._wsConnector = await wsConnectorPool_1.WebSocketConnectionPool.instance().getConnection(this._url, this._timeout);
|
|
118
|
+
if (this._wsConnector.readyState() <= 0) {
|
|
119
|
+
await this._wsConnector.ready();
|
|
120
|
+
}
|
|
121
|
+
log_1.default.debug("ready status ", this._url, this._wsConnector.readyState());
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
log_1.default.error(e.code, e.message);
|
|
126
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async fetch(res) {
|
|
130
|
+
let fetchMsg = {
|
|
131
|
+
action: 'fetch',
|
|
132
|
+
args: {
|
|
133
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
134
|
+
id: res.id,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
let jsonStr = json_bigint_1.default.stringify(fetchMsg);
|
|
139
|
+
log_1.default.debug('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr);
|
|
140
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
141
|
+
this._wsConnector.sendMsg(jsonStr).then((e) => {
|
|
142
|
+
if (e.msg.code == 0) {
|
|
143
|
+
resolve(new wsResponse_1.WSFetchResponse(e));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
reject(new wsError_1.WebSocketInterfaceError(e.msg.code, e.msg.message));
|
|
147
|
+
}
|
|
148
|
+
}).catch((e) => { reject(e); });
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async fetchBlock(fetchResponse, taosResult) {
|
|
156
|
+
let fetchBlockMsg = {
|
|
157
|
+
action: 'fetch_block',
|
|
158
|
+
args: {
|
|
159
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
160
|
+
id: fetchResponse.id,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
return new Promise((resolve, reject) => {
|
|
164
|
+
let jsonStr = json_bigint_1.default.stringify(fetchBlockMsg);
|
|
165
|
+
log_1.default.debug("[wsQueryInterface.fetchBlock.fetchBlockMsg]===>" + jsonStr);
|
|
166
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
167
|
+
this._wsConnector.sendMsg(jsonStr).then((e) => {
|
|
168
|
+
let resp = e;
|
|
169
|
+
taosResult.addTotalTime(resp.totalTime);
|
|
170
|
+
// if retrieve JSON then reject with message
|
|
171
|
+
// else is binary , so parse raw block to TaosResult
|
|
172
|
+
(0, taosResult_1.parseBlock)(new wsResponse_1.WSFetchBlockResponse(resp.msg), taosResult);
|
|
173
|
+
resolve(taosResult);
|
|
174
|
+
}).catch((e) => reject(e));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
async sendMsg(msg) {
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
log_1.default.debug("[wsQueryInterface.sendMsg]===>" + msg);
|
|
184
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
185
|
+
this._wsConnector.sendMsg(msg).then((e) => {
|
|
186
|
+
resolve(e);
|
|
187
|
+
}).catch((e) => reject(e));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async freeResult(res) {
|
|
195
|
+
let freeResultMsg = {
|
|
196
|
+
action: 'free_result',
|
|
197
|
+
args: {
|
|
198
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
199
|
+
id: res.id,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
let jsonStr = json_bigint_1.default.stringify(freeResultMsg);
|
|
204
|
+
log_1.default.debug("[wsQueryInterface.freeResult.freeResultMsg]===>" + jsonStr);
|
|
205
|
+
if (this._wsConnector && this._wsConnector.readyState() > 0) {
|
|
206
|
+
this._wsConnector.sendMsg(jsonStr, false)
|
|
207
|
+
.then((e) => { resolve(e); })
|
|
208
|
+
.catch((e) => reject(e));
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
reject(new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect"));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
async version() {
|
|
216
|
+
let versionMsg = {
|
|
217
|
+
action: 'version',
|
|
218
|
+
args: {
|
|
219
|
+
req_id: reqid_1.ReqId.getReqID()
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
if (this._wsConnector) {
|
|
223
|
+
try {
|
|
224
|
+
if (this._wsConnector.readyState() <= 0) {
|
|
225
|
+
await this._wsConnector.ready();
|
|
226
|
+
}
|
|
227
|
+
let result = await this._wsConnector.sendMsg(json_bigint_1.default.stringify(versionMsg));
|
|
228
|
+
if (result.msg.code == 0) {
|
|
229
|
+
return new wsResponse_1.WSVersionResponse(result).version;
|
|
230
|
+
}
|
|
231
|
+
throw (new wsError_1.WebSocketInterfaceError(result.msg.code, result.msg.message));
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
log_1.default.error(e.code, e.message);
|
|
235
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `connection creation failed, url: ${this._url}`));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
throw (wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "invalid websocket connect");
|
|
239
|
+
}
|
|
240
|
+
async close() {
|
|
241
|
+
if (this._wsConnector) {
|
|
242
|
+
await wsConnectorPool_1.WebSocketConnectionPool.instance().releaseConnection(this._wsConnector);
|
|
243
|
+
this._wsConnector = undefined;
|
|
244
|
+
// this._wsConnector.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
checkURL(url) {
|
|
248
|
+
// Assert is cloud url
|
|
249
|
+
if (!url.searchParams.has('token')) {
|
|
250
|
+
if (!(url.username || url.password)) {
|
|
251
|
+
throw new wsError_1.WebSocketInterfaceError(wsError_1.ErrorCode.ERR_INVALID_AUTHENTICATION, 'invalid url, password or username needed.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.WsClient = WsClient;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class WebSocketConnector {
|
|
2
|
+
private _wsConn;
|
|
3
|
+
private _wsURL;
|
|
4
|
+
_timeout: number;
|
|
5
|
+
constructor(url: URL, timeout: number | undefined | null);
|
|
6
|
+
ready(): Promise<unknown>;
|
|
7
|
+
private _onclose;
|
|
8
|
+
private _onmessage;
|
|
9
|
+
close(): void;
|
|
10
|
+
readyState(): number;
|
|
11
|
+
sendMsgNoResp(message: string): Promise<void>;
|
|
12
|
+
sendMsg(message: string, register?: Boolean): Promise<unknown>;
|
|
13
|
+
sendBinaryMsg(reqId: bigint, action: string, message: ArrayBuffer, register?: Boolean): Promise<unknown>;
|
|
14
|
+
configTimeout(ms: number): void;
|
|
15
|
+
getWsURL(): URL;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=wsConnector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsConnector.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnector.ts"],"names":[],"mappings":"AAMA,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAM;IACpB,QAAQ,SAAQ;gBAGJ,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAsBlD,KAAK;YAeG,QAAQ;IAKtB,OAAO,CAAC,UAAU;IA0BlB,KAAK;IASL,UAAU,IAAI,MAAM;IAId,aAAa,CAAC,OAAO,EAAE,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC;IAmB5C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc;IAuBjD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,GAAE,OAAc;IAgBzF,aAAa,CAAC,EAAE,EAAE,MAAM;IAIxB,QAAQ,IAAI,GAAG;CAGzB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketConnector = void 0;
|
|
7
|
+
const websocket_1 = require("websocket");
|
|
8
|
+
const wsError_1 = require("../common/wsError");
|
|
9
|
+
const wsEventCallback_1 = require("./wsEventCallback");
|
|
10
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
11
|
+
const reqid_1 = require("../common/reqid");
|
|
12
|
+
class WebSocketConnector {
|
|
13
|
+
// create ws
|
|
14
|
+
constructor(url, timeout) {
|
|
15
|
+
this._timeout = 5000;
|
|
16
|
+
// return w3bsocket3
|
|
17
|
+
if (url) {
|
|
18
|
+
this._wsURL = url;
|
|
19
|
+
let origin = url.origin;
|
|
20
|
+
let pathname = url.pathname;
|
|
21
|
+
let search = url.search;
|
|
22
|
+
if (timeout) {
|
|
23
|
+
this._timeout = timeout;
|
|
24
|
+
}
|
|
25
|
+
this._wsConn = new websocket_1.w3cwebsocket(origin.concat(pathname).concat(search));
|
|
26
|
+
this._wsConn.onerror = function (err) { log_1.default.error(err.message); throw err; };
|
|
27
|
+
this._wsConn.onclose = this._onclose;
|
|
28
|
+
this._wsConn.onmessage = this._onmessage;
|
|
29
|
+
this._wsConn._binaryType = "arraybuffer";
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_INVALID_URL, "websocket URL must be defined");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async ready() {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
let reqId = reqid_1.ReqId.getReqID();
|
|
38
|
+
wsEventCallback_1.WsEventCallback.instance().registerCallback({ action: "websocket_connection", req_id: BigInt(reqId),
|
|
39
|
+
timeout: this._timeout, id: BigInt(reqId) }, resolve, reject);
|
|
40
|
+
this._wsConn.onopen = () => {
|
|
41
|
+
log_1.default.debug("websocket connection opened");
|
|
42
|
+
wsEventCallback_1.WsEventCallback.instance().handleEventCallback({ id: BigInt(reqId), action: "websocket_connection", req_id: BigInt(reqId) }, wsEventCallback_1.OnMessageType.MESSAGE_TYPE_CONNECTION, this);
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async _onclose(e) {
|
|
47
|
+
log_1.default.info("websocket connection closed");
|
|
48
|
+
}
|
|
49
|
+
_onmessage(event) {
|
|
50
|
+
let data = event.data;
|
|
51
|
+
log_1.default.debug("wsClient._onMessage()====" + (Object.prototype.toString.call(data)));
|
|
52
|
+
if (Object.prototype.toString.call(data) === '[object ArrayBuffer]') {
|
|
53
|
+
let id = new DataView(data, 26, 8).getBigUint64(0, true);
|
|
54
|
+
wsEventCallback_1.WsEventCallback.instance().handleEventCallback({ id: id, action: '', req_id: BigInt(0) }, wsEventCallback_1.OnMessageType.MESSAGE_TYPE_ARRAYBUFFER, data);
|
|
55
|
+
}
|
|
56
|
+
else if (Object.prototype.toString.call(data) === '[object Blob]') {
|
|
57
|
+
data.arrayBuffer().then((d) => {
|
|
58
|
+
let id = new DataView(d, 8, 8).getBigUint64(0, true);
|
|
59
|
+
wsEventCallback_1.WsEventCallback.instance().handleEventCallback({ id: id, action: '', req_id: BigInt(0) }, wsEventCallback_1.OnMessageType.MESSAGE_TYPE_BLOB, d);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else if (Object.prototype.toString.call(data) === '[object String]') {
|
|
63
|
+
let msg = JSON.parse(data);
|
|
64
|
+
log_1.default.debug("[_onmessage.stringType]==>:" + data);
|
|
65
|
+
wsEventCallback_1.WsEventCallback.instance().handleEventCallback({ id: BigInt(0), action: msg.action, req_id: msg.req_id }, wsEventCallback_1.OnMessageType.MESSAGE_TYPE_STRING, msg);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_MESSAGE_TYPE, `invalid message type ${Object.prototype.toString.call(data)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
close() {
|
|
72
|
+
if (this._wsConn) {
|
|
73
|
+
this._wsConn.close();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, "WebSocket connection is undefined.");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
readyState() {
|
|
80
|
+
return this._wsConn.readyState;
|
|
81
|
+
}
|
|
82
|
+
async sendMsgNoResp(message) {
|
|
83
|
+
log_1.default.debug("[wsClient.sendMsgNoResp()]===>" + message);
|
|
84
|
+
let msg = JSON.parse(message);
|
|
85
|
+
if (msg.args.id !== undefined) {
|
|
86
|
+
msg.args.id = BigInt(msg.args.id);
|
|
87
|
+
}
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
if (this._wsConn && this._wsConn.readyState > 0) {
|
|
90
|
+
this._wsConn.send(message);
|
|
91
|
+
resolve();
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async sendMsg(message, register = true) {
|
|
99
|
+
log_1.default.debug("[wsClient.sendMessage()]===>" + message);
|
|
100
|
+
let msg = JSON.parse(message);
|
|
101
|
+
if (msg.args.id !== undefined) {
|
|
102
|
+
msg.args.id = BigInt(msg.args.id);
|
|
103
|
+
}
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
if (this._wsConn && this._wsConn.readyState > 0) {
|
|
106
|
+
if (register) {
|
|
107
|
+
wsEventCallback_1.WsEventCallback.instance().registerCallback({ action: msg.action, req_id: msg.args.req_id,
|
|
108
|
+
timeout: this._timeout, id: msg.args.id === undefined ? msg.args.id : BigInt(msg.args.id) }, resolve, reject);
|
|
109
|
+
}
|
|
110
|
+
log_1.default.debug("[wsClient.sendMessage.msg]===>\n", message);
|
|
111
|
+
this._wsConn.send(message);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async sendBinaryMsg(reqId, action, message, register = true) {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
if (this._wsConn && this._wsConn.readyState > 0) {
|
|
121
|
+
if (register) {
|
|
122
|
+
wsEventCallback_1.WsEventCallback.instance().registerCallback({ action: action, req_id: reqId,
|
|
123
|
+
timeout: this._timeout, id: reqId }, resolve, reject);
|
|
124
|
+
}
|
|
125
|
+
log_1.default.debug("[wsClient.sendBinaryMsg()]===>" + reqId + action + message.byteLength);
|
|
126
|
+
this._wsConn.send(message);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
reject(new wsError_1.WebSocketQueryError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_FAIL, `WebSocket connection is not ready,status :${this._wsConn?.readyState}`));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
configTimeout(ms) {
|
|
134
|
+
this._timeout = ms;
|
|
135
|
+
}
|
|
136
|
+
getWsURL() {
|
|
137
|
+
return this._wsURL;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.WebSocketConnector = WebSocketConnector;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { WebSocketConnector } from "./wsConnector";
|
|
2
|
+
export declare class WebSocketConnectionPool {
|
|
3
|
+
private static _instance?;
|
|
4
|
+
private pool;
|
|
5
|
+
private _connectionCount;
|
|
6
|
+
private readonly _maxConnections;
|
|
7
|
+
private constructor();
|
|
8
|
+
static instance(maxConnections?: number): WebSocketConnectionPool;
|
|
9
|
+
getConnection(url: URL, timeout: number | undefined | null): Promise<WebSocketConnector>;
|
|
10
|
+
releaseConnection(connector: WebSocketConnector): Promise<void>;
|
|
11
|
+
destroyed(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=wsConnectorPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsConnectorPool.d.ts","sourceRoot":"","sources":["../../../src/client/wsConnectorPool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAKnD,qBAAa,uBAAuB;IAChC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAyB;IAClD,OAAO,CAAC,IAAI,CAAgD;IAC5D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO;WAKO,QAAQ,CAAC,cAAc,GAAE,MAAW,GAAE,uBAAuB;IAOrE,aAAa,CAAC,GAAG,EAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6BvF,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAE,OAAO,CAAC,IAAI,CAAC;IA0BpE,SAAS;CAYZ"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketConnectionPool = void 0;
|
|
7
|
+
const async_mutex_1 = require("async-mutex");
|
|
8
|
+
const wsConnector_1 = require("./wsConnector");
|
|
9
|
+
const wsError_1 = require("../common/wsError");
|
|
10
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
11
|
+
const mutex = new async_mutex_1.Mutex();
|
|
12
|
+
class WebSocketConnectionPool {
|
|
13
|
+
constructor(maxConnections = -1) {
|
|
14
|
+
this.pool = new Map();
|
|
15
|
+
this._maxConnections = maxConnections;
|
|
16
|
+
this._connectionCount = 0;
|
|
17
|
+
}
|
|
18
|
+
static instance(maxConnections = -1) {
|
|
19
|
+
if (!WebSocketConnectionPool._instance) {
|
|
20
|
+
WebSocketConnectionPool._instance = new WebSocketConnectionPool(maxConnections);
|
|
21
|
+
}
|
|
22
|
+
return WebSocketConnectionPool._instance;
|
|
23
|
+
}
|
|
24
|
+
async getConnection(url, timeout) {
|
|
25
|
+
let connectAddr = url.origin.concat(url.pathname).concat(url.search);
|
|
26
|
+
let connector;
|
|
27
|
+
const unlock = await mutex.acquire();
|
|
28
|
+
try {
|
|
29
|
+
if (this.pool.has(connectAddr)) {
|
|
30
|
+
let connectors = this.pool.get(connectAddr);
|
|
31
|
+
if (connectors) {
|
|
32
|
+
if (connectors.length > 0) {
|
|
33
|
+
connector = connectors.pop();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (connector) {
|
|
38
|
+
log_1.default.debug("get connection success:", this._connectionCount);
|
|
39
|
+
return connector;
|
|
40
|
+
}
|
|
41
|
+
if (this._maxConnections != -1 && this._connectionCount > this._maxConnections) {
|
|
42
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_WEBSOCKET_CONNECTION_ARRIVED_LIMIT, "websocket connect arrived limited:" + this._connectionCount);
|
|
43
|
+
}
|
|
44
|
+
this._connectionCount++;
|
|
45
|
+
return new wsConnector_1.WebSocketConnector(url, timeout);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
unlock();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async releaseConnection(connector) {
|
|
52
|
+
if (connector) {
|
|
53
|
+
const unlock = await mutex.acquire();
|
|
54
|
+
try {
|
|
55
|
+
if (connector.readyState() > 0) {
|
|
56
|
+
let url = connector.getWsURL();
|
|
57
|
+
let connectAddr = url.origin.concat(url.pathname).concat(url.search);
|
|
58
|
+
let connectors = this.pool.get(connectAddr);
|
|
59
|
+
if (!connectors) {
|
|
60
|
+
connectors = new Array();
|
|
61
|
+
connectors.push(connector);
|
|
62
|
+
this.pool.set(connectAddr, connectors);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
connectors.push(connector);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this._connectionCount--;
|
|
70
|
+
connector.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
unlock();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
destroyed() {
|
|
79
|
+
if (this.pool) {
|
|
80
|
+
for (let values of this.pool.values()) {
|
|
81
|
+
for (let i in values) {
|
|
82
|
+
values.pop()?.close();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
log_1.default.info("destroyed connect:" + this._connectionCount);
|
|
87
|
+
this._connectionCount = 0;
|
|
88
|
+
this.pool = new Map();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.WebSocketConnectionPool = WebSocketConnectionPool;
|
|
92
|
+
process.on('exit', (code) => {
|
|
93
|
+
log_1.default.info("begin destroy connect");
|
|
94
|
+
WebSocketConnectionPool.instance().destroyed();
|
|
95
|
+
process.exit();
|
|
96
|
+
});
|
|
97
|
+
process.on('SIGINT', () => {
|
|
98
|
+
log_1.default.info('Received SIGINT. Press Control-D to exit, begin destroy connect...');
|
|
99
|
+
WebSocketConnectionPool.instance().destroyed();
|
|
100
|
+
process.exit();
|
|
101
|
+
});
|
|
102
|
+
process.on('SIGTERM', () => {
|
|
103
|
+
log_1.default.info('Received SIGINT. Press Control-D to exit, begin destroy connect');
|
|
104
|
+
WebSocketConnectionPool.instance().destroyed();
|
|
105
|
+
process.exit();
|
|
106
|
+
});
|
|
107
|
+
// process.kill(process.pid, 'SIGINT');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface MessageId {
|
|
2
|
+
action: string;
|
|
3
|
+
req_id: bigint;
|
|
4
|
+
id?: bigint;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare enum OnMessageType {
|
|
8
|
+
MESSAGE_TYPE_ARRAYBUFFER = 1,
|
|
9
|
+
MESSAGE_TYPE_BLOB = 2,
|
|
10
|
+
MESSAGE_TYPE_STRING = 3,
|
|
11
|
+
MESSAGE_TYPE_CONNECTION = 4
|
|
12
|
+
}
|
|
13
|
+
export declare class WsEventCallback {
|
|
14
|
+
private static _instance?;
|
|
15
|
+
private static _msgActionRegister;
|
|
16
|
+
private constructor();
|
|
17
|
+
static instance(): WsEventCallback;
|
|
18
|
+
registerCallback(id: MessageId, res: (args: unknown) => void, rej: (reason: any) => void): Promise<void>;
|
|
19
|
+
handleEventCallback(msg: MessageId, messageType: OnMessageType, data: any): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=wsEventCallback.d.ts.map
|