integreat-transporter-http
Version:
HTTP transporter for Integreat
63 lines • 2.06 kB
JavaScript
async function readDataFromRequest(request) {
const buffers = [];
for await (const chunk of request) {
buffers.push(chunk);
}
return Buffer.concat(buffers).toString();
}
function searchParamsToObject(searchParams) {
const queryParams = {};
for (const [key, value] of searchParams.entries()) {
if (key.endsWith('[]')) {
const bareKey = key.slice(0, -2);
const arr = queryParams[bareKey] ?? [];
queryParams[bareKey] = [...arr, value];
}
else {
queryParams[key] = value;
}
}
return queryParams;
}
function parseUrl(request) {
if (request.url && request.headers.host) {
const parts = new URL(request.url, `http://${request.headers.host}`);
return [
parts.hostname,
parts.port && Number.parseInt(parts.port, 10),
parts.pathname,
searchParamsToObject(parts.searchParams),
];
}
return [];
}
const actionTypeFromRequest = (request) => typeof request.method !== 'string' ||
['GET', 'OPTIONS'].includes(request.method)
? 'GET'
: 'SET';
function contentTypeFromRequest(request) {
const header = request.headers['content-type'];
if (typeof header === 'string') {
return header.split(';')[0];
}
return undefined;
}
export async function actionFromRequest(request, incomingPort) {
const [hostname, port, path, queryParams] = parseUrl(request);
const data = await readDataFromRequest(request);
return {
type: actionTypeFromRequest(request),
payload: {
...(data && { data }),
method: request.method,
hostname: typeof hostname === 'string' ? hostname.toLowerCase() : undefined,
port: port || incomingPort,
path: typeof path === 'string' ? path : undefined,
queryParams,
contentType: contentTypeFromRequest(request),
headers: request.headers,
},
meta: {},
};
}
//# sourceMappingURL=request.js.map