UNPKG

@domoinc/ryuu-proxy

Version:

a middleware that provides a proxy for local domo app development

123 lines 5.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Proxy = void 0; const path = __importStar(require("path")); const os = __importStar(require("os")); const form_data_1 = __importDefault(require("form-data")); const fs_1 = require("fs"); const https_proxy_agent_1 = require("https-proxy-agent"); const dotenv = __importStar(require("dotenv")); const busboy_1 = __importDefault(require("busboy")); const Transport_1 = __importDefault(require("./lib/Transport")); class Proxy { constructor(config) { this.onError = (err, res) => { const status = err.response?.data?.statusCode !== undefined ? err.response.data.statusCode : 500; const msg = err.response?.data?.statusMessage !== undefined ? err.response.data.statusMessage : (err.message ?? err); res.status(status).send(msg); }; this.express = () => (req, res, next) => { if (this.transport.isDomoRequest(req.url)) { if (this.transport.isMultiPartRequest(req.headers)) { const bb = (0, busboy_1.default)({ headers: req.headers }); let filePath; let fieldName; bb.on('file', (fieldname, filestream, fileMetadata) => { filePath = path.join(os.tmpdir(), path.basename(fileMetadata.filename)); fieldName = fieldname; filestream.pipe((0, fs_1.createWriteStream)(filePath)); }); bb.on('finish', () => { this.transport .buildBasic(req) .then((options) => { const form = new form_data_1.default(); form.append(fieldName, (0, fs_1.createReadStream)(filePath)); return this.transport.request({ ...options, headers: { ...options.headers, ...form.getHeaders() }, data: form, }); }) .then((rawRequest) => rawRequest.data.pipe(res)) .catch((err) => this.onError(err, res)); }); return req.pipe(bb); } return this.transport .build(req) .then((options) => this.transport.request({ ...options, httpsAgent: this.agent, })) .then((rawRequest) => rawRequest.data.pipe(res)) .catch((err) => this.onError(err, res)); } return next(); }; this.stream = (req) => { if (this.transport.isDomoRequest(req.url)) { return this.transport .build(req) .then(this.transport.request) .catch((err) => { // Re-throw the error so callers can handle it throw err; }); } return undefined; }; this.transport = new Transport_1.default(config); dotenv.config({ path: `${process.cwd()}/.env` }); const proxyHost = process.env.REACT_APP_PROXY_HOST ?? process.env.PROXY_HOST; const proxyPort = process.env.REACT_APP_PROXY_PORT ?? process.env.PROXY_PORT; const proxyUsername = process.env.REACT_APP_PROXY_USERNAME ?? process.env.PROXY_USERNAME; const proxyPassword = process.env.REACT_APP_PROXY_PASSWORD ?? process.env.PROXY_PASSWORD; if (proxyHost !== undefined && proxyPort !== undefined) { if (proxyUsername !== undefined && proxyPassword !== undefined) { this.agent = new https_proxy_agent_1.HttpsProxyAgent(`http://${proxyUsername}:${proxyPassword}@${proxyHost}:${proxyPort}`); } else { this.agent = new https_proxy_agent_1.HttpsProxyAgent(`http://${proxyHost}:${proxyPort}`); } } } } exports.Proxy = Proxy; //# sourceMappingURL=index.js.map