piobyte/flamingo

View on GitHub
packages/flamingo/src/reader/https.ts

Summary

Maintainability
A
1 hr
Test Coverage
import got from "got";
import nodeStream = require("stream");
import Url = require("url");

import errors = require("../util/errors");
import FlamingoOperation = require("../model/flamingo-operation");
import ReaderType = require("../model/reader-type");
import readAllowed = require("../util/url-access-allowed");
import { ReaderResult } from "../types/ReaderResult";

const { InvalidInputError } = errors;
import pkg = require("../../package.json");
import Reader = require("../types/Reader");
const { REMOTE } = ReaderType;

/**
 * Reader that creates a stream for a given http/https resource
 * @param {object} operation flamingo process operation
 */
const httpsReader: Reader = function (
  operation: FlamingoOperation
): Promise<ReaderResult> {
  const conf = operation.config;
  const input = operation.input;

  return conf.access?.HTTPS?.ENABLED &&
    !readAllowed(input, conf.access?.HTTPS?.READ as unknown as Array<Url.Url>)
    ? Promise.reject(
        "Read not allowed. See `ACCESS.HTTPS.READ` for more information."
      )
    : Promise.resolve({
        stream(): Promise<nodeStream.Readable> {
          return new Promise(function (resolve, reject) {
            const stream = got.stream(input.href, {
              timeout: conf.READER?.REQUEST?.TIMEOUT,
              followRedirect: conf.ALLOW_READ_REDIRECT,
              headers: {
                "user-agent": `${pkg.name}/${pkg.version} (${pkg.bugs.url})`,
              },
            });
            stream.on("error", function (err) {
              reject(new InvalidInputError(err.message, input.href));
            });
            stream.on("response", function () {
              resolve(stream);
            });
          });
        },
        url: input,
        type: REMOTE,
      });
};

export = httpsReader;