Skip to content

Commit 8ac3eb0

Browse files
authored
refactor: validate cloudevent version agnostic (cloudevents#311)
Signed-off-by: Grant Timmerman <timmerman+devrel@google.com>
1 parent 81623ac commit 8ac3eb0

File tree

4 files changed

+19
-22
lines changed

4 files changed

+19
-22
lines changed

Diff for: src/event/cloudevent.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
CloudEventV1Attributes,
99
CloudEventV1OptionalAttributes,
1010
} from "./interfaces";
11-
import { validateV1, validateV03 } from "./spec";
11+
import { validateCloudEvent } from "./spec";
1212
import { ValidationError, isBinary, asBase64, isValidType } from "./validation";
1313
import CONSTANTS from "../constants";
1414
import { isString } from "util";
@@ -174,12 +174,7 @@ export class CloudEvent implements CloudEventV1, CloudEventV03 {
174174
*/
175175
public validate(): boolean {
176176
try {
177-
if (this.specversion === Version.V1) {
178-
return validateV1(this);
179-
} else if (this.specversion === Version.V03) {
180-
return validateV03(this);
181-
}
182-
throw new ValidationError("invalid payload");
177+
return validateCloudEvent(this);
183178
} catch (e) {
184179
if (e instanceof ValidationError) {
185180
throw e;

Diff for: src/event/spec.ts

+13-11
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,26 @@ import { ValidationError, isBase64 } from "./validation";
33

44
import { CloudEventV1, CloudEventV03 } from "./interfaces";
55
import { schemaV03, schemaV1 } from "./schemas";
6+
import { Version } from "./cloudevent";
67
import CONSTANTS from "../constants";
78

89
const ajv = new Ajv({ extendRefs: true });
910
const isValidAgainstSchemaV1 = ajv.compile(schemaV1);
1011
const isValidAgainstSchemaV03 = ajv.compile(schemaV03);
1112

12-
export function validateV1(event: CloudEventV1): boolean {
13-
if (!isValidAgainstSchemaV1(event)) {
14-
throw new ValidationError("invalid payload", isValidAgainstSchemaV1.errors);
15-
}
16-
return true;
17-
}
18-
19-
export function validateV03(event: CloudEventV03): boolean {
20-
if (!isValidAgainstSchemaV03(event)) {
21-
throw new ValidationError("invalid payload", isValidAgainstSchemaV03.errors);
13+
export function validateCloudEvent(event: CloudEventV03 | CloudEventV1): boolean {
14+
if (event.specversion === Version.V1) {
15+
if (!isValidAgainstSchemaV1(event)) {
16+
throw new ValidationError("invalid payload", isValidAgainstSchemaV1.errors);
17+
}
18+
return true;
19+
} else if (event.specversion === Version.V03) {
20+
if (!isValidAgainstSchemaV03(event)) {
21+
throw new ValidationError("invalid payload", isValidAgainstSchemaV03.errors);
22+
}
23+
return checkDataContentEncoding(event);
2224
}
23-
return checkDataContentEncoding(event);
25+
return false;
2426
}
2527

2628
function checkDataContentEncoding(event: CloudEventV03): boolean {

Diff for: src/transport/http/binary_receiver.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CloudEvent, Version } from "../..";
22
import { CloudEventV1, CloudEventV03 } from "../../event/interfaces";
3-
import { validateV1, validateV03 } from "../../event/spec";
3+
import { validateCloudEvent } from "../../event/spec";
44
import { Headers, validate } from "./headers";
55
import { v03binaryParsers, v1binaryParsers } from "./versions";
66
import { parserByContentType, MappedParser } from "../../parsers";
@@ -88,7 +88,7 @@ export class BinaryHTTPReceiver {
8888
}
8989

9090
const cloudevent = new CloudEvent({ ...eventObj, data: parsedPayload } as CloudEventV1 | CloudEventV03);
91-
this.version === Version.V1 ? validateV1(cloudevent) : validateV03(cloudevent);
91+
validateCloudEvent(cloudevent);
9292
return cloudevent;
9393
}
9494
}

Diff for: src/transport/http/structured_receiver.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { parserByContentType } from "../../parsers";
55
import { v1structuredParsers, v03structuredParsers } from "./versions";
66
import { isString, isBase64, ValidationError, isStringOrObjectOrThrow } from "../../event/validation";
77
import { CloudEventV1, CloudEventV03 } from "../../event/interfaces";
8-
import { validateV1, validateV03 } from "../../event/spec";
8+
import { validateCloudEvent } from "../../event/spec";
99
import CONSTANTS from "../../constants";
1010

1111
/**
@@ -85,7 +85,7 @@ export class StructuredHTTPReceiver {
8585
const cloudevent = new CloudEvent(eventObj as CloudEventV1 | CloudEventV03);
8686

8787
// Validates the event
88-
this.version === Version.V1 ? validateV1(cloudevent) : validateV03(cloudevent);
88+
validateCloudEvent(cloudevent);
8989
return cloudevent;
9090
}
9191
}

0 commit comments

Comments
 (0)