54 lines
1.2 KiB
JavaScript
54 lines
1.2 KiB
JavaScript
'use strict';
|
|
|
|
const Events = require('events');
|
|
const Stream = require('stream');
|
|
|
|
|
|
const internals = {};
|
|
|
|
|
|
exports.encode = function (payload) {
|
|
|
|
if (payload instanceof Stream) {
|
|
return internals.encodeStreamPayload(payload);
|
|
}
|
|
|
|
const headers = Object.create(null);
|
|
|
|
if (payload) {
|
|
if (typeof payload !== 'string' &&
|
|
!Buffer.isBuffer(payload)) {
|
|
|
|
payload = JSON.stringify(payload);
|
|
headers['content-type'] = 'application/json';
|
|
}
|
|
|
|
// Compute the content-length for the corresponding payload in case none set
|
|
|
|
headers['content-length'] = (Buffer.isBuffer(payload) ? payload.length : Buffer.byteLength(payload)).toString();
|
|
}
|
|
|
|
return { payload, headers };
|
|
};
|
|
|
|
|
|
internals.encodeStreamPayload = function (stream) {
|
|
|
|
const headers = Object.create(null);
|
|
|
|
const deferredPayload = (async () => {
|
|
|
|
const chunks = [];
|
|
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
|
|
await Events.once(stream, 'end');
|
|
|
|
const payload = Buffer.concat(chunks);
|
|
headers['content-length'] = headers['content-length'] || payload.length;
|
|
|
|
return payload;
|
|
})();
|
|
|
|
return { payload: deferredPayload, headers };
|
|
};
|