From f475cdfd7ee7e80a375b997ba2f41b1655a44a03 Mon Sep 17 00:00:00 2001 From: Alex Tennant Date: Wed, 2 Apr 2025 17:14:50 +0100 Subject: [PATCH 1/2] fix: add generics to `Binding` type (#604) Fixes: https://github.com/cloudevents/sdk-javascript/issues/487 Signed-off-by: Alex Tennant --- src/message/index.ts | 10 +++++----- src/message/kafka/index.ts | 22 +++++++++++----------- src/message/mqtt/index.ts | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/message/index.ts b/src/message/index.ts index bf1dd5c9..4eda7320 100644 --- a/src/message/index.ts +++ b/src/message/index.ts @@ -22,9 +22,9 @@ export * from "./mqtt"; * @property {@link Deserializer} `toEvent` - converts a Message into a CloudEvent * @property {@link Detector} `isEvent` - determines if a Message can be converted to a CloudEvent */ -export interface Binding { - binary: Serializer; - structured: Serializer; +export interface Binding { + binary: Serializer; + structured: Serializer; toEvent: Deserializer; isEvent: Detector; } @@ -65,8 +65,8 @@ export enum Mode { * CloudEvent into a Message. * @interface */ -export interface Serializer { - (event: CloudEventV1): Message; +export interface Serializer { + (event: CloudEventV1): M; } /** diff --git a/src/message/kafka/index.ts b/src/message/kafka/index.ts index 85f3eeca..83ade52a 100644 --- a/src/message/kafka/index.ts +++ b/src/message/kafka/index.ts @@ -22,7 +22,7 @@ export type { * Bindings for Kafka transport * @implements {@linkcode Binding} */ - const Kafka: Binding = { + const Kafka: Binding, KafkaMessage> = { binary: toBinaryKafkaMessage, structured: toStructuredKafkaMessage, toEvent: deserializeKafkaMessage, @@ -35,9 +35,9 @@ type Key = string | Buffer; * Extends the base Message type to include * Kafka-specific fields */ -interface KafkaMessage extends Message { +interface KafkaMessage extends Message { key: Key - value: T | string | Buffer | unknown + value: T timestamp?: string } @@ -61,7 +61,7 @@ interface KafkaEvent extends CloudEventV1 { * @param {KafkaEvent} event The event to serialize * @returns {KafkaMessage} a KafkaMessage instance */ -function toBinaryKafkaMessage(event: CloudEventV1): KafkaMessage { +function toBinaryKafkaMessage(event: CloudEventV1): KafkaMessage { // 3.2.1. Content Type // For the binary mode, the header content-type property MUST be mapped directly // to the CloudEvents datacontenttype attribute. @@ -86,7 +86,7 @@ function toBinaryKafkaMessage(event: CloudEventV1): KafkaMessage { * @param {CloudEvent} event the CloudEvent to be serialized * @returns {KafkaMessage} a KafkaMessage instance */ - function toStructuredKafkaMessage(event: CloudEventV1): KafkaMessage { + function toStructuredKafkaMessage(event: CloudEventV1): KafkaMessage { if ((event instanceof CloudEvent) && event.data_base64) { // The event's data is binary - delete it event = event.cloneWith({ data: undefined }); @@ -130,9 +130,9 @@ function deserializeKafkaMessage(message: Message): CloudEvent | CloudEven case Mode.BINARY: return parseBinary(m); case Mode.STRUCTURED: - return parseStructured(m); + return parseStructured(m as unknown as KafkaMessage); case Mode.BATCH: - return parseBatched(m); + return parseBatched(m as unknown as KafkaMessage); default: throw new ValidationError("Unknown Message mode"); } @@ -212,14 +212,14 @@ function parseBinary(message: KafkaMessage): CloudEvent { * @param {KafkaMessage} message the message * @returns {CloudEvent} a KafkaEvent */ -function parseStructured(message: KafkaMessage): CloudEvent { +function parseStructured(message: KafkaMessage): CloudEvent { // Although the format of a structured encoded event could be something // other than JSON, e.g. XML, we currently only support JSON // encoded structured events. if (!message.headers[CONSTANTS.HEADER_CONTENT_TYPE]?.startsWith(CONSTANTS.MIME_CE_JSON)) { throw new ValidationError(`Unsupported event encoding ${message.headers[CONSTANTS.HEADER_CONTENT_TYPE]}`); } - const eventObj = JSON.parse(message.value as string); + const eventObj = JSON.parse(message.value); eventObj.time = new Date(eventObj.time).toISOString(); return new CloudEvent({ ...eventObj, @@ -232,14 +232,14 @@ function parseStructured(message: KafkaMessage): CloudEvent { * @param {KafkaMessage} message the message * @returns {CloudEvent[]} an array of KafkaEvent */ -function parseBatched(message: KafkaMessage): CloudEvent[] { +function parseBatched(message: KafkaMessage): CloudEvent[] { // Although the format of batch encoded events could be something // other than JSON, e.g. XML, we currently only support JSON // encoded structured events. if (!message.headers[CONSTANTS.HEADER_CONTENT_TYPE]?.startsWith(CONSTANTS.MIME_CE_BATCH)) { throw new ValidationError(`Unsupported event encoding ${message.headers[CONSTANTS.HEADER_CONTENT_TYPE]}`); } - const events = JSON.parse(message.value as string) as Record[]; + const events = JSON.parse(message.value) as Record[]; return events.map((e) => new CloudEvent({ ...e, partitionkey: message.key }, false)); } diff --git a/src/message/mqtt/index.ts b/src/message/mqtt/index.ts index 3eee93f7..f576c567 100644 --- a/src/message/mqtt/index.ts +++ b/src/message/mqtt/index.ts @@ -15,7 +15,7 @@ export type { MQTTMessage }; * Extends the base {@linkcode Message} interface to include MQTT attributes, some of which * are aliases of the {Message} attributes. */ -interface MQTTMessage extends Message { +interface MQTTMessage extends Message { /** * Identifies this message as a PUBLISH packet. MQTTMessages created with * the `binary` and `structured` Serializers will contain a "Content Type" @@ -37,7 +37,7 @@ interface MQTTMessage extends Message { * Binding for MQTT transport support * @implements @linkcode Binding */ -const MQTT: Binding = { +const MQTT: Binding = { binary, structured, toEvent: toEvent as Deserializer, From c07afa9b774deefa137a960d2d11adee0bf3674a Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 2 Apr 2025 12:17:04 -0400 Subject: [PATCH 2/2] chore(main): release 8.0.3 (#606) Signed-off-by: Lucas Holmquist --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dac6d56e..0cf04d94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [8.0.3](https://github.com/cloudevents/sdk-javascript/compare/v8.0.2...v8.0.3) (2025-04-02) + + +### Bug Fixes + +* add generics to `Binding` type ([#604](https://github.com/cloudevents/sdk-javascript/issues/604)) ([f475cdf](https://github.com/cloudevents/sdk-javascript/commit/f475cdfd7ee7e80a375b997ba2f41b1655a44a03)) + ## [8.0.2](https://github.com/cloudevents/sdk-javascript/compare/v8.0.1...v8.0.2) (2024-07-22) diff --git a/package-lock.json b/package-lock.json index e3002512..50f3b037 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cloudevents", - "version": "8.0.2", + "version": "8.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cloudevents", - "version": "8.0.2", + "version": "8.0.3", "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", diff --git a/package.json b/package.json index b1dc715d..35ea3174 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloudevents", - "version": "8.0.2", + "version": "8.0.3", "description": "CloudEvents SDK for JavaScript", "main": "dist/index.js", "scripts": {