@php-wasm/xdebug-bridge 2.0.0 → 2.0.2
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/README.md +25 -26
- package/cli.cjs +1 -20
- package/cli.d.ts +1 -0
- package/cli.js +2 -127
- package/index.cjs +1 -2
- package/index.d.ts +1 -0
- package/index.js +6 -3
- package/lib/cdp-server.d.ts +8 -0
- package/lib/dbgp-session.d.ts +11 -0
- package/lib/index.d.ts +5 -0
- package/lib/run-cli.d.ts +1 -0
- package/lib/start-bridge.d.ts +13 -0
- package/lib/xdebug-cdp-bridge.d.ts +36 -0
- package/package.json +13 -4
- package/run-cli-DpXpnvR3.cjs +111 -0
- package/run-cli-II34aG2V.js +7857 -0
- package/xdebug-bridge.js +2 -0
- package/cli.cjs.map +0 -1
- package/cli.js.map +0 -1
- package/index.cjs.map +0 -1
- package/index.js.map +0 -1
- package/xdebug-bridge-BeKwvQ65.js +0 -78
- package/xdebug-bridge-BeKwvQ65.js.map +0 -1
- package/xdebug-bridge-Dc4daJ9d.cjs +0 -2
- package/xdebug-bridge-Dc4daJ9d.cjs.map +0 -1
package/xdebug-bridge.js
ADDED
package/cli.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","sources":["../../../../packages/php-wasm/xdebug-bridge/src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'util';\nimport { startXDebugBridge, type XDebugBridgeConfig } from './xdebug-bridge';\n\ninterface CLIArgs {\n\tprotocol?: 'cdp' | 'dap';\n\tport?: number;\n\thost?: string;\n\tverbose?: boolean;\n\thelp?: boolean;\n}\n\nfunction printHelp(): void {\n\t// eslint-ignore-next-line\n\tconsole.log(`\nXDebug Bridge Server CLI\n\nUsage: xdebug-bridge [options]\n\nOptions:\n --protocol <protocol> Protocol to use: cdp, dap (default: cdp)\n --port <port> Port to listen on (default: 9003)\n --host <host> Host to bind to (default: localhost)\n --verbose Enable verbose logging\n --help Show this help message\n\nExamples:\n xdebug-bridge # Start with default settings\n xdebug-bridge --port 9000 --verbose # Custom port with verbose logging\n xdebug-bridge --protocol dap --host 0.0.0.0 # DAP protocol, bind to all interfaces\n`);\n}\n\nfunction parseCliArgs(): CLIArgs {\n\ttry {\n\t\tconst { values } = parseArgs({\n\t\t\targs: process.argv.slice(2),\n\t\t\toptions: {\n\t\t\t\tprotocol: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'p',\n\t\t\t\t},\n\t\t\t\tport: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'P',\n\t\t\t\t},\n\t\t\t\thost: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'h',\n\t\t\t\t},\n\t\t\t\tverbose: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tshort: 'v',\n\t\t\t\t},\n\t\t\t\thelp: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t},\n\t\t\t},\n\t\t\tallowPositionals: false,\n\t\t});\n\n\t\tconst args: CLIArgs = {};\n\n\t\tif (values.protocol) {\n\t\t\tif (values.protocol !== 'cdp' && values.protocol !== 'dap') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid protocol: ${values.protocol}. Must be 'cdp' or 'dap'.`\n\t\t\t\t);\n\t\t\t}\n\t\t\targs.protocol = values.protocol as 'cdp' | 'dap';\n\t\t}\n\n\t\tif (values.port) {\n\t\t\tconst port = parseInt(values.port, 10);\n\t\t\tif (isNaN(port) || port < 1 || port > 65535) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid port: ${values.port}. Must be a number between 1 and 65535.`\n\t\t\t\t);\n\t\t\t}\n\t\t\targs.port = port;\n\t\t}\n\n\t\tif (values.host) {\n\t\t\targs.host = values.host;\n\t\t}\n\n\t\tif (values.verbose) {\n\t\t\targs.verbose = true;\n\t\t}\n\n\t\tif (values.help) {\n\t\t\targs.help = true;\n\t\t}\n\n\t\treturn args;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`Error parsing arguments: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function main(): Promise<void> {\n\tconst args = parseCliArgs();\n\n\tif (args.help) {\n\t\tprintHelp();\n\t\treturn;\n\t}\n\n\tconst config: XDebugBridgeConfig = {\n\t\tprotocol: args.protocol,\n\t\txdebugServerPort: args.port,\n\t\txdebugServerHost: args.host,\n\t\tverbose: args.verbose ?? true, // CLI defaults to verbose\n\t};\n\n\t// eslint-ignore-next-line\n\tconsole.log('Starting XDebug Bridge Server...');\n\n\tconst server = startXDebugBridge(config);\n\n\t// Handle graceful shutdown\n\tconst shutdown = async (signal: string) => {\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`\\nReceived ${signal}, shutting down gracefully...`);\n\t\ttry {\n\t\t\tawait server.stop();\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log('XDebug Bridge Server stopped.');\n\t\t\tprocess.exit(0);\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`Error during shutdown: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t};\n\n\tprocess.on('SIGINT', () => shutdown('SIGINT'));\n\tprocess.on('SIGTERM', () => shutdown('SIGTERM'));\n\n\t// Start the server\n\ttry {\n\t\tawait server.start();\n\n\t\tconst port = server.getPort();\n\t\tconst host = server.getHost();\n\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`✅ XDebug Bridge Server is running on ${host}:${port}`);\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`📡 Protocol: ${config.protocol || 'cdp'}`);\n\t\t// eslint-ignore-next-line\n\t\tconsole.log('🔍 Waiting for XDebug connections...');\n\t\t// eslint-ignore-next-line\n\t\tconsole.log('Press Ctrl+C to stop the server');\n\n\t\t// Set up event listeners for connection activity\n\t\tserver.on('connection', (socket) => {\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log(\n\t\t\t\t`🔗 New XDebug connection established from ${socket.remoteAddress}:${socket.remotePort}`\n\t\t\t);\n\t\t});\n\n\t\tserver.on('disconnection', (socket) => {\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log(\n\t\t\t\t`❌ XDebug connection closed from ${socket.remoteAddress}:${socket.remotePort}`\n\t\t\t);\n\t\t});\n\n\t\tserver.on('error', (error) => {\n\t\t\tconsole.error(`❌ Server error: ${error.message}`);\n\t\t});\n\n\t\tserver.on('socketError', ({ socket, error }) => {\n\t\t\tconsole.error(\n\t\t\t\t`❌ Socket error from ${socket.remoteAddress}:${socket.remotePort}: ${error.message}`\n\t\t\t);\n\t\t});\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`❌ Failed to start XDebug Bridge Server: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\n// Only run if this file is executed directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n\tmain().catch((error) => {\n\t\tconsole.error(\n\t\t\t`❌ Unexpected error: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t});\n}\n"],"names":["printHelp","parseCliArgs","values","parseArgs","args","port","error","main","config","server","startXDebugBridge","shutdown","signal","host","socket","_documentCurrentScript"],"mappings":"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"}
|
package/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../../../../packages/php-wasm/xdebug-bridge/src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from 'util';\nimport { startXDebugBridge, type XDebugBridgeConfig } from './xdebug-bridge';\n\ninterface CLIArgs {\n\tprotocol?: 'cdp' | 'dap';\n\tport?: number;\n\thost?: string;\n\tverbose?: boolean;\n\thelp?: boolean;\n}\n\nfunction printHelp(): void {\n\t// eslint-ignore-next-line\n\tconsole.log(`\nXDebug Bridge Server CLI\n\nUsage: xdebug-bridge [options]\n\nOptions:\n --protocol <protocol> Protocol to use: cdp, dap (default: cdp)\n --port <port> Port to listen on (default: 9003)\n --host <host> Host to bind to (default: localhost)\n --verbose Enable verbose logging\n --help Show this help message\n\nExamples:\n xdebug-bridge # Start with default settings\n xdebug-bridge --port 9000 --verbose # Custom port with verbose logging\n xdebug-bridge --protocol dap --host 0.0.0.0 # DAP protocol, bind to all interfaces\n`);\n}\n\nfunction parseCliArgs(): CLIArgs {\n\ttry {\n\t\tconst { values } = parseArgs({\n\t\t\targs: process.argv.slice(2),\n\t\t\toptions: {\n\t\t\t\tprotocol: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'p',\n\t\t\t\t},\n\t\t\t\tport: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'P',\n\t\t\t\t},\n\t\t\t\thost: {\n\t\t\t\t\ttype: 'string',\n\t\t\t\t\tshort: 'h',\n\t\t\t\t},\n\t\t\t\tverbose: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\tshort: 'v',\n\t\t\t\t},\n\t\t\t\thelp: {\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t},\n\t\t\t},\n\t\t\tallowPositionals: false,\n\t\t});\n\n\t\tconst args: CLIArgs = {};\n\n\t\tif (values.protocol) {\n\t\t\tif (values.protocol !== 'cdp' && values.protocol !== 'dap') {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid protocol: ${values.protocol}. Must be 'cdp' or 'dap'.`\n\t\t\t\t);\n\t\t\t}\n\t\t\targs.protocol = values.protocol as 'cdp' | 'dap';\n\t\t}\n\n\t\tif (values.port) {\n\t\t\tconst port = parseInt(values.port, 10);\n\t\t\tif (isNaN(port) || port < 1 || port > 65535) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid port: ${values.port}. Must be a number between 1 and 65535.`\n\t\t\t\t);\n\t\t\t}\n\t\t\targs.port = port;\n\t\t}\n\n\t\tif (values.host) {\n\t\t\targs.host = values.host;\n\t\t}\n\n\t\tif (values.verbose) {\n\t\t\targs.verbose = true;\n\t\t}\n\n\t\tif (values.help) {\n\t\t\targs.help = true;\n\t\t}\n\n\t\treturn args;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`Error parsing arguments: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function main(): Promise<void> {\n\tconst args = parseCliArgs();\n\n\tif (args.help) {\n\t\tprintHelp();\n\t\treturn;\n\t}\n\n\tconst config: XDebugBridgeConfig = {\n\t\tprotocol: args.protocol,\n\t\txdebugServerPort: args.port,\n\t\txdebugServerHost: args.host,\n\t\tverbose: args.verbose ?? true, // CLI defaults to verbose\n\t};\n\n\t// eslint-ignore-next-line\n\tconsole.log('Starting XDebug Bridge Server...');\n\n\tconst server = startXDebugBridge(config);\n\n\t// Handle graceful shutdown\n\tconst shutdown = async (signal: string) => {\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`\\nReceived ${signal}, shutting down gracefully...`);\n\t\ttry {\n\t\t\tawait server.stop();\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log('XDebug Bridge Server stopped.');\n\t\t\tprocess.exit(0);\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`Error during shutdown: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t};\n\n\tprocess.on('SIGINT', () => shutdown('SIGINT'));\n\tprocess.on('SIGTERM', () => shutdown('SIGTERM'));\n\n\t// Start the server\n\ttry {\n\t\tawait server.start();\n\n\t\tconst port = server.getPort();\n\t\tconst host = server.getHost();\n\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`✅ XDebug Bridge Server is running on ${host}:${port}`);\n\t\t// eslint-ignore-next-line\n\t\tconsole.log(`📡 Protocol: ${config.protocol || 'cdp'}`);\n\t\t// eslint-ignore-next-line\n\t\tconsole.log('🔍 Waiting for XDebug connections...');\n\t\t// eslint-ignore-next-line\n\t\tconsole.log('Press Ctrl+C to stop the server');\n\n\t\t// Set up event listeners for connection activity\n\t\tserver.on('connection', (socket) => {\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log(\n\t\t\t\t`🔗 New XDebug connection established from ${socket.remoteAddress}:${socket.remotePort}`\n\t\t\t);\n\t\t});\n\n\t\tserver.on('disconnection', (socket) => {\n\t\t\t// eslint-ignore-next-line\n\t\t\tconsole.log(\n\t\t\t\t`❌ XDebug connection closed from ${socket.remoteAddress}:${socket.remotePort}`\n\t\t\t);\n\t\t});\n\n\t\tserver.on('error', (error) => {\n\t\t\tconsole.error(`❌ Server error: ${error.message}`);\n\t\t});\n\n\t\tserver.on('socketError', ({ socket, error }) => {\n\t\t\tconsole.error(\n\t\t\t\t`❌ Socket error from ${socket.remoteAddress}:${socket.remotePort}: ${error.message}`\n\t\t\t);\n\t\t});\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`❌ Failed to start XDebug Bridge Server: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n\n// Only run if this file is executed directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n\tmain().catch((error) => {\n\t\tconsole.error(\n\t\t\t`❌ Unexpected error: ${\n\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t}`\n\t\t);\n\t\tprocess.exit(1);\n\t});\n}\n"],"names":["printHelp","parseCliArgs","values","parseArgs","args","port","error","main","config","server","startXDebugBridge","shutdown","signal","host","socket"],"mappings":"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"}
|
package/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { createServer as i } from "net";
|
|
2
|
-
import { EventEmitter as n } from "events";
|
|
3
|
-
class g extends n {
|
|
4
|
-
constructor(e = {}) {
|
|
5
|
-
super(), this.server = null, this.connectedClients = /* @__PURE__ */ new Set(), this.config = {
|
|
6
|
-
protocol: e.protocol ?? "cdp",
|
|
7
|
-
xdebugServerPort: e.xdebugServerPort ?? 9003,
|
|
8
|
-
xdebugServerHost: e.xdebugServerHost ?? "localhost",
|
|
9
|
-
verbose: e.verbose ?? !1,
|
|
10
|
-
logger: e.logger ?? ((t) => {
|
|
11
|
-
this.config.verbose && console.log(`[XDebug Bridge] ${t}`);
|
|
12
|
-
})
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
log(e) {
|
|
16
|
-
this.config.logger(e);
|
|
17
|
-
}
|
|
18
|
-
async start() {
|
|
19
|
-
if (this.server)
|
|
20
|
-
throw new Error("XDebug bridge server is already running");
|
|
21
|
-
return new Promise((e, t) => {
|
|
22
|
-
this.server = i(), this.server.on("connection", (r) => {
|
|
23
|
-
this.handleConnection(r);
|
|
24
|
-
}), this.server.on("error", (r) => {
|
|
25
|
-
this.log(`Server error: ${r.message}`), this.emit("error", r), t(r);
|
|
26
|
-
}), this.server.listen(
|
|
27
|
-
this.config.xdebugServerPort,
|
|
28
|
-
this.config.xdebugServerHost,
|
|
29
|
-
() => {
|
|
30
|
-
const r = this.server?.address(), o = typeof r == "object" && r ? r.port : this.config.xdebugServerPort;
|
|
31
|
-
this.log(
|
|
32
|
-
`XDebug bridge server started on ${this.config.xdebugServerHost}:${o}`
|
|
33
|
-
), this.log(`Protocol: ${this.config.protocol}`), this.emit("started", {
|
|
34
|
-
host: this.config.xdebugServerHost,
|
|
35
|
-
port: o
|
|
36
|
-
}), e();
|
|
37
|
-
}
|
|
38
|
-
);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
async stop() {
|
|
42
|
-
if (this.server)
|
|
43
|
-
return new Promise((e) => {
|
|
44
|
-
for (const t of this.connectedClients)
|
|
45
|
-
t.destroy();
|
|
46
|
-
this.connectedClients.clear(), this.server.close(() => {
|
|
47
|
-
this.log("XDebug bridge server stopped"), this.emit("stopped"), this.server = null, e();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
getPort() {
|
|
52
|
-
if (!this.server) return null;
|
|
53
|
-
const e = this.server.address();
|
|
54
|
-
return typeof e == "object" && e ? e.port : null;
|
|
55
|
-
}
|
|
56
|
-
getHost() {
|
|
57
|
-
return this.config.xdebugServerHost;
|
|
58
|
-
}
|
|
59
|
-
isRunning() {
|
|
60
|
-
return this.server !== null && this.server.listening;
|
|
61
|
-
}
|
|
62
|
-
handleConnection(e) {
|
|
63
|
-
const t = `${e.remoteAddress}:${e.remotePort}`;
|
|
64
|
-
this.log(`New XDebug connection from ${t}`), this.connectedClients.add(e), this.emit("connection", e), e.on("data", () => {
|
|
65
|
-
}), e.on("close", () => {
|
|
66
|
-
this.log(`XDebug connection closed from ${t}`), this.connectedClients.delete(e), this.emit("disconnection", e);
|
|
67
|
-
}), e.on("error", (r) => {
|
|
68
|
-
this.log(`Socket error from ${t}: ${r.message}`), this.connectedClients.delete(e), this.emit("socketError", { socket: e, error: r });
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
function c(s = {}) {
|
|
73
|
-
return new g(s);
|
|
74
|
-
}
|
|
75
|
-
export {
|
|
76
|
-
c as s
|
|
77
|
-
};
|
|
78
|
-
//# sourceMappingURL=xdebug-bridge-BeKwvQ65.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xdebug-bridge-BeKwvQ65.js","sources":["../../../../packages/php-wasm/xdebug-bridge/src/xdebug-bridge.ts"],"sourcesContent":["import { createServer, type Server, type Socket } from 'net';\nimport { EventEmitter } from 'events';\n\nexport interface XDebugBridgeConfig {\n\t/**\n\t * The protocol to use for the bridge communication.\n\t * @default \"cdp\"\n\t */\n\tprotocol?: 'cdp' | 'dap';\n\n\t/**\n\t * The port where XDebug server will listen for connections.\n\t * @default 9003\n\t */\n\txdebugServerPort?: number;\n\n\t/**\n\t * The host where XDebug server will bind to.\n\t * @default \"localhost\"\n\t */\n\txdebugServerHost?: string;\n\n\t/**\n\t * Whether to enable verbose logging.\n\t * @default false\n\t */\n\tverbose?: boolean;\n\n\t/**\n\t * Custom logger function. If not provided and verbose is true, console.log will be used.\n\t */\n\tlogger?: (message: string) => void;\n}\n\nexport interface XDebugBridgeServer extends EventEmitter {\n\t/**\n\t * Start the XDebug bridge server.\n\t */\n\tstart(): Promise<void>;\n\n\t/**\n\t * Stop the XDebug bridge server.\n\t */\n\tstop(): Promise<void>;\n\n\t/**\n\t * Get the actual port the server is listening on.\n\t */\n\tgetPort(): number | null;\n\n\t/**\n\t * Get the host the server is listening on.\n\t */\n\tgetHost(): string;\n\n\t/**\n\t * Check if the server is currently running.\n\t */\n\tisRunning(): boolean;\n}\n\nclass XDebugBridgeServerImpl\n\textends EventEmitter\n\timplements XDebugBridgeServer\n{\n\tprivate server: Server | null = null;\n\tprivate config: Required<XDebugBridgeConfig>;\n\tprivate connectedClients = new Set<Socket>();\n\n\tconstructor(config: XDebugBridgeConfig = {}) {\n\t\tsuper();\n\n\t\tthis.config = {\n\t\t\tprotocol: config.protocol ?? 'cdp',\n\t\t\txdebugServerPort: config.xdebugServerPort ?? 9003,\n\t\t\txdebugServerHost: config.xdebugServerHost ?? 'localhost',\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tlogger:\n\t\t\t\tconfig.logger ??\n\t\t\t\t((message: string) => {\n\t\t\t\t\tif (this.config.verbose) {\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tconsole.log(`[XDebug Bridge] ${message}`);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t};\n\t}\n\n\tprivate log(message: string): void {\n\t\tthis.config.logger(message);\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.server) {\n\t\t\tthrow new Error('XDebug bridge server is already running');\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.server = createServer();\n\n\t\t\tthis.server.on('connection', (socket: Socket) => {\n\t\t\t\tthis.handleConnection(socket);\n\t\t\t});\n\n\t\t\tthis.server.on('error', (error: Error) => {\n\t\t\t\tthis.log(`Server error: ${error.message}`);\n\t\t\t\tthis.emit('error', error);\n\t\t\t\treject(error);\n\t\t\t});\n\n\t\t\tthis.server.listen(\n\t\t\t\tthis.config.xdebugServerPort,\n\t\t\t\tthis.config.xdebugServerHost,\n\t\t\t\t() => {\n\t\t\t\t\tconst address = this.server?.address();\n\t\t\t\t\tconst port =\n\t\t\t\t\t\ttypeof address === 'object' && address\n\t\t\t\t\t\t\t? address.port\n\t\t\t\t\t\t\t: this.config.xdebugServerPort;\n\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`XDebug bridge server started on ${this.config.xdebugServerHost}:${port}`\n\t\t\t\t\t);\n\t\t\t\t\tthis.log(`Protocol: ${this.config.protocol}`);\n\t\t\t\t\tthis.emit('started', {\n\t\t\t\t\t\thost: this.config.xdebugServerHost,\n\t\t\t\t\t\tport,\n\t\t\t\t\t});\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (!this.server) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// Close all client connections\n\t\t\tfor (const client of this.connectedClients) {\n\t\t\t\tclient.destroy();\n\t\t\t}\n\t\t\tthis.connectedClients.clear();\n\n\t\t\tthis.server!.close(() => {\n\t\t\t\tthis.log('XDebug bridge server stopped');\n\t\t\t\tthis.emit('stopped');\n\t\t\t\tthis.server = null;\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tgetPort(): number | null {\n\t\tif (!this.server) return null;\n\t\tconst address = this.server.address();\n\t\treturn typeof address === 'object' && address ? address.port : null;\n\t}\n\n\tgetHost(): string {\n\t\treturn this.config.xdebugServerHost;\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this.server !== null && this.server.listening;\n\t}\n\n\tprivate handleConnection(socket: Socket): void {\n\t\tconst clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;\n\t\tthis.log(`New XDebug connection from ${clientAddress}`);\n\n\t\tthis.connectedClients.add(socket);\n\t\tthis.emit('connection', socket);\n\n\t\tsocket.on('data', () => {\n\t\t\t// TODO: Handle XDebug data\n\t\t});\n\n\t\tsocket.on('close', () => {\n\t\t\tthis.log(`XDebug connection closed from ${clientAddress}`);\n\t\t\tthis.connectedClients.delete(socket);\n\t\t\tthis.emit('disconnection', socket);\n\t\t});\n\n\t\tsocket.on('error', (error: Error) => {\n\t\t\tthis.log(`Socket error from ${clientAddress}: ${error.message}`);\n\t\t\tthis.connectedClients.delete(socket);\n\t\t\tthis.emit('socketError', { socket, error });\n\t\t});\n\t}\n}\n\n/**\n * Starts an XDebug bridge server that can relay debugging sessions.\n *\n * @param config Configuration options for the XDebug bridge\n * @returns A promise that resolves to an XDebugBridgeServer instance\n */\nexport function startXDebugBridge(\n\tconfig: XDebugBridgeConfig = {}\n): XDebugBridgeServer {\n\tconst bridge = new XDebugBridgeServerImpl(config);\n\treturn bridge;\n}\n"],"names":["XDebugBridgeServerImpl","EventEmitter","config","message","resolve","reject","createServer","socket","error","address","port","client","clientAddress","startXDebugBridge"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const n=require("net"),i=require("events");class g extends i.EventEmitter{constructor(e={}){super(),this.server=null,this.connectedClients=new Set,this.config={protocol:e.protocol??"cdp",xdebugServerPort:e.xdebugServerPort??9003,xdebugServerHost:e.xdebugServerHost??"localhost",verbose:e.verbose??!1,logger:e.logger??(t=>{this.config.verbose&&console.log(`[XDebug Bridge] ${t}`)})}}log(e){this.config.logger(e)}async start(){if(this.server)throw new Error("XDebug bridge server is already running");return new Promise((e,t)=>{this.server=n.createServer(),this.server.on("connection",r=>{this.handleConnection(r)}),this.server.on("error",r=>{this.log(`Server error: ${r.message}`),this.emit("error",r),t(r)}),this.server.listen(this.config.xdebugServerPort,this.config.xdebugServerHost,()=>{const r=this.server?.address(),o=typeof r=="object"&&r?r.port:this.config.xdebugServerPort;this.log(`XDebug bridge server started on ${this.config.xdebugServerHost}:${o}`),this.log(`Protocol: ${this.config.protocol}`),this.emit("started",{host:this.config.xdebugServerHost,port:o}),e()})})}async stop(){if(this.server)return new Promise(e=>{for(const t of this.connectedClients)t.destroy();this.connectedClients.clear(),this.server.close(()=>{this.log("XDebug bridge server stopped"),this.emit("stopped"),this.server=null,e()})})}getPort(){if(!this.server)return null;const e=this.server.address();return typeof e=="object"&&e?e.port:null}getHost(){return this.config.xdebugServerHost}isRunning(){return this.server!==null&&this.server.listening}handleConnection(e){const t=`${e.remoteAddress}:${e.remotePort}`;this.log(`New XDebug connection from ${t}`),this.connectedClients.add(e),this.emit("connection",e),e.on("data",()=>{}),e.on("close",()=>{this.log(`XDebug connection closed from ${t}`),this.connectedClients.delete(e),this.emit("disconnection",e)}),e.on("error",r=>{this.log(`Socket error from ${t}: ${r.message}`),this.connectedClients.delete(e),this.emit("socketError",{socket:e,error:r})})}}function d(s={}){return new g(s)}exports.startXDebugBridge=d;
|
|
2
|
-
//# sourceMappingURL=xdebug-bridge-Dc4daJ9d.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xdebug-bridge-Dc4daJ9d.cjs","sources":["../../../../packages/php-wasm/xdebug-bridge/src/xdebug-bridge.ts"],"sourcesContent":["import { createServer, type Server, type Socket } from 'net';\nimport { EventEmitter } from 'events';\n\nexport interface XDebugBridgeConfig {\n\t/**\n\t * The protocol to use for the bridge communication.\n\t * @default \"cdp\"\n\t */\n\tprotocol?: 'cdp' | 'dap';\n\n\t/**\n\t * The port where XDebug server will listen for connections.\n\t * @default 9003\n\t */\n\txdebugServerPort?: number;\n\n\t/**\n\t * The host where XDebug server will bind to.\n\t * @default \"localhost\"\n\t */\n\txdebugServerHost?: string;\n\n\t/**\n\t * Whether to enable verbose logging.\n\t * @default false\n\t */\n\tverbose?: boolean;\n\n\t/**\n\t * Custom logger function. If not provided and verbose is true, console.log will be used.\n\t */\n\tlogger?: (message: string) => void;\n}\n\nexport interface XDebugBridgeServer extends EventEmitter {\n\t/**\n\t * Start the XDebug bridge server.\n\t */\n\tstart(): Promise<void>;\n\n\t/**\n\t * Stop the XDebug bridge server.\n\t */\n\tstop(): Promise<void>;\n\n\t/**\n\t * Get the actual port the server is listening on.\n\t */\n\tgetPort(): number | null;\n\n\t/**\n\t * Get the host the server is listening on.\n\t */\n\tgetHost(): string;\n\n\t/**\n\t * Check if the server is currently running.\n\t */\n\tisRunning(): boolean;\n}\n\nclass XDebugBridgeServerImpl\n\textends EventEmitter\n\timplements XDebugBridgeServer\n{\n\tprivate server: Server | null = null;\n\tprivate config: Required<XDebugBridgeConfig>;\n\tprivate connectedClients = new Set<Socket>();\n\n\tconstructor(config: XDebugBridgeConfig = {}) {\n\t\tsuper();\n\n\t\tthis.config = {\n\t\t\tprotocol: config.protocol ?? 'cdp',\n\t\t\txdebugServerPort: config.xdebugServerPort ?? 9003,\n\t\t\txdebugServerHost: config.xdebugServerHost ?? 'localhost',\n\t\t\tverbose: config.verbose ?? false,\n\t\t\tlogger:\n\t\t\t\tconfig.logger ??\n\t\t\t\t((message: string) => {\n\t\t\t\t\tif (this.config.verbose) {\n\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\tconsole.log(`[XDebug Bridge] ${message}`);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t};\n\t}\n\n\tprivate log(message: string): void {\n\t\tthis.config.logger(message);\n\t}\n\n\tasync start(): Promise<void> {\n\t\tif (this.server) {\n\t\t\tthrow new Error('XDebug bridge server is already running');\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.server = createServer();\n\n\t\t\tthis.server.on('connection', (socket: Socket) => {\n\t\t\t\tthis.handleConnection(socket);\n\t\t\t});\n\n\t\t\tthis.server.on('error', (error: Error) => {\n\t\t\t\tthis.log(`Server error: ${error.message}`);\n\t\t\t\tthis.emit('error', error);\n\t\t\t\treject(error);\n\t\t\t});\n\n\t\t\tthis.server.listen(\n\t\t\t\tthis.config.xdebugServerPort,\n\t\t\t\tthis.config.xdebugServerHost,\n\t\t\t\t() => {\n\t\t\t\t\tconst address = this.server?.address();\n\t\t\t\t\tconst port =\n\t\t\t\t\t\ttypeof address === 'object' && address\n\t\t\t\t\t\t\t? address.port\n\t\t\t\t\t\t\t: this.config.xdebugServerPort;\n\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`XDebug bridge server started on ${this.config.xdebugServerHost}:${port}`\n\t\t\t\t\t);\n\t\t\t\t\tthis.log(`Protocol: ${this.config.protocol}`);\n\t\t\t\t\tthis.emit('started', {\n\t\t\t\t\t\thost: this.config.xdebugServerHost,\n\t\t\t\t\t\tport,\n\t\t\t\t\t});\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (!this.server) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// Close all client connections\n\t\t\tfor (const client of this.connectedClients) {\n\t\t\t\tclient.destroy();\n\t\t\t}\n\t\t\tthis.connectedClients.clear();\n\n\t\t\tthis.server!.close(() => {\n\t\t\t\tthis.log('XDebug bridge server stopped');\n\t\t\t\tthis.emit('stopped');\n\t\t\t\tthis.server = null;\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tgetPort(): number | null {\n\t\tif (!this.server) return null;\n\t\tconst address = this.server.address();\n\t\treturn typeof address === 'object' && address ? address.port : null;\n\t}\n\n\tgetHost(): string {\n\t\treturn this.config.xdebugServerHost;\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this.server !== null && this.server.listening;\n\t}\n\n\tprivate handleConnection(socket: Socket): void {\n\t\tconst clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;\n\t\tthis.log(`New XDebug connection from ${clientAddress}`);\n\n\t\tthis.connectedClients.add(socket);\n\t\tthis.emit('connection', socket);\n\n\t\tsocket.on('data', () => {\n\t\t\t// TODO: Handle XDebug data\n\t\t});\n\n\t\tsocket.on('close', () => {\n\t\t\tthis.log(`XDebug connection closed from ${clientAddress}`);\n\t\t\tthis.connectedClients.delete(socket);\n\t\t\tthis.emit('disconnection', socket);\n\t\t});\n\n\t\tsocket.on('error', (error: Error) => {\n\t\t\tthis.log(`Socket error from ${clientAddress}: ${error.message}`);\n\t\t\tthis.connectedClients.delete(socket);\n\t\t\tthis.emit('socketError', { socket, error });\n\t\t});\n\t}\n}\n\n/**\n * Starts an XDebug bridge server that can relay debugging sessions.\n *\n * @param config Configuration options for the XDebug bridge\n * @returns A promise that resolves to an XDebugBridgeServer instance\n */\nexport function startXDebugBridge(\n\tconfig: XDebugBridgeConfig = {}\n): XDebugBridgeServer {\n\tconst bridge = new XDebugBridgeServerImpl(config);\n\treturn bridge;\n}\n"],"names":["XDebugBridgeServerImpl","EventEmitter","config","message","resolve","reject","createServer","socket","error","address","port","client","clientAddress","startXDebugBridge"],"mappings":"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"}
|