You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@php-wasm/logger

Package Overview
Dependencies
Maintainers
5
Versions
177
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@php-wasm/logger - npm Package Compare versions

Comparing version
3.0.15
to
3.0.16
+1
-1
index.cjs.map

@@ -1,1 +0,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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"}
{"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,1 +0,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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"}
{"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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"}
{
"name": "@php-wasm/logger",
"version": "3.0.15",
"version": "3.0.16",
"description": "A logger for PHP-wasm clients like Playground and WP-now.",

@@ -30,3 +30,3 @@ "repository": {

},
"gitHead": "4e8addef4a0fa0e76f26785689a1a676bbb823e1",
"gitHead": "1f96a559fda4946f36f8543a2715cee411a5c8f2",
"packageManager": "npm@10.9.2",

@@ -44,3 +44,3 @@ "overrides": {

"dependencies": {
"@php-wasm/node-polyfills": "3.0.15"
"@php-wasm/node-polyfills": "3.0.16"
},

@@ -47,0 +47,0 @@ "optionalDependencies": {