@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
|
@@ -0,0 +1,207 @@
|
|
|
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.WsStmt = void 0;
|
|
7
|
+
const wsError_1 = require("../common/wsError");
|
|
8
|
+
const wsProto_1 = require("./wsProto");
|
|
9
|
+
const reqid_1 = require("../common/reqid");
|
|
10
|
+
const constant_1 = require("../common/constant");
|
|
11
|
+
const wsParams_1 = require("./wsParams");
|
|
12
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
13
|
+
class WsStmt {
|
|
14
|
+
constructor(wsClient, precision) {
|
|
15
|
+
this._precision = constant_1.PrecisionLength['ms'];
|
|
16
|
+
this._wsClient = wsClient;
|
|
17
|
+
if (precision) {
|
|
18
|
+
this._precision = precision;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
static async newStmt(wsClient, precision, reqId) {
|
|
22
|
+
try {
|
|
23
|
+
let wsStmt = new WsStmt(wsClient, precision);
|
|
24
|
+
return await wsStmt.init(reqId);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
log_1.default.error(e.code, e.message);
|
|
28
|
+
throw (e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async prepare(sql) {
|
|
32
|
+
let queryMsg = {
|
|
33
|
+
action: 'prepare',
|
|
34
|
+
args: {
|
|
35
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
36
|
+
sql: sql,
|
|
37
|
+
stmt_id: this._stmt_id,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
return await this.execute(queryMsg);
|
|
41
|
+
}
|
|
42
|
+
async setTableName(tableName) {
|
|
43
|
+
let queryMsg = {
|
|
44
|
+
action: 'set_table_name',
|
|
45
|
+
args: {
|
|
46
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
47
|
+
name: tableName,
|
|
48
|
+
stmt_id: this._stmt_id,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
return await this.execute(queryMsg);
|
|
52
|
+
}
|
|
53
|
+
async setJsonTags(tags) {
|
|
54
|
+
let queryMsg = {
|
|
55
|
+
action: 'set_tags',
|
|
56
|
+
args: {
|
|
57
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
58
|
+
tags: tags,
|
|
59
|
+
stmt_id: this._stmt_id,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
return await this.execute(queryMsg);
|
|
63
|
+
}
|
|
64
|
+
newStmtParam() {
|
|
65
|
+
return new wsParams_1.StmtBindParams(this._precision);
|
|
66
|
+
}
|
|
67
|
+
async setTags(paramsArray) {
|
|
68
|
+
if (!paramsArray || !this._stmt_id) {
|
|
69
|
+
throw new wsError_1.TaosError(wsError_1.ErrorCode.ERR_INVALID_PARAMS, "SetBinaryTags paramArray is invalid!");
|
|
70
|
+
}
|
|
71
|
+
let columnInfos = paramsArray.getParams();
|
|
72
|
+
if (!columnInfos) {
|
|
73
|
+
throw new wsError_1.TaosError(wsError_1.ErrorCode.ERR_INVALID_PARAMS, "SetBinaryTags paramArray is invalid!");
|
|
74
|
+
}
|
|
75
|
+
let reqId = BigInt(reqid_1.ReqId.getReqID());
|
|
76
|
+
let dataBlock = (0, wsProto_1.binaryBlockEncode)(paramsArray, 1 /* StmtBindType.STMT_TYPE_TAG */, this._stmt_id, reqId, paramsArray.getDataRows());
|
|
77
|
+
return await this.sendBinaryMsg(reqId, 'set_tags', dataBlock);
|
|
78
|
+
}
|
|
79
|
+
async bind(paramsArray) {
|
|
80
|
+
if (!paramsArray || !this._stmt_id) {
|
|
81
|
+
throw new wsError_1.TaosError(wsError_1.ErrorCode.ERR_INVALID_PARAMS, "BinaryBind paramArray is invalid!");
|
|
82
|
+
}
|
|
83
|
+
let columnInfos = paramsArray.getParams();
|
|
84
|
+
if (!columnInfos) {
|
|
85
|
+
throw new wsError_1.TaosError(wsError_1.ErrorCode.ERR_INVALID_PARAMS, "BinaryBind paramArray is invalid!");
|
|
86
|
+
}
|
|
87
|
+
let reqId = BigInt(reqid_1.ReqId.getReqID());
|
|
88
|
+
let dataBlock = (0, wsProto_1.binaryBlockEncode)(paramsArray, 2 /* StmtBindType.STMT_TYPE_BIND */, this._stmt_id, reqId, paramsArray.getDataRows());
|
|
89
|
+
return await this.sendBinaryMsg(reqId, 'bind', dataBlock);
|
|
90
|
+
}
|
|
91
|
+
async jsonBind(paramArray) {
|
|
92
|
+
let queryMsg = {
|
|
93
|
+
action: 'bind',
|
|
94
|
+
args: {
|
|
95
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
96
|
+
columns: paramArray,
|
|
97
|
+
stmt_id: this._stmt_id,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
return await this.execute(queryMsg);
|
|
101
|
+
}
|
|
102
|
+
async batch() {
|
|
103
|
+
let queryMsg = {
|
|
104
|
+
action: 'add_batch',
|
|
105
|
+
args: {
|
|
106
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
107
|
+
stmt_id: this._stmt_id,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
return await this.execute(queryMsg);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* return client version.
|
|
114
|
+
*/
|
|
115
|
+
async version() {
|
|
116
|
+
return await this._wsClient.version();
|
|
117
|
+
}
|
|
118
|
+
async exec() {
|
|
119
|
+
let queryMsg = {
|
|
120
|
+
action: 'exec',
|
|
121
|
+
args: {
|
|
122
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
123
|
+
stmt_id: this._stmt_id,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
return await this.execute(queryMsg);
|
|
127
|
+
}
|
|
128
|
+
getLastAffected() {
|
|
129
|
+
return this.lastAffected;
|
|
130
|
+
}
|
|
131
|
+
async close() {
|
|
132
|
+
let queryMsg = {
|
|
133
|
+
action: 'close',
|
|
134
|
+
args: {
|
|
135
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
136
|
+
stmt_id: this._stmt_id,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
return await this.execute(queryMsg, false);
|
|
140
|
+
}
|
|
141
|
+
getStmtId() {
|
|
142
|
+
return this._stmt_id;
|
|
143
|
+
}
|
|
144
|
+
async execute(queryMsg, register = true) {
|
|
145
|
+
try {
|
|
146
|
+
if (this._wsClient.getState() <= 0) {
|
|
147
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!");
|
|
148
|
+
}
|
|
149
|
+
let reqMsg = JSON.stringify(queryMsg);
|
|
150
|
+
if (register) {
|
|
151
|
+
let result = await this._wsClient.exec(reqMsg, false);
|
|
152
|
+
let resp = new wsProto_1.WsStmtQueryResponse(result);
|
|
153
|
+
if (resp.stmt_id) {
|
|
154
|
+
this._stmt_id = resp.stmt_id;
|
|
155
|
+
}
|
|
156
|
+
if (resp.affected) {
|
|
157
|
+
this.lastAffected = resp.affected;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await this._wsClient.execNoResp(reqMsg);
|
|
162
|
+
this._stmt_id = null;
|
|
163
|
+
this.lastAffected = null;
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
throw new wsError_1.TaosResultError(e.code, e.message);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async sendBinaryMsg(reqId, action, message) {
|
|
172
|
+
if (this._wsClient.getState() <= 0) {
|
|
173
|
+
throw new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "websocket connect has closed!");
|
|
174
|
+
}
|
|
175
|
+
let result = await this._wsClient.sendBinaryMsg(reqId, action, message, false);
|
|
176
|
+
let resp = new wsProto_1.WsStmtQueryResponse(result);
|
|
177
|
+
if (resp.stmt_id) {
|
|
178
|
+
this._stmt_id = resp.stmt_id;
|
|
179
|
+
}
|
|
180
|
+
if (resp.affected) {
|
|
181
|
+
this.lastAffected = resp.affected;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async init(reqId) {
|
|
185
|
+
if (this._wsClient) {
|
|
186
|
+
try {
|
|
187
|
+
if (this._wsClient.getState() <= 0) {
|
|
188
|
+
await this._wsClient.connect();
|
|
189
|
+
}
|
|
190
|
+
let queryMsg = {
|
|
191
|
+
action: 'init',
|
|
192
|
+
args: {
|
|
193
|
+
req_id: reqid_1.ReqId.getReqID(reqId),
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
await this.execute(queryMsg);
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
log_1.default.error(e.code, e.message);
|
|
201
|
+
throw (e);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_CONNECTION_CLOSED, "stmt connect closed"));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.WsStmt = WsStmt;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class TmqConfig {
|
|
2
|
+
url: URL;
|
|
3
|
+
user: string;
|
|
4
|
+
password: string;
|
|
5
|
+
group_id: string;
|
|
6
|
+
client_id: string;
|
|
7
|
+
offset_rest: string;
|
|
8
|
+
topics?: Array<string>;
|
|
9
|
+
auto_commit: boolean;
|
|
10
|
+
auto_commit_interval_ms: number;
|
|
11
|
+
timeout: number;
|
|
12
|
+
constructor(wsConfig: Map<string, any>);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/tmq/config.ts"],"names":[],"mappings":"AAEA,qBAAa,SAAS;IAElB,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,OAAO,EAAC,MAAM,CAAC;gBAGH,QAAQ,EAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;CAwCxC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TmqConfig = void 0;
|
|
4
|
+
const constant_1 = require("./constant");
|
|
5
|
+
class TmqConfig {
|
|
6
|
+
constructor(wsConfig) {
|
|
7
|
+
this.url = new URL(wsConfig.get(constant_1.TMQConstants.WS_URL));
|
|
8
|
+
this.user = wsConfig.get(constant_1.TMQConstants.CONNECT_USER);
|
|
9
|
+
this.password = wsConfig.get(constant_1.TMQConstants.CONNECT_PASS);
|
|
10
|
+
this.group_id = wsConfig.get(constant_1.TMQConstants.GROUP_ID);
|
|
11
|
+
this.client_id = wsConfig.get(constant_1.TMQConstants.CLIENT_ID);
|
|
12
|
+
this.offset_rest = wsConfig.get(constant_1.TMQConstants.AUTO_OFFSET_RESET);
|
|
13
|
+
this.auto_commit = wsConfig.get(constant_1.TMQConstants.ENABLE_AUTO_COMMIT);
|
|
14
|
+
if (!this.auto_commit) {
|
|
15
|
+
this.auto_commit = false;
|
|
16
|
+
}
|
|
17
|
+
this.auto_commit_interval_ms = wsConfig.get(constant_1.TMQConstants.AUTO_COMMIT_INTERVAL_MS);
|
|
18
|
+
if (!this.auto_commit_interval_ms) {
|
|
19
|
+
this.auto_commit_interval_ms = 5 * 1000;
|
|
20
|
+
}
|
|
21
|
+
this.timeout = wsConfig.get(constant_1.TMQConstants.CONNECT_MESSAGE_TIMEOUT);
|
|
22
|
+
if (!this.timeout) {
|
|
23
|
+
this.timeout = 5000;
|
|
24
|
+
}
|
|
25
|
+
if (this.url) {
|
|
26
|
+
if (this.user) {
|
|
27
|
+
this.url.username = this.user;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.user = this.url.username;
|
|
31
|
+
}
|
|
32
|
+
if (this.password) {
|
|
33
|
+
this.url.password = this.password;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.password = this.url.password;
|
|
37
|
+
}
|
|
38
|
+
this.url.pathname = '/rest/tmq';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.TmqConfig = TmqConfig;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export declare class TMQConstants {
|
|
2
|
+
static GROUP_ID: string;
|
|
3
|
+
static CLIENT_ID: string;
|
|
4
|
+
/**
|
|
5
|
+
* auto commit default is true then the commitCallback function will be called after 5 seconds
|
|
6
|
+
*/
|
|
7
|
+
static ENABLE_AUTO_COMMIT: string;
|
|
8
|
+
/**
|
|
9
|
+
* commit interval. unit milliseconds
|
|
10
|
+
*/
|
|
11
|
+
static AUTO_COMMIT_INTERVAL_MS: string;
|
|
12
|
+
/**
|
|
13
|
+
* only valid in first group id create.
|
|
14
|
+
*/
|
|
15
|
+
static AUTO_OFFSET_RESET: string;
|
|
16
|
+
/**
|
|
17
|
+
* whether poll result include table name. suggest always true
|
|
18
|
+
*/
|
|
19
|
+
static MSG_WITH_TABLE_NAME: string;
|
|
20
|
+
/**
|
|
21
|
+
* indicate host and port of connection
|
|
22
|
+
*/
|
|
23
|
+
static BOOTSTRAP_SERVERS: string;
|
|
24
|
+
/**
|
|
25
|
+
* deserializer Bean
|
|
26
|
+
*/
|
|
27
|
+
static VALUE_DESERIALIZER: string;
|
|
28
|
+
/**
|
|
29
|
+
* encode for deserializer String value
|
|
30
|
+
*/
|
|
31
|
+
static VALUE_DESERIALIZER_ENCODING: string;
|
|
32
|
+
/**
|
|
33
|
+
* connection ip
|
|
34
|
+
*/
|
|
35
|
+
static CONNECT_IP: string;
|
|
36
|
+
/**
|
|
37
|
+
* connection port
|
|
38
|
+
*/
|
|
39
|
+
static CONNECT_PORT: string;
|
|
40
|
+
/**
|
|
41
|
+
* connection username
|
|
42
|
+
*/
|
|
43
|
+
static CONNECT_USER: string;
|
|
44
|
+
/**
|
|
45
|
+
* connection password
|
|
46
|
+
*/
|
|
47
|
+
static CONNECT_PASS: string;
|
|
48
|
+
/**
|
|
49
|
+
* connect type websocket or jni, default is jni
|
|
50
|
+
*/
|
|
51
|
+
static CONNECT_TYPE: string;
|
|
52
|
+
/**
|
|
53
|
+
* Key used to retrieve the token value from the properties instance passed to
|
|
54
|
+
* the driver.
|
|
55
|
+
* Just for Cloud Service
|
|
56
|
+
*/
|
|
57
|
+
static WS_URL: string;
|
|
58
|
+
/**
|
|
59
|
+
* the timeout in milliseconds until a connection is established.
|
|
60
|
+
* zero is interpreted as an infinite timeout.
|
|
61
|
+
* only valid in websocket
|
|
62
|
+
*/
|
|
63
|
+
static CONNECT_TIMEOUT: string;
|
|
64
|
+
/**
|
|
65
|
+
* message receive from server timeout. ms.
|
|
66
|
+
* only valid in websocket
|
|
67
|
+
*/
|
|
68
|
+
static CONNECT_MESSAGE_TIMEOUT: string;
|
|
69
|
+
}
|
|
70
|
+
export declare class TMQMessageType {
|
|
71
|
+
static Subscribe: string;
|
|
72
|
+
static Poll: string;
|
|
73
|
+
static FetchRaw: string;
|
|
74
|
+
static FetchJsonMeta: string;
|
|
75
|
+
static Commit: string;
|
|
76
|
+
static Unsubscribe: string;
|
|
77
|
+
static GetTopicAssignment: string;
|
|
78
|
+
static Seek: string;
|
|
79
|
+
static CommitOffset: string;
|
|
80
|
+
static Committed: string;
|
|
81
|
+
static Position: string;
|
|
82
|
+
static ListTopics: string;
|
|
83
|
+
static ResDataType: number;
|
|
84
|
+
}
|
|
85
|
+
export declare class TMQBlockInfo {
|
|
86
|
+
rawBlock?: ArrayBuffer;
|
|
87
|
+
precision?: number;
|
|
88
|
+
schema: Array<TMQRawDataSchema>;
|
|
89
|
+
tableName?: string;
|
|
90
|
+
constructor();
|
|
91
|
+
}
|
|
92
|
+
export declare class TMQRawDataSchema {
|
|
93
|
+
colType: number;
|
|
94
|
+
flag: number;
|
|
95
|
+
bytes: bigint;
|
|
96
|
+
colID: number;
|
|
97
|
+
name: string;
|
|
98
|
+
constructor();
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=constant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../../src/tmq/constant.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACrB,OAAc,QAAQ,EAAE,MAAM,CAAc;IAE5C,OAAc,SAAS,EAAE,MAAM,CAAe;IAE9C;;OAEG;IACH,OAAc,kBAAkB,EAAE,MAAM,CAAwB;IAEhE;;OAEG;IACH,OAAc,uBAAuB,EAAE,MAAM,CAA6B;IAE1E;;OAEG;IACH,OAAc,iBAAiB,EAAE,MAAM,CAAuB;IAE9D;;OAEG;IACH,OAAc,mBAAmB,EAAE,MAAM,CAAyB;IAElE;;OAEG;IACH,OAAc,iBAAiB,EAAE,MAAM,CAAuB;IAE9D;;OAEG;IACH,OAAc,kBAAkB,EAAE,MAAM,CAAwB;IAEhE;;OAEG;IACH,OAAc,2BAA2B,EAAE,MAAM,CAAiC;IAElF;;OAEG;IACH,OAAc,UAAU,EAAE,MAAM,CAAmB;IAEnD;;OAEG;IACH,OAAc,YAAY,EAAE,MAAM,CAAqB;IAEvD;;OAEG;IACH,OAAc,YAAY,EAAE,MAAM,CAAqB;IAEvD;;OAEG;IACH,OAAc,YAAY,EAAE,MAAM,CAAqB;IAEvD;;OAEG;IACH,OAAc,YAAY,EAAE,MAAM,CAAqB;IAEvD;;;;OAIG;IACH,OAAc,MAAM,EAAE,MAAM,CAAY;IAExC;;;;OAIG;IACH,OAAc,eAAe,EAAE,MAAM,CAAwB;IAE7D;;;OAGG;IACH,OAAc,uBAAuB,EAAE,MAAM,CAAwB;CAExE;AAED,qBAAa,cAAc;IACvB,OAAc,SAAS,EAAE,MAAM,CAAe;IAC9C,OAAc,IAAI,EAAE,MAAM,CAAU;IACpC,OAAc,QAAQ,EAAE,MAAM,CAAe;IAC7C,OAAc,aAAa,EAAE,MAAM,CAAqB;IACxD,OAAc,MAAM,EAAE,MAAM,CAAY;IACxC,OAAc,WAAW,EAAE,MAAM,CAAiB;IAClD,OAAc,kBAAkB,EAAE,MAAM,CAAgB;IACxD,OAAc,IAAI,EAAE,MAAM,CAAU;IACpC,OAAc,YAAY,EAAE,MAAM,CAAmB;IACrD,OAAc,SAAS,EAAE,MAAM,CAAe;IAC9C,OAAc,QAAQ,EAAE,MAAM,CAAc;IAC5C,OAAc,UAAU,EAAE,MAAM,CAAiB;IACjD,OAAc,WAAW,EAAE,MAAM,CAAK;CACzC;AAED,qBAAa,YAAY;IACxB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;;CAInB;AAED,qBAAa,gBAAgB;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAI,MAAM,CAAC;IACf,KAAK,EAAG,MAAM,CAAC;IACf,KAAK,EAAG,MAAM,CAAA;IACd,IAAI,EAAG,MAAM,CAAC;;CASd"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TMQRawDataSchema = exports.TMQBlockInfo = exports.TMQMessageType = exports.TMQConstants = void 0;
|
|
4
|
+
class TMQConstants {
|
|
5
|
+
}
|
|
6
|
+
exports.TMQConstants = TMQConstants;
|
|
7
|
+
TMQConstants.GROUP_ID = 'group.id';
|
|
8
|
+
TMQConstants.CLIENT_ID = 'client.id';
|
|
9
|
+
/**
|
|
10
|
+
* auto commit default is true then the commitCallback function will be called after 5 seconds
|
|
11
|
+
*/
|
|
12
|
+
TMQConstants.ENABLE_AUTO_COMMIT = 'enable.auto.commit';
|
|
13
|
+
/**
|
|
14
|
+
* commit interval. unit milliseconds
|
|
15
|
+
*/
|
|
16
|
+
TMQConstants.AUTO_COMMIT_INTERVAL_MS = 'auto.commit.interval.ms';
|
|
17
|
+
/**
|
|
18
|
+
* only valid in first group id create.
|
|
19
|
+
*/
|
|
20
|
+
TMQConstants.AUTO_OFFSET_RESET = 'auto.offset.reset';
|
|
21
|
+
/**
|
|
22
|
+
* whether poll result include table name. suggest always true
|
|
23
|
+
*/
|
|
24
|
+
TMQConstants.MSG_WITH_TABLE_NAME = 'msg.with.table.name';
|
|
25
|
+
/**
|
|
26
|
+
* indicate host and port of connection
|
|
27
|
+
*/
|
|
28
|
+
TMQConstants.BOOTSTRAP_SERVERS = 'bootstrap.servers';
|
|
29
|
+
/**
|
|
30
|
+
* deserializer Bean
|
|
31
|
+
*/
|
|
32
|
+
TMQConstants.VALUE_DESERIALIZER = 'value.deserializer';
|
|
33
|
+
/**
|
|
34
|
+
* encode for deserializer String value
|
|
35
|
+
*/
|
|
36
|
+
TMQConstants.VALUE_DESERIALIZER_ENCODING = 'value.deserializer.encoding';
|
|
37
|
+
/**
|
|
38
|
+
* connection ip
|
|
39
|
+
*/
|
|
40
|
+
TMQConstants.CONNECT_IP = 'td.connect.ip';
|
|
41
|
+
/**
|
|
42
|
+
* connection port
|
|
43
|
+
*/
|
|
44
|
+
TMQConstants.CONNECT_PORT = 'td.connect.port';
|
|
45
|
+
/**
|
|
46
|
+
* connection username
|
|
47
|
+
*/
|
|
48
|
+
TMQConstants.CONNECT_USER = 'td.connect.user';
|
|
49
|
+
/**
|
|
50
|
+
* connection password
|
|
51
|
+
*/
|
|
52
|
+
TMQConstants.CONNECT_PASS = 'td.connect.pass';
|
|
53
|
+
/**
|
|
54
|
+
* connect type websocket or jni, default is jni
|
|
55
|
+
*/
|
|
56
|
+
TMQConstants.CONNECT_TYPE = 'td.connect.type';
|
|
57
|
+
/**
|
|
58
|
+
* Key used to retrieve the token value from the properties instance passed to
|
|
59
|
+
* the driver.
|
|
60
|
+
* Just for Cloud Service
|
|
61
|
+
*/
|
|
62
|
+
TMQConstants.WS_URL = 'ws.url';
|
|
63
|
+
/**
|
|
64
|
+
* the timeout in milliseconds until a connection is established.
|
|
65
|
+
* zero is interpreted as an infinite timeout.
|
|
66
|
+
* only valid in websocket
|
|
67
|
+
*/
|
|
68
|
+
TMQConstants.CONNECT_TIMEOUT = 'httpConnectTimeout';
|
|
69
|
+
/**
|
|
70
|
+
* message receive from server timeout. ms.
|
|
71
|
+
* only valid in websocket
|
|
72
|
+
*/
|
|
73
|
+
TMQConstants.CONNECT_MESSAGE_TIMEOUT = 'messageWaitTimeout';
|
|
74
|
+
class TMQMessageType {
|
|
75
|
+
}
|
|
76
|
+
exports.TMQMessageType = TMQMessageType;
|
|
77
|
+
TMQMessageType.Subscribe = 'subscribe';
|
|
78
|
+
TMQMessageType.Poll = 'poll';
|
|
79
|
+
TMQMessageType.FetchRaw = 'fetch_raw';
|
|
80
|
+
TMQMessageType.FetchJsonMeta = 'fetch_json_meta';
|
|
81
|
+
TMQMessageType.Commit = 'commit';
|
|
82
|
+
TMQMessageType.Unsubscribe = 'unsubscribe';
|
|
83
|
+
TMQMessageType.GetTopicAssignment = 'assignment';
|
|
84
|
+
TMQMessageType.Seek = 'seek';
|
|
85
|
+
TMQMessageType.CommitOffset = 'commit_offset';
|
|
86
|
+
TMQMessageType.Committed = 'committed';
|
|
87
|
+
TMQMessageType.Position = 'position';
|
|
88
|
+
TMQMessageType.ListTopics = "list_topics";
|
|
89
|
+
TMQMessageType.ResDataType = 1;
|
|
90
|
+
class TMQBlockInfo {
|
|
91
|
+
constructor() {
|
|
92
|
+
this.schema = [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.TMQBlockInfo = TMQBlockInfo;
|
|
96
|
+
class TMQRawDataSchema {
|
|
97
|
+
constructor() {
|
|
98
|
+
this.bytes = BigInt(0);
|
|
99
|
+
this.colID = -1;
|
|
100
|
+
this.colType = -1;
|
|
101
|
+
this.flag = -1;
|
|
102
|
+
this.name = "";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.TMQRawDataSchema = TMQRawDataSchema;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { WSQueryResponse } from "../client/wsResponse";
|
|
2
|
+
import { MessageResp, TaosResult } from "../common/taosResult";
|
|
3
|
+
import { TMQBlockInfo, TMQRawDataSchema } from "./constant";
|
|
4
|
+
export declare class WsPollResponse {
|
|
5
|
+
code: number;
|
|
6
|
+
message: string;
|
|
7
|
+
action: string;
|
|
8
|
+
req_id: number;
|
|
9
|
+
have_message: boolean;
|
|
10
|
+
topic: string;
|
|
11
|
+
database: string;
|
|
12
|
+
vgroup_id: number;
|
|
13
|
+
message_id: number;
|
|
14
|
+
id: bigint;
|
|
15
|
+
message_type: number;
|
|
16
|
+
totalTime: number;
|
|
17
|
+
constructor(resp: MessageResp);
|
|
18
|
+
}
|
|
19
|
+
export declare class WsTmqQueryResponse extends WSQueryResponse {
|
|
20
|
+
completed: boolean;
|
|
21
|
+
table_name: string;
|
|
22
|
+
rows: number;
|
|
23
|
+
message_id: number;
|
|
24
|
+
constructor(resp: MessageResp);
|
|
25
|
+
}
|
|
26
|
+
export declare class TaosTmqResult extends TaosResult {
|
|
27
|
+
database: string;
|
|
28
|
+
vgroup_id: number;
|
|
29
|
+
constructor(pollResp: WsPollResponse);
|
|
30
|
+
}
|
|
31
|
+
export declare class WSTmqFetchBlockInfo {
|
|
32
|
+
withTableName?: boolean;
|
|
33
|
+
withSchema?: boolean;
|
|
34
|
+
blockInfos?: Array<TMQBlockInfo>;
|
|
35
|
+
schema: Array<TMQRawDataSchema>;
|
|
36
|
+
tableName?: string;
|
|
37
|
+
taosResult: TaosResult;
|
|
38
|
+
schemaLen: number;
|
|
39
|
+
rows: number;
|
|
40
|
+
textDecoder: TextDecoder;
|
|
41
|
+
constructor(dataView: DataView, taosResult: TaosResult);
|
|
42
|
+
getRows(): number;
|
|
43
|
+
private skipHead;
|
|
44
|
+
private getTypeSkip;
|
|
45
|
+
private parseBlockInfos;
|
|
46
|
+
private parseSchemaInfo;
|
|
47
|
+
private parseVariableByteInteger;
|
|
48
|
+
private parseTmqBlock;
|
|
49
|
+
}
|
|
50
|
+
export declare class AssignmentResp {
|
|
51
|
+
req_id: number;
|
|
52
|
+
code: number;
|
|
53
|
+
message: string;
|
|
54
|
+
action: string;
|
|
55
|
+
totalTime: number;
|
|
56
|
+
timing: bigint;
|
|
57
|
+
topicPartition: TopicPartition[];
|
|
58
|
+
constructor(resp: MessageResp, topic: string);
|
|
59
|
+
}
|
|
60
|
+
export declare class SubscriptionResp {
|
|
61
|
+
req_id: number;
|
|
62
|
+
code: number;
|
|
63
|
+
message: string;
|
|
64
|
+
action: string;
|
|
65
|
+
totalTime: number;
|
|
66
|
+
timing: bigint;
|
|
67
|
+
topics: string[];
|
|
68
|
+
constructor(resp: MessageResp);
|
|
69
|
+
}
|
|
70
|
+
export declare class PartitionsResp {
|
|
71
|
+
req_id: number;
|
|
72
|
+
code: number;
|
|
73
|
+
message: string;
|
|
74
|
+
action: string;
|
|
75
|
+
totalTime: number;
|
|
76
|
+
timing: bigint;
|
|
77
|
+
positions: number[];
|
|
78
|
+
constructor(resp: MessageResp);
|
|
79
|
+
setTopicPartitions(topicPartitions: TopicPartition[]): TopicPartition[];
|
|
80
|
+
}
|
|
81
|
+
export declare class CommittedResp extends PartitionsResp {
|
|
82
|
+
constructor(resp: MessageResp);
|
|
83
|
+
}
|
|
84
|
+
export declare class TopicPartition {
|
|
85
|
+
topic: string;
|
|
86
|
+
vgroup_id: number;
|
|
87
|
+
offset?: number;
|
|
88
|
+
begin?: number;
|
|
89
|
+
end?: number;
|
|
90
|
+
constructor(msg: any);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tmqResponse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmqResponse.d.ts","sourceRoot":"","sources":["../../../src/tmq/tmqResponse.ts"],"names":[],"mappings":"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"}
|