lib: change Receiver#accept() to be static Receiver.accept (#271)

Note that I did not add a third `Protocol` parameter to `Receiver.accept` since
that would not currently be used. It's non-breaking to add a third parameter
in the future once additional protocols are supported.

Fixes: https://github.com/cloudevents/sdk-javascript/issues/266
Fixes: https://github.com/cloudevents/sdk-javascript/issues/261

BREAKING CHANGE

Signed-off-by: Lance Ball <lball@redhat.com>
This commit is contained in:
Lance Ball 2020-07-24 15:07:46 -04:00 committed by GitHub
parent 565f867424
commit 9ae32c76cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 52 deletions

View File

@ -4,7 +4,6 @@ import { BinaryHTTPReceiver as BinaryReceiver } from "./http/binary_receiver";
import { StructuredHTTPReceiver as StructuredReceiver } from "./http/structured_receiver"; import { StructuredHTTPReceiver as StructuredReceiver } from "./http/structured_receiver";
import { CloudEventV03 } from "../event/v03"; import { CloudEventV03 } from "../event/v03";
import { CloudEventV1 } from "../event/v1"; import { CloudEventV1 } from "../event/v1";
import { Protocol } from "./protocols";
import CONSTANTS from "../constants"; import CONSTANTS from "../constants";
/** /**
@ -15,42 +14,21 @@ export enum Mode {
STRUCTURED = "structured", STRUCTURED = "structured",
} }
const receivers = {
v1: {
structured: new StructuredReceiver(Version.V1),
binary: new BinaryReceiver(Version.V1),
},
v03: {
structured: new StructuredReceiver(Version.V03),
binary: new BinaryReceiver(Version.V03),
},
};
/** /**
* A class to receive a CloudEvent from an HTTP POST request. * A class to receive a CloudEvent from an HTTP POST request.
*/ */
export class Receiver { export class Receiver {
protocol: Protocol;
receivers: {
v1: {
structured: StructuredReceiver;
binary: BinaryReceiver;
[key: string]: unknown;
};
v03: {
structured: StructuredReceiver;
binary: BinaryReceiver;
[key: string]: unknown;
};
};
/**
* Create an instance of an HTTPReceiver to accept incoming CloudEvents.
* @param {Protocol} protocol the transport protocol - currently only Protocol.HTTP is supported
*/
constructor(protocol: Protocol = Protocol.HTTP) {
// currently unused, but reserved for future protocol implementations
this.protocol = protocol;
this.receivers = {
v1: {
structured: new StructuredReceiver(Version.V1),
binary: new BinaryReceiver(Version.V1),
},
v03: {
structured: new StructuredReceiver(Version.V03),
binary: new BinaryReceiver(Version.V03),
},
};
}
/** /**
* Acceptor for an incoming HTTP CloudEvent POST. Can process * Acceptor for an incoming HTTP CloudEvent POST. Can process
* binary and structured incoming CloudEvents. * binary and structured incoming CloudEvents.
@ -59,7 +37,7 @@ export class Receiver {
* @param {Object|JSON} body The body of the HTTP request * @param {Object|JSON} body The body of the HTTP request
* @return {CloudEvent} A new {CloudEvent} instance * @return {CloudEvent} A new {CloudEvent} instance
*/ */
accept( static accept(
headers: Headers, headers: Headers,
body: string | Record<string, unknown> | CloudEventV1 | CloudEventV03 | undefined | null, body: string | Record<string, unknown> | CloudEventV1 | CloudEventV03 | undefined | null,
): CloudEvent { ): CloudEvent {
@ -68,12 +46,12 @@ export class Receiver {
const version = getVersion(mode, cleanHeaders, body); const version = getVersion(mode, cleanHeaders, body);
switch (version) { switch (version) {
case Version.V1: case Version.V1:
return this.receivers.v1[mode].parse(body, headers); return receivers.v1[mode].parse(body, headers);
case Version.V03: case Version.V03:
return this.receivers.v03[mode].parse(body, headers); return receivers.v03[mode].parse(body, headers);
default: default:
console.error(`Unknown spec version ${version}. Default to ${Version.V1}`); console.error(`Unknown spec version ${version}. Default to ${Version.V1}`);
return this.receivers.v1[mode].parse(body, headers); return receivers.v1[mode].parse(body, headers);
} }
} }
} }

View File

@ -8,7 +8,6 @@ import { Receiver } from "../../src";
const { HTTPParser } = require("http-parser-js"); const { HTTPParser } = require("http-parser-js");
const parser = new HTTPParser(HTTPParser.REQUEST); const parser = new HTTPParser(HTTPParser.REQUEST);
const receiver = new Receiver();
Given("HTTP Protocol Binding is supported", function (this: World) { Given("HTTP Protocol Binding is supported", function (this: World) {
return true; return true;
@ -28,7 +27,7 @@ Given("an HTTP request", function (request: string) {
}); });
When("parsed as HTTP request", function () { When("parsed as HTTP request", function () {
this.cloudevent = receiver.accept(this.headers, this.body); this.cloudevent = Receiver.accept(this.headers, this.body);
return true; return true;
}); });

View File

@ -3,7 +3,6 @@ import { expect } from "chai";
import { CloudEvent, Receiver, ValidationError } from "../../src"; import { CloudEvent, Receiver, ValidationError } from "../../src";
import { CloudEventV1 } from "../../src/event/v1"; import { CloudEventV1 } from "../../src/event/v1";
const receiver = new Receiver();
const id = "1234"; const id = "1234";
const type = "org.cncf.cloudevents.test"; const type = "org.cncf.cloudevents.test";
const source = "urn:event:from:myapi/resourse/123"; const source = "urn:event:from:myapi/resourse/123";
@ -22,7 +21,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
specversion, specversion,
}; };
expect(receiver.accept.bind(receiver, {}, payload)).to.throw(ValidationError, "no cloud event detected"); expect(Receiver.accept.bind(Receiver, {}, payload)).to.throw(ValidationError, "no cloud event detected");
}); });
it("Converts the JSON body of a binary event to an Object", () => { it("Converts the JSON body of a binary event to an Object", () => {
@ -34,7 +33,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-source": source, "ce-source": source,
}; };
const event: CloudEvent = receiver.accept(binaryHeaders, data); const event: CloudEvent = Receiver.accept(binaryHeaders, data);
expect(typeof event.data).to.equal("object"); expect(typeof event.data).to.equal("object");
expect((event.data as Record<string, string>).lunch).to.equal("sushi"); expect((event.data as Record<string, string>).lunch).to.equal("sushi");
}); });
@ -47,7 +46,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-type": type, "ce-type": type,
"ce-source": source, "ce-source": source,
}; };
const event = receiver.accept(binaryHeaders, undefined); const event = Receiver.accept(binaryHeaders, undefined);
expect(event.data).to.be.undefined; expect(event.data).to.be.undefined;
}); });
@ -59,7 +58,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-type": type, "ce-type": type,
"ce-source": source, "ce-source": source,
}; };
const event = receiver.accept(binaryHeaders, null); const event = Receiver.accept(binaryHeaders, null);
expect(event.data).to.be.undefined; expect(event.data).to.be.undefined;
}); });
@ -72,7 +71,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
specversion, specversion,
}; };
const event = receiver.accept(structuredHeaders, payload); const event = Receiver.accept(structuredHeaders, payload);
expect(typeof event.data).to.equal("object"); expect(typeof event.data).to.equal("object");
expect((event.data as Record<string, string>).lunch).to.equal("sushi"); expect((event.data as Record<string, string>).lunch).to.equal("sushi");
}); });
@ -86,7 +85,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-source": source, "ce-source": source,
}; };
const event: CloudEvent = receiver.accept(binaryHeaders, data); const event: CloudEvent = Receiver.accept(binaryHeaders, data);
expect(event.validate()).to.be.true; expect(event.validate()).to.be.true;
expect((event.data as Record<string, string>).lunch).to.equal("sushi"); expect((event.data as Record<string, string>).lunch).to.equal("sushi");
}); });
@ -101,7 +100,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
specversion, specversion,
}; };
const event: CloudEvent = receiver.accept(structuredHeaders, payload); const event: CloudEvent = Receiver.accept(structuredHeaders, payload);
expect(event.validate()).to.be.true; expect(event.validate()).to.be.true;
expect((event.data as Record<string, string>).lunch).to.equal("sushi"); expect((event.data as Record<string, string>).lunch).to.equal("sushi");
}); });
@ -119,7 +118,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
specversion, specversion,
}; };
const event = receiver.accept(structuredHeaders, payload); const event = Receiver.accept(structuredHeaders, payload);
validateEvent(event, specversion); validateEvent(event, specversion);
}); });
@ -132,7 +131,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-source": source, "ce-source": source,
}; };
const event = receiver.accept(binaryHeaders, data); const event = Receiver.accept(binaryHeaders, data);
validateEvent(event, specversion); validateEvent(event, specversion);
}); });
}); });
@ -149,7 +148,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
specversion, specversion,
}; };
const event = receiver.accept(structuredHeaders, payload); const event = Receiver.accept(structuredHeaders, payload);
validateEvent(event, specversion); validateEvent(event, specversion);
}); });
@ -162,7 +161,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"ce-source": source, "ce-source": source,
}; };
const event = receiver.accept(binaryHeaders, data); const event = Receiver.accept(binaryHeaders, data);
validateEvent(event, specversion); validateEvent(event, specversion);
}); });
}); });
@ -192,7 +191,7 @@ describe("HTTP Transport Binding Receiver for CloudEvents", () => {
"x-forwarded-proto": "http", "x-forwarded-proto": "http",
"x-request-id": "d3649c1b-a968-40bf-a9da-3e853abc0c8b", "x-request-id": "d3649c1b-a968-40bf-a9da-3e853abc0c8b",
}; };
const event = receiver.accept(headers, data); const event = Receiver.accept(headers, data);
expect(event instanceof CloudEvent).to.equal(true); expect(event instanceof CloudEvent).to.equal(true);
expect(event.id).to.equal(id); expect(event.id).to.equal(id);
expect(event.type).to.equal(type); expect(event.type).to.equal(type);