@tdengine/websocket 3.1.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/basicSql.js +9 -7
- package/lib/example/basicStmt.js +34 -20
- package/lib/example/basicTmq.js +22 -20
- package/lib/src/client/wsClient.d.ts +1 -1
- package/lib/src/client/wsClient.d.ts.map +1 -1
- package/lib/src/client/wsClient.js +5 -2
- package/lib/src/client/wsConnector.js +2 -2
- package/lib/src/client/wsResponse.d.ts +10 -2
- package/lib/src/client/wsResponse.d.ts.map +1 -1
- package/lib/src/client/wsResponse.js +30 -3
- package/lib/src/common/constant.d.ts +23 -1
- package/lib/src/common/constant.d.ts.map +1 -1
- package/lib/src/common/constant.js +25 -22
- package/lib/src/common/log.js +1 -1
- package/lib/src/common/taosResult.d.ts +11 -5
- package/lib/src/common/taosResult.d.ts.map +1 -1
- package/lib/src/common/taosResult.js +106 -76
- package/lib/src/common/utils.d.ts +2 -0
- package/lib/src/common/utils.d.ts.map +1 -1
- package/lib/src/common/utils.js +34 -1
- package/lib/src/sql/wsRows.d.ts.map +1 -1
- package/lib/src/sql/wsRows.js +21 -10
- package/lib/src/sql/wsSql.d.ts.map +1 -1
- package/lib/src/sql/wsSql.js +29 -19
- package/lib/src/stmt/wsParams.js +40 -40
- package/lib/src/tmq/constant.d.ts +15 -0
- package/lib/src/tmq/constant.d.ts.map +1 -1
- package/lib/src/tmq/constant.js +17 -1
- package/lib/src/tmq/tmqResponse.d.ts +20 -8
- package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
- package/lib/src/tmq/tmqResponse.js +214 -89
- package/lib/src/tmq/wsTmq.d.ts.map +1 -1
- package/lib/src/tmq/wsTmq.js +24 -21
- 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/schemaless.test.js +7 -6
- package/lib/test/bulkPulling/sql.test.js +38 -18
- package/lib/test/bulkPulling/stmt.func.test.js +71 -55
- package/lib/test/bulkPulling/stmt.type.test.js +1 -5
- package/lib/test/bulkPulling/tmq.test.js +16 -15
- package/lib/test/bulkPulling/wsConnectPool.test.js +9 -2
- package/package.json +2 -2
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
6
|
+
exports.TopicPartition = exports.CommittedResp = exports.PartitionsResp = exports.SubscriptionResp = exports.AssignmentResp = exports.WSTmqFetchBlockInfo = exports.TaosTmqResult = exports.WsTmqQueryResponse = exports.WsPollResponse = void 0;
|
|
4
7
|
const wsResponse_1 = require("../client/wsResponse");
|
|
5
8
|
const constant_1 = require("../common/constant");
|
|
6
9
|
const taosResult_1 = require("../common/taosResult");
|
|
7
10
|
const wsError_1 = require("../common/wsError");
|
|
11
|
+
const constant_2 = require("./constant");
|
|
12
|
+
const utils_1 = require("../common/utils");
|
|
13
|
+
const log_1 = __importDefault(require("../common/log"));
|
|
8
14
|
class WsPollResponse {
|
|
9
15
|
constructor(resp) {
|
|
10
16
|
this.totalTime = resp.totalTime;
|
|
@@ -39,23 +45,220 @@ class WsTmqQueryResponse extends wsResponse_1.WSQueryResponse {
|
|
|
39
45
|
}
|
|
40
46
|
exports.WsTmqQueryResponse = WsTmqQueryResponse;
|
|
41
47
|
class TaosTmqResult extends taosResult_1.TaosResult {
|
|
42
|
-
constructor(
|
|
43
|
-
super(
|
|
44
|
-
this.
|
|
45
|
-
// this._affectRows = resp.rows;
|
|
46
|
-
this.topic = pollResp.topic;
|
|
48
|
+
constructor(pollResp) {
|
|
49
|
+
super();
|
|
50
|
+
this.setTopic(pollResp.topic);
|
|
47
51
|
this.database = pollResp.database;
|
|
48
52
|
this.vgroup_id = pollResp.vgroup_id;
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
55
|
exports.TaosTmqResult = TaosTmqResult;
|
|
52
|
-
class
|
|
53
|
-
constructor(
|
|
54
|
-
this.totalTime = resp.totalTime
|
|
55
|
-
this.blockData = resp.msg
|
|
56
|
+
class WSTmqFetchBlockInfo {
|
|
57
|
+
constructor(dataView, taosResult) {
|
|
58
|
+
// this.totalTime = resp.totalTime
|
|
59
|
+
// this.blockData = resp.msg
|
|
60
|
+
this.textDecoder = new TextDecoder();
|
|
61
|
+
this.taosResult = taosResult;
|
|
62
|
+
this.schema = [];
|
|
63
|
+
this.schemaLen = 0;
|
|
64
|
+
let blockDataView = this.skipHead(dataView);
|
|
65
|
+
this.rows = this.parseBlockInfos(blockDataView);
|
|
66
|
+
}
|
|
67
|
+
getRows() {
|
|
68
|
+
return this.rows;
|
|
69
|
+
}
|
|
70
|
+
skipHead(dataView) {
|
|
71
|
+
let v = dataView.getUint8(0);
|
|
72
|
+
if (v >= 100) {
|
|
73
|
+
let skip = dataView.getUint32(1, true);
|
|
74
|
+
return new DataView(dataView.buffer, dataView.byteOffset + skip + 5);
|
|
75
|
+
}
|
|
76
|
+
let skip1 = this.getTypeSkip(v);
|
|
77
|
+
v = dataView.getUint8(1 + skip1);
|
|
78
|
+
let skip2 = this.getTypeSkip(v);
|
|
79
|
+
return new DataView(dataView.buffer, dataView.byteOffset + skip1 + 2 + skip2);
|
|
80
|
+
}
|
|
81
|
+
getTypeSkip(v) {
|
|
82
|
+
switch (v) {
|
|
83
|
+
case 1:
|
|
84
|
+
return 8;
|
|
85
|
+
case 2:
|
|
86
|
+
case 3:
|
|
87
|
+
return 16;
|
|
88
|
+
default:
|
|
89
|
+
throw (new wsError_1.TDWebSocketClientError(wsError_1.ErrorCode.ERR_INVALID_FETCH_MESSAGE_DATA, `FetchBlockRawResp getTypeSkip error, type: ${v}`));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
parseBlockInfos(dataView) {
|
|
93
|
+
let blockNum = dataView.getUint32(0, true);
|
|
94
|
+
if (blockNum == 0) {
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
this.withTableName = dataView.getUint8(4) == 1 ? true : false;
|
|
98
|
+
this.withSchema = dataView.getUint8(5) == 1 ? true : false;
|
|
99
|
+
// let dataBuffer = dataView.buffer.slice(6)
|
|
100
|
+
let dataBuffer = new DataView(dataView.buffer, dataView.byteOffset + 6);
|
|
101
|
+
let rows = 0;
|
|
102
|
+
// const parseStartTime = new Date().getTime();
|
|
103
|
+
// console.log("parseBlockInfos blockNum="+ blockNum)
|
|
104
|
+
for (let i = 0; i < blockNum; i++) {
|
|
105
|
+
let variableInfo = this.parseVariableByteInteger(dataBuffer);
|
|
106
|
+
this.taosResult.setPrecision(variableInfo[1].getUint8(17));
|
|
107
|
+
dataView = new DataView(variableInfo[1].buffer, variableInfo[1].byteOffset + 17);
|
|
108
|
+
let offset = variableInfo[0] - 17;
|
|
109
|
+
dataBuffer = this.parseSchemaInfo(dataView, offset);
|
|
110
|
+
rows += this.parseTmqBlock(dataView, 1);
|
|
111
|
+
}
|
|
112
|
+
// const parseEndTime = new Date().getTime();
|
|
113
|
+
// console.log("------------->", parseEndTime- parseStartTime, rows);
|
|
114
|
+
log_1.default.info("parseBlockInfos blockNum=" + blockNum + ", withTableName=" + this.withTableName + ", withSchema=" + this.withSchema + ", rows=" + rows);
|
|
115
|
+
return rows;
|
|
116
|
+
}
|
|
117
|
+
parseSchemaInfo(dataBuffer, offset) {
|
|
118
|
+
if (this.withSchema) {
|
|
119
|
+
let isSkip = this.schema.length > 0;
|
|
120
|
+
if (!isSkip) {
|
|
121
|
+
dataBuffer = new DataView(dataBuffer.buffer, dataBuffer.byteOffset + offset);
|
|
122
|
+
let variableInfo = this.parseVariableByteInteger(dataBuffer);
|
|
123
|
+
this.schemaLen = variableInfo[2];
|
|
124
|
+
let cols = (0, utils_1.zigzagDecode)(variableInfo[0]);
|
|
125
|
+
variableInfo = this.parseVariableByteInteger(variableInfo[1]);
|
|
126
|
+
this.schemaLen += variableInfo[2];
|
|
127
|
+
let dataView = variableInfo[1];
|
|
128
|
+
for (let index = 0; index < cols; index++) {
|
|
129
|
+
let schema = new constant_2.TMQRawDataSchema();
|
|
130
|
+
schema.colType = dataView.getInt8(0);
|
|
131
|
+
schema.flag = dataView.getInt8(1);
|
|
132
|
+
variableInfo = this.parseVariableByteInteger(dataView, 2);
|
|
133
|
+
this.schemaLen += 2 + variableInfo[2];
|
|
134
|
+
schema.bytes = BigInt((0, utils_1.zigzagDecode)(variableInfo[0]));
|
|
135
|
+
variableInfo = this.parseVariableByteInteger(variableInfo[1]);
|
|
136
|
+
this.schemaLen += variableInfo[2];
|
|
137
|
+
schema.colID = (0, utils_1.zigzagDecode)(variableInfo[0]);
|
|
138
|
+
variableInfo = this.parseVariableByteInteger(variableInfo[1]);
|
|
139
|
+
this.schemaLen += variableInfo[2];
|
|
140
|
+
schema.name = (0, taosResult_1.getString)(variableInfo[1], 0, variableInfo[0], this.textDecoder);
|
|
141
|
+
if (!isSkip) {
|
|
142
|
+
this.taosResult.setMeta({
|
|
143
|
+
name: schema.name,
|
|
144
|
+
type: schema.colType,
|
|
145
|
+
length: Number(schema.bytes)
|
|
146
|
+
});
|
|
147
|
+
this.schema.push(schema);
|
|
148
|
+
}
|
|
149
|
+
dataView = new DataView(variableInfo[1].buffer, variableInfo[1].byteOffset + variableInfo[0]);
|
|
150
|
+
this.schemaLen += variableInfo[0];
|
|
151
|
+
}
|
|
152
|
+
if (this.withTableName) {
|
|
153
|
+
variableInfo = this.parseVariableByteInteger(dataView);
|
|
154
|
+
this.schemaLen += variableInfo[2];
|
|
155
|
+
this.tableName = (0, taosResult_1.readVarchar)(variableInfo[1].buffer, variableInfo[1].byteOffset, variableInfo[0], this.textDecoder);
|
|
156
|
+
dataView = new DataView(variableInfo[1].buffer, variableInfo[1].byteOffset + variableInfo[0]);
|
|
157
|
+
this.schemaLen += variableInfo[0];
|
|
158
|
+
}
|
|
159
|
+
return dataView;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return new DataView(dataBuffer.buffer, dataBuffer.byteOffset + this.schemaLen + offset);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return dataBuffer;
|
|
166
|
+
}
|
|
167
|
+
parseVariableByteInteger(dataView, offset = 0) {
|
|
168
|
+
let value = 0;
|
|
169
|
+
let multiplier = 1;
|
|
170
|
+
let count = 0;
|
|
171
|
+
while (true) {
|
|
172
|
+
let encodedByte = dataView.getUint8(count + offset);
|
|
173
|
+
value += (encodedByte & 127) * multiplier;
|
|
174
|
+
if ((encodedByte & 128) == 0) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
multiplier *= 128;
|
|
178
|
+
count++;
|
|
179
|
+
}
|
|
180
|
+
return [value, new DataView(dataView.buffer, dataView.byteOffset + count + 1 + offset), count + 1];
|
|
181
|
+
}
|
|
182
|
+
parseTmqBlock(dataView, startOffset) {
|
|
183
|
+
// let dataView = new DataView(dataBuffer)
|
|
184
|
+
let rows = dataView.getInt32(8 + startOffset, true);
|
|
185
|
+
if (rows == 0) {
|
|
186
|
+
return rows;
|
|
187
|
+
}
|
|
188
|
+
let taosData = this.taosResult.getData();
|
|
189
|
+
let metaData = this.taosResult.getMeta();
|
|
190
|
+
if (metaData && rows && taosData) {
|
|
191
|
+
let dataList = new Array(rows);
|
|
192
|
+
//get bitmap length
|
|
193
|
+
let bitMapOffset = getBitmapLen(rows);
|
|
194
|
+
//skip data head
|
|
195
|
+
let bufferOffset = 28 + 5 * this.schema.length + startOffset;
|
|
196
|
+
let metaLens = [];
|
|
197
|
+
for (let i = 0; i < this.schema.length; i++) {
|
|
198
|
+
//get data len
|
|
199
|
+
metaLens.push(dataView.getInt32(bufferOffset + i * 4, true));
|
|
200
|
+
}
|
|
201
|
+
bufferOffset += this.schema.length * 4;
|
|
202
|
+
for (let i = 0; i < this.schema.length; i++) {
|
|
203
|
+
let data = [];
|
|
204
|
+
//get type code
|
|
205
|
+
let isVarType = (0, taosResult_1._isVarType)(this.schema[i].colType);
|
|
206
|
+
//fixed length type
|
|
207
|
+
if (isVarType == constant_1.ColumnsBlockType.SOLID) {
|
|
208
|
+
// let bitMapArr = dataBuffer.slice(bufferOffset, bufferOffset + bitMapOffset);
|
|
209
|
+
let bitMapArr = new Uint8Array(dataView.buffer, dataView.byteOffset + bufferOffset, bitMapOffset);
|
|
210
|
+
bufferOffset += bitMapOffset;
|
|
211
|
+
//decode column data, data is array
|
|
212
|
+
data = (0, taosResult_1.readSolidDataToArray)(dataView, bufferOffset, rows, this.schema[i].colType, bitMapArr);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
//Variable length type
|
|
216
|
+
let start = bufferOffset;
|
|
217
|
+
let offsets = [];
|
|
218
|
+
for (let i = 0; i < rows; i++, start += constant_1.TDengineTypeLength['INT']) {
|
|
219
|
+
//get data length, -1 is null
|
|
220
|
+
offsets.push(dataView.getInt32(start, true));
|
|
221
|
+
}
|
|
222
|
+
for (let i = 0; i < rows; i++) {
|
|
223
|
+
let value = '';
|
|
224
|
+
if (-1 == offsets[i]) {
|
|
225
|
+
value = null;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
let header = start + offsets[i];
|
|
229
|
+
let dataLength = dataView.getInt16(header, true) & 0xFFFF;
|
|
230
|
+
if (isVarType == constant_1.ColumnsBlockType.VARCHAR) {
|
|
231
|
+
//decode var char
|
|
232
|
+
value = (0, taosResult_1.readVarchar)(dataView.buffer, dataView.byteOffset + header + 2, dataLength, this.textDecoder);
|
|
233
|
+
}
|
|
234
|
+
else if (isVarType == constant_1.ColumnsBlockType.GEOMETRY || isVarType == constant_1.ColumnsBlockType.VARBINARY) {
|
|
235
|
+
//decode binary
|
|
236
|
+
value = (0, taosResult_1.readBinary)(dataView.buffer, dataView.byteOffset + header + 2, dataLength);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
//decode nchar
|
|
240
|
+
value = (0, taosResult_1.readNchar)(dataView.buffer, dataView.byteOffset + header + 2, dataLength);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
data.push(value);
|
|
244
|
+
}
|
|
245
|
+
bufferOffset += rows * 4;
|
|
246
|
+
}
|
|
247
|
+
bufferOffset += metaLens[i];
|
|
248
|
+
//column data to row data
|
|
249
|
+
for (let row = 0; row < data.length; row++) {
|
|
250
|
+
if (dataList[row] == null) {
|
|
251
|
+
dataList[row] = [];
|
|
252
|
+
}
|
|
253
|
+
dataList[row].push(data[row]);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
taosData.push(...dataList);
|
|
257
|
+
}
|
|
258
|
+
return rows;
|
|
56
259
|
}
|
|
57
260
|
}
|
|
58
|
-
exports.
|
|
261
|
+
exports.WSTmqFetchBlockInfo = WSTmqFetchBlockInfo;
|
|
59
262
|
class AssignmentResp {
|
|
60
263
|
constructor(resp, topic) {
|
|
61
264
|
this.timing = BigInt(resp.msg.timing);
|
|
@@ -121,84 +324,6 @@ class TopicPartition {
|
|
|
121
324
|
}
|
|
122
325
|
}
|
|
123
326
|
exports.TopicPartition = TopicPartition;
|
|
124
|
-
function parseTmqBlock(rows, resp, taosResult) {
|
|
125
|
-
let dataList = new Array(rows);
|
|
126
|
-
if (!resp || !taosResult) {
|
|
127
|
-
return taosResult;
|
|
128
|
-
}
|
|
129
|
-
let metaList = taosResult.getTaosMeta();
|
|
130
|
-
let taosdata = taosResult.getData();
|
|
131
|
-
if (metaList && rows && taosdata) {
|
|
132
|
-
//get bitmap length
|
|
133
|
-
let bitMapOffset = getBitmapLen(rows);
|
|
134
|
-
//skip data head
|
|
135
|
-
let bufferOffset = 24 + 28 + 5 * metaList.length;
|
|
136
|
-
let dataBuffer = resp.blockData.slice(bufferOffset);
|
|
137
|
-
let metaLens = [];
|
|
138
|
-
for (let i = 0; i < metaList.length; i++) {
|
|
139
|
-
//get data len
|
|
140
|
-
metaLens.push(new DataView(dataBuffer, i * 4, 4).getInt32(0, true));
|
|
141
|
-
}
|
|
142
|
-
bufferOffset = metaList.length * 4;
|
|
143
|
-
for (let i = 0; i < metaList.length; i++) {
|
|
144
|
-
let data = [];
|
|
145
|
-
//get type code
|
|
146
|
-
let isVarType = (0, taosResult_1._isVarType)(metaList[i]);
|
|
147
|
-
//fixed length type
|
|
148
|
-
if (isVarType == constant_1.ColumnsBlockType.SOLID) {
|
|
149
|
-
let bitMapArr = dataBuffer.slice(bufferOffset, bufferOffset + bitMapOffset);
|
|
150
|
-
bufferOffset += bitMapOffset;
|
|
151
|
-
//decode column data, data is array
|
|
152
|
-
data = (0, taosResult_1.readSolidDataToArray)(dataBuffer, bufferOffset, rows, metaList[i], bitMapArr);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
//Variable length type
|
|
156
|
-
let offset = bufferOffset;
|
|
157
|
-
let offsets = [];
|
|
158
|
-
for (let i = 0; i < rows; i++, offset += constant_1.TDengineTypeLength['INT']) {
|
|
159
|
-
//get data length, -1 is null
|
|
160
|
-
offsets.push(new DataView(dataBuffer, offset, 4).getInt32(0, true));
|
|
161
|
-
}
|
|
162
|
-
let start = offset;
|
|
163
|
-
for (let i = 0; i < rows; i++) {
|
|
164
|
-
let value = '';
|
|
165
|
-
if (-1 == offsets[i]) {
|
|
166
|
-
value = null;
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
let header = start + offsets[i];
|
|
170
|
-
let dataLength = new DataView(dataBuffer, header, 2).getInt16(0, true) & 0xFFFF;
|
|
171
|
-
if (isVarType == constant_1.ColumnsBlockType.VARCHAR) {
|
|
172
|
-
//decode var char
|
|
173
|
-
value = (0, taosResult_1.readVarchar)(dataBuffer, header + 2, dataLength);
|
|
174
|
-
}
|
|
175
|
-
else if (isVarType == constant_1.ColumnsBlockType.GEOMETRY || isVarType == constant_1.ColumnsBlockType.VARBINARY) {
|
|
176
|
-
//decode binary
|
|
177
|
-
value = (0, taosResult_1.readBinary)(dataBuffer, header + 2, dataLength);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
//decode nchar
|
|
181
|
-
value = (0, taosResult_1.readNchar)(dataBuffer, header + 2, dataLength);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
data.push(value);
|
|
185
|
-
}
|
|
186
|
-
bufferOffset += rows * 4;
|
|
187
|
-
}
|
|
188
|
-
bufferOffset += metaLens[i];
|
|
189
|
-
//column data to row data
|
|
190
|
-
for (let row = 0; row < data.length; row++) {
|
|
191
|
-
if (dataList[row] == null) {
|
|
192
|
-
dataList[row] = [];
|
|
193
|
-
}
|
|
194
|
-
dataList[row].push(data[row]);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
taosdata.push(...dataList);
|
|
198
|
-
}
|
|
199
|
-
return taosResult;
|
|
200
|
-
}
|
|
201
|
-
exports.parseTmqBlock = parseTmqBlock;
|
|
202
327
|
function getBitmapLen(n) {
|
|
203
328
|
return (n + 0x7) >> 3;
|
|
204
329
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsTmq.d.ts","sourceRoot":"","sources":["../../../src/tmq/wsTmq.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAkF,cAAc,
|
|
1
|
+
{"version":3,"file":"wsTmq.d.ts","sourceRoot":"","sources":["../../../src/tmq/wsTmq.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAkF,cAAc,EAA0D,MAAM,eAAe,CAAC;AAKvL,qBAAa,UAAU;IACnB,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO;YAMO,IAAI;WAML,WAAW,CAAC,QAAQ,EAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAE,OAAO,CAAC,UAAU,CAAC;IAUjE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9D,WAAW,CAAC,KAAK,CAAC,EAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAgBvE,YAAY,CAAC,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAYlD,MAAM,CAAC,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAK5C,QAAQ;IAYhB,SAAS,CAAC,UAAU,EAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IA0BzF,aAAa,CAAC,UAAU,EAAC,KAAK,CAAC,cAAc,CAAC,GAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAc9E,YAAY,CAAC,SAAS,EAAC,cAAc,EAAE,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC;IAkBnE,SAAS,CAAC,UAAU,EAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IA0BzF,IAAI,CAAC,SAAS,EAAC,cAAc,EAAE,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC;IAkB3D,eAAe,CAAC,UAAU,EAAC,KAAK,CAAC,cAAc,CAAC,GAAE,OAAO,CAAC,IAAI,CAAC;IAQ/D,SAAS,CAAC,UAAU,EAAC,KAAK,CAAC,cAAc,CAAC,GAAE,OAAO,CAAC,IAAI,CAAC;IASzD,KAAK,IAAG,OAAO,CAAC,IAAI,CAAC;YAIb,KAAK;YAcL,cAAc;YA4Bd,QAAQ;YA4BR,iBAAiB;IAczB,UAAU,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,GAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAoBnD,gBAAgB;CA6BjC"}
|
package/lib/src/tmq/wsTmq.js
CHANGED
|
@@ -11,6 +11,7 @@ const wsError_1 = require("../common/wsError");
|
|
|
11
11
|
const tmqResponse_1 = require("./tmqResponse");
|
|
12
12
|
const reqid_1 = require("../common/reqid");
|
|
13
13
|
const log_1 = __importDefault(require("../common/log"));
|
|
14
|
+
const wsResponse_1 = require("../client/wsResponse");
|
|
14
15
|
class WsConsumer {
|
|
15
16
|
constructor(wsConfig) {
|
|
16
17
|
this._wsConfig = new config_1.TmqConfig(wsConfig);
|
|
@@ -211,19 +212,30 @@ class WsConsumer {
|
|
|
211
212
|
let result = await this._wsClient.exec(jsonStr, false);
|
|
212
213
|
return new tmqResponse_1.WsTmqQueryResponse(result);
|
|
213
214
|
}
|
|
214
|
-
async fetchBlockData(
|
|
215
|
+
async fetchBlockData(pollResp, taosResult) {
|
|
215
216
|
let fetchMsg = {
|
|
216
|
-
action: '
|
|
217
|
+
action: 'fetch_raw_data',
|
|
217
218
|
args: {
|
|
218
|
-
req_id:
|
|
219
|
-
message_id:
|
|
219
|
+
req_id: reqid_1.ReqId.getReqID(),
|
|
220
|
+
message_id: pollResp.message_id,
|
|
220
221
|
},
|
|
221
222
|
};
|
|
222
223
|
let jsonStr = JSON.stringify(fetchMsg);
|
|
223
224
|
log_1.default.debug('[wsQueryInterface.fetch.fetchMsg]===>' + jsonStr);
|
|
225
|
+
// const startTime = new Date().getTime();
|
|
224
226
|
let result = await this._wsClient.sendMsg(jsonStr);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
+
let wsResponse = new wsResponse_1.WSFetchBlockResponse(result.msg);
|
|
228
|
+
if (wsResponse && wsResponse.data && wsResponse.blockLen > 0) {
|
|
229
|
+
// const parseStartTime = new Date().getTime();
|
|
230
|
+
let wsTmqResponse = new tmqResponse_1.WSTmqFetchBlockInfo(wsResponse.data, taosResult);
|
|
231
|
+
log_1.default.debug('[WSTmqFetchBlockInfo.fetchBlockData]===>' + wsTmqResponse.taosResult);
|
|
232
|
+
if (wsTmqResponse.rows > 0) {
|
|
233
|
+
// const endTime = new Date().getTime();
|
|
234
|
+
// console.log(endTime - parseStartTime, endTime - startTime);
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return false;
|
|
227
239
|
}
|
|
228
240
|
async pollData(timeoutMs, reqId) {
|
|
229
241
|
let queryMsg = {
|
|
@@ -233,26 +245,17 @@ class WsConsumer {
|
|
|
233
245
|
blocking_time: timeoutMs
|
|
234
246
|
},
|
|
235
247
|
};
|
|
236
|
-
var taosResults = new Map();
|
|
237
248
|
let resp = await this._wsClient.exec(JSON.stringify(queryMsg), false);
|
|
238
249
|
let pollResp = new tmqResponse_1.WsPollResponse(resp);
|
|
250
|
+
let taosResult = new tmqResponse_1.TaosTmqResult(pollResp);
|
|
251
|
+
var taosResults = new Map();
|
|
252
|
+
taosResults.set(pollResp.topic, taosResult);
|
|
239
253
|
if (!pollResp.have_message || pollResp.message_type != constant_1.TMQMessageType.ResDataType) {
|
|
240
254
|
return taosResults;
|
|
241
255
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
247
|
-
let taosResult = taosResults.get(pollResp.topic + pollResp.vgroup_id);
|
|
248
|
-
if (taosResult == null) {
|
|
249
|
-
taosResult = new tmqResponse_1.TaosTmqResult(fetchResp, pollResp);
|
|
250
|
-
taosResults.set(pollResp.topic + pollResp.vgroup_id, taosResult);
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
taosResult.setRowsAndTime(fetchResp.rows);
|
|
254
|
-
}
|
|
255
|
-
await this.fetchBlockData(fetchResp, taosResult);
|
|
256
|
+
let finish = false;
|
|
257
|
+
while (!finish) {
|
|
258
|
+
finish = await this.fetchBlockData(pollResp, taosResult);
|
|
256
259
|
}
|
|
257
260
|
return taosResults;
|
|
258
261
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.test.d.ts","sourceRoot":"","sources":["../../../test/bulkPulling/log.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const log_1 = __importStar(require("../../src/common/log"));
|
|
27
|
+
describe('log level print', () => {
|
|
28
|
+
test('normal connect', async () => {
|
|
29
|
+
log_1.default.info('log level is info');
|
|
30
|
+
log_1.default.debug('log level is debug');
|
|
31
|
+
log_1.default.error('log level is error');
|
|
32
|
+
let isLevel = log_1.default.isLevelEnabled("info");
|
|
33
|
+
expect(isLevel).toEqual(true);
|
|
34
|
+
(0, log_1.setLevel)("debug");
|
|
35
|
+
log_1.default.debug('log level is debug');
|
|
36
|
+
isLevel = log_1.default.isLevelEnabled("debug");
|
|
37
|
+
expect(isLevel).toEqual(true);
|
|
38
|
+
(0, log_1.setLevel)("error");
|
|
39
|
+
log_1.default.error('log level is error');
|
|
40
|
+
log_1.default.debug('log level is debug');
|
|
41
|
+
isLevel = log_1.default.isLevelEnabled("error");
|
|
42
|
+
expect(isLevel).toEqual(true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -10,8 +10,9 @@ beforeAll(async () => {
|
|
|
10
10
|
conf.setUser('root');
|
|
11
11
|
conf.setPwd('taosdata');
|
|
12
12
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
13
|
-
await wsSql.exec('
|
|
14
|
-
await wsSql.exec('
|
|
13
|
+
await wsSql.exec('drop database if exists power_schemaless;');
|
|
14
|
+
await wsSql.exec('create database if not exists power_schemaless KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;');
|
|
15
|
+
await wsSql.exec('CREATE STABLE if not exists power_schemaless.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);');
|
|
15
16
|
await wsSql.close();
|
|
16
17
|
});
|
|
17
18
|
describe('TDWebSocket.WsSchemaless()', () => {
|
|
@@ -23,7 +24,7 @@ describe('TDWebSocket.WsSchemaless()', () => {
|
|
|
23
24
|
let conf = new config_1.WSConfig(dns);
|
|
24
25
|
conf.setUser('root');
|
|
25
26
|
conf.setPwd('taosdata');
|
|
26
|
-
conf.setDb('
|
|
27
|
+
conf.setDb('power_schemaless');
|
|
27
28
|
let wsSchemaless = await wsSql_1.WsSql.open(conf);
|
|
28
29
|
expect(wsSchemaless.state()).toBeGreaterThan(0);
|
|
29
30
|
await wsSchemaless.close();
|
|
@@ -52,7 +53,7 @@ describe('TDWebSocket.WsSchemaless()', () => {
|
|
|
52
53
|
let conf = new config_1.WSConfig(dns);
|
|
53
54
|
conf.setUser('root');
|
|
54
55
|
conf.setPwd('taosdata');
|
|
55
|
-
conf.setDb('
|
|
56
|
+
conf.setDb('power_schemaless');
|
|
56
57
|
let wsSchemaless = await wsSql_1.WsSql.open(conf);
|
|
57
58
|
expect(wsSchemaless.state()).toBeGreaterThan(0);
|
|
58
59
|
await wsSchemaless.schemalessInsert([influxdbData], wsProto_1.SchemalessProto.InfluxDBLineProtocol, wsProto_1.Precision.NANO_SECONDS, 0);
|
|
@@ -64,7 +65,7 @@ describe('TDWebSocket.WsSchemaless()', () => {
|
|
|
64
65
|
let conf = new config_1.WSConfig(dns);
|
|
65
66
|
conf.setUser('root');
|
|
66
67
|
conf.setPwd('taosdata');
|
|
67
|
-
conf.setDb('
|
|
68
|
+
conf.setDb('power_schemaless');
|
|
68
69
|
let wsSchemaless = await wsSql_1.WsSql.open(conf);
|
|
69
70
|
expect(wsSchemaless.state()).toBeGreaterThan(0);
|
|
70
71
|
await wsSchemaless.schemalessInsert([influxdbData], wsProto_1.SchemalessProto.InfluxDBLineProtocol, wsProto_1.Precision.NOT_CONFIGURED, 0);
|
|
@@ -77,7 +78,7 @@ describe('TDWebSocket.WsSchemaless()', () => {
|
|
|
77
78
|
let conf = new config_1.WSConfig(dns);
|
|
78
79
|
conf.setUser('root');
|
|
79
80
|
conf.setPwd('taosdata');
|
|
80
|
-
conf.setDb('
|
|
81
|
+
conf.setDb('power_schemaless');
|
|
81
82
|
let wsSchemaless = await wsSql_1.WsSql.open(conf);
|
|
82
83
|
expect(wsSchemaless.state()).toBeGreaterThan(0);
|
|
83
84
|
try {
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
|
|
4
4
|
const config_1 = require("../../src/common/config");
|
|
5
5
|
const wsSql_1 = require("../../src/sql/wsSql");
|
|
6
|
+
let dns = 'ws://localhost:6041';
|
|
6
7
|
beforeAll(async () => {
|
|
7
|
-
let dns = 'ws://localhost:6041';
|
|
8
8
|
let conf = new config_1.WSConfig(dns);
|
|
9
9
|
conf.setUser('root');
|
|
10
10
|
conf.setPwd('taosdata');
|
|
@@ -17,9 +17,10 @@ beforeAll(async () => {
|
|
|
17
17
|
describe('TDWebSocket.WsSql()', () => {
|
|
18
18
|
jest.setTimeout(20 * 1000);
|
|
19
19
|
test('normal connect', async () => {
|
|
20
|
-
let dsn = 'ws://root:taosdata@localhost:6041';
|
|
21
20
|
let wsSql = null;
|
|
22
|
-
let conf = new config_1.WSConfig(
|
|
21
|
+
let conf = new config_1.WSConfig(dns);
|
|
22
|
+
conf.setUser('root');
|
|
23
|
+
conf.setPwd('taosdata');
|
|
23
24
|
conf.setDb('power');
|
|
24
25
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
25
26
|
expect(wsSql.state()).toBeGreaterThan(0);
|
|
@@ -29,8 +30,9 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
29
30
|
expect.assertions(1);
|
|
30
31
|
let wsSql = null;
|
|
31
32
|
try {
|
|
32
|
-
let
|
|
33
|
-
|
|
33
|
+
let conf = new config_1.WSConfig(dns);
|
|
34
|
+
conf.setUser('root');
|
|
35
|
+
conf.setPwd('taosdata');
|
|
34
36
|
conf.setDb('jest');
|
|
35
37
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
36
38
|
}
|
|
@@ -45,8 +47,9 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
45
47
|
}
|
|
46
48
|
});
|
|
47
49
|
test('get taosc version', async () => {
|
|
48
|
-
let
|
|
49
|
-
|
|
50
|
+
let conf = new config_1.WSConfig(dns);
|
|
51
|
+
conf.setUser('root');
|
|
52
|
+
conf.setPwd('taosdata');
|
|
50
53
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
51
54
|
let version = await wsSql.version();
|
|
52
55
|
await wsSql.close();
|
|
@@ -54,8 +57,9 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
54
57
|
expect(version).toBeTruthy();
|
|
55
58
|
});
|
|
56
59
|
test('show databases', async () => {
|
|
57
|
-
let
|
|
58
|
-
|
|
60
|
+
let conf = new config_1.WSConfig(dns);
|
|
61
|
+
conf.setUser('root');
|
|
62
|
+
conf.setPwd('taosdata');
|
|
59
63
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
60
64
|
let taosResult = await wsSql.exec('show databases');
|
|
61
65
|
await wsSql.close();
|
|
@@ -63,8 +67,9 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
63
67
|
expect(taosResult).toBeTruthy();
|
|
64
68
|
});
|
|
65
69
|
test('create databases', async () => {
|
|
66
|
-
let
|
|
67
|
-
|
|
70
|
+
let conf = new config_1.WSConfig(dns);
|
|
71
|
+
conf.setUser('root');
|
|
72
|
+
conf.setPwd('taosdata');
|
|
68
73
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
69
74
|
let taosResult = await wsSql.exec('create database if not exists power KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;');
|
|
70
75
|
await wsSql.close();
|
|
@@ -72,8 +77,9 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
72
77
|
expect(taosResult).toBeTruthy();
|
|
73
78
|
});
|
|
74
79
|
test('create stable', async () => {
|
|
75
|
-
let
|
|
76
|
-
|
|
80
|
+
let conf = new config_1.WSConfig(dns);
|
|
81
|
+
conf.setUser('root');
|
|
82
|
+
conf.setPwd('taosdata');
|
|
77
83
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
78
84
|
let taosResult = await wsSql.exec('use power');
|
|
79
85
|
console.log(taosResult);
|
|
@@ -84,22 +90,24 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
84
90
|
expect(taosResult).toBeTruthy();
|
|
85
91
|
});
|
|
86
92
|
test('insert recoder', async () => {
|
|
87
|
-
let
|
|
88
|
-
|
|
93
|
+
let conf = new config_1.WSConfig(dns);
|
|
94
|
+
conf.setUser('root');
|
|
95
|
+
conf.setPwd('taosdata');
|
|
89
96
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
90
97
|
let taosResult = await wsSql.exec('use power');
|
|
91
98
|
console.log(taosResult);
|
|
92
99
|
expect(taosResult).toBeTruthy();
|
|
93
100
|
taosResult = await wsSql.exec('describe meters');
|
|
94
101
|
console.log(taosResult);
|
|
95
|
-
taosResult = await wsSql.exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California
|
|
102
|
+
taosResult = await wsSql.exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California", 3) VALUES (NOW, 10.2, 219, 0.32)');
|
|
96
103
|
console.log(taosResult);
|
|
97
104
|
expect(taosResult.getAffectRows()).toBeGreaterThanOrEqual(1);
|
|
98
105
|
await wsSql.close();
|
|
99
106
|
});
|
|
100
107
|
test('query sql', async () => {
|
|
101
|
-
let
|
|
102
|
-
|
|
108
|
+
let conf = new config_1.WSConfig(dns);
|
|
109
|
+
conf.setUser('root');
|
|
110
|
+
conf.setPwd('taosdata');
|
|
103
111
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
104
112
|
let taosResult = await wsSql.exec('use power');
|
|
105
113
|
console.log(taosResult);
|
|
@@ -118,6 +126,18 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
118
126
|
}
|
|
119
127
|
await wsSql.close();
|
|
120
128
|
});
|
|
129
|
+
test('query sql no getdata', async () => {
|
|
130
|
+
let conf = new config_1.WSConfig(dns);
|
|
131
|
+
conf.setUser('root');
|
|
132
|
+
conf.setPwd('taosdata');
|
|
133
|
+
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
134
|
+
let taosResult = await wsSql.exec('use power');
|
|
135
|
+
console.log(taosResult);
|
|
136
|
+
expect(taosResult).toBeTruthy();
|
|
137
|
+
let wsRows = await wsSql.query('select * from meters');
|
|
138
|
+
await wsRows.close();
|
|
139
|
+
await wsSql.close();
|
|
140
|
+
});
|
|
121
141
|
});
|
|
122
142
|
afterAll(async () => {
|
|
123
143
|
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|