queue-pilot 0.2.0 → 0.5.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 (130) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +209 -31
  3. package/dist/broker/factory.d.ts +25 -0
  4. package/dist/broker/factory.js +35 -0
  5. package/dist/broker/factory.js.map +1 -0
  6. package/dist/broker/registry.d.ts +8 -0
  7. package/dist/broker/registry.js +95 -0
  8. package/dist/broker/registry.js.map +1 -0
  9. package/dist/broker/tool-definition.d.ts +7 -0
  10. package/dist/broker/tool-definition.js +2 -0
  11. package/dist/broker/tool-definition.js.map +1 -0
  12. package/dist/broker/types.d.ts +71 -0
  13. package/dist/broker/types.js +10 -0
  14. package/dist/broker/types.js.map +1 -0
  15. package/dist/brokers/kafka/adapter.d.ts +18 -0
  16. package/dist/brokers/kafka/adapter.js +83 -0
  17. package/dist/brokers/kafka/adapter.js.map +1 -0
  18. package/dist/brokers/kafka/tools.d.ts +3 -0
  19. package/dist/brokers/kafka/tools.js +51 -0
  20. package/dist/brokers/kafka/tools.js.map +1 -0
  21. package/dist/brokers/rabbitmq/adapter.d.ts +19 -0
  22. package/dist/brokers/rabbitmq/adapter.js +114 -0
  23. package/dist/brokers/rabbitmq/adapter.js.map +1 -0
  24. package/dist/brokers/rabbitmq/tools.d.ts +3 -0
  25. package/dist/brokers/rabbitmq/tools.js +124 -0
  26. package/dist/brokers/rabbitmq/tools.js.map +1 -0
  27. package/dist/index.d.ts +8 -1
  28. package/dist/index.js +208 -30
  29. package/dist/index.js.map +1 -1
  30. package/dist/init.d.ts +24 -0
  31. package/dist/init.js +269 -0
  32. package/dist/init.js.map +1 -0
  33. package/dist/kafka/client.d.ts +63 -0
  34. package/dist/kafka/client.js +256 -0
  35. package/dist/kafka/client.js.map +1 -0
  36. package/dist/kafka/types.d.ts +48 -0
  37. package/dist/kafka/types.js +2 -0
  38. package/dist/kafka/types.js.map +1 -0
  39. package/dist/rabbitmq/client.d.ts +14 -2
  40. package/dist/rabbitmq/client.js +44 -7
  41. package/dist/rabbitmq/client.js.map +1 -1
  42. package/dist/rabbitmq/types.d.ts +64 -4
  43. package/dist/schemas/loader.d.ts +0 -1
  44. package/dist/schemas/loader.js +23 -7
  45. package/dist/schemas/loader.js.map +1 -1
  46. package/dist/schemas/types.d.ts +5 -6
  47. package/dist/schemas/validator.d.ts +0 -1
  48. package/dist/schemas/validator.js +11 -64
  49. package/dist/schemas/validator.js.map +1 -1
  50. package/dist/server.d.ts +5 -4
  51. package/dist/server.js +92 -194
  52. package/dist/server.js.map +1 -1
  53. package/dist/startup.d.ts +18 -0
  54. package/dist/startup.js +36 -0
  55. package/dist/startup.js.map +1 -0
  56. package/dist/tools/check-health.d.ts +6 -0
  57. package/dist/tools/check-health.js +9 -0
  58. package/dist/tools/check-health.js.map +1 -0
  59. package/dist/tools/create-queue.d.ts +2 -3
  60. package/dist/tools/create-queue.js +4 -2
  61. package/dist/tools/create-queue.js.map +1 -1
  62. package/dist/tools/delete-queue.d.ts +11 -0
  63. package/dist/tools/delete-queue.js +9 -0
  64. package/dist/tools/delete-queue.js.map +1 -0
  65. package/dist/tools/get-overview.d.ts +23 -0
  66. package/dist/tools/get-overview.js +13 -0
  67. package/dist/tools/get-overview.js.map +1 -0
  68. package/dist/tools/get-queue.d.ts +19 -0
  69. package/dist/tools/get-queue.js +18 -0
  70. package/dist/tools/get-queue.js.map +1 -0
  71. package/dist/tools/get-schema.d.ts +8 -6
  72. package/dist/tools/get-schema.js.map +1 -1
  73. package/dist/tools/inspect-queue.d.ts +5 -3
  74. package/dist/tools/inspect-queue.js +45 -27
  75. package/dist/tools/inspect-queue.js.map +1 -1
  76. package/dist/tools/list-connections.d.ts +14 -0
  77. package/dist/tools/list-connections.js +16 -0
  78. package/dist/tools/list-connections.js.map +1 -0
  79. package/dist/tools/list-consumers.d.ts +11 -0
  80. package/dist/tools/list-consumers.js +13 -0
  81. package/dist/tools/list-consumers.js.map +1 -0
  82. package/dist/tools/list-queues.d.ts +2 -3
  83. package/dist/tools/list-queues.js +4 -4
  84. package/dist/tools/list-queues.js.map +1 -1
  85. package/dist/tools/list-schemas.d.ts +0 -1
  86. package/dist/tools/list-schemas.js +6 -2
  87. package/dist/tools/list-schemas.js.map +1 -1
  88. package/dist/tools/peek-messages.d.ts +3 -3
  89. package/dist/tools/peek-messages.js +5 -4
  90. package/dist/tools/peek-messages.js.map +1 -1
  91. package/dist/tools/publish-message.d.ts +3 -4
  92. package/dist/tools/publish-message.js +12 -6
  93. package/dist/tools/publish-message.js.map +1 -1
  94. package/dist/tools/purge-queue.d.ts +2 -3
  95. package/dist/tools/purge-queue.js +3 -3
  96. package/dist/tools/purge-queue.js.map +1 -1
  97. package/dist/tools/validate-message.d.ts +0 -1
  98. package/dist/tools/validate-message.js.map +1 -1
  99. package/dist/version.d.ts +1 -0
  100. package/dist/version.js +5 -0
  101. package/dist/version.js.map +1 -0
  102. package/package.json +21 -6
  103. package/dist/index.d.ts.map +0 -1
  104. package/dist/rabbitmq/client.d.ts.map +0 -1
  105. package/dist/rabbitmq/types.d.ts.map +0 -1
  106. package/dist/schemas/loader.d.ts.map +0 -1
  107. package/dist/schemas/types.d.ts.map +0 -1
  108. package/dist/schemas/validator.d.ts.map +0 -1
  109. package/dist/server.d.ts.map +0 -1
  110. package/dist/tools/create-binding.d.ts +0 -15
  111. package/dist/tools/create-binding.d.ts.map +0 -1
  112. package/dist/tools/create-binding.js +0 -10
  113. package/dist/tools/create-binding.js.map +0 -1
  114. package/dist/tools/create-queue.d.ts.map +0 -1
  115. package/dist/tools/get-schema.d.ts.map +0 -1
  116. package/dist/tools/inspect-queue.d.ts.map +0 -1
  117. package/dist/tools/list-bindings.d.ts +0 -11
  118. package/dist/tools/list-bindings.d.ts.map +0 -1
  119. package/dist/tools/list-bindings.js +0 -12
  120. package/dist/tools/list-bindings.js.map +0 -1
  121. package/dist/tools/list-exchanges.d.ts +0 -10
  122. package/dist/tools/list-exchanges.d.ts.map +0 -1
  123. package/dist/tools/list-exchanges.js +0 -11
  124. package/dist/tools/list-exchanges.js.map +0 -1
  125. package/dist/tools/list-queues.d.ts.map +0 -1
  126. package/dist/tools/list-schemas.d.ts.map +0 -1
  127. package/dist/tools/peek-messages.d.ts.map +0 -1
  128. package/dist/tools/publish-message.d.ts.map +0 -1
  129. package/dist/tools/purge-queue.d.ts.map +0 -1
  130. package/dist/tools/validate-message.d.ts.map +0 -1
