Skip to content

Commit a6124cc

Browse files
authored
refactor: simplify parser logic and duplicated code (#269)
Signed-off-by: Grant Timmerman <timmerman+devrel@google.com>
1 parent 9ae32c7 commit a6124cc

File tree

9 files changed

+80
-102
lines changed

9 files changed

+80
-102
lines changed

src/parsers.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import CONSTANTS from "./constants";
2+
import { isString, isDefinedOrThrow, isStringOrObjectOrThrow, ValidationError } from "./event/validation";
3+
4+
export abstract class Parser {
5+
abstract parse(payload: Record<string, unknown> | string): unknown;
6+
}
7+
8+
export class JSONParser implements Parser {
9+
decorator?: Base64Parser;
10+
constructor(decorator?: Base64Parser) {
11+
this.decorator = decorator;
12+
}
13+
14+
/**
15+
* Parses the payload with an optional decorator
16+
* @param {object|string} payload the JSON payload
17+
* @return {object} the parsed JSON payload.
18+
*/
19+
parse(payload: Record<string, unknown> | string): string {
20+
if (this.decorator) {
21+
payload = this.decorator.parse(payload);
22+
}
23+
24+
isDefinedOrThrow(payload, new ValidationError("null or undefined payload"));
25+
isStringOrObjectOrThrow(payload, new ValidationError("invalid payload type, allowed are: string or object"));
26+
const parseJSON = (v: Record<string, unknown> | string): string => (isString(v) ? JSON.parse(v as string) : v);
27+
return parseJSON(payload);
28+
}
29+
}
30+
31+
export class PassThroughParser extends Parser {
32+
parse(payload: unknown): unknown {
33+
return payload;
34+
}
35+
}
36+
37+
const jsonParser = new JSONParser();
38+
export const parserByContentType: { [key: string]: Parser } = {
39+
[CONSTANTS.MIME_JSON]: jsonParser,
40+
[CONSTANTS.MIME_CE_JSON]: jsonParser,
41+
[CONSTANTS.DEFAULT_CONTENT_TYPE]: jsonParser,
42+
[CONSTANTS.DEFAULT_CE_CONTENT_TYPE]: jsonParser,
43+
[CONSTANTS.MIME_OCTET_STREAM]: new PassThroughParser(),
44+
};
45+
46+
export class Base64Parser implements Parser {
47+
decorator?: Parser;
48+
49+
constructor(decorator?: Parser) {
50+
this.decorator = decorator;
51+
}
52+
53+
parse(payload: Record<string, unknown> | string): string {
54+
let payloadToParse = payload;
55+
if (this.decorator) {
56+
payloadToParse = this.decorator.parse(payload) as string;
57+
}
58+
59+
return Buffer.from(payloadToParse as string, "base64").toString();
60+
}
61+
}
62+
63+
export interface MappedParser {
64+
name: string;
65+
parser: Parser;
66+
}
67+
68+
export class DateParser extends Parser {
69+
parse(payload: string): Date {
70+
return new Date(Date.parse(payload));
71+
}
72+
}
73+
74+
export const parserByEncoding: { [key: string]: { [key: string]: Parser } } = {
75+
base64: {
76+
[CONSTANTS.MIME_CE_JSON]: new JSONParser(new Base64Parser()),
77+
[CONSTANTS.MIME_OCTET_STREAM]: new PassThroughParser(),
78+
},
79+
};

src/parsers/base64.ts

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

src/parsers/date.ts

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

src/parsers/index.ts

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

src/parsers/json.ts

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

src/parsers/mapped.ts

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

src/parsers/parser.ts

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

src/parsers/pass_through.ts

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

test/integration/parser_test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import "mocha";
22
import { expect } from "chai";
33

4-
import { JSONParser as Parser } from "../../src/parsers/";
4+
import { JSONParser as Parser } from "../../src/parsers";
55
import { ValidationError } from "../../src/";
66

77
describe("JSON Event Format Parser", () => {

0 commit comments

Comments
 (0)