clawsql 0.1.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 (311) hide show
  1. package/.env.example +97 -0
  2. package/README.md +372 -0
  3. package/dist/__tests__/config/settings.test.d.ts +5 -0
  4. package/dist/__tests__/config/settings.test.d.ts.map +1 -0
  5. package/dist/__tests__/config/settings.test.js +154 -0
  6. package/dist/__tests__/config/settings.test.js.map +1 -0
  7. package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
  8. package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
  9. package/dist/__tests__/core/discovery/topology.test.js +191 -0
  10. package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
  11. package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
  12. package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/core/failover/executor.test.js +256 -0
  14. package/dist/__tests__/core/failover/executor.test.js.map +1 -0
  15. package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
  16. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
  17. package/dist/__tests__/core/monitoring/collector.test.js +131 -0
  18. package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
  19. package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
  20. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
  21. package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
  22. package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
  23. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
  24. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
  25. package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
  26. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
  27. package/dist/__tests__/types/index.test.d.ts +5 -0
  28. package/dist/__tests__/types/index.test.d.ts.map +1 -0
  29. package/dist/__tests__/types/index.test.js +290 -0
  30. package/dist/__tests__/types/index.test.js.map +1 -0
  31. package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
  32. package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/exceptions.test.js +142 -0
  34. package/dist/__tests__/utils/exceptions.test.js.map +1 -0
  35. package/dist/api/routes/clusters.d.ts +7 -0
  36. package/dist/api/routes/clusters.d.ts.map +1 -0
  37. package/dist/api/routes/clusters.js +123 -0
  38. package/dist/api/routes/clusters.js.map +1 -0
  39. package/dist/api/routes/config.d.ts +7 -0
  40. package/dist/api/routes/config.d.ts.map +1 -0
  41. package/dist/api/routes/config.js +65 -0
  42. package/dist/api/routes/config.js.map +1 -0
  43. package/dist/api/routes/failover.d.ts +7 -0
  44. package/dist/api/routes/failover.d.ts.map +1 -0
  45. package/dist/api/routes/failover.js +100 -0
  46. package/dist/api/routes/failover.js.map +1 -0
  47. package/dist/api/routes/instances.d.ts +11 -0
  48. package/dist/api/routes/instances.d.ts.map +1 -0
  49. package/dist/api/routes/instances.js +315 -0
  50. package/dist/api/routes/instances.js.map +1 -0
  51. package/dist/api/routes/monitoring.d.ts +7 -0
  52. package/dist/api/routes/monitoring.d.ts.map +1 -0
  53. package/dist/api/routes/monitoring.js +72 -0
  54. package/dist/api/routes/monitoring.js.map +1 -0
  55. package/dist/api/routes/webhooks.d.ts +12 -0
  56. package/dist/api/routes/webhooks.d.ts.map +1 -0
  57. package/dist/api/routes/webhooks.js +232 -0
  58. package/dist/api/routes/webhooks.js.map +1 -0
  59. package/dist/api/schemas/index.d.ts +965 -0
  60. package/dist/api/schemas/index.d.ts.map +1 -0
  61. package/dist/api/schemas/index.js +171 -0
  62. package/dist/api/schemas/index.js.map +1 -0
  63. package/dist/app.d.ts +13 -0
  64. package/dist/app.d.ts.map +1 -0
  65. package/dist/app.js +197 -0
  66. package/dist/app.js.map +1 -0
  67. package/dist/bin/clawsql.d.ts +12 -0
  68. package/dist/bin/clawsql.d.ts.map +1 -0
  69. package/dist/bin/clawsql.js +43 -0
  70. package/dist/bin/clawsql.js.map +1 -0
  71. package/dist/cli/agent/handler.d.ts +73 -0
  72. package/dist/cli/agent/handler.d.ts.map +1 -0
  73. package/dist/cli/agent/handler.js +258 -0
  74. package/dist/cli/agent/handler.js.map +1 -0
  75. package/dist/cli/agent/index.d.ts +14 -0
  76. package/dist/cli/agent/index.d.ts.map +1 -0
  77. package/dist/cli/agent/index.js +30 -0
  78. package/dist/cli/agent/index.js.map +1 -0
  79. package/dist/cli/agent/openclaw-integration.d.ts +81 -0
  80. package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
  81. package/dist/cli/agent/openclaw-integration.js +341 -0
  82. package/dist/cli/agent/openclaw-integration.js.map +1 -0
  83. package/dist/cli/agent/providers/anthropic.d.ts +27 -0
  84. package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
  85. package/dist/cli/agent/providers/anthropic.js +106 -0
  86. package/dist/cli/agent/providers/anthropic.js.map +1 -0
  87. package/dist/cli/agent/providers/base.d.ts +91 -0
  88. package/dist/cli/agent/providers/base.d.ts.map +1 -0
  89. package/dist/cli/agent/providers/base.js +24 -0
  90. package/dist/cli/agent/providers/base.js.map +1 -0
  91. package/dist/cli/agent/providers/openai.d.ts +27 -0
  92. package/dist/cli/agent/providers/openai.d.ts.map +1 -0
  93. package/dist/cli/agent/providers/openai.js +98 -0
  94. package/dist/cli/agent/providers/openai.js.map +1 -0
  95. package/dist/cli/agent/tools/index.d.ts +32 -0
  96. package/dist/cli/agent/tools/index.d.ts.map +1 -0
  97. package/dist/cli/agent/tools/index.js +263 -0
  98. package/dist/cli/agent/tools/index.js.map +1 -0
  99. package/dist/cli/commands/cleanup.d.ts +12 -0
  100. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  101. package/dist/cli/commands/cleanup.js +205 -0
  102. package/dist/cli/commands/cleanup.js.map +1 -0
  103. package/dist/cli/commands/clusters.d.ts +12 -0
  104. package/dist/cli/commands/clusters.d.ts.map +1 -0
  105. package/dist/cli/commands/clusters.js +468 -0
  106. package/dist/cli/commands/clusters.js.map +1 -0
  107. package/dist/cli/commands/config.d.ts +12 -0
  108. package/dist/cli/commands/config.d.ts.map +1 -0
  109. package/dist/cli/commands/config.js +406 -0
  110. package/dist/cli/commands/config.js.map +1 -0
  111. package/dist/cli/commands/cron.d.ts +12 -0
  112. package/dist/cli/commands/cron.d.ts.map +1 -0
  113. package/dist/cli/commands/cron.js +215 -0
  114. package/dist/cli/commands/cron.js.map +1 -0
  115. package/dist/cli/commands/doctor.d.ts +13 -0
  116. package/dist/cli/commands/doctor.d.ts.map +1 -0
  117. package/dist/cli/commands/doctor.js +687 -0
  118. package/dist/cli/commands/doctor.js.map +1 -0
  119. package/dist/cli/commands/failover.d.ts +16 -0
  120. package/dist/cli/commands/failover.d.ts.map +1 -0
  121. package/dist/cli/commands/failover.js +333 -0
  122. package/dist/cli/commands/failover.js.map +1 -0
  123. package/dist/cli/commands/health.d.ts +12 -0
  124. package/dist/cli/commands/health.d.ts.map +1 -0
  125. package/dist/cli/commands/health.js +125 -0
  126. package/dist/cli/commands/health.js.map +1 -0
  127. package/dist/cli/commands/help.d.ts +12 -0
  128. package/dist/cli/commands/help.d.ts.map +1 -0
  129. package/dist/cli/commands/help.js +52 -0
  130. package/dist/cli/commands/help.js.map +1 -0
  131. package/dist/cli/commands/instances.d.ts +12 -0
  132. package/dist/cli/commands/instances.d.ts.map +1 -0
  133. package/dist/cli/commands/instances.js +801 -0
  134. package/dist/cli/commands/instances.js.map +1 -0
  135. package/dist/cli/commands/notify.d.ts +12 -0
  136. package/dist/cli/commands/notify.d.ts.map +1 -0
  137. package/dist/cli/commands/notify.js +43 -0
  138. package/dist/cli/commands/notify.js.map +1 -0
  139. package/dist/cli/commands/sql.d.ts +12 -0
  140. package/dist/cli/commands/sql.d.ts.map +1 -0
  141. package/dist/cli/commands/sql.js +90 -0
  142. package/dist/cli/commands/sql.js.map +1 -0
  143. package/dist/cli/commands/start.d.ts +12 -0
  144. package/dist/cli/commands/start.d.ts.map +1 -0
  145. package/dist/cli/commands/start.js +174 -0
  146. package/dist/cli/commands/start.js.map +1 -0
  147. package/dist/cli/commands/status.d.ts +12 -0
  148. package/dist/cli/commands/status.d.ts.map +1 -0
  149. package/dist/cli/commands/status.js +218 -0
  150. package/dist/cli/commands/status.js.map +1 -0
  151. package/dist/cli/commands/stop.d.ts +12 -0
  152. package/dist/cli/commands/stop.d.ts.map +1 -0
  153. package/dist/cli/commands/stop.js +128 -0
  154. package/dist/cli/commands/stop.js.map +1 -0
  155. package/dist/cli/commands/topology.d.ts +12 -0
  156. package/dist/cli/commands/topology.d.ts.map +1 -0
  157. package/dist/cli/commands/topology.js +106 -0
  158. package/dist/cli/commands/topology.js.map +1 -0
  159. package/dist/cli/completer.d.ts +47 -0
  160. package/dist/cli/completer.d.ts.map +1 -0
  161. package/dist/cli/completer.js +332 -0
  162. package/dist/cli/completer.js.map +1 -0
  163. package/dist/cli/formatter.d.ts +165 -0
  164. package/dist/cli/formatter.d.ts.map +1 -0
  165. package/dist/cli/formatter.js +408 -0
  166. package/dist/cli/formatter.js.map +1 -0
  167. package/dist/cli/index.d.ts +21 -0
  168. package/dist/cli/index.d.ts.map +1 -0
  169. package/dist/cli/index.js +79 -0
  170. package/dist/cli/index.js.map +1 -0
  171. package/dist/cli/raw-input.d.ts +97 -0
  172. package/dist/cli/raw-input.d.ts.map +1 -0
  173. package/dist/cli/raw-input.js +493 -0
  174. package/dist/cli/raw-input.js.map +1 -0
  175. package/dist/cli/registry.d.ts +103 -0
  176. package/dist/cli/registry.d.ts.map +1 -0
  177. package/dist/cli/registry.js +205 -0
  178. package/dist/cli/registry.js.map +1 -0
  179. package/dist/cli/repl.d.ts +83 -0
  180. package/dist/cli/repl.d.ts.map +1 -0
  181. package/dist/cli/repl.js +447 -0
  182. package/dist/cli/repl.js.map +1 -0
  183. package/dist/cli/ui/components.d.ts +144 -0
  184. package/dist/cli/ui/components.d.ts.map +1 -0
  185. package/dist/cli/ui/components.js +331 -0
  186. package/dist/cli/ui/components.js.map +1 -0
  187. package/dist/cli/ui/index.d.ts +7 -0
  188. package/dist/cli/ui/index.d.ts.map +1 -0
  189. package/dist/cli/ui/index.js +23 -0
  190. package/dist/cli/ui/index.js.map +1 -0
  191. package/dist/cli/utils/docker-files.d.ts +39 -0
  192. package/dist/cli/utils/docker-files.d.ts.map +1 -0
  193. package/dist/cli/utils/docker-files.js +223 -0
  194. package/dist/cli/utils/docker-files.js.map +1 -0
  195. package/dist/cli/utils/docker-prereq.d.ts +48 -0
  196. package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
  197. package/dist/cli/utils/docker-prereq.js +203 -0
  198. package/dist/cli/utils/docker-prereq.js.map +1 -0
  199. package/dist/config/settings.d.ts +594 -0
  200. package/dist/config/settings.d.ts.map +1 -0
  201. package/dist/config/settings.js +250 -0
  202. package/dist/config/settings.js.map +1 -0
  203. package/dist/core/discovery/cluster-view.d.ts +50 -0
  204. package/dist/core/discovery/cluster-view.d.ts.map +1 -0
  205. package/dist/core/discovery/cluster-view.js +235 -0
  206. package/dist/core/discovery/cluster-view.js.map +1 -0
  207. package/dist/core/discovery/scanner.d.ts +70 -0
  208. package/dist/core/discovery/scanner.d.ts.map +1 -0
  209. package/dist/core/discovery/scanner.js +197 -0
  210. package/dist/core/discovery/scanner.js.map +1 -0
  211. package/dist/core/discovery/topology.d.ts +118 -0
  212. package/dist/core/discovery/topology.d.ts.map +1 -0
  213. package/dist/core/discovery/topology.js +550 -0
  214. package/dist/core/discovery/topology.js.map +1 -0
  215. package/dist/core/failover/candidate-selector.d.ts +46 -0
  216. package/dist/core/failover/candidate-selector.d.ts.map +1 -0
  217. package/dist/core/failover/candidate-selector.js +70 -0
  218. package/dist/core/failover/candidate-selector.js.map +1 -0
  219. package/dist/core/failover/executor.d.ts +104 -0
  220. package/dist/core/failover/executor.d.ts.map +1 -0
  221. package/dist/core/failover/executor.js +248 -0
  222. package/dist/core/failover/executor.js.map +1 -0
  223. package/dist/core/failover/operation-builder.d.ts +71 -0
  224. package/dist/core/failover/operation-builder.d.ts.map +1 -0
  225. package/dist/core/failover/operation-builder.js +157 -0
  226. package/dist/core/failover/operation-builder.js.map +1 -0
  227. package/dist/core/failover/operation-runner.d.ts +75 -0
  228. package/dist/core/failover/operation-runner.d.ts.map +1 -0
  229. package/dist/core/failover/operation-runner.js +191 -0
  230. package/dist/core/failover/operation-runner.js.map +1 -0
  231. package/dist/core/failover/promoter.d.ts +33 -0
  232. package/dist/core/failover/promoter.d.ts.map +1 -0
  233. package/dist/core/failover/promoter.js +97 -0
  234. package/dist/core/failover/promoter.js.map +1 -0
  235. package/dist/core/failover/recovery-manager.d.ts +47 -0
  236. package/dist/core/failover/recovery-manager.d.ts.map +1 -0
  237. package/dist/core/failover/recovery-manager.js +145 -0
  238. package/dist/core/failover/recovery-manager.js.map +1 -0
  239. package/dist/core/failover/types.d.ts +54 -0
  240. package/dist/core/failover/types.d.ts.map +1 -0
  241. package/dist/core/failover/types.js +8 -0
  242. package/dist/core/failover/types.js.map +1 -0
  243. package/dist/core/monitoring/collector.d.ts +25 -0
  244. package/dist/core/monitoring/collector.d.ts.map +1 -0
  245. package/dist/core/monitoring/collector.js +115 -0
  246. package/dist/core/monitoring/collector.js.map +1 -0
  247. package/dist/core/monitoring/exporters.d.ts +49 -0
  248. package/dist/core/monitoring/exporters.d.ts.map +1 -0
  249. package/dist/core/monitoring/exporters.js +126 -0
  250. package/dist/core/monitoring/exporters.js.map +1 -0
  251. package/dist/core/routing/proxysql-manager.d.ts +213 -0
  252. package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
  253. package/dist/core/routing/proxysql-manager.js +632 -0
  254. package/dist/core/routing/proxysql-manager.js.map +1 -0
  255. package/dist/core/sync/replica-recovery.d.ts +40 -0
  256. package/dist/core/sync/replica-recovery.d.ts.map +1 -0
  257. package/dist/core/sync/replica-recovery.js +134 -0
  258. package/dist/core/sync/replica-recovery.js.map +1 -0
  259. package/dist/core/sync/sync-coordinator.d.ts +83 -0
  260. package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
  261. package/dist/core/sync/sync-coordinator.js +254 -0
  262. package/dist/core/sync/sync-coordinator.js.map +1 -0
  263. package/dist/core/sync/topology-watcher.d.ts +76 -0
  264. package/dist/core/sync/topology-watcher.d.ts.map +1 -0
  265. package/dist/core/sync/topology-watcher.js +222 -0
  266. package/dist/core/sync/topology-watcher.js.map +1 -0
  267. package/dist/core/sync/types.d.ts +85 -0
  268. package/dist/core/sync/types.d.ts.map +1 -0
  269. package/dist/core/sync/types.js +8 -0
  270. package/dist/core/sync/types.js.map +1 -0
  271. package/dist/index.d.ts +5 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +9 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/types/index.d.ts +212 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +153 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/database.d.ts +62 -0
  280. package/dist/utils/database.d.ts.map +1 -0
  281. package/dist/utils/database.js +257 -0
  282. package/dist/utils/database.js.map +1 -0
  283. package/dist/utils/exceptions.d.ts +69 -0
  284. package/dist/utils/exceptions.d.ts.map +1 -0
  285. package/dist/utils/exceptions.js +121 -0
  286. package/dist/utils/exceptions.js.map +1 -0
  287. package/dist/utils/logger.d.ts +20 -0
  288. package/dist/utils/logger.d.ts.map +1 -0
  289. package/dist/utils/logger.js +90 -0
  290. package/dist/utils/logger.js.map +1 -0
  291. package/dist/utils/mysql-client.d.ts +43 -0
  292. package/dist/utils/mysql-client.d.ts.map +1 -0
  293. package/dist/utils/mysql-client.js +125 -0
  294. package/dist/utils/mysql-client.js.map +1 -0
  295. package/docker/Dockerfile +61 -0
  296. package/docker/Dockerfile.node +41 -0
  297. package/docker/grafana/dashboards/clawsql.json +212 -0
  298. package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
  299. package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
  300. package/docker/init/primary.sql +26 -0
  301. package/docker/init/replica.sql +16 -0
  302. package/docker/orchestrator/orchestrator.conf.json +98 -0
  303. package/docker/prometheus/prometheus.yml +45 -0
  304. package/docker/proxysql/entrypoint.sh +8 -0
  305. package/docker/proxysql/init.sql.demo +30 -0
  306. package/docker/proxysql/proxysql.cnf +38 -0
  307. package/docker-compose.demo.yml +115 -0
  308. package/docker-compose.yml +217 -0
  309. package/init/primary.sql +19 -0
  310. package/init/replica.sql +13 -0
  311. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-builder.js","sourceRoot":"","sources":["../../../src/core/failover/operation-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * ClawSQL - Operation Runner
