utils.js

// WARNING: Directly export all functions; DO NOT use export default = { key: function }
// This approach does not work.

import { backendInfo } from './server.js';

/**
 * Utils namespace. Providing utility functions.
 *
 * @namespace utils
 */

/**
 * Get the value of all occurences of a key from a nested object.
 *
 * @memberof utils
 * @param {Object} obj object
 * @param {String} key key to find in the object
 * @returns {Array} array of the values of all occurences of key
 */
export const findKeyInObj = function (obj, key) {
  const values = [];
  const iterator = (obj, key) => {
    for (const i in obj) {
      if (i === key) {
        values.push(obj[i]);
      }
      if (typeof obj[i] === 'object') {
        iterator(obj[i], key);
      }
    }
  };
  iterator(obj, key);
  return values;
};

/**
 * Set proxy headers for backend requests using node-fetch.
 * If header is not present, use defaults.
 *
 * @memberof utils
 * @param {*} expressReq request object from expressjs
 * @returns {Object} headers for node-fetch
 */
export const getHeaders = function (expressReq) {
  return {
    Host: expressReq.headers.host || backendInfo.HOST,
    'X-Real-IP': expressReq.headers['x-real-ip'] || backendInfo.HOST,
    'X-Forwarded-For': expressReq.headers['x-forwarded-for'] || backendInfo.HOST,
    'X-Forwarded-Proto': expressReq.headers['x-forwarded-proto'] || 'http',
    Connection: 'upgrade',
    Upgrade: expressReq.headers.Upgrade
  };
};