@@ -0,0 +1,63 @@
1
+ import type { KafkaConfig, TopicInfo, ConsumerGroupInfo } from "./types.js";
2
+ export interface PeekedMessage {
3
+ key: string | null;
4
+ value: string | null;
5
+ headers: Record<string, string>;
6
+ timestamp: string;
7
+ partition: number;
8
+ offset: string;
9
+ topic: string;
10
+ }
11
+ export interface KafkaHealthResult {
12
+ status: string;
13
+ brokersConnected?: number;
14
+ reason?: string;
15
+ }
16
+ export interface KafkaOverview {
17
+ cluster: {
18
+ clusterId: string;
19
+ controller: number;
20
+ brokers: {
21
+ nodeId: number;
22
+ host: string;
23
+ port: number;
24
+ }[];
25
+ };
26
+ topics: string[];
27
+ }
28
+ export declare class KafkaClient {
29
+ private readonly config;
30
+ private kafka;
31
+ private adminInstance;
32
+ private producerInstance;
33
+ constructor(config: KafkaConfig);
34
+ private getKafka;
35
+ private getAdmin;
36
+ private getProducer;
37
+ listTopics(): Promise<string[]>;
38
+ describeTopic(name: string): Promise<TopicInfo>;
39
+ createTopic(name: string, numPartitions: number, replicationFactor: number): Promise<boolean>;
40
+ deleteTopic(name: string): Promise<void>;
41
+ purge(name: string): Promise<void>;
42
+ peekMessages(topic: string, count: number, timeoutMs?: number): Promise<PeekedMessage[]>;
43
+ publish(topic: string, key: string | null, value: string, headers?: Record<string, string>): Promise<{
44
+ topicName: string;
45
+ partition: number;
46
+ errorCode: number;
47
+ }[]>;
48
+ checkHealth(): Promise<KafkaHealthResult>;
49
+ getOverview(): Promise<KafkaOverview>;
50
+ listConsumerGroups(): Promise<{
51
+ groupId: string;
52
+ protocolType: string;
53
+ state: string;
54
+ }[]>;
55
+ describeConsumerGroup(groupId: string): Promise<ConsumerGroupInfo>;
56
+ fetchTopicOffsets(topic: string): Promise<{
57
+ partition: number;
58
+ offset: string;
59
+ high: string;
60
+ low: string;
61
+ }[]>;
62
+ disconnect(): Promise<void>;
63
+ }
@@ -0,0 +1,256 @@
1
+ async function loadKafkaModule() {
2
+ try {
3
+ return (await import("@confluentinc/kafka-javascript"));
4
+ }
5
+ catch {
6
+ throw new Error("Kafka support requires @confluentinc/kafka-javascript. " +
7
+ "Install it with: npm install @confluentinc/kafka-javascript");
8
+ }
9
+ }
10
+ export class KafkaClient {
11
+ config;
12
+ kafka = null;
13
+ adminInstance = null;
14
+ producerInstance = null;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ async getKafka() {
19
+ if (!this.kafka) {
20
+ const mod = await loadKafkaModule();
21
+ const kafkaConfig = {
22
+ brokers: this.config.brokers,
23
+ clientId: this.config.clientId ?? "queue-pilot",
24
+ };
25
+ if (this.config.ssl) {
26
+ kafkaConfig.ssl = true;
27
+ }
28
+ if (this.config.sasl) {
29
+ kafkaConfig.sasl = this.config.sasl;
30
+ }
31
+ this.kafka = new mod.KafkaJS.Kafka(kafkaConfig);
32
+ }
33
+ return this.kafka;
34
+ }
35
+ async getAdmin() {
36
+ if (!this.adminInstance) {
37
+ const kafka = await this.getKafka();
38
+ this.adminInstance = kafka.admin();
39
+ await this.adminInstance.connect();
40
+ }
41
+ return this.adminInstance;
42
+ }
43
+ async getProducer() {
44
+ if (!this.producerInstance) {
45
+ const kafka = await this.getKafka();
46
+ this.producerInstance = kafka.producer();
47
+ await this.producerInstance.connect();
48
+ }
49
+ return this.producerInstance;
50
+ }
51
+ async listTopics() {
52
+ const admin = await this.getAdmin();
53
+ return admin.listTopics();
54
+ }
55
+ async describeTopic(name) {
56
+ const admin = await this.getAdmin();
57
+ const metadata = await admin.fetchTopicMetadata({ topics: [name] });
58
+ const topic = metadata.topics.find((t) => t.name === name);
59
+ if (!topic) {
60
+ throw new Error(`Topic '${name}' not found`);
61
+ }
62
+ return {
63
+ name: topic.name,
64
+ partitions: topic.partitions.map((p) => ({
65
+ partitionId: p.partitionId,
66
+ leader: p.leader,
67
+ replicas: p.replicas,
68
+ isr: p.isr,
69
+ })),
70
+ };
71
+ }
72
+ async createTopic(name, numPartitions, replicationFactor) {
73
+ const admin = await this.getAdmin();
74
+ return admin.createTopics({
75
+ topics: [{ topic: name, numPartitions, replicationFactor }],
76
+ });
77
+ }
78
+ async deleteTopic(name) {
79
+ const admin = await this.getAdmin();
80
+ await admin.deleteTopics({ topics: [name] });
81
+ }
82
+ async purge(name) {
83
+ const admin = await this.getAdmin();
84
+ const offsets = await admin.fetchTopicOffsets(name);
85
+ await admin.deleteTopicRecords({
86
+ topic: name,
87
+ partitions: offsets.map((o) => ({
88
+ partition: o.partition,
89
+ offset: o.high,
90
+ })),
91
+ });
92
+ }
93
+ async peekMessages(topic, count, timeoutMs = 5000) {
94
+ const kafka = await this.getKafka();
95
+ const groupId = `queue-pilot-peek-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
96
+ const consumer = kafka.consumer({ groupId });
97
+ const messages = [];
98
+ try {
99
+ await consumer.connect();
100
+ await consumer.subscribe({ topic, fromBeginning: true });
101
+ const consume = consumer.run({
102
+ eachMessage: async ({ topic: msgTopic, partition, message }) => {
103
+ if (messages.length < count) {
104
+ messages.push({
105
+ key: message.key ? message.key.toString() : null,
106
+ value: message.value ? message.value.toString() : null,
107
+ headers: decodeHeaders(message.headers),
108
+ timestamp: message.timestamp,
109
+ partition,
110
+ offset: message.offset,
111
+ topic: msgTopic,
112
+ });
113
+ }
114
+ if (messages.length >= count) {
115
+ await consumer.stop();
116
+ }
117
+ },
118
+ });
119
+ const timeout = new Promise((resolve) => {
120
+ setTimeout(resolve, timeoutMs);
121
+ });
122
+ await Promise.race([consume, timeout]);
123
+ }
124
+ finally {
125
+ await consumer.disconnect();
126
+ try {
127
+ const admin = await this.getAdmin();
128
+ await admin.deleteGroups([groupId]);
129
+ }
130
+ catch {
131
+ // Group cleanup is best-effort
132
+ }
133
+ }
134
+ return messages;
135
+ }
136
+ async publish(topic, key, value, headers) {
137
+ const producer = await this.getProducer();
138
+ return producer.send({
139
+ topic,
140
+ messages: [{ key, value, headers }],
141
+ });
142
+ }
143
+ async checkHealth() {
144
+ try {
145
+ const admin = await this.getAdmin();
146
+ const cluster = await admin.describeCluster();
147
+ return {
148
+ status: "ok",
149
+ brokersConnected: cluster.brokers.length,
150
+ };
151
+ }
152
+ catch (error) {
153
+ return {
154
+ status: "failed",
155
+ reason: error instanceof Error ? error.message : String(error),
156
+ };
157
+ }
158
+ }
159
+ async getOverview() {
160
+ const admin = await this.getAdmin();
161
+ const [cluster, topics] = await Promise.all([
162
+ admin.describeCluster(),
163
+ admin.listTopics(),
164
+ ]);
165
+ return {
166
+ cluster: {
167
+ clusterId: cluster.clusterId,
168
+ controller: cluster.controller,
169
+ brokers: cluster.brokers.map((b) => ({
170
+ nodeId: b.nodeId,
171
+ host: b.host,
172
+ port: b.port,
173
+ })),
174
+ },
175
+ topics,
176
+ };
177
+ }
178
+ async listConsumerGroups() {
179
+ const admin = await this.getAdmin();
180
+ const result = await admin.listGroups();
181
+ return result.groups;
182
+ }
183
+ async describeConsumerGroup(groupId) {
184
+ const admin = await this.getAdmin();
185
+ const result = await admin.describeGroups([groupId]);
186
+ const group = result.groups.find((g) => g.groupId === groupId);
187
+ if (!group) {
188
+ throw new Error(`Consumer group '${groupId}' not found`);
189
+ }
190
+ return {
191
+ groupId: group.groupId,
192
+ state: group.state,
193
+ protocol: group.protocol,
194
+ protocolType: group.protocolType,
195
+ members: group.members.map((m) => ({
196
+ memberId: m.memberId,
197
+ clientId: m.clientId,
198
+ clientHost: m.clientHost,
199
+ assignment: decodeMemberAssignment(m.memberAssignment),
200
+ })),
201
+ };
202
+ }
203
+ async fetchTopicOffsets(topic) {
204
+ const admin = await this.getAdmin();
205
+ return admin.fetchTopicOffsets(topic);
206
+ }
207
+ async disconnect() {
208
+ if (this.adminInstance) {
209
+ await this.adminInstance.disconnect();
210
+ this.adminInstance = null;
211
+ }
212
+ if (this.producerInstance) {
213
+ await this.producerInstance.disconnect();
214
+ this.producerInstance = null;
215
+ }
216
+ this.kafka = null;
217
+ }
218
+ }
219
+ function decodeHeaders(headers) {
220
+ if (!headers)
221
+ return {};
222
+ const result = {};
223
+ for (const [key, value] of Object.entries(headers)) {
224
+ result[key] = value.toString();
225
+ }
226
+ return result;
227
+ }
228
+ function decodeMemberAssignment(buffer) {
229
+ if (!buffer || buffer.length === 0)
230
+ return [];
231
+ try {
232
+ let offset = 2; // skip version (int16)
233
+ const topicCount = buffer.readInt32BE(offset);
234
+ offset += 4;
235
+ const assignments = [];
236
+ for (let i = 0; i < topicCount; i++) {
237
+ const topicLength = buffer.readInt16BE(offset);
238
+ offset += 2;
239
+ const topic = buffer.toString("utf8", offset, offset + topicLength);
240
+ offset += topicLength;
241
+ const partitionCount = buffer.readInt32BE(offset);
242
+ offset += 4;
243
+ const partitions = [];
244
+ for (let j = 0; j < partitionCount; j++) {
245
+ partitions.push(buffer.readInt32BE(offset));
246
+ offset += 4;
247
+ }
248
+ assignments.push({ topic, partitions });
249
+ }
250
+ return assignments;
251
+ }
252
+ catch {
253
+ return [];
254
+ }
255
+ }
256
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/kafka/client.ts"],"names":[],"mappings":"AAoIA,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAA2B,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,yDAAyD;YACvD,6DAA6D,CAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,WAAW;IACL,MAAM,CAAc;IAC7B,KAAK,GAAyB,IAAI,CAAC;IACnC,aAAa,GAAsB,IAAI,CAAC;IACxC,gBAAgB,GAAyB,IAAI,CAAC;IAEtD,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;YACpC,MAAM,WAAW,GAA4B;gBAC3C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,aAAa;aAChD,CAAC;YACF,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACpB,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,aAAqB,EACrB,iBAAyB;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,YAAY,CAAC;YACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC,kBAAkB,CAAC;YAC7B,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,MAAM,EAAE,CAAC,CAAC,IAAI;aACf,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,YAAoB,IAAI;QACvE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,oBAAoB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC;gBAC3B,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC7D,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;wBAC5B,QAAQ,CAAC,IAAI,CAAC;4BACZ,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;4BAChD,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;4BACtD,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;4BACvC,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,SAAS;4BACT,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,KAAK,EAAE,QAAQ;yBAChB,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;wBAC7B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxB,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5C,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;YACjC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,KAAa,EACb,GAAkB,EAClB,KAAa,EACb,OAAgC;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC;YACnB,KAAK;YACL,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;aACzC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,KAAK,CAAC,eAAe,EAAE;YACvB,KAAK,CAAC,UAAU,EAAE;SACnB,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;iBACb,CAAC,CAAC;aACJ;YACD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB;QAGtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAe;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,aAAa,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CACxB,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC;gBAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;aACvD,CAAC,CACH;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,KAAa;QAEb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF;AAED,SAAS,aAAa,CACpB,OAAgC;IAEhC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAc;IAEd,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,uBAAuB;QACvC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,CAAC;QACZ,MAAM,WAAW,GAA8C,EAAE,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;YACpE,MAAM,IAAI,WAAW,CAAC;YACtB,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,CAAC;YACZ,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5C,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface KafkaConfig {
2
+ brokers: string[];
3
+ clientId?: string;
4
+ sasl?: SaslConfig;
5
+ ssl?: boolean;
6
+ }
7
+ export interface SaslConfig {
8
+ mechanism: "plain" | "scram-sha-256" | "scram-sha-512";
9
+ username: string;
10
+ password: string;
11
+ }
12
+ export interface TopicInfo {
13
+ name: string;
14
+ partitions: PartitionInfo[];
15
+ }
16
+ export interface PartitionInfo {
17
+ partitionId: number;
18
+ leader: number;
19
+ replicas: number[];
20
+ isr: number[];
21
+ }
22
+ export interface ConsumerGroupInfo {
23
+ groupId: string;
24
+ state: string;
25
+ protocol: string;
26
+ protocolType: string;
27
+ members: ConsumerGroupMember[];
28
+ }
29
+ export interface ConsumerGroupMember {
30
+ memberId: string;
31
+ clientId: string;
32
+ clientHost: string;
33
+ assignment: TopicPartitionAssignment[];
34
+ }
35
+ export interface TopicPartitionAssignment {
36
+ topic: string;
37
+ partitions: number[];
38
+ }
39
+ export interface TopicOffsets {
40
+ topic: string;
41
+ partitions: PartitionOffset[];
42
+ }
43
+ export interface PartitionOffset {
44
+ partition: number;
45
+ offset: string;
46
+ high: string;
47
+ low: string;
48
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/kafka/types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import type { RabbitMQConfig, QueueInfo, QueueMessage, ExchangeInfo, BindingInfo, PublishMessageBody, PublishResponse, PurgeResponse } from "./types.js";
1
+ import type { RabbitMQConfig, QueueInfo, QueueMessage, ExchangeInfo, BindingInfo, PublishMessageBody, PublishResponse, PurgeResponse, OverviewResponse, HealthCheckResponse, QueueDetail, ConsumerInfo, ConnectionInfo } from "./types.js";
2
2
  export declare class RabbitMQClient {
3
3
  private readonly baseUrl;
4
4
  private readonly authHeader;
@@ -18,5 +18,17 @@ export declare class RabbitMQClient {
18
18
  }): Promise<void>;
19
19
  createBinding(vhost: string, exchange: string, queue: string, routingKey: string): Promise<void>;
20
20
  publishMessage(vhost: string, exchange: string, body: PublishMessageBody): Promise<PublishResponse>;
21
+ createExchange(vhost: string, exchange: string, options: {
22
+ type: string;
23
+ durable: boolean;
24
+ auto_delete: boolean;
25
+ }): Promise<void>;
26
+ deleteQueue(vhost: string, queue: string): Promise<void>;
27
+ deleteExchange(vhost: string, exchange: string): Promise<void>;
28
+ deleteBinding(vhost: string, exchange: string, queue: string, propertiesKey: string): Promise<void>;
29
+ getOverview(): Promise<OverviewResponse>;
30
+ checkHealth(): Promise<HealthCheckResponse>;
31
+ getQueue(vhost: string, queue: string): Promise<QueueDetail>;
32
+ listConsumers(vhost: string): Promise<ConsumerInfo[]>;
33
+ listConnections(): Promise<ConnectionInfo[]>;
21
34
  }
22
- //# sourceMappingURL=client.d.ts.map
@@ -1,4 +1,6 @@
1
1
  function encodeVhost(vhost) {
2
+ if (!vhost)
3
+ throw new Error("vhost must not be empty");
2
4
  return vhost === "/" ? "%2F" : encodeURIComponent(vhost);
3
5
  }
4
6
  export class RabbitMQClient {
@@ -20,9 +22,15 @@ export class RabbitMQClient {
20
22
  const response = await fetch(`${this.baseUrl}${path}`, {
21
23
  ...options,
22
24
  headers: { ...this.headers(), ...options?.headers },
25
+ signal: options?.signal ?? AbortSignal.timeout(10_000),
23
26
  });
24
27
  if (!response.ok) {
25
- throw new Error(`RabbitMQ API error: ${response.status} ${response.statusText}`);
28
+ let body = "";
29
+ try {
30
+ body = await response.text();
31
+ }
32
+ catch { /* response body unreadable */ }
33
+ throw new Error(`RabbitMQ API error: ${response.status} ${response.statusText} — ${body}`);
26
34
  }
27
35
  return response;
28
36
  }
@@ -53,12 +61,11 @@ export class RabbitMQClient {
53
61
  return this.request(`/api/bindings/${encodeVhost(vhost)}`);
54
62
  }
55
63
  async purgeQueue(vhost, queue) {
56
- const encodedVhost = encodeVhost(vhost);
57
- const encodedQueue = encodeURIComponent(queue);
58
- const messages = await this.peekMessages(vhost, queue, 1);
59
- const messageCount = messages.length > 0 ? messages[0].message_count + 1 : 0;
60
- await this.requestVoid(`/api/queues/${encodedVhost}/${encodedQueue}/contents`, { method: "DELETE" });
61
- return { messages_purged: messageCount };
64
+ const response = await this.rawRequest(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}/contents`, { method: "DELETE" });
65
+ if (response.status === 204) {
66
+ return { message_count: 0 };
67
+ }
68
+ return response.json();
62
69
  }
