UNPKG

@geek-fun/serverless-adapter

Version:

Adapter for web frame work express, koa, springboot to run in serverless function as backend of apigateway cross multi cloud provider like aliyun, huawei

77 lines (76 loc) 2.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildResponse = exports.waitForStreamComplete = void 0; const serverlessResponse_1 = __importDefault(require("./serverlessResponse")); const waitForStreamComplete = (stream) => { if (stream.writableFinished || stream.writableEnded) { return Promise.resolve(stream); } return new Promise((resolve, reject) => { let isComplete = false; function complete(err) { if (isComplete) { return; } isComplete = true; stream.removeListener('error', complete); stream.removeListener('end', complete); stream.removeListener('finish', complete); if (err) { reject(err); } else { resolve(stream); } } stream.once('error', complete); stream.once('end', complete); stream.once('finish', complete); }); }; exports.waitForStreamComplete = waitForStreamComplete; const sanitizeHeaders = (headers) => { return Object.keys(headers).reduce((memo, key) => { const value = headers[key]; if (Array.isArray(value)) { memo.multiValueHeaders[key] = value; if (key.toLowerCase() !== 'set-cookie') { memo.headers[key] = value.join(', '); } } else { memo.headers[key] = value == null ? '' : value.toString(); } return memo; }, { headers: {}, multiValueHeaders: {}, }); }; const buildResponse = ({ request, response, }) => { const { headers, multiValueHeaders } = sanitizeHeaders(serverlessResponse_1.default.headers(response)); let body = serverlessResponse_1.default.body(response).toString(request.isBase64Encoded ? 'base64' : 'utf8'); if (headers['transfer-encoding'] === 'chunked' || response.chunkedEncoding) { const raw = serverlessResponse_1.default.body(response).toString().split('\r\n'); const parsed = []; for (let i = 0; i < raw.length; i += 2) { const size = parseInt(raw[i], 16); const value = raw[i + 1]; if (value) { parsed.push(value.substring(0, size)); } } body = parsed.join(''); } return { statusCode: response.statusCode, body, headers, multiValueHeaders, isBase64Encoded: request.isBase64Encoded, }; }; exports.buildResponse = buildResponse;