@tdengine/websocket
Version:
The websocket Node.js connector for TDengine. TDengine versions 3.3.2.0 and above are recommended to use this connector.
301 lines (300 loc) • 16.6 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const wsConnectorPool_1 = require("../../src/client/wsConnectorPool");
const config_1 = require("../../src/common/config");
const wsSql_1 = require("../../src/sql/wsSql");
const utils_1 = require("../utils");
// const DSN = 'ws://root:taosdata@127.0.0.1:6041'
let dsn = 'ws://root:taosdata@localhost:6041';
let conf = new config_1.WSConfig(dsn);
const resultMap = new Map();
resultMap.set("POINT (4.0 8.0)", (0, utils_1.hexToBytes)("010100000000000000000010400000000000002040"));
resultMap.set("POINT (3.0 5.0)", (0, utils_1.hexToBytes)("010100000000000000000008400000000000001440"));
resultMap.set("LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)", (0, utils_1.hexToBytes)("010200000003000000000000000000f03f000000000000f03f0000000000000040000000000000004000000000000014400000000000001440"));
resultMap.set("POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))", (0, utils_1.hexToBytes)("010300000001000000050000000000000000000840000000000000184000000000000014400000000000001840000000000000144000000000000020400000000000000840000000000000204000000000000008400000000000001840"));
resultMap.set("POINT (7.0 9.0)", (0, utils_1.hexToBytes)("01010000000000000000001c400000000000002240"));
resultMap.set("0x7661726332", (0, utils_1.hexToBytes)("307837363631373236333332"));
resultMap.set("0x7661726333", (0, utils_1.hexToBytes)("307837363631373236333333"));
resultMap.set("0x7661726334", (0, utils_1.hexToBytes)("307837363631373236333334"));
resultMap.set("0x7661726335", (0, utils_1.hexToBytes)("307837363631373236333335"));
const table = 'ws_q_n';
const stable = 'ws_q_s';
const tableCN = 'ws_q_n_cn';
const stableCN = 'ws_q_s_cn';
const db = 'ws_q_db';
const jsonTable = 'ws_q_j';
const jsonTableCN = 'ws_q_j_cn';
const createDB = `create database if not exists ${db} keep 3650`;
const dropDB = `drop database if exists ${db}`;
const useDB = `use ${db}`;
const stableTags = [true, -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_tag_1', 'nchar_tag_1'];
const stableCNTags = [false, -1 * 2, -2 * 2, -3 * 2, BigInt(-4 * 2), 1 * 2, 2 * 2, 3 * 2, BigInt(4 * 2), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_标签_壹', 'nchar_标签_贰'];
const tableValues = [
[BigInt(1656677710000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_col_1', 'nchar_col_1', true, 'NULL', 'POINT (4.0 8.0)', '0x7661726332'],
[BigInt(1656677720000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_col_2', 'nchar_col_2', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'],
[BigInt(1656677730000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_col_3', 'nchar_col_3', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'],
[BigInt(1656677740000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_col_4', 'nchar_col_4', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'],
[BigInt(1656677750000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_col_5', 'nchar_col_5', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'],
];
const tableCNValues = [
[BigInt(1656677760000), 0, -1, -2, BigInt(-3), 0, 1, 2, BigInt(3), parseFloat(3.1415.toFixed(5)), parseFloat(3.14159265.toFixed(15)), 'varchar_列_壹', 'nchar_列_甲', true, 'NULL', 'POINT (4.0 8.0)', '0x7661726332'],
[BigInt(1656677770000), -1, -2, -3, BigInt(-4), 1, 2, 3, BigInt(4), parseFloat((3.1415 * 2).toFixed(5)), parseFloat((3.14159265 * 2).toFixed(15)), 'varchar_列_贰', 'nchar_列_乙', false, 'NULL', 'POINT (3.0 5.0)', '0x7661726333'],
[BigInt(1656677780000), -2, -3, -4, BigInt(-5), 2, 3, 4, BigInt(5), parseFloat((3.1415 * 3).toFixed(5)), parseFloat((3.14159265 * 3).toFixed(15)), 'varchar_列_叁', 'nchar_列_丙', true, 'NULL', 'LINESTRING (1.000000 1.000000, 2.000000 2.000000, 5.000000 5.000000)', '0x7661726334'],
[BigInt(1656677790000), -3, -4, -5, BigInt(-6), 3, 4, 5, BigInt(6), parseFloat((3.1415 * 4).toFixed(5)), parseFloat((3.14159265 * 4).toFixed(15)), 'varchar_列_肆', 'nchar_列_丁', false, 'NULL', 'POLYGON ((3.000000 6.000000, 5.000000 6.000000, 5.000000 8.000000, 3.000000 8.000000, 3.000000 6.000000))', '0x7661726335'],
[BigInt(1656677800000), -4, -5, -6, BigInt(-7), 4, 5, 6, BigInt(7), parseFloat((3.1415 * 5).toFixed(5)), parseFloat((3.14159265 * 5).toFixed(15)), 'varchar_列_伍', 'nchar_列_戊', true, 'NULL', 'POINT (7.0 9.0)', '0x7661726335'],
];
const jsonTags = ["{\"key1\":\"taos\",\"key2\":null,\"key3\":\"TDengine\",\"key4\":0,\"key5\":false}"];
const jsonTagsCN = ["{\"key1\":\"taosdata\",\"key2\":null,\"key3\":\"TDengine涛思数据\",\"key4\":1,\"key5\":true}"];
const selectStable = `select * from ${stable}`;
const selectStableCN = `select * from ${stableCN}`;
const selectTable = `select * from ${table}`;
const selectTableCN = `select * from ${tableCN}`;
const selectJsonTable = `select * from ${jsonTable}`;
const selectJsonTableCN = `select * from ${jsonTableCN}`;
beforeAll(async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(dropDB);
await ws.exec(createDB);
await ws.exec(useDB);
await ws.exec((0, utils_1.createSTable)(stable));
await ws.exec((0, utils_1.createSTable)(stableCN));
await ws.exec((0, utils_1.createTable)(table));
await ws.exec((0, utils_1.createTable)(tableCN));
await ws.exec((0, utils_1.createSTableJSON)(jsonTable));
await ws.exec((0, utils_1.createSTableJSON)(jsonTableCN));
await ws.close();
});
describe('ws.query(stable)', () => {
jest.setTimeout(20 * 1000);
test('Insert query stable without CN character', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insert = (0, utils_1.insertStable)(tableValues, stableTags, stable);
let insertRes = await ws.exec(insert);
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectStable);
let expectMeta = utils_1.tableMeta.concat(utils_1.tagMeta);
let expectData = (0, utils_1.expectStableData)(tableValues, stableTags);
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
// // console.log(i, index, d, expectData[i][index])
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
let buffer = resultMap.get(expectData[i][index]);
if (buffer) {
let dbData = d;
console.log(i, index, dbData, expectData[i][index], buffer, (0, utils_1.compareUint8Arrays)(new Uint8Array(dbData), new Uint8Array(buffer)));
expect((0, utils_1.compareUint8Arrays)(new Uint8Array(dbData), new Uint8Array(buffer))).toBe(true);
}
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
test('query stable with CN character', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insertCN = (0, utils_1.insertStable)(tableCNValues, stableCNTags, stableCN);
// console.log(insertCN)
let insertRes = await ws.exec(insertCN);
// console.log(insertRes)
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectStableCN);
let expectMeta = utils_1.tableMeta.concat(utils_1.tagMeta);
let expectData = (0, utils_1.expectStableData)(tableCNValues, stableCNTags);
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
let buffer = resultMap.get(expectData[i][index]);
if (buffer) {
let dbData = d;
console.log(i, index, dbData, expectData[i][index], buffer, (0, utils_1.compareUint8Arrays)(new Uint8Array(dbData), new Uint8Array(buffer)));
expect((0, utils_1.compareUint8Arrays)(new Uint8Array(dbData), new Uint8Array(buffer))).toBe(true);
}
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
});
describe('ws.query(table)', () => {
test('Insert query normal table without CN character', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insert = (0, utils_1.insertNTable)(tableValues, table);
// console.log(insert)
let insertRes = await ws.exec(insert);
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectTable);
let expectMeta = utils_1.tableMeta;
let expectData = tableValues;
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
// console.log(meta,expectMeta[index]);
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
expect(d).toBeTruthy();
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
test('Insert query normal table with CN character', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insertCN = (0, utils_1.insertNTable)(tableCNValues, tableCN);
// console.log(insertCN)
let insertRes = await ws.exec(insertCN);
// console.log(insertRes)
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectTableCN);
let expectMeta = utils_1.tableMeta;
let expectData = tableCNValues;
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
// console.log(meta, expectMeta[index]);
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
expect(d).toBeTruthy();
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
});
describe('ws.query(jsonTable)', () => {
test('Insert and query json data from table without CN', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insert = (0, utils_1.insertStable)(tableValues, jsonTags, jsonTable);
// console.log(insert)
let insertRes = await ws.exec(insert);
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectJsonTable);
let expectMeta = utils_1.tableMeta.concat(utils_1.jsonMeta);
let expectData = (0, utils_1.expectStableData)(tableValues, jsonTags);
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
// console.log(meta);
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
expect(d).toBeTruthy();
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
test('Insert and query json data from table with CN', async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(useDB);
let insert = (0, utils_1.insertStable)(tableCNValues, jsonTagsCN, jsonTableCN);
// console.log(insert)
let insertRes = await ws.exec(insert);
expect(insertRes.getAffectRows()).toBe(5);
let queryRes = await ws.exec(selectJsonTableCN);
let expectMeta = utils_1.tableMeta.concat(utils_1.jsonMeta);
let expectData = (0, utils_1.expectStableData)(tableCNValues, jsonTagsCN);
let actualMeta = queryRes.getMeta();
let actualData = queryRes.getData();
await ws.close();
if (actualData && actualMeta) {
actualMeta.forEach((meta, index) => {
// console.log(meta);
expect(meta.name).toBe(expectMeta[index].name);
expect(meta.type).toBe(expectMeta[index].type);
expect(meta.length).toBe(expectMeta[index].length);
});
for (let i = 0; i < actualData.length; i++) {
actualData[i].forEach((d, index) => {
if (expectMeta[index].name == 'geo' || expectMeta[index].name == 'vbinary') {
expect(d).toBeTruthy();
}
else {
expect(d).toBe(expectData[i][index]);
}
});
}
}
else {
throw new Error("retrieve empty result");
}
});
});
afterAll(async () => {
let ws = await wsSql_1.WsSql.open(conf);
await ws.exec(dropDB);
await ws.close();
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
});
//--detectOpenHandles --maxConcurrency=1 --forceExit
;