From 3d82fb629182edaee11e571ea895a5f8a7456a0e Mon Sep 17 00:00:00 2001 From: Grant Timmerman Date: Mon, 27 Jul 2020 10:25:11 -0700 Subject: [PATCH] refactor: simplify ce version parsers (#274) Signed-off-by: Grant Timmerman --- src/transport/http/binary_receiver.ts | 5 +- src/transport/http/headers.ts | 7 +- src/transport/http/structured_receiver.ts | 6 +- src/transport/http/v03.ts | 47 ------------ src/transport/http/v1.ts | 46 ------------ src/transport/http/versions.ts | 87 +++++++++++++++++++++++ src/transport/index.ts | 2 - 7 files changed, 95 insertions(+), 105 deletions(-) delete mode 100644 src/transport/http/v03.ts delete mode 100644 src/transport/http/v1.ts create mode 100644 src/transport/http/versions.ts diff --git a/src/transport/http/binary_receiver.ts b/src/transport/http/binary_receiver.ts index 91fd579..3c6fb2c 100644 --- a/src/transport/http/binary_receiver.ts +++ b/src/transport/http/binary_receiver.ts @@ -2,8 +2,7 @@ import { CloudEvent, Version } from "../.."; import { CloudEventV1, CloudEventV03 } from "../../event/interfaces"; import { validateV1, validateV03 } from "../../event/spec"; import { Headers, validate } from "./headers"; -import { binaryParsers as v1Parsers } from "./v1"; -import { binaryParsers as v03Parsers } from "./v03"; +import { v03binaryParsers, v1binaryParsers } from "./versions"; import { parserByContentType, MappedParser } from "../../parsers"; import { isString, isBase64, ValidationError, isStringOrObjectOrThrow } from "../../event/validation"; import CONSTANTS from "../../constants"; @@ -52,7 +51,7 @@ export class BinaryHTTPReceiver { const sanitizedHeaders = validate(headers); const eventObj: { [key: string]: unknown | string | Record } = {}; - const parserMap: Record = this.version === Version.V1 ? v1Parsers : v03Parsers; + const parserMap: Record = this.version === Version.V1 ? v1binaryParsers : v03binaryParsers; for (const header in parserMap) { if (sanitizedHeaders[header]) { diff --git a/src/transport/http/headers.ts b/src/transport/http/headers.ts index 8c80074..044aef7 100644 --- a/src/transport/http/headers.ts +++ b/src/transport/http/headers.ts @@ -1,6 +1,5 @@ import { ValidationError, CloudEvent } from "../.."; -import { headerMap as v1Map } from "./v1"; -import { headerMap as v03Map } from "./v03"; +import { v03headerMap, v1headerMap } from "./versions"; import { Version } from "../../event/cloudevent"; import { MappedParser } from "../../parsers"; import CONSTANTS from "../../constants"; @@ -60,9 +59,9 @@ export function headersFor(event: CloudEvent): Headers { const headers: Headers = {}; let headerMap: Readonly<{ [key: string]: MappedParser }>; if (event.specversion === Version.V1) { - headerMap = v1Map; + headerMap = v1headerMap; } else { - headerMap = v03Map; + headerMap = v03headerMap; } // iterate over the event properties - generate a header for each diff --git a/src/transport/http/structured_receiver.ts b/src/transport/http/structured_receiver.ts index 9a073ba..383c5a7 100644 --- a/src/transport/http/structured_receiver.ts +++ b/src/transport/http/structured_receiver.ts @@ -2,8 +2,7 @@ import { CloudEvent, Version } from "../.."; import { Headers, sanitize } from "./headers"; import { Parser, JSONParser, MappedParser } from "../../parsers"; import { parserByContentType } from "../../parsers"; -import { structuredParsers as v1Parsers } from "./v1"; -import { structuredParsers as v03Parsers } from "./v03"; +import { v1structuredParsers, v03structuredParsers } from "./versions"; import { isString, isBase64, ValidationError, isStringOrObjectOrThrow } from "../../event/validation"; import { CloudEventV1, CloudEventV03 } from "../../event/interfaces"; import { validateV1, validateV03 } from "../../event/spec"; @@ -55,7 +54,8 @@ export class StructuredHTTPReceiver { const incoming = { ...(parser.parse(payload) as Record) }; const eventObj: { [key: string]: unknown } = {}; - const parserMap: Record = this.version === Version.V1 ? v1Parsers : v03Parsers; + const parserMap: Record = + this.version === Version.V1 ? v1structuredParsers : v03structuredParsers; for (const key in parserMap) { const property = incoming[key]; diff --git a/src/transport/http/v03.ts b/src/transport/http/v03.ts deleted file mode 100644 index 2390ead..0000000 --- a/src/transport/http/v03.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { MappedParser, DateParser, PassThroughParser } from "../../parsers"; -import CONSTANTS from "../../constants"; - -function parser(header: string, parser = new PassThroughParser()): MappedParser { - return { name: header, parser }; -} - -/** - * A utility Map used to retrieve the header names for a CloudEvent - * using the CloudEvent getter function. - */ -export const headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({ - [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE), - [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT), - [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE), - [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION), - [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE), - [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID), - [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME), - [CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING), - [CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL), -}); - -export const binaryParsers: Record = Object.freeze({ - [CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), - [CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), - [CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), - [CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), - [CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), - [CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL), - [CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), - [CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING), - [CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), -}); - -export const structuredParsers: Record = Object.freeze({ - [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), - [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), - [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), - [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), - [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), - [CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL), - [CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING), - [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), - [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), - [CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA), -}); diff --git a/src/transport/http/v1.ts b/src/transport/http/v1.ts deleted file mode 100644 index 4176c1a..0000000 --- a/src/transport/http/v1.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { PassThroughParser, DateParser, MappedParser } from "../../parsers"; -import CONSTANTS from "../../constants"; - -function parser(name: string, parser = new PassThroughParser()): MappedParser { - return { name: name, parser: parser }; -} - -/** - * A utility Map used to retrieve the header names for a CloudEvent - * using the CloudEvent getter function. - */ -export const headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({ - [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE), - [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT), - [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE), - [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION), - [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE), - [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID), - [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME), - [CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA), -}); - -export const binaryParsers: Record = Object.freeze({ - [CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), - [CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), - [CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), - [CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), - [CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), - [CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA), - [CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), - [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), - [CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), -}); - -export const structuredParsers: Record = Object.freeze({ - [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), - [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), - [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), - [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), - [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), - [CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA), - [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), - [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), - [CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA), - [CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64), -}); diff --git a/src/transport/http/versions.ts b/src/transport/http/versions.ts new file mode 100644 index 0000000..70ddc56 --- /dev/null +++ b/src/transport/http/versions.ts @@ -0,0 +1,87 @@ +import { PassThroughParser, DateParser, MappedParser } from "../../parsers"; +import CONSTANTS from "../../constants"; + +function parser(name: string, parser = new PassThroughParser()): MappedParser { + return { name: name, parser: parser }; +} + +/** + * A utility Map used to retrieve the header names for a CloudEvent + * using the CloudEvent getter function. + */ +export const v1headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({ + [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE), + [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT), + [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE), + [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION), + [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE), + [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID), + [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME), + [CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA), +}); + +export const v1binaryParsers: Record = Object.freeze({ + [CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), + [CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), + [CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), + [CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), + [CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), + [CONSTANTS.BINARY_HEADERS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA), + [CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), + [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), + [CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), +}); + +export const v1structuredParsers: Record = Object.freeze({ + [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), + [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), + [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), + [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), + [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), + [CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_SCHEMA), + [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), + [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), + [CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA), + [CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64]: parser(CONSTANTS.STRUCTURED_ATTRS_1.DATA_BASE64), +}); + +/** + * A utility Map used to retrieve the header names for a CloudEvent + * using the CloudEvent getter function. + */ +export const v03headerMap: Readonly<{ [key: string]: MappedParser }> = Object.freeze({ + [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.HEADER_CONTENT_TYPE), + [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_HEADERS.SUBJECT), + [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_HEADERS.TYPE), + [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_HEADERS.SPEC_VERSION), + [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_HEADERS.SOURCE), + [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_HEADERS.ID), + [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_HEADERS.TIME), + [CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING), + [CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL), +}); + +export const v03binaryParsers: Record = Object.freeze({ + [CONSTANTS.CE_HEADERS.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), + [CONSTANTS.CE_HEADERS.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), + [CONSTANTS.CE_HEADERS.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), + [CONSTANTS.CE_HEADERS.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), + [CONSTANTS.CE_HEADERS.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), + [CONSTANTS.BINARY_HEADERS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL), + [CONSTANTS.CE_HEADERS.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), + [CONSTANTS.BINARY_HEADERS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING), + [CONSTANTS.HEADER_CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), +}); + +export const v03structuredParsers: Record = Object.freeze({ + [CONSTANTS.CE_ATTRIBUTES.TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.TYPE), + [CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION]: parser(CONSTANTS.CE_ATTRIBUTES.SPEC_VERSION), + [CONSTANTS.CE_ATTRIBUTES.SOURCE]: parser(CONSTANTS.CE_ATTRIBUTES.SOURCE), + [CONSTANTS.CE_ATTRIBUTES.ID]: parser(CONSTANTS.CE_ATTRIBUTES.ID), + [CONSTANTS.CE_ATTRIBUTES.TIME]: parser(CONSTANTS.CE_ATTRIBUTES.TIME, new DateParser()), + [CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL]: parser(CONSTANTS.STRUCTURED_ATTRS_03.SCHEMA_URL), + [CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING]: parser(CONSTANTS.STRUCTURED_ATTRS_03.CONTENT_ENCODING), + [CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE]: parser(CONSTANTS.CE_ATTRIBUTES.CONTENT_TYPE), + [CONSTANTS.CE_ATTRIBUTES.SUBJECT]: parser(CONSTANTS.CE_ATTRIBUTES.SUBJECT), + [CONSTANTS.CE_ATTRIBUTES.DATA]: parser(CONSTANTS.CE_ATTRIBUTES.DATA), +}); diff --git a/src/transport/index.ts b/src/transport/index.ts index 8a07728..24c5755 100644 --- a/src/transport/index.ts +++ b/src/transport/index.ts @@ -1,6 +1,4 @@ export * from "./emitter"; export * from "./receiver"; -export * as v1Headers from "./http/v1"; -export * as v03Headers from "./http/v03"; export * as http from "./http/headers"; export * from "./protocols";