prototypes/server/extend/response-send.js

/**
 * @private
 * @param {SGAppsServerRequest} request 
 * @param {SGAppsServerResponse} response 
 * @param {SGAppsServer} server 
 * @param {function} callback
 */
function ResponseSendDecorator(request, response, server, callback) {
	if (request === null || response === null) {
		callback();
		return;
	}

	/**
	 * @method send
	 * @memberof SGAppsServerResponse#
	 * @param {string|Buffer|object|any[]} data 
	 * @param {object} [options] 
	 * @param {number} [options.statusCode=200] 
	 * @param {Object<string,(string|string[])>} [options.headers]
	 */
	response.send = function (data, options) {
		if (response._flags.finished)
			return;
		options = Object.assign(
			{
				statusCode: 200,
				headers: {}
			},
			options || {}
		);

		if (!response.response.headersSent) {
			if (
				!options.headers["Content-type"]
				&&
				!options.headers["Content-Type"]
				&&
				!options.headers["content-type"]
			) {
				if (typeof(data) === "string") {
					options.headers["Content-type"] = (
						data[0] === '<' ? "text/html" : "text/plain"
					);
				} else if (data instanceof Buffer) {
					options.headers["Content-type"] = 'application/octet-stream';
				} else if (Array.isArray(data) || typeof(data) === "object") {
					options.headers['Content-type'] = 'application/json';
				} else {
					options.headers["Content-type"] = 'application/octet-stream';
				}
			}

			response.response.statusCode = options.statusCode;
			let header;
			for (header in options.headers) {
				response.response.setHeader(header, options.headers[header]);
			}
		}

		if (
			typeof(data) === "string"
			|| data instanceof Buffer
		) {
			response.response.write(data, function (err) {
				//@ts-ignore
				if (err) server.logger.error(err);
				response.response.end();
			});
		} else if (Array.isArray(data) || (typeof(data) === "object" && data)) {
			response.response.write(JSON.stringify(data), function (err) {
				//@ts-ignore
				if (err) server.logger.error(err);
				response.response.end();
			});
		} else {
			response.response.write((data.toString ? data.toString() : (data + '')), function (err) {
				//@ts-ignore
				if (err) server.logger.error(err);
				response.response.end();
			});
		}
	};

	/**
	* @method sendStatusCode
	* @memberof SGAppsServerResponse#
	* @param {number} statusCode 
	*/
	response.sendStatusCode = function (statusCode) {
		response.send(
			//@ts-ignore
			server.STATUS_CODES[statusCode] || 'Unknown status code',
			{
				statusCode
			}
		);
	};
	
	// response._destroy.push(function () {
	// 	// @ts-ignore
	// 	delete response.send;
	// });

	callback();
};

module.exports = ResponseSendDecorator;