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:
parent
565f867424
commit
9ae32c76cb
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue