@backstage/plugin-events-backend-module-kafka 0.1.4-next.0 → 0.1.5-next.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @backstage/plugin-events-backend-module-kafka
2
2
 
3
+ ## 0.1.5-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 05f60e1: Refactored constructor parameter properties to explicit property declarations for compatibility with TypeScript's `erasableSyntaxOnly` setting. This internal refactoring maintains all existing functionality while ensuring TypeScript compilation compatibility.
8
+ - Updated dependencies
9
+ - @backstage/plugin-events-node@0.4.17-next.0
10
+ - @backstage/config@1.3.6-next.0
11
+ - @backstage/backend-plugin-api@1.4.5-next.0
12
+ - @backstage/types@1.2.2
13
+
14
+ ## 0.1.4
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies
19
+ - @backstage/config@1.3.5
20
+ - @backstage/backend-plugin-api@1.4.4
21
+ - @backstage/plugin-events-node@0.4.16
22
+
3
23
  ## 0.1.4-next.0
4
24
 
5
25
  ### Patch Changes
@@ -1,6 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  class KafkaConsumingEventPublisher {
4
+ kafkaConsumer;
5
+ consumerSubscribeTopics;
6
+ backstageTopic;
7
+ logger;
8
+ static fromConfig(env) {
9
+ return new KafkaConsumingEventPublisher(
10
+ env.kafkaClient,
11
+ env.logger,
12
+ env.events,
13
+ env.config
14
+ );
15
+ }
16
+ events;
4
17
  constructor(kafkaClient, logger, events, config) {
5
18
  this.events = events;
6
19
  this.kafkaConsumer = kafkaClient.consumer(config.consumerConfig);
@@ -15,18 +28,6 @@ class KafkaConsumingEventPublisher {
15
28
  taskId: id
16
29
  });
17
30
  }
