Skip to content

Commit f475cdf

Browse files
authored
fix: add generics to Binding type (#604)
Fixes: #487 Signed-off-by: Alex Tennant <[email protected]>
1 parent 8357719 commit f475cdf

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

src/message/index.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ export * from "./mqtt";
2222
* @property {@link Deserializer} `toEvent` - converts a Message into a CloudEvent
2323
* @property {@link Detector} `isEvent` - determines if a Message can be converted to a CloudEvent
2424
*/
25-
export interface Binding {
26-
binary: Serializer;
27-
structured: Serializer;
25+
export interface Binding<B extends Message = Message, S extends Message = Message> {
26+
binary: Serializer<B>;
27+
structured: Serializer<S>;
2828
toEvent: Deserializer;
2929
isEvent: Detector;
3030
}
@@ -65,8 +65,8 @@ export enum Mode {
6565
* CloudEvent into a Message.
6666
* @interface
6767
*/
68-
export interface Serializer {
69-
<T>(event: CloudEventV1<T>): Message;
68+
export interface Serializer<M extends Message> {
69+
<T>(event: CloudEventV1<T>): M;
7070
}
7171

7272
/**

src/message/kafka/index.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export type {
2222
* Bindings for Kafka transport
2323
* @implements {@linkcode Binding}
2424
*/
25-
const Kafka: Binding = {
25+
const Kafka: Binding<KafkaMessage<unknown>, KafkaMessage<string>> = {
2626
binary: toBinaryKafkaMessage,
2727
structured: toStructuredKafkaMessage,
2828
toEvent: deserializeKafkaMessage,
@@ -35,9 +35,9 @@ type Key = string | Buffer;
3535
* Extends the base Message type to include
3636
* Kafka-specific fields
3737
*/
38-
interface KafkaMessage<T = string> extends Message {
38+
interface KafkaMessage<T = string | Buffer | unknown> extends Message {
3939
key: Key
40-
value: T | string | Buffer | unknown
40+
value: T
4141
timestamp?: string
4242
}
4343

@@ -61,7 +61,7 @@ interface KafkaEvent<T> extends CloudEventV1<T> {
6161
* @param {KafkaEvent<T>} event The event to serialize
6262
* @returns {KafkaMessage<T>} a KafkaMessage instance
6363
*/
64-
function toBinaryKafkaMessage<T>(event: CloudEventV1<T>): KafkaMessage<T> {
64+
function toBinaryKafkaMessage<T>(event: CloudEventV1<T>): KafkaMessage<T | undefined> {
6565
// 3.2.1. Content Type
6666
// For the binary mode, the header content-type property MUST be mapped directly
6767
// to the CloudEvents datacontenttype attribute.
@@ -86,7 +86,7 @@ function toBinaryKafkaMessage<T>(event: CloudEventV1<T>): KafkaMessage<T> {
8686
* @param {CloudEvent<T>} event the CloudEvent to be serialized
8787
* @returns {KafkaMessage<T>} a KafkaMessage instance
8888
*/
89-
function toStructuredKafkaMessage<T>(event: CloudEventV1<T>): KafkaMessage<T> {
89+
function toStructuredKafkaMessage<T>(event: CloudEventV1<T>): KafkaMessage<string> {
9090
if ((event instanceof CloudEvent) && event.data_base64) {
9191
// The event's data is binary - delete it
9292
event = event.cloneWith({ data: undefined });
@@ -130,9 +130,9 @@ function deserializeKafkaMessage<T>(message: Message): CloudEvent<T> | CloudEven
130130
case Mode.BINARY:
131131
return parseBinary(m);
132132
case Mode.STRUCTURED:
133-
return parseStructured(m);
133+
return parseStructured(m as unknown as KafkaMessage<string>);
134134
case Mode.BATCH:
135-
return parseBatched(m);
135+
return parseBatched(m as unknown as KafkaMessage<string>);
136136
default:
137137
throw new ValidationError("Unknown Message mode");
138138
}
@@ -212,14 +212,14 @@ function parseBinary<T>(message: KafkaMessage<T>): CloudEvent<T> {
212212
* @param {KafkaMessage<T>} message the message
213213
* @returns {CloudEvent<T>} a KafkaEvent<T>
214214
*/
215-
function parseStructured<T>(message: KafkaMessage<T>): CloudEvent<T> {
215+
function parseStructured<T>(message: KafkaMessage<string>): CloudEvent<T> {
216216
// Although the format of a structured encoded event could be something
217217
// other than JSON, e.g. XML, we currently only support JSON
218218
// encoded structured events.
219219
if (!message.headers[CONSTANTS.HEADER_CONTENT_TYPE]?.startsWith(CONSTANTS.MIME_CE_JSON)) {
220220
throw new ValidationError(`Unsupported event encoding ${message.headers[CONSTANTS.HEADER_CONTENT_TYPE]}`);
221221
}
222-
const eventObj = JSON.parse(message.value as string);
222+
const eventObj = JSON.parse(message.value);
223223
eventObj.time = new Date(eventObj.time).toISOString();
224224
return new CloudEvent({
225225
...eventObj,
@@ -232,14 +232,14 @@ function parseStructured<T>(message: KafkaMessage<T>): CloudEvent<T> {
232232
* @param {KafkaMessage<T>} message the message
233233
* @returns {CloudEvent<T>[]} an array of KafkaEvent<T>
234234
*/
235-
function parseBatched<T>(message: KafkaMessage<T>): CloudEvent<T>[] {
235+
function parseBatched<T>(message: KafkaMessage<string>): CloudEvent<T>[] {
236236
// Although the format of batch encoded events could be something
237237
// other than JSON, e.g. XML, we currently only support JSON
238238
// encoded structured events.
239239
if (!message.headers[CONSTANTS.HEADER_CONTENT_TYPE]?.startsWith(CONSTANTS.MIME_CE_BATCH)) {
240240
throw new ValidationError(`Unsupported event encoding ${message.headers[CONSTANTS.HEADER_CONTENT_TYPE]}`);
241241
}
242-
const events = JSON.parse(message.value as string) as Record<string, unknown>[];
242+
const events = JSON.parse(message.value) as Record<string, unknown>[];
243243
return events.map((e) => new CloudEvent({ ...e, partitionkey: message.key }, false));
244244
}
245245

src/message/mqtt/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type { MQTTMessage };
1515
* Extends the base {@linkcode Message} interface to include MQTT attributes, some of which
1616
* are aliases of the {Message} attributes.
1717
*/
18-
interface MQTTMessage<T> extends Message<T> {
18+
interface MQTTMessage<T = unknown> extends Message<T> {
1919
/**
2020
* Identifies this message as a PUBLISH packet. MQTTMessages created with
2121
* the `binary` and `structured` Serializers will contain a "Content Type"
@@ -37,7 +37,7 @@ interface MQTTMessage<T> extends Message<T> {
3737
* Binding for MQTT transport support
3838
* @implements @linkcode Binding
3939
*/
40-
const MQTT: Binding = {
40+
const MQTT: Binding<MQTTMessage, MQTTMessage> = {
4141
binary,
4242
structured,
4343
toEvent: toEvent as Deserializer,

0 commit comments

Comments
 (0)