UNPKG

integreat-transporter-http

Version:

HTTP transporter for Integreat

63 lines 2.06 kB
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