63
70
  async createQueue(vhost, queue, options) {
64
71
  return this.requestVoid(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}`, {
@@ -78,5 +85,35 @@ export class RabbitMQClient {
78
85
  body: JSON.stringify(body),
79
86
  });
80
87
  }
88
+ async createExchange(vhost, exchange, options) {
89
+ return this.requestVoid(`/api/exchanges/${encodeVhost(vhost)}/${encodeURIComponent(exchange)}`, {
90
+ method: "PUT",
91
+ body: JSON.stringify(options),
92
+ });
93
+ }
94
+ async deleteQueue(vhost, queue) {
95
+ return this.requestVoid(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}`, { method: "DELETE" });
96
+ }
97
+ async deleteExchange(vhost, exchange) {
98
+ return this.requestVoid(`/api/exchanges/${encodeVhost(vhost)}/${encodeURIComponent(exchange)}`, { method: "DELETE" });
99
+ }
100
+ async deleteBinding(vhost, exchange, queue, propertiesKey) {
101
+ return this.requestVoid(`/api/bindings/${encodeVhost(vhost)}/e/${encodeURIComponent(exchange)}/q/${encodeURIComponent(queue)}/${encodeURIComponent(propertiesKey)}`, { method: "DELETE" });
102
+ }
103
+ async getOverview() {
104
+ return this.request("/api/overview");
105
+ }
106
+ async checkHealth() {
107
+ return this.request("/api/health/checks/alarms");
108
+ }
109
+ async getQueue(vhost, queue) {
110
+ return this.request(`/api/queues/${encodeVhost(vhost)}/${encodeURIComponent(queue)}`);
111
+ }
112
+ async listConsumers(vhost) {
113
+ return this.request(`/api/consumers/${encodeVhost(vhost)}`);
114
+ }
115
+ async listConnections() {
116
+ return this.request("/api/connections");
117
+ }
81
118
  }
