piecemeal
Version:
Effortless incrementally deliver your data
40 lines (38 loc) • 1.26 kB
JavaScript
const CONTENT_TYPE = 'content-type';
const message = (payload, headers) => {
const returns = [''];
for (let key in headers)
returns.push(`${key}: ${headers[key]}`);
returns.push('', String(payload), '');
return returns.join('\r\n');
};
/*#__INLINE__*/
const is_raw = (data) => 'headers' in data && 'data' in data;
const generate = async (iterator, boundary, write, abort) => {
await write(`--${boundary}`);
for await (let data of iterator) {
if (abort && abort.aborted)
break;
let payload = data, headers;
let dtype = typeof data;
if (data === null)
payload = '';
else if (dtype === 'object') {
if (is_raw(data)) {
headers = data.headers;
payload = data.data;
}
else {
headers = { [CONTENT_TYPE]: 'application/json;charset=utf-8' };
payload = JSON.stringify(data);
}
}
else if (dtype !== 'string') {
payload = String(data);
}
headers = headers || { [CONTENT_TYPE]: 'text/plain' };
await write(message(payload, headers) + `--${boundary}`);
}
write(`--\r\n`);
};
export { generate, message };