@shopify/react-server
Version:
Utilities for React server-side rendering
93 lines (84 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var chalk = require('chalk');
var reactNetwork = require('@shopify/react-network');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
/* eslint-disable no-process-env */
const LOGGER = Symbol('logger');
const PREFIX = chalk__default["default"].underline('[React Server] ');
class Logger {
constructor() {
this.buffer = '';
this.logger = console;
}
log(message) {
if (process.env.NODE_ENV === 'development') {
this.logger.log(`${PREFIX}${message}`);
} else {
this.buffer = `${this.buffer}\n${message}`;
}
}
}
function setLogger(ctx, logger) {
ctx.state[LOGGER] = logger;
}
function getLogger(ctx) {
return ctx.state[LOGGER];
}
function initialRequestMessage(request) {
const requestMethod = `${request.method.toUpperCase()} "${request.url}"`;
return `Started ${requestMethod} at ${new Date().toISOString()}`;
}
function endRequestMessage(ctx, requestDuration) {
const httpStatus = `${ctx.status} ${ctx.message || ''}`;
const duration = `${requestDuration.toFixed(0)}ms`;
return `Completed ${httpStatus} at ${new Date().toISOString()} in ${duration}`;
}
function endRequest(ctx, requestDuration) {
const logger = getLogger(ctx);
logger.log(endRequestMessage(ctx, requestDuration));
if (process.env.NODE_ENV === 'development') {
return;
}
/* eslint-disable @typescript-eslint/naming-convention */
const logObject = {
datetime: new Date().toISOString(),
http_method: ctx.method.toUpperCase(),
http_response: ctx.message || '',
http_status: ctx.status,
hostname: ctx.request.hostname,
ips: ctx.request.ips,
request_id: ctx.header['X-Request-ID'],
uri: ctx.originalUrl,
user_agent: ctx.header[reactNetwork.Header.UserAgent],
payload: logger.buffer
};
/* eslint-enable @typescript-eslint/naming-convention */
// eslint-disable-next-line no-console
console.log(JSON.stringify(logObject, undefined, process.env.NODE_ENV === 'production' ? undefined : 2));
}
function requestDuration(requestStartTime) {
const duration = process.hrtime(requestStartTime);
const ms = duration[0] * 1000 + duration[1] / 1e6;
return Math.round(ms);
}
async function requestLogger(ctx, next) {
const requestStartTime = process.hrtime();
setLogger(ctx, new Logger());
const logger = getLogger(ctx);
logger.log(initialRequestMessage(ctx.request));
try {
await next();
} catch (error) {
logger.log('Error during server execution, see details below.');
logger.log(`${error.stack || error.message || 'No stack trace was present'}`);
} finally {
endRequest(ctx, requestDuration(requestStartTime));
}
}
exports.LOGGER = LOGGER;
exports.Logger = Logger;
exports.getLogger = getLogger;
exports.requestLogger = requestLogger;
exports.setLogger = setLogger;