mod_sign__sign.js

/**
## /sign

The sign API provides access to different request signer modules. Signer modules which are unavailable will export as null and won't be available from the signerModules object methods.

@requires /sign/cloudinary
@requires /sign/s3

@module /sign
*/

import cloudfront from './cloudfront.js';
import cloudinary from './cloudinary.js';
import s3 from './s3.js';

const signerModules = {
  cloudinary,
  s3,
  cloudfront,
};

/**
@function signer
@async

@description
The signer method looks up a signerModules method matching the signer request parameter and passes the req/res objects as argument to the matched method.

The response from the method is returned with the HTTP response.

@param {Object} req HTTP request.
@param {Object} res HTTP response.
@param {Object} req.params Request parameter.
@param {string} params.signer Signer module to sign the request.

@returns {Promise} The promise resolves into the response from the signerModules method.
*/
export default async function signer(req, res) {
  if (!Object.hasOwn(signerModules, req.params.signer)) {
    return res
      .status(404)
      .send(`Failed to validate 'signer=${req.params.signer}' param.`);
  }

  if (signerModules[req.params.signer] === null) {
    return res
      .status(405)
      .send(`Signer: ${req.params.signer} is not configured.`);
  }

  const response = await signerModules[req.params.signer](req, res);

  if (response instanceof Error) {
    return res.status(500).send(response.message);
  }

  res.send(response);
}