Skip to content

Commit 3d82fb6

Browse files
authored
refactor: simplify ce version parsers (#274)
Signed-off-by: Grant Timmerman <timmerman+devrel@google.com>
1 parent 3c8273f commit 3d82fb6

File tree

7 files changed

+95
-105
lines changed

7 files changed

+95
-105
lines changed

src/transport/http/binary_receiver.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { CloudEvent, Version } from "../..";
22
import { CloudEventV1, CloudEventV03 } from "../../event/interfaces";
33
import { validateV1, validateV03 } from "../../event/spec";
44
import { Headers, validate } from "./headers";
5-
import { binaryParsers as v1Parsers } from "./v1";
6-
import { binaryParsers as v03Parsers } from "./v03";
5+
import { v03binaryParsers, v1binaryParsers } from "./versions";
76
import { parserByContentType, MappedParser } from "../../parsers";
87
import { isString, isBase64, ValidationError, isStringOrObjectOrThrow } from "../../event/validation";
98
import CONSTANTS from "../../constants";
@@ -52,7 +51,7 @@ export class BinaryHTTPReceiver {
5251
const sanitizedHeaders = validate(headers);
5352

5453
const eventObj: { [key: string]: unknown | string | Record<string, unknown> } = {};
55-
const parserMap: Record<string, MappedParser> = this.version === Version.V1 ? v1Parsers : v03Parsers;
54+
const parserMap: Record<string, MappedParser> = this.version === Version.V1 ? v1binaryParsers : v03binaryParsers;
5655

5756
for (const header in parserMap) {
5857
if (sanitizedHeaders[header]) {

src/transport/http/headers.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { ValidationError, CloudEvent } from "../..";
2-
import { headerMap as v1Map } from "./v1";
3-
import { headerMap as v03Map } from "./v03";
2+
import { v03headerMap, v1headerMap } from "./versions";
43
import { Version } from "../../event/cloudevent";
54
import { MappedParser } from "../../parsers";
65
import CONSTANTS from "../../constants";
@@ -60,9 +59,9 @@ export function headersFor(event: CloudEvent): Headers {
6059
const headers: Headers = {};
6160
let headerMap: Readonly<{ [key: string]: MappedParser }>;
6261
if (event.specversion === Version.V1) {
63-
headerMap = v1Map;
62+
headerMap = v1headerMap;
6463
} else {
65-
headerMap = v03Map;
64+
headerMap = v03headerMap;
6665
}
6766

6867
// iterate over the event properties - generate a header for each

src/transport/http/structured_receiver.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { CloudEvent, Version } from "../..";
22
import { Headers, sanitize } from "./headers";
33
import { Parser, JSONParser, MappedParser } from "../../parsers";
44
import { parserByContentType } from "../../parsers";
5-
import { structuredParsers as v1Parsers } from "./v1";
6-
import { structuredParsers as v03Parsers } from "./v03";
5+
import { v1structuredParsers, v03structuredParsers } from "./versions";
76
import { isString, isBase64, ValidationError, isStringOrObjectOrThrow } from "../../event/validation";
87
import { CloudEventV1, CloudEventV03 } from "../../event/interfaces";
98
import { validateV1, validateV03 } from "../../event/spec";
@@ -55,7 +54,8 @@ export class StructuredHTTPReceiver {
5554
const incoming = { ...(parser.parse(payload) as Record<string, unknown>) };
5655

5756
const eventObj: { [key: string]: unknown } = {};
58-
const parserMap: Record<string, MappedParser> = this.version === Version.V1 ? v1Parsers : v03Parsers;
57+
const parserMap: Record<string, MappedParser> =
58+
this.version === Version.V1 ? v1structuredParsers : v03structuredParsers;
5959

6060
for (const key in parserMap) {
6161
const property = incoming[key];

src/transport/http/v03.ts

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/transport/http/v1.ts

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/transport/http/versions.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { PassThroughParser, DateParser, MappedParser } from "../../parsers";
2+
import CONSTANTS from "../../constants";
3+
4+
function parser(name: string, parser = new PassThroughParser()): MappedParser {
5+
return { name: name, parser: parser };
6+
}
7+
8+
/**
9+
* A utility Map used to retrieve the header names for a CloudEvent
10+
* using the CloudEvent getter function.
11+
*/
12+
export const v1headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({
13+
[CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE),
14+
[CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT),
15+
[CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE),
16+
[CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION),
17+
[CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE),
18+
[CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID),
19+
[CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME),
20+
[CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA),
21+
});
22+
23+
export const v1binaryParsers: Record<string, MappedParser> = Object.freeze({
24+
[CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE),
25+
[CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION),
26+
[CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE),
27+
[CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID),
28+
[CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()),
29+
[CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA),
30+
[CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT),
31+
[CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE),
32+
[CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE),
33+
});
34+
35+
export const v1structuredParsers: Record<string, MappedParser> = Object.freeze({
36+
[CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE),
37+
[CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION),
38+
[CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE),
39+
[CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID),
40+
[CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()),
41+
[CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA),
42+
[CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE),
43+
[CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT),
44+
[CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA),
45+
[CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64),
46+
});
47+
48+
/**
49+
* A utility Map used to retrieve the header names for a CloudEvent
50+
* using the CloudEvent getter function.
51+
*/
52+
export const v03headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({
53+
[CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE),
54+
[CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT),
55+
[CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE),
56+
[CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION),
57+
[CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE),
58+
[CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID),
59+
[CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME),
60+
[CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING),
61+
[CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL),
62+
});
63+
64+
export const v03binaryParsers: Record<string, MappedParser> = Object.freeze({
65+
[CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE),
66+
[CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION),
67+
[CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE),
68+
[CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID),
69+
[CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()),
70+
[CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL),
71+
[CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT),
72+
[CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING),
73+
[CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE),
74+
});
75+
76+
export const v03structuredParsers: Record<string, MappedParser> = Object.freeze({
77+
[CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE),
78+
[CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION),
79+
[CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE),
80+
[CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID),
81+
[CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()),
82+
[CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL),
83+
[CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING),
84+
[CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE),
85+
[CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT),
86+
[CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA),
87+
});

src/transport/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
export * from "./emitter";
22
export * from "./receiver";
3-
export * as v1Headers from "./http/v1";
4-
export * as v03Headers from "./http/v03";
53
export * as http from "./http/headers";
64
export * from "./protocols";

0 commit comments

Comments
 (0)