UNPKG

@shopify/react-server

Version:
93 lines (84 loc) 2.99 kB
'use strict'; 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;