18
- kafkaConsumer;
19
- consumerSubscribeTopics;
20
- backstageTopic;
21
- logger;
22
- static fromConfig(env) {
23
- return new KafkaConsumingEventPublisher(
24
- env.kafkaClient,
25
- env.logger,
26
- env.events,
27
- env.config
28
- );
29
- }
30
31
  async start() {
31
32
  try {
32
33
  await this.kafkaConsumer.connect();
@@ -1 +1 @@
1
- {"version":3,"file":"KafkaConsumingEventPublisher.cjs.js","sources":["../../src/publisher/KafkaConsumingEventPublisher.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { EventParams, EventsService } from '@backstage/plugin-events-node';\nimport { Consumer, ConsumerSubscribeTopics, IHeaders, Kafka } from 'kafkajs';\nimport { KafkaConsumerConfig } from './config';\n\ntype EventMetadata = EventParams['metadata'];\n\n/**\n * This class subscribes to Kafka topics and publishes events received to the registered subscriber.\n * The message payload will be used as the event payload and passed to the subscribers.\n */\nexport class KafkaConsumingEventPublisher {\n private readonly kafkaConsumer: Consumer;\n private readonly consumerSubscribeTopics: ConsumerSubscribeTopics;\n private readonly backstageTopic: string;\n private readonly logger: LoggerService;\n\n static fromConfig(env: {\n kafkaClient: Kafka;\n config: KafkaConsumerConfig;\n events: EventsService;\n logger: LoggerService;\n }): KafkaConsumingEventPublisher {\n return new KafkaConsumingEventPublisher(\n env.kafkaClient,\n env.logger,\n env.events,\n env.config,\n );\n }\n\n private constructor(\n kafkaClient: Kafka,\n logger: LoggerService,\n private readonly events: EventsService,\n config: KafkaConsumerConfig,\n ) {\n this.kafkaConsumer = kafkaClient.consumer(config.consumerConfig);\n this.consumerSubscribeTopics = config.consumerSubscribeTopics;\n this.backstageTopic = config.backstageTopic;\n const id = `events.kafka.publisher:${this.backstageTopic}`;\n this.logger = logger.child({\n class: KafkaConsumingEventPublisher.prototype.constructor.name,\n groupId: config.consumerConfig.groupId,\n kafkaTopics: config.consumerSubscribeTopics.topics.toString(),\n backstageTopic: config.backstageTopic,\n taskId: id,\n });\n }\n\n async start(): Promise<void> {\n try {\n await this.kafkaConsumer.connect();\n\n await this.kafkaConsumer.subscribe(this.consumerSubscribeTopics);\n\n await this.kafkaConsumer.run({\n eachMessage: async ({ message }) => {\n this.events.publish({\n topic: this.backstageTopic,\n eventPayload: JSON.parse(message.value?.toString()!),\n metadata: this.convertHeadersToMetadata(message.headers),\n });\n },\n });\n } catch (error: any) {\n this.logger.error('Kafka consumer connection failed ', error);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.kafkaConsumer.disconnect();\n }\n\n private convertHeadersToMetadata = (\n headers: IHeaders | undefined,\n ): EventParams['metadata'] => {\n if (!headers) return undefined;\n\n const metadata: EventMetadata = {};\n\n Object.entries(headers).forEach(([key, value]) => {\n // If value is an array use toString() on all values converting any Buffer types to valid strings\n if (Array.isArray(value)) metadata[key] = value.map(v => v.toString());\n // Always return the values using toString() to catch all Buffer types that should be converted to strings\n else metadata[key] = value?.toString();\n });\n\n return metadata;\n };\n}\n"],"names":[],"mappings":";;AA0BO,MAAM,4BAAA,CAA6B;AAAA,EAoBhC,WAAA,CACN,WAAA,EACA,MAAA,EACiB,MAAA,EACjB,MAAA,EACA;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA;AAC/D,IAAA,IAAA,CAAK,0BAA0B,MAAA,CAAO,uBAAA;AACtC,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,CAAA,uBAAA,EAA0B,IAAA,CAAK,cAAc,CAAA,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,KAAA,CAAM;AAAA,MACzB,KAAA,EAAO,4BAAA,CAA6B,SAAA,CAAU,WAAA,CAAY,IAAA;AAAA,MAC1D,OAAA,EAAS,OAAO,cAAA,CAAe,OAAA;AAAA,MAC/B,WAAA,EAAa,MAAA,CAAO,uBAAA,CAAwB,MAAA,CAAO,QAAA,EAAS;AAAA,MAC5D,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EApCiB,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EAEjB,OAAO,WAAW,GAAA,EAKe;AAC/B,IAAA,OAAO,IAAI,4BAAA;AAAA,MACT,GAAA,CAAI,WAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,GAAA,CAAI;AAAA,KACN;AAAA,EACF;AAAA,EAqBA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,cAAc,OAAA,EAAQ;AAEjC,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,uBAAuB,CAAA;AAE/D,MAAA,MAAM,IAAA,CAAK,cAAc,GAAA,CAAI;AAAA,QAC3B,WAAA,EAAa,OAAO,EAAE,OAAA,EAAQ,KAAM;AAClC,UAAA,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,YAClB,OAAO,IAAA,CAAK,cAAA;AAAA,YACZ,cAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,UAAW,CAAA;AAAA,YACnD,QAAA,EAAU,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,OAAO;AAAA,WACxD,CAAA;AAAA,QACH;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,KAAK,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,EACtC;AAAA,EAEQ,wBAAA,GAA2B,CACjC,OAAA,KAC4B;AAC5B,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAEhD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,EAAU,CAAA;AAAA,WAEhE,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,EAAO,QAAA,EAAS;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"KafkaConsumingEventPublisher.cjs.js","sources":["../../src/publisher/KafkaConsumingEventPublisher.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { EventParams, EventsService } from '@backstage/plugin-events-node';\nimport { Consumer, ConsumerSubscribeTopics, IHeaders, Kafka } from 'kafkajs';\nimport { KafkaConsumerConfig } from './config';\n\ntype EventMetadata = EventParams['metadata'];\n\n/**\n * This class subscribes to Kafka topics and publishes events received to the registered subscriber.\n * The message payload will be used as the event payload and passed to the subscribers.\n */\nexport class KafkaConsumingEventPublisher {\n private readonly kafkaConsumer: Consumer;\n private readonly consumerSubscribeTopics: ConsumerSubscribeTopics;\n private readonly backstageTopic: string;\n private readonly logger: LoggerService;\n\n static fromConfig(env: {\n kafkaClient: Kafka;\n config: KafkaConsumerConfig;\n events: EventsService;\n logger: LoggerService;\n }): KafkaConsumingEventPublisher {\n return new KafkaConsumingEventPublisher(\n env.kafkaClient,\n env.logger,\n env.events,\n env.config,\n );\n }\n\n private readonly events: EventsService;\n\n private constructor(\n kafkaClient: Kafka,\n logger: LoggerService,\n events: EventsService,\n config: KafkaConsumerConfig,\n ) {\n this.events = events;\n this.kafkaConsumer = kafkaClient.consumer(config.consumerConfig);\n this.consumerSubscribeTopics = config.consumerSubscribeTopics;\n this.backstageTopic = config.backstageTopic;\n const id = `events.kafka.publisher:${this.backstageTopic}`;\n this.logger = logger.child({\n class: KafkaConsumingEventPublisher.prototype.constructor.name,\n groupId: config.consumerConfig.groupId,\n kafkaTopics: config.consumerSubscribeTopics.topics.toString(),\n backstageTopic: config.backstageTopic,\n taskId: id,\n });\n }\n\n async start(): Promise<void> {\n try {\n await this.kafkaConsumer.connect();\n\n await this.kafkaConsumer.subscribe(this.consumerSubscribeTopics);\n\n await this.kafkaConsumer.run({\n eachMessage: async ({ message }) => {\n this.events.publish({\n topic: this.backstageTopic,\n eventPayload: JSON.parse(message.value?.toString()!),\n metadata: this.convertHeadersToMetadata(message.headers),\n });\n },\n });\n } catch (error: any) {\n this.logger.error('Kafka consumer connection failed ', error);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.kafkaConsumer.disconnect();\n }\n\n private convertHeadersToMetadata = (\n headers: IHeaders | undefined,\n ): EventParams['metadata'] => {\n if (!headers) return undefined;\n\n const metadata: EventMetadata = {};\n\n Object.entries(headers).forEach(([key, value]) => {\n // If value is an array use toString() on all values converting any Buffer types to valid strings\n if (Array.isArray(value)) metadata[key] = value.map(v => v.toString());\n // Always return the values using toString() to catch all Buffer types that should be converted to strings\n else metadata[key] = value?.toString();\n });\n\n return metadata;\n };\n}\n"],"names":[],"mappings":";;AA0BO,MAAM,4BAAA,CAA6B;AAAA,EACvB,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EAEjB,OAAO,WAAW,GAAA,EAKe;AAC/B,IAAA,OAAO,IAAI,4BAAA;AAAA,MACT,GAAA,CAAI,WAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,GAAA,CAAI;AAAA,KACN;AAAA,EACF;AAAA,EAEiB,MAAA;AAAA,EAET,WAAA,CACN,WAAA,EACA,MAAA,EACA,MAAA,EACA,MAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAA,CAAY,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA;AAC/D,IAAA,IAAA,CAAK,0BAA0B,MAAA,CAAO,uBAAA;AACtC,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,CAAA,uBAAA,EAA0B,IAAA,CAAK,cAAc,CAAA,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,KAAA,CAAM;AAAA,MACzB,KAAA,EAAO,4BAAA,CAA6B,SAAA,CAAU,WAAA,CAAY,IAAA;AAAA,MAC1D,OAAA,EAAS,OAAO,cAAA,CAAe,OAAA;AAAA,MAC/B,WAAA,EAAa,MAAA,CAAO,uBAAA,CAAwB,MAAA,CAAO,QAAA,EAAS;AAAA,MAC5D,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,cAAc,OAAA,EAAQ;AAEjC,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,uBAAuB,CAAA;AAE/D,MAAA,MAAM,IAAA,CAAK,cAAc,GAAA,CAAI;AAAA,QAC3B,WAAA,EAAa,OAAO,EAAE,OAAA,EAAQ,KAAM;AAClC,UAAA,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,YAClB,OAAO,IAAA,CAAK,cAAA;AAAA,YACZ,cAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,UAAW,CAAA;AAAA,YACnD,QAAA,EAAU,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,OAAO;AAAA,WACxD,CAAA;AAAA,QACH;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,KAAK,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,CAAK,cAAc,UAAA,EAAW;AAAA,EACtC;AAAA,EAEQ,wBAAA,GAA2B,CACjC,OAAA,KAC4B;AAC5B,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,MAAM,WAA0B,EAAC;AAEjC,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAEhD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,EAAU,CAAA;AAAA,WAEhE,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,EAAO,QAAA,EAAS;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-events-backend-module-kafka",
3
- "version": "0.1.4-next.0",
3
+ "version": "0.1.5-next.0",
4
4
  "description": "The kafka backend module for the events plugin.",
5
5
  "backstage": {
6
6
  "role": "backend-plugin-module",
@@ -38,16 +38,16 @@
38
38
  "test": "backstage-cli package test"
39
39
  },
40
40
  "dependencies": {
41
- "@backstage/backend-plugin-api": "1.4.4-next.0",
42
- "@backstage/config": "1.3.4-next.0",
43
- "@backstage/plugin-events-node": "0.4.16-next.0",
41
+ "@backstage/backend-plugin-api": "1.4.5-next.0",
42
+ "@backstage/config": "1.3.6-next.0",
43
+ "@backstage/plugin-events-node": "0.4.17-next.0",
44
44
  "@backstage/types": "1.2.2",
45
45
  "kafkajs": "^2.2.4"
46
46
  },
47
47
  "devDependencies": {
48
- "@backstage/backend-test-utils": "1.9.1-next.1",
49
- "@backstage/cli": "0.34.4-next.1",
50
- "@backstage/plugin-events-backend-test-utils": "0.1.49-next.0"
48
+ "@backstage/backend-test-utils": "1.10.0-next.0",
49
+ "@backstage/cli": "0.34.5-next.0",
50
+ "@backstage/plugin-events-backend-test-utils": "0.1.50-next.0"
51
51
  },
52
52
  "configSchema": "config.d.ts",
53
53
  "typesVersions": {