@php-wasm/logger 1.0.29 → 1.1.0
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 +1 -1
- package/index.cjs.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/lib/collectors/collect-php-logs.d.ts +1 -1
- package/lib/collectors/collect-window-errors.d.ts +1 -1
- package/lib/handlers/log-event.d.ts +1 -1
- package/lib/handlers/log-to-console.d.ts +1 -1
- package/lib/handlers/log-to-memory.d.ts +1 -1
- package/lib/log-handlers.d.ts +1 -1
- package/lib/logger.d.ts +6 -2
- package/package.json +13 -6
package/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("@php-wasm/node-polyfills");const m="playground-log",d=(e,...r)=>{y.dispatchEvent(new CustomEvent(m,{detail:{log:e,args:r}}))},b=(e,...r)=>{switch(typeof e.message=="string"?Reflect.set(e,"message",a(e.message)):e.message.message&&typeof e.message.message=="string"&&Reflect.set(e.message,"message",a(e.message.message)),e.severity){case"Debug":console.debug(e.message,...r);break;case"Info":console.info(e.message,...r);break;case"Warn":console.warn(e.message,...r);break;case"Error":console.error(e.message,...r);break;case"Fatal":console.error(e.message,...r);break;default:console.log(e.message,...r)}},v=e=>e instanceof Error?[e.message,e.stack].join(`
|
|
2
|
-
`):JSON.stringify(e,null,2),p=[],l=e=>{p.push(e)},c=e=>{if(e.raw===!0)l(e.message);else{const r=E(typeof e.message=="object"?v(e.message):e.message,e.severity??"Info",e.prefix??"JavaScript");l(r)}};let n=0;const g="/wordpress/wp-content/debug.log",T=async e=>await e.fileExists(g)?await e.readFileAsText(g):"",M=(e,r)=>{r.addEventListener("request.end",async()=>{const s=await T(r);if(s.length>n){const t=s.substring(n);e.logMessage({message:t,raw:!0}),n=s.length}}),r.addEventListener("request.error",s=>{s=s,s.error&&(e.logMessage({message:`${s.error.message} ${s.error.stack}`,severity:"Fatal",prefix:s.source==="request"?"PHP":"WASM Crash"}),e.dispatchEvent(new CustomEvent(e.fatalErrorEvent,{detail:{logs:e.getLogs(),source:s.source}})))})};class h extends EventTarget{constructor(r=[]){super(),this.
|
|
2
|
+
`):JSON.stringify(e,null,2),p=[],l=e=>{p.push(e)},c=e=>{if(e.raw===!0)l(e.message);else{const r=E(typeof e.message=="object"?v(e.message):e.message,e.severity??"Info",e.prefix??"JavaScript");l(r)}};let n=0;const g="/wordpress/wp-content/debug.log",T=async e=>await e.fileExists(g)?await e.readFileAsText(g):"",M=(e,r)=>{r.addEventListener("request.end",async()=>{const s=await T(r);if(s.length>n){const t=s.substring(n);e.logMessage({message:t,raw:!0}),n=s.length}}),r.addEventListener("request.error",s=>{s=s,s.error&&(e.logMessage({message:`${s.error.message} ${s.error.stack}`,severity:"Fatal",prefix:s.source==="request"?"PHP":"WASM Crash"}),e.dispatchEvent(new CustomEvent(e.fatalErrorEvent,{detail:{logs:e.getLogs(),source:s.source}})))})};class h extends EventTarget{constructor(r=[]){super(),this.fatalErrorEvent="playground-fatal-error",this.handlers=r}getLogs(){return this.handlers.includes(c)?[...p]:(this.error(`Logs aren't stored because the logToMemory handler isn't registered.
|
|
3
3
|
If you're using a custom logger instance, make sure to register logToMemory handler.
|
|
4
4
|
`),[])}logMessage(r,...s){for(const t of this.handlers)t(r,...s)}log(r,...s){this.logMessage({message:r,severity:void 0,prefix:"JavaScript",raw:!1},...s)}debug(r,...s){this.logMessage({message:r,severity:"Debug",prefix:"JavaScript",raw:!1},...s)}info(r,...s){this.logMessage({message:r,severity:"Info",prefix:"JavaScript",raw:!1},...s)}warn(r,...s){this.logMessage({message:r,severity:"Warn",prefix:"JavaScript",raw:!1},...s)}error(r,...s){this.logMessage({message:r,severity:"Error",prefix:"JavaScript",raw:!1},...s)}}const P=()=>{try{if(process.env.NODE_ENV==="test")return[c,d]}catch{}return[c,b,d]},y=new h(P()),a=e=>e.replace(/\t/g,""),E=(e,r,s)=>{const t=new Date,o=new Intl.DateTimeFormat("en-GB",{year:"numeric",month:"short",day:"2-digit",timeZone:"UTC"}).format(t).replace(/ /g,"-"),w=new Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:"UTC",timeZoneName:"short"}).format(t),L=o+" "+w;return e=a(e),`[${L}] ${s} ${r}: ${e}`},O=(e,r)=>{e.addEventListener(e.fatalErrorEvent,r)},S=(e,r)=>{e.logMessage({message:`${r.message} in ${r.filename} on line ${r.lineno}:${r.colno}`,severity:"Error"})},f=(e,r)=>{if(!(r!=null&&r.reason))return;const s=(r==null?void 0:r.reason.stack)??r.reason;e.logMessage({message:s,severity:"Error"})};let i=0;const k=e=>{navigator.serviceWorker.addEventListener("message",r=>{var s,t,o;((s=r.data)==null?void 0:s.numberOfOpenPlaygroundTabs)!==void 0&&i!==((t=r.data)==null?void 0:t.numberOfOpenPlaygroundTabs)&&(i=(o=r.data)==null?void 0:o.numberOfOpenPlaygroundTabs,e.debug(`Number of open Playground tabs is: ${i}`))})};let u=!1;const $=e=>{u||(k(e),!(typeof window>"u")&&(window.addEventListener("error",r=>S(e,r)),window.addEventListener("unhandledrejection",r=>f(e,r)),window.addEventListener("rejectionhandled",r=>f(e,r)),u=!0))},x=e=>{e.addEventListener("activate",()=>{e.clients.matchAll().then(r=>{const s={numberOfOpenPlaygroundTabs:r.filter(t=>t.frameType==="top-level").length};for(const t of r)t.postMessage(s)})})};exports.Logger=h;exports.addCrashListener=O;exports.collectPhpLogs=M;exports.collectWindowErrors=$;exports.errorLogPath=g;exports.formatLogEntry=E;exports.logEventType=m;exports.logger=y;exports.prepareLogMessage=a;exports.reportServiceWorkerMetrics=x;
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|
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 { LogHandler } from '../log-handlers';\nimport { 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 { LogHandler } from '../log-handlers';\nimport { Log, 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 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase '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 { LogHandler } from '../log-handlers';\nimport { formatLogEntry, Log } 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 ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\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 { Logger } 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\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: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\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 { logToMemory, logToConsole, logs } 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 type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\tprivate readonly handlers: Function[] = []\n\t) {\n\t\tsuper();\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 message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\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: undefined,\n\t\t\t\tprefix: 'JavaScript',\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: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\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: 'Info',\n\t\t\t\tprefix: 'JavaScript',\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: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\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: 'Error',\n\t\t\t\tprefix: 'JavaScript',\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 (e) {\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}: ${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 { Logger } 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: '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: '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","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","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 } from '../logger';\nimport { 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 } from '../logger';\nimport { 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 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase '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 type { Log } from '../logger';\nimport { formatLogEntry } 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 ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\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 } 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\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: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\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 { logToMemory, logToConsole, logs } 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 type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * Log handler.\n */\nexport type LogHandler = (log: Log, ...args: any[]) => void;\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\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 message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\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: undefined,\n\t\t\t\tprefix: 'JavaScript',\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: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\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: 'Info',\n\t\t\t\tprefix: 'JavaScript',\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: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\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: 'Error',\n\t\t\t\tprefix: 'JavaScript',\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}: ${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 } 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: '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: '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","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"oHAIO,MAAMA,EAAe,iBAEfC,EAAuB,CAACC,KAAaC,IAAsB,CAChEC,EAAA,cACN,IAAI,YAAYJ,EAAc,CAC7B,OAAQ,CACP,IAAAE,EACA,KAAAC,CAAA,CAED,CAAA,CACF,CACD,ECRaE,EAA2B,CAACH,KAAaC,IAAsB,CAiB3E,OAhBI,OAAOD,EAAI,SAAY,SAI1B,QAAQ,IAAIA,EAAK,UAAWI,EAAkBJ,EAAI,OAAO,CAAC,EAChDA,EAAI,QAAQ,SAAW,OAAOA,EAAI,QAAQ,SAAY,UAIxD,QAAA,IACPA,EAAI,QACJ,UACAI,EAAkBJ,EAAI,QAAQ,OAAO,CACtC,EAGOA,EAAI,SAAU,CACrB,IAAK,QACJ,QAAQ,MAAMA,EAAI,QAAS,GAAGC,CAAI,EAClC,MACD,IAAK,OACJ,QAAQ,KAAKD,EAAI,QAAS,GAAGC,CAAI,EACjC,MACD,IAAK,OACJ,QAAQ,KAAKD,EAAI,QAAS,GAAGC,CAAI,EACjC,MACD,IAAK,QACJ,QAAQ,MAAMD,EAAI,QAAS,GAAGC,CAAI,EAClC,MACD,IAAK,QACJ,QAAQ,MAAMD,EAAI,QAAS,GAAGC,CAAI,EAClC,MACD,QACC,QAAQ,IAAID,EAAI,QAAS,GAAGC,CAAI,CAAA,CAGnC,ECxCMG,EAAqBC,GACtBA,aAAsB,MAClB,CAACA,EAAW,QAASA,EAAW,KAAK,EAAE,KAAK;AAAA,CAAI,EAEjD,KAAK,UAAUA,EAAY,KAAM,CAAC,EAG7BC,EAAiB,CAAC,EAEzBC,EAAiBC,GAA0B,CAChDF,EAAK,KAAKE,CAAO,CAClB,EAKaC,EAA2BT,GAAmB,CACtD,GAAAA,EAAI,MAAQ,GACfO,EAAcP,EAAI,OAAO,MACnB,CACN,MAAMQ,EAAUE,EACf,OAAOV,EAAI,SAAY,SACpBI,EAAkBJ,EAAI,OAAO,EAC7BA,EAAI,QACPA,EAAI,UAAY,OAChBA,EAAI,QAAU,YACf,EACAO,EAAcC,CAAO,CAAA,CAEvB,EC9BA,IAAIG,EAAmB,EAChB,MAAMC,EAAe,kCAQtBC,EAAwB,MAAOC,GAC9B,MAAMA,EAAW,WAAWF,CAAY,EAGvC,MAAME,EAAW,eAAeF,CAAY,EAF3C,GAUIG,EAAiB,CAC7BC,EACAF,IACI,CACOA,EAAA,iBAAiB,cAAe,SAAY,CAChD,MAAAd,EAAM,MAAMa,EAAsBC,CAAU,EAC9C,GAAAd,EAAI,OAASW,EAAkB,CAC5B,MAAAM,EAAajB,EAAI,UAAUW,CAAgB,EACjDK,EAAe,WAAW,CACzB,QAASC,EACT,IAAK,EAAA,CACL,EACDN,EAAmBX,EAAI,MAAA,CACxB,CACA,EACUc,EAAA,iBAAiB,gBAAkBI,GAAU,CAC/CA,EAAAA,EACJA,EAAM,QACTF,EAAe,WAAW,CACzB,QAAS,GAAGE,EAAM,MAAM,OAAO,IAAIA,EAAM,MAAM,KAAK,GACpD,SAAU,QACV,OAAQA,EAAM,SAAW,UAAY,MAAQ,YAAA,CAC7C,EACcF,EAAA,cACd,IAAI,YAAYA,EAAe,gBAAiB,CAC/C,OAAQ,CACP,KAAMA,EAAe,QAAQ,EAC7B,OAAQE,EAAM,MAAA,CAEf,CAAA,CACF,EACD,CACA,CACF,ECzBO,MAAMC,UAAe,WAAY,CAKvC,YAGCC,EAAyB,GACxB,CACK,MAAA,EATP,KAAgB,gBAAkB,yBAUjC,KAAK,SAAWA,CAAA,CAOV,SAAoB,CAC1B,OAAK,KAAK,SAAS,SAASX,CAAW,EAOhC,CAAC,GAAGH,CAAI,GANd,KACE,MAAM;AAAA;AAAA,IAEP,EACM,CAAC,EAEM,CAWT,WAAWN,KAAaC,EAAmB,CACtC,UAAAoB,KAAW,KAAK,SAClBA,EAAArB,EAAK,GAAGC,CAAI,CACrB,CASM,IAAIO,KAAiBP,EAAmB,CACzC,KAAA,WACJ,CACC,QAAAO,EACA,SAAU,OACV,OAAQ,aACR,IAAK,EACN,EACA,GAAGP,CACJ,CAAA,CASM,MAAMO,KAAiBP,EAAmB,CAC3C,KAAA,WACJ,CACC,QAAAO,EACA,SAAU,QACV,OAAQ,aACR,IAAK,EACN,EACA,GAAGP,CACJ,CAAA,CASM,KAAKO,KAAiBP,EAAmB,CAC1C,KAAA,WACJ,CACC,QAAAO,EACA,SAAU,OACV,OAAQ,aACR,IAAK,EACN,EACA,GAAGP,CACJ,CAAA,CASM,KAAKO,KAAiBP,EAAmB,CAC1C,KAAA,WACJ,CACC,QAAAO,EACA,SAAU,OACV,OAAQ,aACR,IAAK,EACN,EACA,GAAGP,CACJ,CAAA,CASM,MAAMO,KAAiBP,EAAmB,CAC3C,KAAA,WACJ,CACC,QAAAO,EACA,SAAU,QACV,OAAQ,aACR,IAAK,EACN,EACA,GAAGP,CACJ,CAAA,CAEF,CAEA,MAAMqB,EAAqB,IAAM,CAC5B,GAAA,CACH,GAAI,QAAQ,IAAI,WAAgB,OACxB,MAAA,CAACb,EAAaV,CAAQ,CAC9B,MACO,CAAA,CAGD,MAAA,CAACU,EAAaN,EAAcJ,CAAQ,CAC5C,EAKaG,EAAiB,IAAIiB,EAAOG,EAAoB,CAAA,EAEhDlB,EAAqBI,GAC1BA,EAAQ,QAAQ,MAAO,EAAE,EAGpBE,EAAiB,CAC7BF,EACAe,EACAC,IACY,CACN,MAAAC,MAAW,KACXC,EAAgB,IAAI,KAAK,eAAe,QAAS,CACtD,KAAM,UACN,MAAO,QACP,IAAK,UACL,SAAU,KAAA,CACV,EACC,OAAOD,CAAI,EACX,QAAQ,KAAM,GAAG,EAEbE,EAAgB,IAAI,KAAK,eAAe,QAAS,CACtD,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,GACR,SAAU,MACV,aAAc,OAAA,CACd,EAAE,OAAOF,CAAI,EACRG,EAAMF,EAAgB,IAAMC,EAClC,OAAAnB,EAAUJ,EAAkBI,CAAO,EAC5B,IAAIoB,CAAG,KAAKJ,CAAM,IAAID,CAAQ,KAAKf,CAAO,EAClD,EAWaqB,EAAmB,CAC/Bb,EACAc,IACI,CACWd,EAAA,iBAAiBA,EAAe,gBAAiBc,CAAQ,CACzE,EC5NMC,EAAsB,CAACf,EAAwBE,IAAsB,CAC1EF,EAAe,WAAW,CACzB,QAAS,GAAGE,EAAM,OAAO,OAAOA,EAAM,QAAQ,YAAYA,EAAM,MAAM,IAAIA,EAAM,KAAK,GACrF,SAAU,OAAA,CACV,CACF,EAQMc,EAAsB,CAC3BhB,EACAE,IACI,CAEA,GAAA,EAACA,GAAA,MAAAA,EAAO,QACX,OAED,MAAMV,GAAUU,GAAA,YAAAA,EAAO,OAAO,QAASA,EAAM,OAC7CF,EAAe,WAAW,CACzB,QAAAR,EACA,SAAU,OAAA,CACV,CACF,EAKA,IAAIyB,EAA6B,EAQjC,MAAMC,EAAmClB,GAA2B,CACnE,UAAU,cAAc,iBAAiB,UAAYE,GAAU,aAC1DiB,EAAAjB,EAAM,OAAN,YAAAiB,EAAY,8BAA+B,QAM9CF,MACAG,EAAAlB,EAAM,OAAN,YAAAkB,EAAY,8BAIbH,GAA6BI,EAAAnB,EAAM,OAAN,YAAAmB,EAAY,2BAC1BrB,EAAA,MACd,sCAAsCiB,CAA0B,EACjE,EAAA,CACA,CACF,EAGA,IAAIK,EAAkB,GAMT,MAAAC,EAAuBvB,GAA2B,CAE1DsB,IAGJJ,EAAgClB,CAAc,EAC1C,SAAO,OAAW,OAIf,OAAA,iBAAiB,QAAUE,GACjCa,EAAoBf,EAAgBE,CAAmB,CACxD,EACO,OAAA,iBAAiB,qBAAuBA,GAC9Cc,EAAoBhB,EAAgBE,CAA8B,CACnE,EACO,OAAA,iBAAiB,mBAAqBA,GAC5Cc,EAAoBhB,EAAgBE,CAA8B,CACnE,EACkBoB,EAAA,IACnB,EChFaE,EACZC,GACI,CACGA,EAAA,iBAAiB,WAAY,IAAM,CACzCA,EAAO,QAAQ,SAAW,EAAA,KAAMC,GAAY,CAC3C,MAAMC,EAAU,CACf,2BAA4BD,EAAQ,OAElCE,GAAMA,EAAE,YAAc,WAAA,EACtB,MACH,EACA,UAAWC,KAAUH,EACpBG,EAAO,YAAYF,CAAO,CAC3B,CACA,CAAA,CACD,CACF"}
|
package/index.js
CHANGED
|
@@ -76,7 +76,7 @@ const l = "/wordpress/wp-content/debug.log", b = async (e) => await e.fileExists
|
|
|
76
76
|
class L extends EventTarget {
|
|
77
77
|
// constructor
|
|
78
78
|
constructor(r = []) {
|
|
79
|
-
super(), this.
|
|
79
|
+
super(), this.fatalErrorEvent = "playground-fatal-error", this.handlers = r;
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
82
|
* Get all logs.
|
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 { LogHandler } from '../log-handlers';\nimport { 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 { LogHandler } from '../log-handlers';\nimport { Log, 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 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase '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 { LogHandler } from '../log-handlers';\nimport { formatLogEntry, Log } 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 ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\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 { Logger } 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\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: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\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 { logToMemory, logToConsole, logs } 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 type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\tprivate readonly handlers: Function[] = []\n\t) {\n\t\tsuper();\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 message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\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: undefined,\n\t\t\t\tprefix: 'JavaScript',\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: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\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: 'Info',\n\t\t\t\tprefix: 'JavaScript',\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: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\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: 'Error',\n\t\t\t\tprefix: 'JavaScript',\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 (e) {\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}: ${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 { Logger } 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: '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: '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","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","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 } from '../logger';\nimport { 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 } from '../logger';\nimport { 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 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase '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 type { Log } from '../logger';\nimport { formatLogEntry } 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 ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\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 } 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\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: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\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 { logToMemory, logToConsole, logs } 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 type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * Log handler.\n */\nexport type LogHandler = (log: Log, ...args: any[]) => void;\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\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 message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\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: undefined,\n\t\t\t\tprefix: 'JavaScript',\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: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\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: 'Info',\n\t\t\t\tprefix: 'JavaScript',\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: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\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: 'Error',\n\t\t\t\tprefix: 'JavaScript',\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}: ${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 } 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: '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: '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","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","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/lib/log-handlers.d.ts
CHANGED
package/lib/logger.d.ts
CHANGED
|
@@ -14,13 +14,17 @@ export type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';
|
|
|
14
14
|
* Log prefix.
|
|
15
15
|
*/
|
|
16
16
|
export type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';
|
|
17
|
+
/**
|
|
18
|
+
* Log handler.
|
|
19
|
+
*/
|
|
20
|
+
export type LogHandler = (log: Log, ...args: any[]) => void;
|
|
17
21
|
/**
|
|
18
22
|
* A logger for Playground.
|
|
19
23
|
*/
|
|
20
24
|
export declare class Logger extends EventTarget {
|
|
21
|
-
private readonly handlers;
|
|
22
25
|
readonly fatalErrorEvent = "playground-fatal-error";
|
|
23
|
-
|
|
26
|
+
private readonly handlers;
|
|
27
|
+
constructor(handlers?: LogHandler[]);
|
|
24
28
|
/**
|
|
25
29
|
* Get all logs.
|
|
26
30
|
* @returns string[]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@php-wasm/logger",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A logger for PHP-wasm clients like Playground and WP-now.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -24,11 +24,18 @@
|
|
|
24
24
|
"main": "./index.cjs",
|
|
25
25
|
"types": "index.d.ts",
|
|
26
26
|
"engines": {
|
|
27
|
-
"node": ">=
|
|
28
|
-
"npm": ">=
|
|
27
|
+
"node": ">=20.18.3",
|
|
28
|
+
"npm": ">=10.1.0"
|
|
29
|
+
},
|
|
30
|
+
"gitHead": "9dbbe2b22ccbacda9c0da4444c51d5739e784302",
|
|
31
|
+
"overrides": {
|
|
32
|
+
"rollup": "^4.34.6",
|
|
33
|
+
"react": "18.3.1",
|
|
34
|
+
"react-dom": "18.3.1",
|
|
35
|
+
"typescript": "5.4.5",
|
|
36
|
+
"ws": "^8.18.0"
|
|
29
37
|
},
|
|
30
|
-
"gitHead": "173e69f62e1b43bd7353b875054bb1ef5e394de8",
|
|
31
38
|
"dependencies": {
|
|
32
|
-
"@php-wasm/node-polyfills": "1.0
|
|
39
|
+
"@php-wasm/node-polyfills": "1.1.0"
|
|
33
40
|
}
|
|
34
|
-
}
|
|
41
|
+
}
|