bindings/http/emitter_structured.js

const axios = require("axios");
const {
  DATA_ATTRIBUTE,
  DEFAULT_CE_CONTENT_TYPE,
  HEADERS,
  HEADER_CONTENT_TYPE
} = require("./constants.js");

const defaults = {
  [HEADERS]: {
    [HEADER_CONTENT_TYPE]: DEFAULT_CE_CONTENT_TYPE
  },
  method: "POST"
};

/**
 * A class for sending {CloudEvent} instances over HTTP.
 */
class StructuredHTTPEmitter {
  // TODO: Do we really need a class here? There is no state maintenance

  /**
   * Sends the event over HTTP
   * @param {Object} options The configuration options for this event. Options
   * provided 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 {CloudEvent} cloudevent The CloudEvent to be sent
   * @returns {Promise} Promise with an eventual response from the receiver
   */
  async emit(options, cloudevent) {
    const config = { ...defaults, ...options };
    config[DATA_ATTRIBUTE] = cloudevent.format();
    return axios.request(config);
  }
}

module.exports = StructuredHTTPEmitter;