86 lines
2.5 KiB
JavaScript
86 lines
2.5 KiB
JavaScript
const axios = require("axios");
|
|
|
|
const {
|
|
HEADERS,
|
|
BINARY_HEADERS_03,
|
|
BINARY_HEADERS_1,
|
|
HEADER_CONTENT_TYPE,
|
|
DEFAULT_CONTENT_TYPE,
|
|
DATA_ATTRIBUTE,
|
|
SPEC_V1,
|
|
SPEC_V03
|
|
} = require("./constants.js");
|
|
|
|
const defaults = {
|
|
[HEADERS]: {
|
|
[HEADER_CONTENT_TYPE]: DEFAULT_CONTENT_TYPE
|
|
},
|
|
method: "POST"
|
|
};
|
|
|
|
/**
|
|
* A class to emit binary CloudEvents over HTTP.
|
|
*/
|
|
class BinaryHTTPEmitter {
|
|
/**
|
|
* Create a new {BinaryHTTPEmitter} for the provided CloudEvent specification version.
|
|
* Once an instance is created for a given spec version, it may only be used to send
|
|
* events for that version.
|
|
* Default version is 1.0
|
|
* @param {string} version - the CloudEvent HTTP specification version.
|
|
* Default: 1.0
|
|
*/
|
|
constructor(version) {
|
|
if (version === SPEC_V1) {
|
|
this.headerByGetter = require("./emitter_binary_1.js");
|
|
this.extensionPrefix = BINARY_HEADERS_1.EXTENSIONS_PREFIX;
|
|
} else if (version === SPEC_V03) {
|
|
this.headerByGetter = require("./emitter_binary_0_3.js");
|
|
this.extensionPrefix = BINARY_HEADERS_03.EXTENSIONS_PREFIX;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sends this cloud event to a receiver over HTTP.
|
|
*
|
|
* @param {Object} options The configuration options for this event. Options
|
|
* provided other than `url` will be passed along to Node.js `http.request`.
|
|
* https://nodejs.org/api/http.html#http_http_request_options_callback
|
|
* @param {URL} options.url The HTTP/S url that should receive this event
|
|
* @param {Object} cloudevent the CloudEvent to be sent
|
|
* @returns {Promise} Promise with an eventual response from the receiver
|
|
*/
|
|
async emit(options, cloudevent) {
|
|
const config = { ...options, ...defaults };
|
|
const headers = config[HEADERS];
|
|
|
|
Object.keys(this.headerByGetter)
|
|
.filter((getter) => cloudevent[getter]())
|
|
.forEach((getter) => {
|
|
const header = this.headerByGetter[getter];
|
|
headers[header.name] = header.parser(cloudevent[getter]());
|
|
});
|
|
|
|
// Set the cloudevent payload
|
|
const formatted = cloudevent.format();
|
|
let data = formatted.data;
|
|
data = (formatted.data_base64 ? formatted.data_base64 : data);
|
|
|
|
// Have extensions?
|
|
const exts = cloudevent.getExtensions();
|
|
Object.keys(exts)
|
|
.filter((ext) => Object.hasOwnProperty.call(exts, ext))
|
|
.forEach((ext) => {
|
|
headers[this.extensionPrefix + ext] = exts[ext];
|
|
});
|
|
|
|
config[DATA_ATTRIBUTE] = data;
|
|
config.headers = headers;
|
|
|
|
// Return the Promise
|
|
return axios.request(config);
|
|
}
|
|
}
|
|
|
|
module.exports = BinaryHTTPEmitter;
|