82
119
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rabbitmq/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rabbitmq/client.ts"],"names":[],"mappings":"AAgBA,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvD,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,cAAc;IACR,OAAO,CAAS;IAChB,UAAU,CAAS;IAEpC,YAAY,MAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU;YACb,QAAQ;gBACR,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAEO,OAAO;QACb,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,UAAU;YAC9B,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAqB;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACrD,GAAG,OAAO;YACV,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;YACnD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACvD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC;gBAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CACb,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,IAAI,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,OAAqB;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,OAAqB;QAC3D,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAc,eAAe,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,KAAa,EACb,KAAa;QAEb,OAAO,IAAI,CAAC,OAAO,CACjB,eAAe,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EACpE;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,MAAM;aACjB,CAAC;SACH,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,WAAW,CAAC,KAAK,CAAC,EAAE,CACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAgB,iBAAiB,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAAa,EACb,KAAa;QAEb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CACpC,eAAe,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,WAAW,EACzE,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAa,EACb,KAAa,EACb,OAAmD;QAEnD,OAAO,IAAI,CAAC,WAAW,CACrB,eAAe,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAChE;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAa,EACb,QAAgB,EAChB,KAAa,EACb,UAAkB;QAElB,OAAO,IAAI,CAAC,WAAW,CACrB,iBAAiB,WAAW,CAAC,KAAK,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACtG;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;SAClD,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,QAAgB,EAChB,IAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAC9E;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,QAAgB,EAChB,OAAiE;QAEjE,OAAO,IAAI,CAAC,WAAW,CACrB,kBAAkB,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EACtE;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,KAAa;QAC5C,OAAO,IAAI,CAAC,WAAW,CACrB,eAAe,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAChE,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB;QAClD,OAAO,IAAI,CAAC,WAAW,CACrB,kBAAkB,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EACtE,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAa,EACb,QAAgB,EAChB,KAAa,EACb,aAAqB;QAErB,OAAO,IAAI,CAAC,WAAW,CACrB,iBAAiB,WAAW,CAAC,KAAK,CAAC,MAAM,kBAAkB,CAAC,QAAQ,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAC3I,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAmB,eAAe,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAsB,2BAA2B,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,OAAO,CACjB,eAAe,WAAW,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CACjE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,OAAO,CACjB,kBAAkB,WAAW,CAAC,KAAK,CAAC,EAAE,CACvC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,OAAO,CAAmB,kBAAkB,CAAC,CAAC;IAC5D,CAAC;CACF"}
@@ -5,8 +5,8 @@ export interface RabbitMQConfig {
5
5
  }
6
6
  export interface QueueInfo {
7
7
  name: string;
8
- messages_ready: number;
9
- messages_unacknowledged: number;
8
+ messages_ready: number | null;
9
+ messages_unacknowledged: number | null;
10
10
  state: string;
11
11
  vhost: string;
12
12
  }
@@ -38,6 +38,7 @@ export interface BindingInfo {
38
38
  destination: string;
39
39
  destination_type: string;
40
40
  routing_key: string;
41
+ properties_key: string;
41
42
  vhost: string;
42
43
  }
43
44
  export interface PublishMessageBody {
@@ -50,6 +51,65 @@ export interface PublishResponse {
50
51
  routed: boolean;
51
52
  }
52
53
  export interface PurgeResponse {
53
- messages_purged: number;
54
+ message_count: number;
55
+ }
56
+ export interface OverviewResponse {
57
+ cluster_name: string;
58
+ rabbitmq_version: string;
59
+ erlang_version: string;
60
+ message_stats: {
61
+ publish: number;
62
+ deliver: number;
63
+ };
64
+ queue_totals: {
65
+ messages: number;
66
+ messages_ready: number;
67
+ messages_unacknowledged: number;
68
+ };
69
+ object_totals: {
70
+ queues: number;
71
+ exchanges: number;
72
+ connections: number;
73
+ consumers: number;
74
+ };
75
+ node: string;
76
+ }
77
+ export interface HealthCheckResponse {
78
+ status: string;
79
+ reason?: string;
80
+ }
81
+ export interface QueueDetail extends QueueInfo {
82
+ consumers: number;
83
+ consumer_utilisation: number | null;
84
+ memory: number;
85
+ message_stats: {
86
+ publish: number;
87
+ deliver: number;
88
+ } | null;
89
+ policy: string | null;
90
+ arguments: Record<string, unknown>;
91
+ node: string;
92
+ }
93
+ export interface ConsumerInfo {
94
+ queue: {
95
+ name: string;
96
+ };
97
+ consumer_tag: string;
98
+ channel_details: {
99
+ connection_name: string;
100
+ };
101
+ ack_required: boolean;
102
+ prefetch_count: number;
103
+ }
104
+ export interface ConnectionInfo {
105
+ name: string;
106
+ user: string;
107
+ state: string;
108
+ channels: number;
109
+ connected_at: number;
110
+ client_properties: {
111
+ connection_name?: string;
112
+ };
113
+ peer_host: string;
114
+ peer_port: number;
54
115
  }
55
- //# sourceMappingURL=types.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import type { SchemaEntry } from "./types.js";
2
2
  export declare function loadSchemas(directory: string): Promise<SchemaEntry[]>;
3
- //# sourceMappingURL=loader.d.ts.map
@@ -1,24 +1,40 @@
1
- import { readdir, readFile, access } from "fs/promises";
2
- import { join } from "path";
1
+ import { readdir, readFile, realpath } from "fs/promises";
2
+ import { join, relative, isAbsolute } from "path";
3
3
  export async function loadSchemas(directory) {
4
+ let files;
4
5
  try {
5
- await access(directory);
6
+ files = await readdir(directory, { recursive: true });
6
7
  }
7
- catch {
8
- throw new Error(`Schema directory not found: ${directory}`);
8
+ catch (error) {
9
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
10
+ throw new Error(`Schema directory not found: ${directory}`);
11
+ }
12
+ throw error;
9
13
  }
10
- const files = await readdir(directory);
11
- const jsonFiles = files.filter((f) => f.endsWith(".json"));
14
+ const jsonFiles = files.filter((f) => typeof f === "string" && f.endsWith(".json"));
15
+ const resolvedDir = await realpath(directory);
12
16
  const entries = [];
17
+ const seenIds = new Set();
13
18
  for (const file of jsonFiles) {
14
19
  try {
15
20
  const filePath = join(directory, file);
21
+ const resolvedPath = await realpath(filePath);
22
+ const rel = relative(resolvedDir, resolvedPath);
23
+ if (rel.startsWith("..") || isAbsolute(rel)) {
24
+ process.stderr.write(`Warning: skipping ${file}: path outside schema directory\n`);
25
+ continue;
26
+ }
16
27
  const content = await readFile(filePath, "utf-8");
17
28
  const parsed = JSON.parse(content);
18
29
  if (!parsed.$id || typeof parsed.$id !== "string") {
19
30
  throw new Error(`Missing required "$id" field`);
20
31
  }
21
32
  const schema = parsed;
33
+ if (seenIds.has(schema.$id)) {
34
+ process.stderr.write(`Warning: skipping ${file}: duplicate $id "${schema.$id}"\n`);
35
+ continue;
36
+ }
37
+ seenIds.add(schema.$id);
22
38
  entries.push({
23
39
  name: schema.$id,
24
40
  version: schema.version ?? "0.0.0",
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/schemas/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAE9D,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,MAAM,GAAG,MAA0B,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC,GAAG;gBAChB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG;gBACjC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;gBACrC,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/schemas/loader.ts"],"names":[],"mappings":"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"}