3
+ *
4
+ * Base runner for failover operations.
5
+ * Implements the Template Method Pattern for operation execution.
6
+ */
7
+ import { MySQLCluster, FailoverOperation } from '../../types/index.js';
8
+ import { FailoverHook } from './types.js';
9
+ import { InstancePromoter } from './promoter.js';
10
+ import { ProxySQLManager } from '../routing/proxysql-manager.js';
11
+ /**
12
+ * Operation Runner
13
+ * Executes the common flow for failover operations.
14
+ */
15
+ export declare class OperationRunner {
16
+ private promoter;
17
+ private proxysql;
18
+ private preHooks;
19
+ private postHooks;
20
+ constructor(promoter: InstancePromoter, proxysql: ProxySQLManager);
21
+ /**
22
+ * Register a pre-execution hook
23
+ */
24
+ registerPreHook(hook: FailoverHook): void;
25
+ /**
26
+ * Register a post-execution hook
27
+ */
28
+ registerPostHook(hook: FailoverHook): void;
29
+ /**
30
+ * Execute the operation
31
+ * Template method that defines the skeleton of the operation.
32
+ */
33
+ execute(operation: FailoverOperation, cluster: MySQLCluster, isSwitchover: boolean): Promise<FailoverOperation>;
34
+ /**
35
+ * Create a step logging function
36
+ */
37
+ private createStepLogger;
38
+ /**
39
+ * Run pre-execution hooks
40
+ */
41
+ private runPreHooks;
42
+ /**
43
+ * Select candidate for promotion
44
+ */
45
+ private selectCandidate;
46
+ /**
47
+ * Promote the instance
48
+ */
49
+ private promoteInstance;
50
+ /**
51
+ * Reconfigure replicas to follow new primary
52
+ */
53
+ private reconfigureReplicas;
54
+ /**
55
+ * Update routing rules
56
+ */
57
+ private updateRouting;
58
+ /**
59
+ * Run post-execution hooks
60
+ */
61
+ private runPostHooks;
62
+ /**
63
+ * Handle operation failure
64
+ */
65
+ private handleFailure;
66
+ /**
67
+ * Get promotion message
68
+ */
69
+ private getPromotionMessage;
70
+ /**
71
+ * Get success message
72
+ */
73
+ private getSuccessMessage;
74
+ }
75
+ //# sourceMappingURL=operation-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-runner.d.ts","sourceRoot":"","sources":["../../../src/core/failover/operation-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAiB,iBAAiB,EAAiB,MAAM,sBAAsB,CAAC;AAErG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE;;;GAGG;AACH,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IALlB,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAsB;gBAG7B,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe;IAGnC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIzC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI1C;;;OAGG;IACG,OAAO,CACX,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,iBAAiB,CAAC;IAwC7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,WAAW;IAWzB;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,eAAe;IAqB7B;;OAEG;YACW,mBAAmB;IAsBjC;;OAEG;YACW,aAAa;IAe3B;;OAEG;YACW,YAAY;IAa1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Operation Runner
4
+ *
5
+ * Base runner for failover operations.
6
+ * Implements the Template Method Pattern for operation execution.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.OperationRunner = void 0;
10
+ const logger_js_1 = require("../../utils/logger.js");
11
+ const index_js_1 = require("../../types/index.js");
12
+ const exceptions_js_1 = require("../../utils/exceptions.js");
13
+ const candidate_selector_js_1 = require("./candidate-selector.js");
14
+ const proxysql_manager_js_1 = require("../routing/proxysql-manager.js");
15
+ const logger = (0, logger_js_1.getLogger)('failover');
16
+ /**
17
+ * Operation Runner
18
+ * Executes the common flow for failover operations.
19
+ */
20
+ class OperationRunner {
21
+ promoter;
22
+ proxysql;
23
+ preHooks = [];
24
+ postHooks = [];
25
+ constructor(promoter, proxysql) {
26
+ this.promoter = promoter;
27
+ this.proxysql = proxysql;
28
+ }
29
+ /**
30
+ * Register a pre-execution hook
31
+ */
32
+ registerPreHook(hook) {
33
+ this.preHooks.push(hook);
34
+ }
35
+ /**
36
+ * Register a post-execution hook
37
+ */
38
+ registerPostHook(hook) {
39
+ this.postHooks.push(hook);
40
+ }
41
+ /**
42
+ * Execute the operation
43
+ * Template method that defines the skeleton of the operation.
44
+ */
45
+ async execute(operation, cluster, isSwitchover) {
46
+ const addStep = this.createStepLogger(operation);
47
+ operation.startedAt = new Date();
48
+ operation.state = index_js_1.FailoverState.DETECTING;
49
+ try {
50
+ // 1. Pre-execution hooks
51
+ await this.runPreHooks(operation, cluster, addStep);
52
+ // 2. Select candidate
53
+ const newPrimary = await this.selectCandidate(operation, cluster, addStep);
54
+ // 3. Promote instance
55
+ await this.promoteInstance(operation, cluster, newPrimary, isSwitchover, addStep);
56
+ // 4. Reconfigure replicas
57
+ await this.reconfigureReplicas(operation, cluster, newPrimary, addStep);
58
+ // 5. Update routing
59
+ await this.updateRouting(operation, cluster, newPrimary, addStep);
60
+ // Success
61
+ operation.state = index_js_1.FailoverState.COMPLETED;
62
+ operation.completedAt = new Date();
63
+ addStep(this.getSuccessMessage(isSwitchover));
64
+ logger.info({ operationId: operation.operationId, clusterId: cluster.clusterId }, this.getSuccessMessage(isSwitchover));
65
+ }
66
+ catch (error) {
67
+ this.handleFailure(operation, error, addStep, isSwitchover);
68
+ }
69
+ finally {
70
+ await this.runPostHooks(operation, cluster);
71
+ }
72
+ return operation;
73
+ }
74
+ /**
75
+ * Create a step logging function
76
+ */
77
+ createStepLogger(operation) {
78
+ return (step) => {
79
+ const timestamp = new Date().toISOString();
80
+ operation.steps.push(`[${timestamp}] ${step}`);
81
+ };
82
+ }
83
+ /**
84
+ * Run pre-execution hooks
85
+ */
86
+ async runPreHooks(operation, cluster, addStep) {
87
+ addStep('Running pre-execution hooks');
88
+ for (const hook of this.preHooks) {
89
+ await hook(operation, cluster);
90
+ }
91
+ }
92
+ /**
93
+ * Select candidate for promotion
94
+ */
95
+ async selectCandidate(operation, cluster, addStep) {
96
+ operation.state = index_js_1.FailoverState.CANDIDATE_SELECTION;
97
+ addStep('Selecting candidate for promotion');
98
+ // Auto-select if not specified
99
+ if (!operation.newPrimaryId) {
100
+ const selector = new candidate_selector_js_1.CandidateSelector();
101
+ const candidate = selector.select(cluster);
102
+ if (!candidate) {
103
+ throw new exceptions_js_1.FailoverError('No suitable candidate found for promotion');
104
+ }
105
+ operation.newPrimaryId = candidate_selector_js_1.CandidateSelector.getInstanceId(candidate);
106
+ }
107
+ // Find the instance
108
+ const newPrimary = candidate_selector_js_1.CandidateSelector.findReplica(cluster, operation.newPrimaryId);
109
+ if (!newPrimary) {
110
+ throw new exceptions_js_1.FailoverError(`Candidate ${operation.newPrimaryId} not found`);
111
+ }
112
+ return newPrimary;
113
+ }
114
+ /**
115
+ * Promote the instance
116
+ */
117
+ async promoteInstance(operation, cluster, newPrimary, isSwitchover, addStep) {
118
+ operation.state = index_js_1.FailoverState.PROMOTING;
119
+ addStep(this.getPromotionMessage(operation.newPrimaryId, isSwitchover));
120
+ const result = await this.promoter.promote(newPrimary, cluster, isSwitchover);
121
+ if (!result.success) {
122
+ throw new exceptions_js_1.FailoverError(result.error || 'Promotion failed');
123
+ }
124
+ if (isSwitchover) {
125
+ addStep('Started replication on demoted primary');
126
+ }
127
+ }
128
+ /**
129
+ * Reconfigure replicas to follow new primary
130
+ */
131
+ async reconfigureReplicas(operation, cluster, newPrimary, addStep) {
132
+ operation.state = index_js_1.FailoverState.RECONFIGURING;
133
+ addStep('Reconfiguring replicas');
134
+ const otherReplicas = cluster.replicas.filter(r => `${r.host}:${r.port}` !== operation.newPrimaryId);
135
+ for (const replica of otherReplicas) {
136
+ try {
137
+ await this.proxysql.relocateReplica(replica, newPrimary);
138
+ }
139
+ catch (error) {
140
+ logger.warn({ error, replica: `${replica.host}:${replica.port}` }, 'Failed to reconfigure replica');
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Update routing rules
146
+ */
147
+ async updateRouting(_operation, cluster, newPrimary, addStep) {
148
+ addStep('Updating routing rules');
149
+ await this.proxysql.syncCluster({ ...cluster, primary: newPrimary }, proxysql_manager_js_1.ProxySQLManager.DEFAULT_WRITER_HOSTGROUP, proxysql_manager_js_1.ProxySQLManager.DEFAULT_READER_HOSTGROUP);
150
+ }
151
+ /**
152
+ * Run post-execution hooks
153
+ */
154
+ async runPostHooks(operation, cluster) {
155
+ for (const hook of this.postHooks) {
156
+ try {
157
+ await hook(operation, cluster);
158
+ }
159
+ catch (error) {
160
+ logger.error({ error }, 'Post-execution hook error');
161
+ }
162
+ }
163
+ }
164
+ /**
165
+ * Handle operation failure
166
+ */
167
+ handleFailure(operation, error, addStep, isSwitchover) {
168
+ operation.state = index_js_1.FailoverState.FAILED;
169
+ operation.error = error instanceof Error ? error.message : String(error);
170
+ operation.completedAt = new Date();
171
+ const operationType = isSwitchover ? 'Switchover' : 'Failover';
172
+ addStep(`${operationType} failed: ${operation.error}`);
173
+ logger.error({ error, operationId: operation.operationId }, `${operationType} failed`);
174
+ }
175
+ /**
176
+ * Get promotion message
177
+ */
178
+ getPromotionMessage(targetId, isSwitchover) {
179
+ return isSwitchover
180
+ ? `Switching over to ${targetId}`
181
+ : `Promoting ${targetId} to primary (failover)`;
182
+ }
183
+ /**
184
+ * Get success message
185
+ */
186
+ getSuccessMessage(isSwitchover) {
187
+ return isSwitchover ? 'Switchover completed successfully' : 'Failover completed successfully';
188
+ }
189
+ }
190
+ exports.OperationRunner = OperationRunner;
191
+ //# sourceMappingURL=operation-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-runner.js","sourceRoot":"","sources":["../../../src/core/failover/operation-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * ClawSQL - Instance Promoter
3
+ *
4
+ * Handles the promotion of instances to primary role.
5
+ * Coordinates with Orchestrator for the actual promotion.
6
+ */
7
+ import { MySQLCluster, MySQLInstance } from '../../types/index.js';
8
+ import { OrchestratorClient } from '../discovery/topology.js';
9
+ import { PromotionResult } from './types.js';
10
+ /**
11
+ * Instance Promoter
12
+ * Handles promotion logic and post-promotion tasks.
13
+ */
14
+ export declare class InstancePromoter {
15
+ private orchestrator;
16
+ constructor(orchestrator: OrchestratorClient);
17
+ /**
18
+ * Promote an instance to primary
19
+ * @param instance - The instance to promote
20
+ * @param cluster - The cluster context
21
+ * @param isSwitchover - True for switchover (primary healthy), false for failover
22
+ */
23
+ promote(instance: MySQLInstance, cluster: MySQLCluster, isSwitchover: boolean): Promise<PromotionResult>;
24
+ /**
25
+ * Execute the promotion via Orchestrator
26
+ */
27
+ private executePromotion;
28
+ /**
29
+ * Start replication on the demoted primary
30
+ */
31
+ private startReplicationOnDemotedPrimary;
32
+ }
33
+ //# sourceMappingURL=promoter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoter.d.ts","sourceRoot":"","sources":["../../../src/core/failover/promoter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2B7C;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,kBAAkB;IAEpD;;;;;OAKG;IACG,OAAO,CACX,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,eAAe,CAAC;IA0B3B;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;YACW,gCAAgC;CAgB/C"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Instance Promoter
4
+ *
5
+ * Handles the promotion of instances to primary role.
6
+ * Coordinates with Orchestrator for the actual promotion.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.InstancePromoter = void 0;
10
+ const logger_js_1 = require("../../utils/logger.js");
11
+ const mysql_client_js_1 = require("../../utils/mysql-client.js");
12
+ const logger = (0, logger_js_1.getLogger)('failover');
13
+ /**
14
+ * Orchestrator response success indicators
15
+ */
16
+ const SUCCESS_INDICATORS = ['Code', 'IsSuccessful', 'Success'];
17
+ /**
18
+ * Check if Orchestrator response indicates success
19
+ */
20
+ function isSuccessfulResponse(result) {
21
+ if (!result)
22
+ return false;
23
+ return SUCCESS_INDICATORS.some(key => result[key] === 'OK' || result[key] === true);
24
+ }
25
+ /**
26
+ * Extract error message from Orchestrator response
27
+ */
28
+ function extractError(result) {
29
+ if (!result)
30
+ return 'Unknown error';
31
+ return result.Message || result.Error || JSON.stringify(result);
32
+ }
33
+ /**
34
+ * Instance Promoter
35
+ * Handles promotion logic and post-promotion tasks.
36
+ */
37
+ class InstancePromoter {
38
+ orchestrator;
39
+ constructor(orchestrator) {
40
+ this.orchestrator = orchestrator;
41
+ }
42
+ /**
43
+ * Promote an instance to primary
44
+ * @param instance - The instance to promote
45
+ * @param cluster - The cluster context
46
+ * @param isSwitchover - True for switchover (primary healthy), false for failover
47
+ */
48
+ async promote(instance, cluster, isSwitchover) {
49
+ const clusterAlias = cluster.clusterId;
50
+ const oldPrimary = cluster.primary;
51
+ try {
52
+ const result = await this.executePromotion(instance, clusterAlias, isSwitchover);
53
+ if (!isSuccessfulResponse(result)) {
54
+ const errorMsg = extractError(result);
55
+ logger.error({ cluster: clusterAlias, result }, 'Promotion returned failure');
56
+ return { success: false, error: errorMsg };
57
+ }
58
+ // For switchover, start replication on the old primary
59
+ if (isSwitchover && oldPrimary) {
60
+ await this.startReplicationOnDemotedPrimary(oldPrimary);
61
+ }
62
+ return { success: true };
63
+ }
64
+ catch (error) {
65
+ const errorMsg = error instanceof Error ? error.message : String(error);
66
+ logger.error({ error, instance: `${instance.host}:${instance.port}` }, 'Promotion failed');
67
+ return { success: false, error: errorMsg };
68
+ }
69
+ }
70
+ /**
71
+ * Execute the promotion via Orchestrator
72
+ */
73
+ async executePromotion(instance, clusterAlias, isSwitchover) {
74
+ if (isSwitchover) {
75
+ logger.info({ cluster: clusterAlias, target: `${instance.host}:${instance.port}` }, 'Performing graceful master takeover');
76
+ return this.orchestrator.gracefulMasterTakeover(clusterAlias, instance.host, instance.port);
77
+ }
78
+ else {
79
+ logger.info({ cluster: clusterAlias }, 'Performing force master failover');
80
+ return this.orchestrator.forceMasterFailover(clusterAlias);
81
+ }
82
+ }
83
+ /**
84
+ * Start replication on the demoted primary
85
+ */
86
+ async startReplicationOnDemotedPrimary(oldPrimary) {
87
+ const instanceId = `${oldPrimary.host}:${oldPrimary.port}`;
88
+ logger.info({ oldPrimary: instanceId }, 'Starting replication on demoted primary');
89
+ const mysqlClient = (0, mysql_client_js_1.getMySQLClient)();
90
+ const started = await mysqlClient.startReplication(oldPrimary.host, oldPrimary.port);
91
+ if (!started) {
92
+ logger.warn({ oldPrimary: instanceId }, 'Failed to start replication on demoted primary - manual intervention may be needed');
93
+ }
94
+ }
95
+ }
96
+ exports.InstancePromoter = InstancePromoter;
97
+ //# sourceMappingURL=promoter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promoter.js","sourceRoot":"","sources":["../../../src/core/failover/promoter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * ClawSQL - Recovery Manager
3
+ *
4
+ * Manages the recovery of instances after failover.
5
+ * Tracks instances that need recovery and handles the recovery process.
6
+ */
7
+ import { OrchestratorClient } from '../discovery/topology.js';
8
+ import { PendingRecovery, RecoveryResult, BatchRecoveryResult } from './types.js';
9
+ /**
10
+ * Recovery Manager
11
+ * Handles tracking and recovery of instances after failover.
12
+ */
13
+ export declare class RecoveryManager {
14
+ private orchestrator;
15
+ private pendingRecoveries;
16
+ constructor(orchestrator: OrchestratorClient);
17
+ /**
18
+ * Queue an instance for recovery
19
+ */
20
+ queueForRecovery(recovery: PendingRecovery): void;
21
+ /**
22
+ * Get all pending recoveries
23
+ */
24
+ getPending(): PendingRecovery[];
25
+ /**
26
+ * Check if an instance is pending recovery
27
+ */
28
+ isPending(instanceId: string): boolean;
29
+ /**
30
+ * Clear a pending recovery
31
+ */
32
+ clear(instanceId: string): boolean;
33
+ /**
34
+ * Recover a specific instance
35
+ */
36
+ recover(instanceId: string): Promise<RecoveryResult>;
37
+ /**
38
+ * Recover all pending instances
39
+ */
40
+ recoverAll(): Promise<BatchRecoveryResult>;
41
+ /**
42
+ * Create a pending recovery record
43
+ */
44
+ static createPendingRecovery(clusterId: string, host: string, port: number, newPrimaryId: string): PendingRecovery;
45
+ private delay;
46
+ }
47
+ //# sourceMappingURL=recovery-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-manager.d.ts","sourceRoot":"","sources":["../../../src/core/failover/recovery-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIlF;;;GAGG;AACH,qBAAa,eAAe;IAGd,OAAO,CAAC,YAAY;IAFhC,OAAO,CAAC,iBAAiB,CAA2C;gBAEhD,YAAY,EAAE,kBAAkB;IAEpD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAQjD;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAI/B;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6D1D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,mBAAmB,CAAC;IA0BhD;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,eAAe;IAWlB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Recovery Manager
4
+ *
5
+ * Manages the recovery of instances after failover.
6
+ * Tracks instances that need recovery and handles the recovery process.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RecoveryManager = void 0;
10
+ const logger_js_1 = require("../../utils/logger.js");
11
+ const index_js_1 = require("../../types/index.js");
12
+ const mysql_client_js_1 = require("../../utils/mysql-client.js");
13
+ const logger = (0, logger_js_1.getLogger)('failover');
14
+ /**
15
+ * Recovery Manager
16
+ * Handles tracking and recovery of instances after failover.
17
+ */
18
+ class RecoveryManager {
19
+ orchestrator;
20
+ pendingRecoveries = new Map();
21
+ constructor(orchestrator) {
22
+ this.orchestrator = orchestrator;
23
+ }
24
+ /**
25
+ * Queue an instance for recovery
26
+ */
27
+ queueForRecovery(recovery) {
28
+ this.pendingRecoveries.set(recovery.instanceId, recovery);
29
+ logger.info({ instanceId: recovery.instanceId, newPrimaryId: recovery.newPrimaryId }, 'Instance queued for recovery');
30
+ }
31
+ /**
32
+ * Get all pending recoveries
33
+ */
34
+ getPending() {
35
+ return Array.from(this.pendingRecoveries.values());
36
+ }
37
+ /**
38
+ * Check if an instance is pending recovery
39
+ */
40
+ isPending(instanceId) {
41
+ return this.pendingRecoveries.has(instanceId);
42
+ }
43
+ /**
44
+ * Clear a pending recovery
45
+ */
46
+ clear(instanceId) {
47
+ return this.pendingRecoveries.delete(instanceId);
48
+ }
49
+ /**
50
+ * Recover a specific instance
51
+ */
52
+ async recover(instanceId) {
53
+ const pending = this.pendingRecoveries.get(instanceId);
54
+ if (!pending) {
55
+ return { success: false, message: `Instance ${instanceId} is not pending recovery` };
56
+ }
57
+ try {
58
+ logger.info({ instanceId, newPrimaryId: pending.newPrimaryId }, 'Attempting to recover instance');
59
+ // Verify instance is online
60
+ const instance = await this.orchestrator.getInstance(pending.host, pending.port);
61
+ if (!instance) {
62
+ return { success: false, message: `Instance ${instanceId} not found in Orchestrator` };
63
+ }
64
+ if (instance.state !== index_js_1.InstanceState.ONLINE) {
65
+ return {
66
+ success: false,
67
+ message: `Instance ${instanceId} is not online (state: ${instance.state})`
68
+ };
69
+ }
70
+ // Start replication
71
+ const mysqlClient = (0, mysql_client_js_1.getMySQLClient)();
72
+ const started = await mysqlClient.startReplication(pending.host, pending.port);
73
+ if (!started) {
74
+ return { success: false, message: `Failed to start replication on ${instanceId}` };
75
+ }
76
+ // Verify replication is running
77
+ await this.delay(2000);
78
+ const status = await mysqlClient.getReplicationStatus(pending.host, pending.port);
79
+ if (!status || !status.ioRunning || !status.sqlRunning) {
80
+ const ioStatus = status?.ioRunning ? 'running' : 'stopped';
81
+ const sqlStatus = status?.sqlRunning ? 'running' : 'stopped';
82
+ return {
83
+ success: false,
84
+ message: `Replication not fully running on ${instanceId}: IO=${ioStatus}, SQL=${sqlStatus}`
85
+ };
86
+ }
87
+ // Mark as recovered
88
+ pending.recoveredAt = new Date();
89
+ this.pendingRecoveries.delete(instanceId);
90
+ logger.info({ instanceId, newPrimaryId: pending.newPrimaryId }, 'Instance recovered successfully');
91
+ return {
92
+ success: true,
93
+ message: `Instance ${instanceId} recovered and replicating from ${pending.newPrimaryId}`
94
+ };
95
+ }
96
+ catch (error) {
97
+ const message = error instanceof Error ? error.message : String(error);
98
+ logger.error({ error, instanceId }, 'Recovery failed');
99
+ return { success: false, message: `Recovery failed: ${message}` };
100
+ }
101
+ }
102
+ /**
103
+ * Recover all pending instances
104
+ */
105
+ async recoverAll() {
106
+ const result = {
107
+ recovered: [],
108
+ stillPending: [],
109
+ errors: []
110
+ };
111
+ for (const [instanceId] of this.pendingRecoveries) {
112
+ const recoveryResult = await this.recover(instanceId);
113
+ if (recoveryResult.success) {
114
+ result.recovered.push(instanceId);
115
+ }
116
+ else if (recoveryResult.message.includes('not online') ||
117
+ recoveryResult.message.includes('not found')) {
118
+ result.stillPending.push(instanceId);
119
+ }
120
+ else {
121
+ result.errors.push(`${instanceId}: ${recoveryResult.message}`);
122
+ result.stillPending.push(instanceId);
123
+ }
124
+ }
125
+ return result;
126
+ }
127
+ /**
128
+ * Create a pending recovery record
129
+ */
130
+ static createPendingRecovery(clusterId, host, port, newPrimaryId) {
131
+ return {
132
+ clusterId,
133
+ instanceId: `${host}:${port}`,
134
+ host,
135
+ port,
136
+ newPrimaryId,
137
+ failedAt: new Date()
138
+ };
139
+ }
140
+ delay(ms) {
141
+ return new Promise(resolve => setTimeout(resolve, ms));
142
+ }
143
+ }
144
+ exports.RecoveryManager = RecoveryManager;
145
+ //# sourceMappingURL=recovery-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-manager.js","sourceRoot":"","sources":["../../../src/core/failover/recovery-manager.ts"],"names":[],"mappings":"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"}