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,232 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Webhook Routes
4
+ *
5
+ * Handles webhook callbacks from Orchestrator.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const zod_1 = require("zod");
9
+ const logger_js_1 = require("../../utils/logger.js");
10
+ const topology_js_1 = require("../../core/discovery/topology.js");
11
+ const sync_coordinator_js_1 = require("../../core/sync/sync-coordinator.js");
12
+ const replica_recovery_js_1 = require("../../core/sync/replica-recovery.js");
13
+ const logger = (0, logger_js_1.getLogger)('webhook');
14
+ /**
15
+ * Orchestrator failover payload schema
16
+ */
17
+ const OrchestratorFailoverPayloadSchema = zod_1.z.object({
18
+ cluster: zod_1.z.string(),
19
+ master: zod_1.z.string(),
20
+ successor: zod_1.z.string(),
21
+ successorHost: zod_1.z.string().optional(),
22
+ successorPort: zod_1.z.number().optional(),
23
+ isSuccessful: zod_1.z.boolean(),
24
+ failoverType: zod_1.z.enum(['master', 'intermediate-master']),
25
+ reason: zod_1.z.string().optional(),
26
+ timestamp: zod_1.z.string().optional(),
27
+ });
28
+ /**
29
+ * Webhook routes
30
+ */
31
+ const webhookRoutes = async (fastify) => {
32
+ /**
33
+ * Orchestrator failover webhook
34
+ * Called by Orchestrator after a failover event
35
+ */
36
+ fastify.post('/orchestrator/failover', async (request, _reply) => {
37
+ // Parse and validate payload manually
38
+ const parseResult = OrchestratorFailoverPayloadSchema.safeParse(request.body);
39
+ if (!parseResult.success) {
40
+ logger.warn({ errors: parseResult.error.errors }, 'Invalid webhook payload');
41
+ return {
42
+ received: false,
43
+ processed: false,
44
+ message: `Invalid payload: ${parseResult.error.message}`,
45
+ };
46
+ }
47
+ const payload = parseResult.data;
48
+ logger.info({
49
+ cluster: payload.cluster,
50
+ master: payload.master,
51
+ successor: payload.successor,
52
+ isSuccessful: payload.isSuccessful,
53
+ failoverType: payload.failoverType,
54
+ }, 'Received Orchestrator failover webhook');
55
+ const result = await handleFailoverWebhook(payload);
56
+ return result;
57
+ });
58
+ /**
59
+ * Health check for webhook endpoint
60
+ */
61
+ fastify.get('/health', async () => {
62
+ return {
63
+ status: 'healthy',
64
+ timestamp: new Date().toISOString(),
65
+ };
66
+ });
67
+ };
68
+ /**
69
+ * Handle Orchestrator failover webhook
70
+ */
71
+ async function handleFailoverWebhook(payload) {
72
+ // Check if failover was successful
73
+ if (!payload.isSuccessful) {
74
+ logger.warn({ cluster: payload.cluster }, 'Failover was not successful, skipping sync');
75
+ return {
76
+ received: true,
77
+ processed: false,
78
+ message: 'Failover was not successful, sync skipped',
79
+ };
80
+ }
81
+ try {
82
+ // Get the current topology from Orchestrator
83
+ const orchestrator = (0, topology_js_1.getOrchestratorClient)();
84
+ // Wait for topology to stabilize after failover
85
+ // Orchestrator may not have discovered all replicas immediately after switchover
86
+ const maxRetries = 10;
87
+ const retryDelayMs = 2000;
88
+ let topology = null;
89
+ let lastReplicaCount = -1;
90
+ let stableCount = 0;
91
+ for (let retryCount = 0; retryCount < maxRetries; retryCount++) {
92
+ // Try to get topology - first by successor (new primary), then enumerate all clusters
93
+ if (payload.successor) {
94
+ try {
95
+ topology = await orchestrator.getTopology(payload.successor);
96
+ }
97
+ catch (err) {
98
+ logger.debug({ successor: payload.successor, error: err }, 'Successor lookup failed');
99
+ }
100
+ }
101
+ // If topology incomplete, try enumerating all clusters
102
+ if (!topology || topology.replicas.length === 0) {
103
+ try {
104
+ const clusters = await orchestrator.getClusters();
105
+ for (const clusterName of clusters) {
106
+ try {
107
+ const clusterTopology = await orchestrator.getTopology(clusterName);
108
+ if (clusterTopology?.primary) {
109
+ const primaryId = `${clusterTopology.primary.host}:${clusterTopology.primary.port}`;
110
+ if (primaryId === payload.successor) {
111
+ // Only use this if it has more replicas than what we have
112
+ if (!topology || clusterTopology.replicas.length > topology.replicas.length) {
113
+ topology = clusterTopology;
114
+ logger.debug({ foundCluster: clusterName, primary: primaryId, replicas: clusterTopology.replicas.length }, 'Found cluster topology via enumeration');
115
+ }
116
+ }
117
+ }
118
+ }
119
+ catch (err) {
120
+ logger.debug({ clusterName, error: err }, 'Failed to get topology for cluster');
121
+ }
122
+ }
123
+ }
124
+ catch (err) {
125
+ logger.error({ error: err }, 'Failed to get clusters from Orchestrator');
126
+ }
127
+ }
128
+ // If we have a topology with replicas, check if it's stable
129
+ if (topology && topology.replicas.length > 0) {
130
+ // Check for replicas in maintenance/downtime mode - wait for them to recover
131
+ const maintenanceReplicas = topology.replicas.filter(r => r.state === 'maintenance' || r.state === 'offline');
132
+ if (maintenanceReplicas.length > 0) {
133
+ logger.debug({ cluster: topology.clusterId, maintenanceReplicas: maintenanceReplicas.map(r => r.host) }, 'Some replicas are in maintenance/downtime mode, waiting for recovery');
134
+ // Don't reset stability counter, but continue waiting
135
+ }
136
+ else if (topology.replicas.length === lastReplicaCount) {
137
+ stableCount++;
138
+ if (stableCount >= 2) {
139
+ // Topology is stable - proceed with sync
140
+ break;
141
+ }
142
+ logger.debug({ cluster: topology.clusterId, replicas: topology.replicas.length, stableCount }, 'Topology stabilizing, waiting for confirmation');
143
+ }
144
+ else {
145
+ // Replica count changed, reset stability counter
146
+ stableCount = 0;
147
+ lastReplicaCount = topology.replicas.length;
148
+ }
149
+ }
150
+ // Wait before next retry
151
+ if (retryCount < maxRetries - 1) {
152
+ logger.info({ cluster: payload.cluster, successor: payload.successor, attempt: retryCount + 1, replicas: topology?.replicas.length || 0 }, 'Waiting for topology to stabilize (replicas not yet discovered)');
153
+ await new Promise(resolve => setTimeout(resolve, retryDelayMs));
154
+ }
155
+ }
156
+ if (!topology) {
157
+ logger.error({ cluster: payload.cluster, successor: payload.successor }, 'Could not find cluster topology after retries');
158
+ return {
159
+ received: true,
160
+ processed: false,
161
+ message: `Cluster '${payload.cluster}' not found in Orchestrator`,
162
+ };
163
+ }
164
+ logger.info({ cluster: topology.clusterId, primary: topology.primary?.host, replicas: topology.replicas.length }, 'Topology retrieved for webhook sync');
165
+ // Verify the successor matches the new primary
166
+ if (topology.primary) {
167
+ const newPrimaryId = `${topology.primary.host}:${topology.primary.port}`;
168
+ if (payload.successor !== newPrimaryId) {
169
+ logger.warn({
170
+ expected: newPrimaryId,
171
+ received: payload.successor,
172
+ cluster: payload.cluster,
173
+ }, 'Successor mismatch in webhook payload');
174
+ // Continue anyway - trust Orchestrator topology
175
+ }
176
+ }
177
+ // Attempt to recover replicas in maintenance/offline state
178
+ // This is critical after failover/switchover when the old primary is demoted
179
+ if (topology.primary && topology.replicas.length > 0) {
180
+ const recoveryResults = await (0, replica_recovery_js_1.recoverReplicas)(topology.replicas, topology.primary, orchestrator);
181
+ // Log recovery results
182
+ for (const [instanceId, result] of recoveryResults) {
183
+ if (result.recovered) {
184
+ logger.info({ instanceId, reason: result.reason }, 'Replica recovered during webhook');
185
+ }
186
+ else {
187
+ logger.warn({ instanceId, reason: result.reason }, 'Replica recovery deferred');
188
+ }
189
+ }
190
+ // Re-fetch topology after recovery attempts to get updated states
191
+ if (recoveryResults.size > 0) {
192
+ logger.info({ cluster: topology.clusterId }, 'Re-fetching topology after recovery attempts');
193
+ try {
194
+ const updatedTopology = await orchestrator.getTopology(topology.clusterId);
195
+ if (updatedTopology) {
196
+ topology = updatedTopology;
197
+ }
198
+ }
199
+ catch (err) {
200
+ logger.warn({ error: err }, 'Failed to re-fetch topology, using cached version');
201
+ }
202
+ }
203
+ }
204
+ // Sync ProxySQL
205
+ const syncCoordinator = (0, sync_coordinator_js_1.getSyncCoordinator)();
206
+ const syncResult = await syncCoordinator.sync(topology, 'webhook');
207
+ logger.info({
208
+ cluster: payload.cluster,
209
+ skipped: syncResult.skipped,
210
+ reason: syncResult.reason,
211
+ }, 'ProxySQL sync completed from webhook');
212
+ return {
213
+ received: true,
214
+ processed: !syncResult.skipped,
215
+ message: syncResult.skipped
216
+ ? `Sync skipped: ${syncResult.reason}`
217
+ : `ProxySQL synced with ${syncResult.serversSynced} servers`,
218
+ syncResult,
219
+ };
220
+ }
221
+ catch (error) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ logger.error({ error, cluster: payload.cluster }, 'Webhook handler error');
224
+ return {
225
+ received: true,
226
+ processed: false,
227
+ message: `Error processing webhook: ${message}`,
228
+ };
229
+ }
230
+ }
231
+ exports.default = webhookRoutes;
232
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/api/routes/webhooks.ts"],"names":[],"mappings":"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"}