|
1 | 1 | const axios = require("axios"); |
2 | 2 |
|
3 | | -const Constants = require("./constants.js"); |
4 | | -const defaults = {}; |
5 | | -defaults[Constants.HEADERS] = {}; |
6 | | -defaults[Constants.HEADERS][Constants.HEADER_CONTENT_TYPE] = |
7 | | - Constants.DEFAULT_CONTENT_TYPE; |
8 | | - |
9 | | -function BinaryHTTPEmitter(config, headerByGetter, extensionPrefix) { |
10 | | - this.config = Object.assign({}, defaults, config); |
11 | | - this.headerByGetter = headerByGetter; |
12 | | - this.extensionPrefix = extensionPrefix; |
13 | | -} |
| 3 | +const { |
| 4 | + HEADERS, |
| 5 | + BINARY_HEADERS_03, |
| 6 | + BINARY_HEADERS_1, |
| 7 | + HEADER_CONTENT_TYPE, |
| 8 | + DEFAULT_CONTENT_TYPE, |
| 9 | + DATA_ATTRIBUTE, |
| 10 | + SPEC_V1, |
| 11 | + SPEC_V03 |
| 12 | +} = require("./constants.js"); |
14 | 13 |
|
15 | | -BinaryHTTPEmitter.prototype.emit = function(cloudevent) { |
16 | | - const config = Object.assign({}, this.config); |
17 | | - const headers = Object.assign({}, this.config[Constants.HEADERS]); |
18 | | - |
19 | | - Object.keys(this.headerByGetter) |
20 | | - .filter((getter) => cloudevent[getter]()) |
21 | | - .forEach((getter) => { |
22 | | - const header = this.headerByGetter[getter]; |
23 | | - headers[header.name] = |
24 | | - header.parser( |
25 | | - cloudevent[getter]() |
26 | | - ); |
27 | | - }); |
28 | | - |
29 | | - // Set the cloudevent payload |
30 | | - const formatted = cloudevent.format(); |
31 | | - let data = formatted.data; |
32 | | - data = (formatted.data_base64 ? formatted.data_base64 : data); |
33 | | - |
34 | | - // Have extensions? |
35 | | - const exts = cloudevent.getExtensions(); |
36 | | - Object.keys(exts) |
37 | | - .filter((ext) => Object.hasOwnProperty.call(exts, ext)) |
38 | | - .forEach((ext) => { |
39 | | - headers[this.extensionPrefix + ext] = exts[ext]; |
40 | | - }); |
41 | | - |
42 | | - config[Constants.DATA_ATTRIBUTE] = data; |
43 | | - config.headers = headers; |
44 | | - |
45 | | - // Return the Promise |
46 | | - return axios.request(config); |
| 14 | +const defaults = { |
| 15 | + [HEADERS]: { |
| 16 | + [HEADER_CONTENT_TYPE]: DEFAULT_CONTENT_TYPE |
| 17 | + }, |
| 18 | + method: "POST" |
47 | 19 | }; |
48 | 20 |
|
| 21 | +/** |
| 22 | + * A class to emit binary CloudEvents over HTTP. |
| 23 | + */ |
| 24 | +class BinaryHTTPEmitter { |
| 25 | + /** |
| 26 | + * Create a new {BinaryHTTPEmitter} for the provided CloudEvent specification version. |
| 27 | + * Once an instance is created for a given spec version, it may only be used to send |
| 28 | + * events for that version. |
| 29 | + * Default version is 1.0 |
| 30 | + * @param {string} version - the CloudEvent HTTP specification version. |
| 31 | + * Default: 1.0 |
| 32 | + */ |
| 33 | + constructor(version) { |
| 34 | + if (version === SPEC_V1) { |
| 35 | + this.headerByGetter = require("./emitter_binary_1.js"); |
| 36 | + this.extensionPrefix = BINARY_HEADERS_1.EXTENSIONS_PREFIX; |
| 37 | + } else if (version === SPEC_V03) { |
| 38 | + this.headerByGetter = require("./emitter_binary_0_3.js"); |
| 39 | + this.extensionPrefix = BINARY_HEADERS_03.EXTENSIONS_PREFIX; |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + /** |
| 44 | + * Sends this cloud event to a receiver over HTTP. |
| 45 | + * |
| 46 | + * @param {Object} options The configuration options for this event. Options |
| 47 | + * provided other than `url` will be passed along to Node.js `http.request`. |
| 48 | + * https://nodejs.org/api/http.html#http_http_request_options_callback |
| 49 | + * @param {URL} options.url The HTTP/S url that should receive this event |
| 50 | + * @param {Object} cloudevent the CloudEvent to be sent |
| 51 | + * @returns {Promise} Promise with an eventual response from the receiver |
| 52 | + */ |
| 53 | + async emit(options, cloudevent) { |
| 54 | + const config = { ...options, ...defaults }; |
| 55 | + const headers = config[HEADERS]; |
| 56 | + |
| 57 | + Object.keys(this.headerByGetter) |
| 58 | + .filter((getter) => cloudevent[getter]()) |
| 59 | + .forEach((getter) => { |
| 60 | + const header = this.headerByGetter[getter]; |
| 61 | + headers[header.name] = header.parser(cloudevent[getter]()); |
| 62 | + }); |
| 63 | + |
| 64 | + // Set the cloudevent payload |
| 65 | + const formatted = cloudevent.format(); |
| 66 | + let data = formatted.data; |
| 67 | + data = (formatted.data_base64 ? formatted.data_base64 : data); |
| 68 | + |
| 69 | + // Have extensions? |
| 70 | + const exts = cloudevent.getExtensions(); |
| 71 | + Object.keys(exts) |
| 72 | + .filter((ext) => Object.hasOwnProperty.call(exts, ext)) |
| 73 | + .forEach((ext) => { |
| 74 | + headers[this.extensionPrefix + ext] = exts[ext]; |
| 75 | + }); |
| 76 | + |
| 77 | + config[DATA_ATTRIBUTE] = data; |
| 78 | + config.headers = headers; |
| 79 | + |
| 80 | + // Return the Promise |
| 81 | + return axios.request(config); |
| 82 | + } |
| 83 | +} |
| 84 | + |
49 | 85 | module.exports = BinaryHTTPEmitter; |
0 commit comments