rekwest
Version:
The robust request library that humanity deserves 🌐
118 lines (117 loc) • 3.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mixin = void 0;
var _nodeBuffer = require("node:buffer");
var _nodeHttp = _interopRequireDefault(require("node:http2"));
var _consumers = require("node:stream/consumers");
var _nodeUtil = require("node:util");
var _codecs = require("./codecs.cjs");
var _utils = require("./utils.cjs");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const {
HTTP2_HEADER_CONTENT_ENCODING,
HTTP2_HEADER_CONTENT_TYPE
} = _nodeHttp.default.constants;
const mixin = (res, {
decodersOptions,
digest = false,
parse = false
} = {}) => {
if (!digest) {
Object.defineProperties(res, {
arrayBuffer: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
parse &&= false;
const {
buffer,
byteLength,
byteOffset
} = await this.body();
return buffer.slice(byteOffset, byteOffset + byteLength);
}
},
blob: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
const val = await this.arrayBuffer();
return new _nodeBuffer.Blob([val]);
}
},
bytes: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
return new Uint8Array(await this.arrayBuffer());
}
},
json: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
const val = await this.text();
return JSON.parse(val);
}
},
text: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
const blob = await this.blob();
return blob.text();
}
}
});
}
return Object.defineProperties(res, {
body: {
enumerable: true,
value: async function () {
(0, _utils.brandCheck)(this, res?.constructor);
if (this.bodyUsed) {
throw new TypeError('Response stream already read.');
}
let body = await (0, _consumers.buffer)((0, _codecs.decode)(this, this.headers[HTTP2_HEADER_CONTENT_ENCODING], {
decodersOptions
}));
if (!body.length && parse) {
return null;
}
if (body.length && parse) {
const contentType = this.headers[HTTP2_HEADER_CONTENT_TYPE] ?? '';
let isTextual, mimeType;
try {
mimeType = contentType ? new _nodeUtil.MIMEType(contentType) : null;
} finally {
isTextual = mimeType && (mimeType.type === 'text' || mimeType.subtype.match(/\bcsv\b|\bjson\b|\bxml\b|\byaml\b/) || mimeType.essence.match(/\becmascript\b|\bjavascript\b|\bx-www-form-urlencoded\b/));
}
if (isTextual) {
if (/\bjson\b/.test(mimeType)) {
body = JSON.parse(body.toString());
} else if ((0, _nodeBuffer.isUtf8)(body)) {
body = body.toString();
} else {
const charset = mimeType.params.get('charset')?.toLowerCase() ?? 'utf-8';
body = new TextDecoder(charset, {
fatal: true
}).decode(body);
}
}
}
return body;
},
writable: true
},
bodyUsed: {
enumerable: true,
get() {
return this.readableEnded;
}
}
});
};
exports.mixin = mixin;