@tdengine/websocket 3.2.2 → 3.3.0

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.
Files changed (275) hide show
  1. package/lib/package.json +64 -0
  2. package/lib/src/client/retryConfig.d.ts +10 -0
  3. package/lib/src/client/retryConfig.d.ts.map +1 -0
  4. package/lib/src/client/retryConfig.js +46 -0
  5. package/lib/src/client/wsClient.d.ts +24 -7
  6. package/lib/src/client/wsClient.d.ts.map +1 -1
  7. package/lib/src/client/wsClient.js +164 -137
  8. package/lib/src/client/wsConnector.d.ts +55 -9
  9. package/lib/src/client/wsConnector.d.ts.map +1 -1
  10. package/lib/src/client/wsConnector.js +522 -102
  11. package/lib/src/client/wsConnectorPool.d.ts +5 -1
  12. package/lib/src/client/wsConnectorPool.d.ts.map +1 -1
  13. package/lib/src/client/wsConnectorPool.js +67 -52
  14. package/lib/src/client/wsEventCallback.d.ts +3 -0
  15. package/lib/src/client/wsEventCallback.d.ts.map +1 -1
  16. package/lib/src/client/wsEventCallback.js +67 -8
  17. package/lib/src/client/wsResponse.d.ts +0 -3
  18. package/lib/src/client/wsResponse.d.ts.map +1 -1
  19. package/lib/src/client/wsResponse.js +0 -3
  20. package/lib/src/common/addressConnectionTracker.d.ts +11 -0
  21. package/lib/src/common/addressConnectionTracker.d.ts.map +1 -0
  22. package/lib/src/common/addressConnectionTracker.js +53 -0
  23. package/lib/src/common/config.d.ts +3 -0
  24. package/lib/src/common/config.d.ts.map +1 -1
  25. package/lib/src/common/config.js +6 -0
  26. package/lib/src/common/constant.d.ts +1 -0
  27. package/lib/src/common/constant.d.ts.map +1 -1
  28. package/lib/src/common/constant.js +6 -1
  29. package/lib/src/common/dsn.d.ts +30 -0
  30. package/lib/src/common/dsn.d.ts.map +1 -0
  31. package/lib/src/common/dsn.js +221 -0
  32. package/lib/src/common/taosResult.d.ts.map +1 -1
  33. package/lib/src/common/taosResult.js +0 -5
  34. package/lib/src/common/urlParser.d.ts +32 -0
  35. package/lib/src/common/urlParser.d.ts.map +1 -0
  36. package/lib/src/common/urlParser.js +201 -0
  37. package/lib/src/common/utils.d.ts +6 -1
  38. package/lib/src/common/utils.d.ts.map +1 -1
  39. package/lib/src/common/utils.js +74 -22
  40. package/lib/src/index.d.ts.map +1 -1
  41. package/lib/src/sql/wsSql.d.ts.map +1 -1
  42. package/lib/src/sql/wsSql.js +2 -2
  43. package/lib/src/stmt/FieldBindParams.d.ts.map +1 -1
  44. package/lib/src/stmt/wsColumnInfo.d.ts.map +1 -1
  45. package/lib/src/stmt/wsParams1.d.ts.map +1 -1
  46. package/lib/src/stmt/wsParams1.js +26 -26
  47. package/lib/src/stmt/wsParams2.d.ts.map +1 -1
  48. package/lib/src/stmt/wsParams2.js +0 -3
  49. package/lib/src/stmt/wsParamsBase.d.ts.map +1 -1
  50. package/lib/src/stmt/wsProto.d.ts.map +1 -1
  51. package/lib/src/stmt/wsProto.js +16 -16
  52. package/lib/src/stmt/wsStmt1.d.ts.map +1 -1
  53. package/lib/src/stmt/wsStmt2.d.ts +12 -4
  54. package/lib/src/stmt/wsStmt2.d.ts.map +1 -1
  55. package/lib/src/stmt/wsStmt2.js +182 -64
  56. package/lib/src/stmt/wsTableInfo.d.ts.map +1 -1
  57. package/lib/src/tmq/config.d.ts +4 -2
  58. package/lib/src/tmq/config.d.ts.map +1 -1
  59. package/lib/src/tmq/config.js +30 -13
  60. package/lib/src/tmq/constant.d.ts +4 -0
  61. package/lib/src/tmq/constant.d.ts.map +1 -1
  62. package/lib/src/tmq/constant.js +4 -0
  63. package/lib/src/tmq/tmqResponse.d.ts.map +1 -1
  64. package/lib/src/tmq/tmqResponse.js +1 -4
  65. package/lib/src/tmq/wsTmq.d.ts +4 -1
  66. package/lib/src/tmq/wsTmq.d.ts.map +1 -1
  67. package/lib/src/tmq/wsTmq.js +55 -27
  68. package/lib/test/bulkPulling/a.test.d.ts +2 -0
  69. package/lib/test/bulkPulling/a.test.d.ts.map +1 -0
  70. package/lib/test/bulkPulling/a.test.js +166 -0
  71. package/lib/test/bulkPulling/cloud.tmq.test.js +3 -2
  72. package/lib/test/bulkPulling/decimal.test.js +8 -8
  73. package/lib/test/bulkPulling/dsn.test.d.ts +2 -0
  74. package/lib/test/bulkPulling/dsn.test.d.ts.map +1 -0
  75. package/lib/test/bulkPulling/dsn.test.js +397 -0
  76. package/lib/test/bulkPulling/queryTables.test.js +1 -1
  77. package/lib/test/bulkPulling/retryConfig.test.d.ts +2 -0
  78. package/lib/test/bulkPulling/retryConfig.test.d.ts.map +1 -0
  79. package/lib/test/bulkPulling/retryConfig.test.js +34 -0
  80. package/lib/test/bulkPulling/schemaless.test.js +15 -14
  81. package/lib/test/bulkPulling/sql.failover.test.d.ts +2 -0
  82. package/lib/test/bulkPulling/sql.failover.test.d.ts.map +1 -0
  83. package/lib/test/bulkPulling/sql.failover.test.js +338 -0
  84. package/lib/test/bulkPulling/sql.test.js +116 -44
  85. package/lib/test/bulkPulling/stmt1.func.test.js +31 -30
  86. package/lib/test/bulkPulling/stmt1.type.test.js +1 -1
  87. package/lib/test/bulkPulling/stmt2.failover.test.d.ts +2 -0
  88. package/lib/test/bulkPulling/stmt2.failover.test.d.ts.map +1 -0
  89. package/lib/test/bulkPulling/stmt2.failover.test.js +313 -0
  90. package/lib/test/bulkPulling/stmt2.func.test.js +37 -36
  91. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts +2 -0
  92. package/lib/test/bulkPulling/stmt2.init.failover.test.d.ts.map +1 -0
  93. package/lib/test/bulkPulling/stmt2.init.failover.test.js +50 -0
  94. package/lib/test/bulkPulling/stmt2.type.test.js +1 -1
  95. package/lib/test/bulkPulling/tmq.config.test.d.ts +2 -0
  96. package/lib/test/bulkPulling/tmq.config.test.d.ts.map +1 -0
  97. package/lib/test/bulkPulling/tmq.config.test.js +77 -0
  98. package/lib/test/bulkPulling/tmq.failover.test.d.ts +2 -0
  99. package/lib/test/bulkPulling/tmq.failover.test.d.ts.map +1 -0
  100. package/lib/test/bulkPulling/tmq.failover.test.js +404 -0
  101. package/lib/test/bulkPulling/tmq.test.js +135 -14
  102. package/lib/test/bulkPulling/urlParser.test.d.ts +2 -0
  103. package/lib/test/bulkPulling/urlParser.test.d.ts.map +1 -0
  104. package/lib/test/bulkPulling/urlParser.test.js +452 -0
  105. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts +2 -0
  106. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.d.ts.map +1 -0
  107. package/lib/test/bulkPulling/wsClient.reconnect.integration.test.js +184 -0
  108. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts +2 -0
  109. package/lib/test/bulkPulling/wsClient.recovery.test.d.ts.map +1 -0
  110. package/lib/test/bulkPulling/wsClient.recovery.test.js +104 -0
  111. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts +2 -0
  112. package/lib/test/bulkPulling/wsConfig.dsn.test.d.ts.map +1 -0
  113. package/lib/test/bulkPulling/wsConfig.dsn.test.js +39 -0
  114. package/lib/test/bulkPulling/wsConnectPool.test.js +7 -7
  115. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts +2 -0
  116. package/lib/test/bulkPulling/wsConnector.failover.test.d.ts.map +1 -0
  117. package/lib/test/bulkPulling/wsConnector.failover.test.js +497 -0
  118. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts +2 -0
  119. package/lib/test/bulkPulling/wsConnectorPool.key.test.d.ts.map +1 -0
  120. package/lib/test/bulkPulling/wsConnectorPool.key.test.js +52 -0
  121. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts +2 -0
  122. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.d.ts.map +1 -0
  123. package/lib/test/bulkPulling/wsConnectorPool.keyAuth.test.js +28 -0
  124. package/lib/test/bulkPulling/wsEventCallback.test.d.ts +2 -0
  125. package/lib/test/bulkPulling/wsEventCallback.test.d.ts.map +1 -0
  126. package/lib/test/bulkPulling/wsEventCallback.test.js +54 -0
  127. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts +2 -0
  128. package/lib/test/bulkPulling/wsProxy.failover.integration.test.d.ts.map +1 -0
  129. package/lib/test/bulkPulling/wsProxy.failover.integration.test.js +120 -0
  130. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts +2 -0
  131. package/lib/test/bulkPulling/wsProxy.failover.test.d.ts.map +1 -0
  132. package/lib/test/bulkPulling/wsProxy.failover.test.js +465 -0
  133. package/lib/test/client/wsClient.recovery.test.d.ts +2 -0
  134. package/lib/test/client/wsClient.recovery.test.d.ts.map +1 -0
  135. package/lib/test/client/wsClient.recovery.test.js +122 -0
  136. package/lib/test/client/wsConnectPool.test.d.ts +2 -0
  137. package/lib/test/client/wsConnectPool.test.d.ts.map +1 -0
  138. package/lib/test/client/wsConnectPool.test.js +147 -0
  139. package/lib/test/client/wsConnector.failover.test.d.ts +2 -0
  140. package/lib/test/client/wsConnector.failover.test.d.ts.map +1 -0
  141. package/lib/test/client/wsConnector.failover.test.js +681 -0
  142. package/lib/test/client/wsConnector.leastConnections.test.d.ts +2 -0
  143. package/lib/test/client/wsConnector.leastConnections.test.d.ts.map +1 -0
  144. package/lib/test/client/wsConnector.leastConnections.test.js +71 -0
  145. package/lib/test/client/wsConnectorPool.key.test.d.ts +2 -0
  146. package/lib/test/client/wsConnectorPool.key.test.d.ts.map +1 -0
  147. package/lib/test/client/wsConnectorPool.key.test.js +127 -0
  148. package/lib/test/client/wsEventCallback.test.d.ts +2 -0
  149. package/lib/test/client/wsEventCallback.test.d.ts.map +1 -0
  150. package/lib/test/client/wsEventCallback.test.js +98 -0
  151. package/lib/test/common/addressConnectionTracker.test.d.ts +2 -0
  152. package/lib/test/common/addressConnectionTracker.test.d.ts.map +1 -0
  153. package/lib/test/common/addressConnectionTracker.test.js +74 -0
  154. package/lib/test/common/dsn.test.d.ts +2 -0
  155. package/lib/test/common/dsn.test.d.ts.map +1 -0
  156. package/lib/test/common/dsn.test.js +406 -0
  157. package/lib/test/common/log.test.d.ts +2 -0
  158. package/lib/test/common/log.test.d.ts.map +1 -0
  159. package/lib/test/common/log.test.js +54 -0
  160. package/lib/test/common/utils.test.d.ts +2 -0
  161. package/lib/test/common/utils.test.d.ts.map +1 -0
  162. package/lib/test/common/utils.test.js +13 -0
  163. package/lib/test/common/wsConfig.dsn.test.d.ts +2 -0
  164. package/lib/test/common/wsConfig.dsn.test.d.ts.map +1 -0
  165. package/lib/test/common/wsConfig.dsn.test.js +39 -0
  166. package/lib/test/helpers/utils.d.ts +27 -0
  167. package/lib/test/helpers/utils.d.ts.map +1 -0
  168. package/lib/test/helpers/utils.js +341 -0
  169. package/lib/test/helpers/wsFailoverProxy.d.ts +109 -0
  170. package/lib/test/helpers/wsFailoverProxy.d.ts.map +1 -0
  171. package/lib/test/helpers/wsFailoverProxy.js +420 -0
  172. package/lib/test/helpers/wsProxy.d.ts +110 -0
  173. package/lib/test/helpers/wsProxy.d.ts.map +1 -0
  174. package/lib/test/helpers/wsProxy.js +429 -0
  175. package/lib/test/sql/core/decimal.test.d.ts +2 -0
  176. package/lib/test/sql/core/decimal.test.d.ts.map +1 -0
  177. package/lib/test/sql/core/decimal.test.js +153 -0
  178. package/lib/test/sql/core/queryTables.test.d.ts +2 -0
  179. package/lib/test/sql/core/queryTables.test.d.ts.map +1 -0
  180. package/lib/test/sql/core/queryTables.test.js +506 -0
  181. package/lib/test/sql/core/schemaless.test.d.ts +2 -0
  182. package/lib/test/sql/core/schemaless.test.d.ts.map +1 -0
  183. package/lib/test/sql/core/schemaless.test.js +102 -0
  184. package/lib/test/sql/core/sql.test.d.ts +2 -0
  185. package/lib/test/sql/core/sql.test.d.ts.map +1 -0
  186. package/lib/test/sql/core/sql.test.js +324 -0
  187. package/lib/test/sql/decimal.test.d.ts +2 -0
  188. package/lib/test/sql/decimal.test.d.ts.map +1 -0
  189. package/lib/test/sql/decimal.test.js +153 -0
  190. package/lib/test/sql/failover/sql.failover.test.d.ts +2 -0
  191. package/lib/test/sql/failover/sql.failover.test.d.ts.map +1 -0
  192. package/lib/test/sql/failover/sql.failover.test.js +341 -0
  193. package/lib/test/sql/queryTables.test.d.ts +2 -0
  194. package/lib/test/sql/queryTables.test.d.ts.map +1 -0
  195. package/lib/test/sql/queryTables.test.js +506 -0
  196. package/lib/test/sql/schemaless.test.d.ts +2 -0
  197. package/lib/test/sql/schemaless.test.d.ts.map +1 -0
  198. package/lib/test/sql/schemaless.test.js +102 -0
  199. package/lib/test/sql/sql.failover.test.d.ts +2 -0
  200. package/lib/test/sql/sql.failover.test.d.ts.map +1 -0
  201. package/lib/test/sql/sql.failover.test.js +341 -0
  202. package/lib/test/sql/sql.test.d.ts +2 -0
  203. package/lib/test/sql/sql.test.d.ts.map +1 -0
  204. package/lib/test/sql/sql.test.js +324 -0
  205. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts +2 -0
  206. package/lib/test/stmt/failover/stmt2.failover.mock.test.d.ts.map +1 -0
  207. package/lib/test/stmt/failover/stmt2.failover.mock.test.js +341 -0
  208. package/lib/test/stmt/failover/stmt2.failover.test.d.ts +2 -0
  209. package/lib/test/stmt/failover/stmt2.failover.test.d.ts.map +1 -0
  210. package/lib/test/stmt/failover/stmt2.failover.test.js +384 -0
  211. package/lib/test/stmt/stmt1.func.test.d.ts +2 -0
  212. package/lib/test/stmt/stmt1.func.test.d.ts.map +1 -0
  213. package/lib/test/stmt/stmt1.func.test.js +418 -0
  214. package/lib/test/stmt/stmt1.type.test.d.ts +2 -0
  215. package/lib/test/stmt/stmt1.type.test.d.ts.map +1 -0
  216. package/lib/test/stmt/stmt1.type.test.js +399 -0
  217. package/lib/test/stmt/stmt2.failover.mock.test.d.ts +2 -0
  218. package/lib/test/stmt/stmt2.failover.mock.test.d.ts.map +1 -0
  219. package/lib/test/stmt/stmt2.failover.mock.test.js +341 -0
  220. package/lib/test/stmt/stmt2.failover.test.d.ts +2 -0
  221. package/lib/test/stmt/stmt2.failover.test.d.ts.map +1 -0
  222. package/lib/test/stmt/stmt2.failover.test.js +384 -0
  223. package/lib/test/stmt/stmt2.func.test.d.ts +2 -0
  224. package/lib/test/stmt/stmt2.func.test.d.ts.map +1 -0
  225. package/lib/test/stmt/stmt2.func.test.js +537 -0
  226. package/lib/test/stmt/stmt2.type.test.d.ts +2 -0
  227. package/lib/test/stmt/stmt2.type.test.d.ts.map +1 -0
  228. package/lib/test/stmt/stmt2.type.test.js +401 -0
  229. package/lib/test/stmt/v1/stmt1.func.test.d.ts +2 -0
  230. package/lib/test/stmt/v1/stmt1.func.test.d.ts.map +1 -0
  231. package/lib/test/stmt/v1/stmt1.func.test.js +418 -0
  232. package/lib/test/stmt/v1/stmt1.type.test.d.ts +2 -0
  233. package/lib/test/stmt/v1/stmt1.type.test.d.ts.map +1 -0
  234. package/lib/test/stmt/v1/stmt1.type.test.js +399 -0
  235. package/lib/test/stmt/v2/stmt2.func.test.d.ts +2 -0
  236. package/lib/test/stmt/v2/stmt2.func.test.d.ts.map +1 -0
  237. package/lib/test/stmt/v2/stmt2.func.test.js +537 -0
  238. package/lib/test/stmt/v2/stmt2.type.test.d.ts +2 -0
  239. package/lib/test/stmt/v2/stmt2.type.test.d.ts.map +1 -0
  240. package/lib/test/stmt/v2/stmt2.type.test.js +401 -0
  241. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts +2 -0
  242. package/lib/test/tmq/cloud/cloud.tmq.test.d.ts.map +1 -0
  243. package/lib/test/tmq/cloud/cloud.tmq.test.js +84 -0
  244. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts +2 -0
  245. package/lib/test/tmq/cloud/tmq.cloud.test.d.ts.map +1 -0
  246. package/lib/test/tmq/cloud/tmq.cloud.test.js +82 -0
  247. package/lib/test/tmq/core/tmq.config.test.d.ts +2 -0
  248. package/lib/test/tmq/core/tmq.config.test.d.ts.map +1 -0
  249. package/lib/test/tmq/core/tmq.config.test.js +83 -0
  250. package/lib/test/tmq/core/tmq.test.d.ts +2 -0
  251. package/lib/test/tmq/core/tmq.test.d.ts.map +1 -0
  252. package/lib/test/tmq/core/tmq.test.js +513 -0
  253. package/lib/test/tmq/failover/tmq.failover.test.d.ts +2 -0
  254. package/lib/test/tmq/failover/tmq.failover.test.d.ts.map +1 -0
  255. package/lib/test/tmq/failover/tmq.failover.test.js +404 -0
  256. package/lib/test/tmq/tmq.cloud.test.d.ts +2 -0
  257. package/lib/test/tmq/tmq.cloud.test.d.ts.map +1 -0
  258. package/lib/test/tmq/tmq.cloud.test.js +82 -0
  259. package/lib/test/tmq/tmq.config.test.d.ts +2 -0
  260. package/lib/test/tmq/tmq.config.test.d.ts.map +1 -0
  261. package/lib/test/tmq/tmq.config.test.js +94 -0
  262. package/lib/test/tmq/tmq.failover.test.d.ts +2 -0
  263. package/lib/test/tmq/tmq.failover.test.d.ts.map +1 -0
  264. package/lib/test/tmq/tmq.failover.test.js +404 -0
  265. package/lib/test/tmq/tmq.test.d.ts +2 -0
  266. package/lib/test/tmq/tmq.test.d.ts.map +1 -0
  267. package/lib/test/tmq/tmq.test.js +513 -0
  268. package/lib/test/unit/connectionManager.test.d.ts +2 -0
  269. package/lib/test/unit/connectionManager.test.d.ts.map +1 -0
  270. package/lib/test/unit/connectionManager.test.js +91 -0
  271. package/lib/test/utils.d.ts +4 -0
  272. package/lib/test/utils.d.ts.map +1 -1
  273. package/lib/test/utils.js +11 -17
  274. package/package.json +1 -1
  275. package/readme.md +2 -2
