UNPKG

rekwest

Version:

The robust request library that humanity deserves 🌐

118 lines (117 loc) 3.64 kB
"use strict"; 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;