@tdengine/websocket 3.2.0 → 3.2.2
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.js +26 -22
- package/lib/example/all_type_stmt.js +22 -20
- package/lib/example/basicBatchTmq.js +14 -14
- package/lib/example/basicSchemaless.js +11 -11
- package/lib/example/basicSql.js +10 -10
- package/lib/example/basicStmt.js +3 -3
- package/lib/example/basicTmq.js +8 -9
- package/lib/index.d.ts +0 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +0 -7
- package/lib/src/client/wsClient.d.ts +2 -2
- package/lib/src/client/wsClient.d.ts.map +1 -1
- package/lib/src/client/wsClient.js +60 -37
- package/lib/src/client/wsConnector.d.ts.map +1 -1
- package/lib/src/client/wsConnector.js +40 -14
- package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
- package/lib/src/client/wsConnectorPool.js +29 -14
- package/lib/src/client/wsEventCallback.d.ts.map +1 -1
- package/lib/src/client/wsEventCallback.js +6 -4
- package/lib/src/client/wsResponse.d.ts.map +1 -1
- package/lib/src/client/wsResponse.js +6 -2
- package/lib/src/common/config.d.ts +2 -2
- package/lib/src/common/config.d.ts.map +1 -1
- package/lib/src/common/config.js +5 -5
- package/lib/src/common/constant.d.ts.map +1 -1
- package/lib/src/common/constant.js +27 -27
- package/lib/src/common/log.d.ts +1 -1
- package/lib/src/common/log.d.ts.map +1 -1
- package/lib/src/common/log.js +9 -7
- package/lib/src/common/reqid.d.ts.map +1 -1
- package/lib/src/common/reqid.js +7 -7
- package/lib/src/common/taosResult.d.ts.map +1 -1
- package/lib/src/common/taosResult.js +46 -27
- package/lib/src/common/ut8Helper.d.ts.map +1 -1
- package/lib/src/common/ut8Helper.js +8 -8
- package/lib/src/common/utils.d.ts.map +1 -1
- package/lib/src/common/utils.js +17 -16
- package/lib/src/common/wsError.d.ts.map +1 -1
- package/lib/src/common/wsError.js +3 -3
- package/lib/src/common/wsOptions.d.ts +1 -1
- package/lib/src/index.d.ts +3 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/sql/wsProto.d.ts.map +1 -1
- package/lib/src/sql/wsRows.d.ts +3 -3
- package/lib/src/sql/wsRows.d.ts.map +1 -1
- package/lib/src/sql/wsRows.js +4 -2
- package/lib/src/sql/wsSql.d.ts +5 -5
- package/lib/src/sql/wsSql.d.ts.map +1 -1
- package/lib/src/sql/wsSql.js +15 -16
- package/lib/src/stmt/FieldBindParams.d.ts.map +1 -1
- package/lib/src/stmt/wsColumnInfo.d.ts.map +1 -1
- package/lib/src/stmt/wsParams1.d.ts.map +1 -1
- package/lib/src/stmt/wsParams1.js +50 -24
- package/lib/src/stmt/wsParams2.d.ts.map +1 -1
- package/lib/src/stmt/wsParams2.js +30 -15
- package/lib/src/stmt/wsParamsBase.d.ts.map +1 -1
- package/lib/src/stmt/wsParamsBase.js +5 -3
- package/lib/src/stmt/wsProto.d.ts.map +1 -1
- package/lib/src/stmt/wsProto.js +22 -11
- package/lib/src/stmt/wsStmt.d.ts.map +1 -1
- package/lib/src/stmt/wsStmt1.d.ts +5 -5
- package/lib/src/stmt/wsStmt1.d.ts.map +1 -1
- package/lib/src/stmt/wsStmt1.js +14 -14
- package/lib/src/stmt/wsStmt2.d.ts +1 -1
- package/lib/src/stmt/wsStmt2.d.ts.map +1 -1
- package/lib/src/stmt/wsStmt2.js +18 -14
- package/lib/src/stmt/wsTableInfo.d.ts.map +1 -1
- package/lib/src/tmq/config.d.ts.map +1 -1
- package/lib/src/tmq/config.js +2 -2
- package/lib/src/tmq/constant.d.ts.map +1 -1
- package/lib/src/tmq/constant.js +28 -28
- package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
- package/lib/src/tmq/tmqResponse.js +30 -16
- package/lib/src/tmq/wsTmq.d.ts +2 -2
- package/lib/src/tmq/wsTmq.d.ts.map +1 -1
- package/lib/src/tmq/wsTmq.js +32 -30
- package/lib/test/bulkPulling/cloud.tmq.test.js +11 -11
- package/lib/test/bulkPulling/decimal.test.js +50 -26
- package/lib/test/bulkPulling/log.test.js +8 -8
- package/lib/test/bulkPulling/queryTables.test.js +255 -49
- package/lib/test/bulkPulling/schemaless.test.js +34 -34
- package/lib/test/bulkPulling/sql.test.js +108 -69
- package/lib/test/bulkPulling/stmt1.func.test.js +96 -96
- package/lib/test/bulkPulling/stmt1.type.test.js +124 -48
- package/lib/test/bulkPulling/stmt2.func.test.js +116 -112
- package/lib/test/bulkPulling/stmt2.type.test.js +124 -48
- package/lib/test/bulkPulling/tmq.test.js +225 -31
- package/lib/test/bulkPulling/utils.test.js +2 -2
- package/lib/test/bulkPulling/wsConnectPool.test.js +18 -18
- package/lib/test/utils.d.ts.map +1 -1
- package/lib/test/utils.js +129 -129
- package/package.json +1 -1
- package/readme.md +1 -0
- package/lib/src/stmt/wsParams.d.ts +0 -41
- package/lib/src/stmt/wsParams.d.ts.map +0 -1
- package/lib/src/stmt/wsParams.js +0 -428
- package/lib/test/bulkPulling/stmt.func.test.d.ts +0 -2
- package/lib/test/bulkPulling/stmt.func.test.d.ts.map +0 -1
- package/lib/test/bulkPulling/stmt.func.test.js +0 -493
- package/lib/test/bulkPulling/stmt.type.test.d.ts +0 -2
- package/lib/test/bulkPulling/stmt.type.test.d.ts.map +0 -1
- package/lib/test/bulkPulling/stmt.type.test.js +0 -316
|
@@ -5,51 +5,51 @@ const config_1 = require("../../src/common/config");
|
|
|
5
5
|
const wsSql_1 = require("../../src/sql/wsSql");
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
7
|
const log_1 = require("../../src/common/log");
|
|
8
|
-
let dns =
|
|
9
|
-
let password1 =
|
|
10
|
-
let password2 =
|
|
8
|
+
let dns = "ws://localhost:6041";
|
|
9
|
+
let password1 = "Ab1!@#$%,.:?<>;~";
|
|
10
|
+
let password2 = "Bc%^&*()-_+=[]{}";
|
|
11
11
|
(0, log_1.setLevel)("debug");
|
|
12
12
|
beforeAll(async () => {
|
|
13
13
|
let conf = new config_1.WSConfig(dns);
|
|
14
|
-
conf.setUser(
|
|
15
|
-
conf.setPwd(
|
|
14
|
+
conf.setUser("root");
|
|
15
|
+
conf.setPwd("taosdata");
|
|
16
16
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
17
|
-
await wsSql.exec(
|
|
18
|
-
await wsSql.exec(
|
|
17
|
+
await wsSql.exec("drop database if exists sql_test");
|
|
18
|
+
await wsSql.exec("drop database if exists sql_create");
|
|
19
19
|
await wsSql.exec(`CREATE USER user1 PASS '${password1}'`);
|
|
20
20
|
await wsSql.exec(`CREATE USER user2 PASS '${password2}'`);
|
|
21
|
-
await wsSql.exec(
|
|
21
|
+
await wsSql.exec("create database if not exists sql_test KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
22
22
|
await (0, utils_1.Sleep)(100);
|
|
23
|
-
await wsSql.exec(
|
|
24
|
-
await wsSql.exec(
|
|
23
|
+
await wsSql.exec("use sql_test");
|
|
24
|
+
await wsSql.exec("CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);");
|
|
25
25
|
await wsSql.close();
|
|
26
26
|
});
|
|
27
|
-
describe(
|
|
27
|
+
describe("TDWebSocket.WsSql()", () => {
|
|
28
28
|
jest.setTimeout(20 * 1000);
|
|
29
|
-
test(
|
|
29
|
+
test("normal connect", async () => {
|
|
30
30
|
let wsSql = null;
|
|
31
|
-
let conf = new config_1.WSConfig(
|
|
31
|
+
let conf = new config_1.WSConfig("");
|
|
32
32
|
conf.setUrl(dns);
|
|
33
|
-
conf.setUser(
|
|
34
|
-
conf.setPwd(
|
|
35
|
-
conf.setDb(
|
|
36
|
-
conf.setTimezone(
|
|
33
|
+
conf.setUser("root");
|
|
34
|
+
conf.setPwd("taosdata");
|
|
35
|
+
conf.setDb("sql_test");
|
|
36
|
+
conf.setTimezone("America/New_York");
|
|
37
37
|
conf.setTimeOut(6000);
|
|
38
38
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
39
39
|
expect(wsSql.state()).toBeGreaterThan(0);
|
|
40
|
-
let wsRows = await wsSql.query(
|
|
40
|
+
let wsRows = await wsSql.query("select timezone()");
|
|
41
41
|
while (await wsRows.next()) {
|
|
42
42
|
let result = wsRows.getData();
|
|
43
43
|
console.log(result);
|
|
44
44
|
expect(result).toBeTruthy();
|
|
45
|
-
expect(JSON.stringify(result)).toContain(
|
|
45
|
+
expect(JSON.stringify(result)).toContain("America/New_York");
|
|
46
46
|
}
|
|
47
47
|
await wsSql.close();
|
|
48
48
|
});
|
|
49
|
-
test(
|
|
49
|
+
test("special characters connect1", async () => {
|
|
50
50
|
let wsSql = null;
|
|
51
51
|
let conf = new config_1.WSConfig(dns);
|
|
52
|
-
conf.setUser(
|
|
52
|
+
conf.setUser("user1");
|
|
53
53
|
conf.setPwd(password1);
|
|
54
54
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
55
55
|
expect(wsSql.state()).toBeGreaterThan(0);
|
|
@@ -58,10 +58,10 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
58
58
|
expect(version).not.toBeUndefined();
|
|
59
59
|
await wsSql.close();
|
|
60
60
|
});
|
|
61
|
-
test(
|
|
61
|
+
test("special characters connect2", async () => {
|
|
62
62
|
let wsSql = null;
|
|
63
63
|
let conf = new config_1.WSConfig(dns);
|
|
64
|
-
conf.setUser(
|
|
64
|
+
conf.setUser("user2");
|
|
65
65
|
conf.setPwd(password2);
|
|
66
66
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
67
67
|
expect(wsSql.state()).toBeGreaterThan(0);
|
|
@@ -70,19 +70,19 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
70
70
|
expect(version).not.toBeUndefined();
|
|
71
71
|
await wsSql.close();
|
|
72
72
|
});
|
|
73
|
-
test(
|
|
73
|
+
test("connect db with error", async () => {
|
|
74
74
|
expect.assertions(1);
|
|
75
75
|
let wsSql = null;
|
|
76
76
|
try {
|
|
77
77
|
let conf = new config_1.WSConfig(dns);
|
|
78
|
-
conf.setUser(
|
|
79
|
-
conf.setPwd(
|
|
80
|
-
conf.setDb(
|
|
78
|
+
conf.setUser("root");
|
|
79
|
+
conf.setPwd("taosdata");
|
|
80
|
+
conf.setDb("jest");
|
|
81
81
|
wsSql = await wsSql_1.WsSql.open(conf);
|
|
82
82
|
}
|
|
83
83
|
catch (e) {
|
|
84
84
|
let err = e;
|
|
85
|
-
expect(err.message).toMatch(
|
|
85
|
+
expect(err.message).toMatch("Database not exist");
|
|
86
86
|
}
|
|
87
87
|
finally {
|
|
88
88
|
if (wsSql) {
|
|
@@ -90,90 +90,90 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
|
-
test(
|
|
94
|
-
let url =
|
|
93
|
+
test("connect url", async () => {
|
|
94
|
+
let url = "ws://root:taosdata@localhost:6041/information_schema?timezone=Asia/Shanghai";
|
|
95
95
|
let conf = new config_1.WSConfig(url);
|
|
96
96
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
97
97
|
let version = await wsSql.version();
|
|
98
98
|
console.log(version);
|
|
99
99
|
expect(version).toBeTruthy();
|
|
100
|
-
let wsRows = await wsSql.query(
|
|
100
|
+
let wsRows = await wsSql.query("select timezone()");
|
|
101
101
|
while (await wsRows.next()) {
|
|
102
102
|
let result = wsRows.getData();
|
|
103
103
|
console.log(result);
|
|
104
104
|
expect(result).toBeTruthy();
|
|
105
|
-
expect(JSON.stringify(result)).toContain(
|
|
105
|
+
expect(JSON.stringify(result)).toContain("Asia/Shanghai");
|
|
106
106
|
}
|
|
107
107
|
await wsSql.close();
|
|
108
108
|
});
|
|
109
|
-
test(
|
|
109
|
+
test("get taosc version", async () => {
|
|
110
110
|
let conf = new config_1.WSConfig(dns);
|
|
111
|
-
conf.setUser(
|
|
112
|
-
conf.setPwd(
|
|
111
|
+
conf.setUser("root");
|
|
112
|
+
conf.setPwd("taosdata");
|
|
113
113
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
114
114
|
let version = await wsSql.version();
|
|
115
115
|
await wsSql.close();
|
|
116
116
|
console.log(version);
|
|
117
117
|
expect(version).toBeTruthy();
|
|
118
118
|
});
|
|
119
|
-
test(
|
|
119
|
+
test("show databases", async () => {
|
|
120
120
|
let conf = new config_1.WSConfig(dns);
|
|
121
|
-
conf.setUser(
|
|
122
|
-
conf.setPwd(
|
|
121
|
+
conf.setUser("root");
|
|
122
|
+
conf.setPwd("taosdata");
|
|
123
123
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
124
|
-
let taosResult = await wsSql.exec(
|
|
124
|
+
let taosResult = await wsSql.exec("show databases");
|
|
125
125
|
await wsSql.close();
|
|
126
126
|
console.log(taosResult);
|
|
127
127
|
expect(taosResult).toBeTruthy();
|
|
128
128
|
});
|
|
129
|
-
test(
|
|
129
|
+
test("create databases", async () => {
|
|
130
130
|
let conf = new config_1.WSConfig(dns);
|
|
131
|
-
conf.setUser(
|
|
132
|
-
conf.setPwd(
|
|
131
|
+
conf.setUser("root");
|
|
132
|
+
conf.setPwd("taosdata");
|
|
133
133
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
134
|
-
let taosResult = await wsSql.exec(
|
|
134
|
+
let taosResult = await wsSql.exec("create database if not exists sql_create KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;");
|
|
135
135
|
await wsSql.close();
|
|
136
136
|
console.log(taosResult);
|
|
137
137
|
expect(taosResult).toBeTruthy();
|
|
138
138
|
});
|
|
139
|
-
test(
|
|
139
|
+
test("create stable", async () => {
|
|
140
140
|
let conf = new config_1.WSConfig(dns);
|
|
141
|
-
conf.setUser(
|
|
142
|
-
conf.setPwd(
|
|
141
|
+
conf.setUser("root");
|
|
142
|
+
conf.setPwd("taosdata");
|
|
143
143
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
144
|
-
let taosResult = await wsSql.exec(
|
|
144
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
145
145
|
console.log(taosResult);
|
|
146
146
|
expect(taosResult).toBeTruthy();
|
|
147
|
-
taosResult = await wsSql.exec(
|
|
147
|
+
taosResult = await wsSql.exec("CREATE STABLE if not exists meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);");
|
|
148
148
|
await wsSql.close();
|
|
149
149
|
console.log(taosResult);
|
|
150
150
|
expect(taosResult).toBeTruthy();
|
|
151
151
|
});
|
|
152
|
-
test(
|
|
152
|
+
test("insert recoder", async () => {
|
|
153
153
|
let conf = new config_1.WSConfig(dns);
|
|
154
|
-
conf.setUser(
|
|
155
|
-
conf.setPwd(
|
|
154
|
+
conf.setUser("root");
|
|
155
|
+
conf.setPwd("taosdata");
|
|
156
156
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
157
|
-
let taosResult = await wsSql.exec(
|
|
157
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
158
158
|
console.log(taosResult);
|
|
159
159
|
expect(taosResult).toBeTruthy();
|
|
160
|
-
taosResult = await wsSql.exec(
|
|
160
|
+
taosResult = await wsSql.exec("describe meters");
|
|
161
161
|
console.log(taosResult);
|
|
162
162
|
taosResult = await wsSql.exec('INSERT INTO d1001 USING meters (location, groupid) TAGS ("California", 3) VALUES (NOW, 10.2, 219, 0.32)');
|
|
163
163
|
console.log(taosResult);
|
|
164
164
|
expect(taosResult.getAffectRows()).toBeGreaterThanOrEqual(1);
|
|
165
165
|
await wsSql.close();
|
|
166
166
|
});
|
|
167
|
-
test(
|
|
167
|
+
test("query sql", async () => {
|
|
168
168
|
let conf = new config_1.WSConfig(dns);
|
|
169
|
-
conf.setUser(
|
|
170
|
-
conf.setPwd(
|
|
169
|
+
conf.setUser("root");
|
|
170
|
+
conf.setPwd("taosdata");
|
|
171
171
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
172
|
-
let taosResult = await wsSql.exec(
|
|
172
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
173
173
|
console.log(taosResult);
|
|
174
174
|
expect(taosResult).toBeTruthy();
|
|
175
175
|
for (let i = 0; i < 10; i++) {
|
|
176
|
-
let wsRows = await wsSql.query(
|
|
176
|
+
let wsRows = await wsSql.query("select * from meters limit 3");
|
|
177
177
|
expect(wsRows).toBeTruthy();
|
|
178
178
|
let meta = wsRows.getMeta();
|
|
179
179
|
expect(meta).toBeTruthy();
|
|
@@ -186,28 +186,67 @@ describe('TDWebSocket.WsSql()', () => {
|
|
|
186
186
|
}
|
|
187
187
|
await wsSql.close();
|
|
188
188
|
});
|
|
189
|
-
test(
|
|
189
|
+
test("query sql no getdata", async () => {
|
|
190
190
|
let conf = new config_1.WSConfig(dns);
|
|
191
|
-
conf.setUser(
|
|
192
|
-
conf.setPwd(
|
|
191
|
+
conf.setUser("root");
|
|
192
|
+
conf.setPwd("taosdata");
|
|
193
193
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
194
|
-
let taosResult = await wsSql.exec(
|
|
194
|
+
let taosResult = await wsSql.exec("use sql_test");
|
|
195
195
|
console.log(taosResult);
|
|
196
196
|
expect(taosResult).toBeTruthy();
|
|
197
|
-
let wsRows = await wsSql.query(
|
|
197
|
+
let wsRows = await wsSql.query("select * from meters");
|
|
198
198
|
await wsRows.close();
|
|
199
199
|
await wsSql.close();
|
|
200
200
|
});
|
|
201
|
+
test("timestamp order check", async () => {
|
|
202
|
+
const conf = new config_1.WSConfig(dns);
|
|
203
|
+
conf.setUser("root");
|
|
204
|
+
conf.setPwd("taosdata");
|
|
205
|
+
const wsSql = await wsSql_1.WsSql.open(conf);
|
|
206
|
+
await wsSql.exec("use sql_test");
|
|
207
|
+
await wsSql.exec("drop table if exists t_order");
|
|
208
|
+
await wsSql.exec("create table t_order (ts timestamp, c1 int)");
|
|
209
|
+
await wsSql.exec("insert into t_order values (1726803356466, 1)");
|
|
210
|
+
await wsSql.exec("insert into t_order values (1726803357466, 2)");
|
|
211
|
+
await wsSql.exec("insert into t_order values (1726803358466, 3)");
|
|
212
|
+
const expectRowsAsc = [
|
|
213
|
+
[1726803356466n, 1],
|
|
214
|
+
[1726803357466n, 2],
|
|
215
|
+
[1726803358466n, 3],
|
|
216
|
+
];
|
|
217
|
+
const expectRowsDesc = expectRowsAsc.slice().reverse();
|
|
218
|
+
const actualRowsAsc = [];
|
|
219
|
+
const actualRowsDesc = [];
|
|
220
|
+
const rowsAsc = await wsSql.query("select * from t_order order by ts asc");
|
|
221
|
+
while (await rowsAsc.next()) {
|
|
222
|
+
const data = rowsAsc.getData();
|
|
223
|
+
if (!data)
|
|
224
|
+
break;
|
|
225
|
+
actualRowsAsc.push(data);
|
|
226
|
+
}
|
|
227
|
+
await rowsAsc.close();
|
|
228
|
+
expect(actualRowsAsc).toEqual(expectRowsAsc);
|
|
229
|
+
const rowsDesc = await wsSql.query("select * from t_order order by ts desc");
|
|
230
|
+
while (await rowsDesc.next()) {
|
|
231
|
+
const data = rowsDesc.getData();
|
|
232
|
+
if (!data)
|
|
233
|
+
break;
|
|
234
|
+
actualRowsDesc.push(data);
|
|
235
|
+
}
|
|
236
|
+
await rowsDesc.close();
|
|
237
|
+
expect(actualRowsDesc).toEqual(expectRowsDesc);
|
|
238
|
+
await wsSql.close();
|
|
239
|
+
});
|
|
201
240
|
});
|
|
202
241
|
afterAll(async () => {
|
|
203
242
|
let conf = new config_1.WSConfig(dns);
|
|
204
|
-
conf.setUser(
|
|
205
|
-
conf.setPwd(
|
|
243
|
+
conf.setUser("root");
|
|
244
|
+
conf.setPwd("taosdata");
|
|
206
245
|
let wsSql = await wsSql_1.WsSql.open(conf);
|
|
207
|
-
await wsSql.exec(
|
|
208
|
-
await wsSql.exec(
|
|
209
|
-
await wsSql.exec(
|
|
210
|
-
await wsSql.exec(
|
|
246
|
+
await wsSql.exec("drop database sql_test");
|
|
247
|
+
await wsSql.exec("drop database sql_create");
|
|
248
|
+
await wsSql.exec("DROP USER user1;");
|
|
249
|
+
await wsSql.exec("DROP USER user2;");
|
|
211
250
|
await wsSql.close();
|
|
212
251
|
wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed();
|
|
213
252
|
});
|