@@ -0,0 +1,341 @@
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 () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const wsStmt2_1 = require("@src/stmt/wsStmt2");
37
+ const wsProto = __importStar(require("@src/stmt/wsProto"));
38
+ const Step = {
39
+ INIT: 0,
40
+ PREPARE: 1,
41
+ BIND: 2,
42
+ EXEC: 3,
43
+ RESULT: 4,
44
+ };
45
+ function createMockWsClient() {
46
+ return {
47
+ getState: jest.fn(() => 1),
48
+ connect: jest.fn(async () => { }),
49
+ checkVersion: jest.fn(async () => { }),
50
+ exec: jest.fn(async () => ({
51
+ totalTime: 0,
52
+ msg: {
53
+ code: 0,
54
+ message: "",
55
+ timing: 0,
56
+ stmt_id: 1,
57
+ is_insert: false,
58
+ fields_count: 1,
59
+ },
60
+ })),
61
+ execNoResp: jest.fn(async () => { }),
62
+ sendBinaryMsg: jest.fn(async () => ({
63
+ totalTime: 0,
64
+ msg: {
65
+ code: 0,
66
+ message: "",
67
+ timing: 0,
68
+ stmt_id: 1,
69
+ affected: 0,
70
+ },
71
+ })),
72
+ waitForReady: jest.fn(async () => { }),
73
+ isNetworkError: jest.fn((_err) => false),
74
+ getReconnectRetries: jest.fn(() => 5),
75
+ };
76
+ }
77
+ function createBareStmt() {
78
+ const wsClient = createMockWsClient();
79
+ const stmt = new wsStmt2_1.WsStmt2(wsClient);
80
+ stmt._stmt_id = 1n;
81
+ return {
82
+ stmt,
83
+ wsClient,
84
+ };
85
+ }
86
+ function makeExecReady(stmt) {
87
+ const tableInfo = {
88
+ getParams: () => ({ ok: true }),
89
+ };
90
+ stmt._currentTableInfo = tableInfo;
91
+ stmt._stmtTableInfoList = [tableInfo];
92
+ stmt._toBeBindTagCount = 0;
93
+ stmt._toBeBindColCount = 0;
94
+ stmt._toBeBindTableNameIndex = undefined;
95
+ }
96
+ function makeSavedBindBytes(reqId = 0n, stmtId = 1n) {
97
+ const bytes = new ArrayBuffer(16);
98
+ const view = new DataView(bytes);
99
+ view.setBigUint64(0, reqId, true);
100
+ view.setBigUint64(8, stmtId, true);
101
+ return bytes;
102
+ }
103
+ describe("WsStmt2 failover (mock)", () => {
104
+ afterEach(() => {
105
+ jest.restoreAllMocks();
106
+ });
107
+ test("init triggers context recovery on network error", async () => {
108
+ const { stmt, wsClient } = createBareStmt();
109
+ const networkError = new Error("socket closed");
110
+ wsClient.isNetworkError.mockReturnValue(true);
111
+ jest.spyOn(stmt, "doInit").mockRejectedValueOnce(networkError);
112
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
113
+ const result = await stmt.init(undefined);
114
+ expect(result).toBe(stmt);
115
+ expect(recoverSpy).toHaveBeenCalledWith(Step.INIT);
116
+ });
117
+ test("prepare caches sql and recovers on network error", async () => {
118
+ const { stmt, wsClient } = createBareStmt();
119
+ const networkError = new Error("socket closed");
120
+ wsClient.isNetworkError.mockReturnValue(true);
121
+ jest.spyOn(stmt, "doPrepare").mockRejectedValueOnce(networkError);
122
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
123
+ const sql = "select * from meters where ts > ?";
124
+ await stmt.prepare(sql);
125
+ expect(stmt._savedSql).toBe(sql);
126
+ expect(recoverSpy).toHaveBeenCalledWith(Step.PREPARE);
127
+ });
128
+ test("exec caches bind bytes and recovers on network error", async () => {
129
+ const { stmt, wsClient } = createBareStmt();
130
+ const networkError = new Error("cannot call send() while not connected");
131
+ const bindBytes = new Uint8Array([1, 2, 3]).buffer;
132
+ makeExecReady(stmt);
133
+ stmt._isInsert = false;
134
+ wsClient.isNetworkError.mockReturnValue(true);
135
+ jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
136
+ jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(networkError);
137
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
138
+ const cleanupSpy = jest.spyOn(stmt, "cleanup");
139
+ await stmt.exec();
140
+ expect(stmt._savedBindBytes).toBe(bindBytes);
141
+ expect(recoverSpy).toHaveBeenCalledWith(Step.EXEC);
142
+ expect(cleanupSpy).not.toHaveBeenCalled();
143
+ });
144
+ test("resultSet recovers on network error and cleans up", async () => {
145
+ const { stmt, wsClient } = createBareStmt();
146
+ const networkError = new Error("connection reset");
147
+ const rebuiltRows = { id: "rebuilt" };
148
+ stmt._savedSql = "select * from t where ts > ?";
149
+ wsClient.isNetworkError.mockReturnValue(true);
150
+ jest.spyOn(stmt, "doResult").mockRejectedValueOnce(networkError);
151
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(rebuiltRows);
152
+ const cleanupSpy = jest.spyOn(stmt, "cleanup");
153
+ const result = await stmt.resultSet();
154
+ expect(result).toBe(rebuiltRows);
155
+ expect(recoverSpy).toHaveBeenCalledWith(Step.RESULT);
156
+ expect(cleanupSpy).toHaveBeenCalledTimes(1);
157
+ expect(stmt._savedSql).toBe("select * from t where ts > ?");
158
+ });
159
+ test("exec only cleans up immediately for insert statements", async () => {
160
+ const bindBytes = new Uint8Array([7, 8, 9]).buffer;
161
+ const insertCtx = createBareStmt();
162
+ const insertStmt = insertCtx.stmt;
163
+ makeExecReady(insertStmt);
164
+ insertStmt._isInsert = true;
165
+ insertStmt._savedSql = "insert into t values(?, ?)";
166
+ jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
167
+ jest.spyOn(insertStmt, "doSendBindBytes").mockResolvedValue(undefined);
168
+ jest.spyOn(insertStmt, "doExec").mockResolvedValue(undefined);
169
+ const insertCleanupSpy = jest.spyOn(insertStmt, "cleanup");
170
+ await insertStmt.exec();
171
+ expect(insertCleanupSpy).toHaveBeenCalledTimes(1);
172
+ expect(insertStmt._savedSql).toBe("insert into t values(?, ?)");
173
+ const queryCtx = createBareStmt();
174
+ const queryStmt = queryCtx.stmt;
175
+ makeExecReady(queryStmt);
176
+ queryStmt._isInsert = false;
177
+ jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
178
+ jest.spyOn(queryStmt, "doSendBindBytes").mockResolvedValue(undefined);
179
+ jest.spyOn(queryStmt, "doExec").mockResolvedValue(undefined);
180
+ const queryCleanupSpy = jest.spyOn(queryStmt, "cleanup");
181
+ await queryStmt.exec();
182
+ expect(queryCleanupSpy).not.toHaveBeenCalled();
183
+ });
184
+ test("exec cleans up insert cache even when recover fails", async () => {
185
+ const { stmt, wsClient } = createBareStmt();
186
+ const networkError = new Error("cannot call send() while not connected");
187
+ const recoverError = new Error("recover failed");
188
+ const bindBytes = new Uint8Array([1, 2, 3]).buffer;
189
+ makeExecReady(stmt);
190
+ stmt._isInsert = true;
191
+ wsClient.isNetworkError.mockReturnValue(true);
192
+ jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
193
+ jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(networkError);
194
+ jest.spyOn(stmt, "recover").mockRejectedValueOnce(recoverError);
195
+ const cleanupSpy = jest.spyOn(stmt, "cleanup");
196
+ await expect(stmt.exec()).rejects.toThrow("recover failed");
197
+ expect(cleanupSpy).toHaveBeenCalledTimes(1);
198
+ });
199
+ test("non-network errors are rethrown without recover in prepare", async () => {
200
+ const { stmt, wsClient } = createBareStmt();
201
+ const nonNetworkError = new Error("invalid sql");
202
+ wsClient.isNetworkError.mockReturnValue(false);
203
+ jest.spyOn(stmt, "doPrepare").mockRejectedValueOnce(nonNetworkError);
204
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
205
+ await expect(stmt.prepare("bad sql")).rejects.toThrow("invalid sql");
206
+ expect(recoverSpy).not.toHaveBeenCalled();
207
+ });
208
+ test("non-network errors are rethrown without recover in exec", async () => {
209
+ const { stmt, wsClient } = createBareStmt();
210
+ const bindBytes = new Uint8Array([4, 5, 6]).buffer;
211
+ const nonNetworkError = new Error("invalid bind");
212
+ makeExecReady(stmt);
213
+ stmt._isInsert = false;
214
+ wsClient.isNetworkError.mockReturnValue(false);
215
+ jest.spyOn(wsProto, "stmt2BinaryBlockEncode").mockReturnValue(bindBytes);
216
+ jest.spyOn(stmt, "doSendBindBytes").mockRejectedValueOnce(nonNetworkError);
217
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
218
+ await expect(stmt.exec()).rejects.toThrow("invalid bind");
219
+ expect(recoverSpy).not.toHaveBeenCalled();
220
+ });
221
+ test("non-network errors are rethrown without recover in resultSet", async () => {
222
+ const { stmt, wsClient } = createBareStmt();
223
+ const nonNetworkError = new Error("result failed");
224
+ wsClient.isNetworkError.mockReturnValue(false);
225
+ jest.spyOn(stmt, "doResult").mockRejectedValueOnce(nonNetworkError);
226
+ const recoverSpy = jest.spyOn(stmt, "recover").mockResolvedValue(undefined);
227
+ await expect(stmt.resultSet()).rejects.toThrow("result failed");
228
+ expect(recoverSpy).not.toHaveBeenCalled();
229
+ });
230
+ test("recover replays steps in order to EXEC", async () => {
231
+ const { stmt } = createBareStmt();
232
+ const callOrder = [];
233
+ stmt._savedSql = "insert into t values(?, ?)";
234
+ stmt._savedBindBytes = makeSavedBindBytes();
235
+ jest.spyOn(stmt, "doInit").mockImplementation(async () => {
236
+ callOrder.push("init");
237
+ });
238
+ jest.spyOn(stmt, "doPrepare").mockImplementation(async () => {
239
+ callOrder.push("prepare");
240
+ });
241
+ jest.spyOn(stmt, "doSendBindBytes").mockImplementation(async () => {
242
+ callOrder.push("bind");
243
+ });
244
+ jest.spyOn(stmt, "doExec").mockImplementation(async () => {
245
+ callOrder.push("exec");
246
+ });
247
+ jest.spyOn(stmt, "doResult").mockImplementation(async () => {
248
+ callOrder.push("result");
249
+ return { rows: 1 };
250
+ });
251
+ await stmt.recover(Step.EXEC);
252
+ expect(callOrder).toEqual(["init", "prepare", "bind", "exec"]);
253
+ });
254
+ test("recover can rebuild to RESULT and return rows", async () => {
255
+ const { stmt } = createBareStmt();
256
+ const rows = { data: [1, 2, 3] };
257
+ stmt._savedSql = "select * from t where ts > ?";
258
+ stmt._savedBindBytes = makeSavedBindBytes();
259
+ jest.spyOn(stmt, "doInit").mockResolvedValue(undefined);
260
+ jest.spyOn(stmt, "doPrepare").mockResolvedValue(undefined);
261
+ jest.spyOn(stmt, "doSendBindBytes").mockResolvedValue(undefined);
262
+ jest.spyOn(stmt, "doExec").mockResolvedValue(undefined);
263
+ jest.spyOn(stmt, "doResult").mockResolvedValue(rows);
264
+ const result = await stmt.recover(Step.RESULT);
265
+ expect(result).toBe(rows);
266
+ });
267
+ test("buildBindBytes rewrites req_id and stmt_id", () => {
268
+ const { stmt } = createBareStmt();
269
+ const originalBytes = makeSavedBindBytes(0n, 5n);
270
+ stmt._savedBindBytes = originalBytes;
271
+ stmt._stmt_id = 42n;
272
+ const replayBytes = stmt.buildBindBytes();
273
+ const originalView = new DataView(originalBytes);
274
+ const replayView = new DataView(replayBytes);
275
+ expect(replayBytes).not.toBe(originalBytes);
276
+ expect(originalView.getBigUint64(8, true)).toBe(5n);
277
+ expect(replayView.getBigUint64(8, true)).toBe(42n);
278
+ expect(replayView.getBigUint64(0, true)).not.toBe(0n);
279
+ });
280
+ test("buildBindBytes throws when stmt_id is missing", () => {
281
+ const { stmt } = createBareStmt();
282
+ stmt._savedBindBytes = makeSavedBindBytes();
283
+ stmt._stmt_id = null;
284
+ expect(() => stmt.buildBindBytes()).toThrow("stmt_id is missing for stmt2 rebuild");
285
+ });
286
+ test("recover retries when another network error occurs", async () => {
287
+ const { stmt, wsClient } = createBareStmt();
288
+ const networkError = new Error("connection reset");
289
+ stmt._savedSql = "select * from t";
290
+ stmt._savedBindBytes = makeSavedBindBytes();
291
+ wsClient.isNetworkError.mockImplementation((err) => err === networkError);
292
+ const initSpy = jest
293
+ .spyOn(stmt, "doInit")
294
+ .mockRejectedValueOnce(networkError)
295
+ .mockResolvedValue(undefined);
296
+ const prepareSpy = jest.spyOn(stmt, "doPrepare").mockResolvedValue(undefined);
297
+ await stmt.recover(Step.PREPARE);
298
+ expect(initSpy).toHaveBeenCalledTimes(2);
299
+ expect(prepareSpy).toHaveBeenCalledTimes(1);
300
+ expect(wsClient.waitForReady).toHaveBeenCalledTimes(2);
301
+ });
302
+ test("recover keeps retrying network errors and throws on first non-network error", async () => {
303
+ const { stmt, wsClient } = createBareStmt();
304
+ const networkError = new Error("connection reset");
305
+ const fatalError = new Error("permission denied");
306
+ stmt._savedSql = "select * from t";
307
+ stmt._savedBindBytes = makeSavedBindBytes();
308
+ wsClient.isNetworkError.mockImplementation((err) => err === networkError);
309
+ const initSpy = jest
310
+ .spyOn(stmt, "doInit")
311
+ .mockRejectedValueOnce(networkError)
312
+ .mockRejectedValueOnce(networkError)
313
+ .mockRejectedValueOnce(fatalError);
314
+ await expect(stmt.recover(Step.INIT)).rejects.toThrow("permission denied");
315
+ expect(initSpy).toHaveBeenCalledTimes(3);
316
+ expect(wsClient.waitForReady).toHaveBeenCalledTimes(3);
317
+ });
318
+ test("recover throws on non-network error", async () => {
319
+ const { stmt, wsClient } = createBareStmt();
320
+ const nonNetworkError = new Error("permission denied");
321
+ stmt._savedSql = "select * from t";
322
+ stmt._savedBindBytes = new Uint8Array([9, 9, 9]).buffer;
323
+ wsClient.isNetworkError.mockReturnValue(false);
324
+ jest.spyOn(stmt, "doInit").mockRejectedValueOnce(nonNetworkError);
325
+ await expect(stmt.recover(Step.INIT)).rejects.toThrow("permission denied");
326
+ });
327
+ test("recover throws when network errors exceed max attempts", async () => {
328
+ const { stmt, wsClient } = createBareStmt();
329
+ const networkError = new Error("connection reset");
330
+ stmt._savedSql = "select * from t";
331
+ stmt._savedBindBytes = makeSavedBindBytes();
332
+ wsClient.getReconnectRetries.mockReturnValue(2);
333
+ wsClient.isNetworkError.mockImplementation((err) => err === networkError);
334
+ const initSpy = jest
335
+ .spyOn(stmt, "doInit")
336
+ .mockRejectedValue(networkError);
337
+ await expect(stmt.recover(Step.INIT)).rejects.toThrow("stmt2 recover exceeded max attempts (2)");
338
+ expect(initSpy).toHaveBeenCalledTimes(2);
339
+ expect(wsClient.waitForReady).toHaveBeenCalledTimes(2);
340
+ });
341
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stmt2.failover.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stmt2.failover.test.d.ts","sourceRoot":"","sources":["../../../../test/stmt/failover/stmt2.failover.test.ts"],"names":[],"mappings":""}