@php-wasm/logger 3.0.15 → 3.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@php-wasm/logger",
3
- "version": "3.0.15",
3
+ "version": "3.0.16",
4
4
  "description": "A logger for PHP-wasm clients like Playground and WP-now.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,7 +27,7 @@
27
27
  "node": ">=20.18.3",
28
28
  "npm": ">=10.1.0"
29
29
  },
30
- "gitHead": "4e8addef4a0fa0e76f26785689a1a676bbb823e1",
30
+ "gitHead": "1f96a559fda4946f36f8543a2715cee411a5c8f2",
31
31
  "packageManager": "npm@10.9.2",
32
32
  "overrides": {
33
33
  "rollup": "^4.34.6",
@@ -40,7 +40,7 @@
40
40
  "form-data": "^4.0.4"
41
41
  },
42
42
  "dependencies": {
43
- "@php-wasm/node-polyfills": "3.0.15"
43
+ "@php-wasm/node-polyfills": "3.0.16"
44
44
  },
45
45
  "optionalDependencies": {
46
46
  "fs-ext": "2.1.1"