@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
JavaScript
;
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;