Source: segments/segment_utils.js

const { safeParseInt } = require('../utils');
var logger = require('../logger');

var DEFAULT_STREAMING_THRESHOLD = 100;

var utils = {
  streamingThreshold: DEFAULT_STREAMING_THRESHOLD,

  getCurrentTime: function getCurrentTime() {
    return Date.now() / 1000;
  },

  setOrigin: function setOrigin(origin) {
    this.origin = origin;
  },

  setPluginData: function setPluginData(pluginData) {
    this.pluginData = pluginData;
  },

  setSDKData: function setSDKData(sdkData) {
    this.sdkData = sdkData;
  },

  setServiceData: function setServiceData(serviceData) {
    this.serviceData = serviceData;
  },

  /**
   * Overrides the default streaming threshold (100).
   * The threshold represents the maximum number of subsegments on a single segment before
   * the SDK beings to send the completed subsegments out of band of the main segment.
   * Reduce this threshold if you see the 'Segment too large to send' error.
   * @param {number} threshold - The new threshold to use.
   * @memberof AWSXRay
   */

  setStreamingThreshold: function setStreamingThreshold(threshold) {
    if (isFinite(threshold) && threshold >= 0) {
      utils.streamingThreshold = threshold;
      logger.getLogger().debug('Subsegment streaming threshold set to: ' + threshold);
    } else {
      logger.getLogger().error('Invalid threshold: ' + threshold + '. Must be a whole number >= 0.');
    }
  },

  getStreamingThreshold: function getStreamingThreshold() {
    return utils.streamingThreshold;
  },

  /**
   * Parses an HTTP response object to return an X-Ray compliant HTTP response object.
   * @param {http.ServerResponse} res
   * @returns {Object} - X-Ray response object to be added to (sub)segment
   */
  getHttpResponseData: (res) => {
    const ret = {};
    if (!res) {
      return ret;
    }

    const status = safeParseInt(res.statusCode);
    if (status !== 0) {
      ret.status = status;
    }
    if (res.headers && res.headers['content-length']) {
      ret.content_length = safeParseInt(res.headers['content-length']);
    }
    return ret;
  },

  getJsonStringifyReplacer: () => (_, value) => {
    if (typeof value === 'bigint') {
      return value.toString();
    }

    return value;
  }
};

module.exports = utils;