UNPKG

@shopify/react-server

Version:
81 lines (76 loc) 2.6 kB
import chalk from 'chalk'; import { Header } from '@shopify/react-network'; /* eslint-disable no-process-env */ const LOGGER = Symbol('logger'); const PREFIX = chalk.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[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)); } } export { LOGGER, Logger, getLogger, requestLogger, setLogger };