Skip to content

Commit a4e797f

Browse files
committed
Intergrate debug adapter into python example and use ViewService
1 parent cdd5405 commit a4e797f

File tree

14 files changed

+352
-68
lines changed

14 files changed

+352
-68
lines changed

package-lock.json

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/examples/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"dependencies": {
7474
"@codingame/monaco-vscode-configuration-service-override": "13.1.3",
7575
"@codingame/monaco-vscode-cpp-default-extension": "13.1.3",
76+
"@codingame/monaco-vscode-debug-service-override": "13.1.3",
7677
"@codingame/monaco-vscode-editor-api": "13.1.3",
7778
"@codingame/monaco-vscode-environment-service-override": "13.1.3",
7879
"@codingame/monaco-vscode-explorer-service-override": "13.1.3",

packages/examples/python.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<!DOCTYPE html>
2-
<html>
2+
<html lang="en">
33

44
<head>
55
<title>Python Language Client & Pyright Language Server (Web Socket)</title>
6-
<meta charset="utf-8">
7-
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<meta charset="UTF-8" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
88
<link rel="stylesheet" href="style.css">
9+
<link rel="stylesheet" href="./resources/styles/views.css">
910
</head>
1011

1112
<body>
@@ -15,8 +16,7 @@
1516
<button type="button" id="button-start">Start</button>
1617
<button type="button" id="button-dispose">Dispose</button>
1718
</div>
18-
<div id="monaco-editor-root" style="width:800px;height:600px;border:1px solid grey"></div>
19-
<script type="module">
19+
<script type="module" rel="modulepreload">
2020
import { runPythonWrapper } from "./src/python/client/main.ts";
2121

2222
runPythonWrapper();

packages/examples/react_python.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>React: Python Language Client & Language Server (Web Socket)</title>
88
<link rel="stylesheet" href="style.css">
9+
<link rel="stylesheet" href="./resources/styles/views.css">
910
</head>
1011

1112
<body>

packages/examples/resources/debugger/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ RUN mkdir -p /home/mlc/workspace
1111
RUN mkdir -p /home/mlc/server/src
1212

1313
COPY ./packages/examples/resources/debugger/package.json /home/mlc/server
14+
COPY ./packages/examples/src/debugger/server/debugServer.ts /home/mlc/server/src

packages/examples/resources/debugger/docker-compose.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ services:
1111
platform: linux/amd64
1212
volumes:
1313
- ../python:/home/mlc/workspace
14-
- ../../src/debugger:/home/mlc/server/src
14+
# allow to override the server sources
15+
- ../../src/debugger/server:/home/mlc/server/src
1516
ports:
1617
- 55555:5555
1718
tty: true

packages/examples/resources/debugger/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@
3939
"tsx": "~4.19.2"
4040
},
4141
"scripts": {
42-
"start": "npm i && vite-node src/debugServer.ts"
42+
"start": "npm i && tsx src/debugServer.ts"
4343
}
4444
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2024 TypeFox and others.
3+
* Licensed under the MIT License. See LICENSE in the package root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
6+
import * as vscode from 'vscode';
7+
import type { ExtensionConfig } from 'monaco-editor-wrapper';
8+
import type { ConfigParams } from '../../python/client/config.js';
9+
10+
// This is derived from:
11+
// https://github.com/CodinGame/monaco-vscode-api/blob/main/demo/src/features/debugger.ts
12+
13+
export const provideDebuggerExtensionConfig = (config: ConfigParams): ExtensionConfig => {
14+
const filesOrContents = new Map<string, string | URL>();
15+
filesOrContents.set('./extension.js', '// nothing');
16+
17+
return {
18+
config: {
19+
name: 'debugger-py-client',
20+
publisher: 'TypeFox',
21+
version: '1.0.0',
22+
engines: {
23+
vscode: '*'
24+
},
25+
// A browser field is mandatory for the extension to be flagged as `web`
26+
browser: 'extension.js',
27+
contributes: {
28+
debuggers: [
29+
{
30+
type: config.languageId,
31+
label: 'Test',
32+
languages: [config.languageId]
33+
}
34+
],
35+
breakpoints: [
36+
{
37+
language: config.languageId
38+
}
39+
]
40+
}
41+
},
42+
filesOrContents
43+
};
44+
};
45+
46+
export const confiugureDebugging = async (api: typeof vscode, config: ConfigParams) => {
47+
class WebsocketDebugAdapter implements vscode.DebugAdapter {
48+
private websocket: WebSocket;
49+
50+
constructor(websocket: WebSocket) {
51+
this.websocket = websocket;
52+
this.websocket.onmessage = (message) => {
53+
this._onDidSendMessage.fire(JSON.parse(message.data));
54+
};
55+
}
56+
57+
_onDidSendMessage = new api.EventEmitter<vscode.DebugProtocolMessage>();
58+
onDidSendMessage = this._onDidSendMessage.event;
59+
60+
handleMessage(message: vscode.DebugProtocolMessage): void {
61+
this.websocket.send(JSON.stringify(message));
62+
}
63+
64+
dispose() {
65+
this.websocket.close();
66+
}
67+
}
68+
69+
api.debug.registerDebugConfigurationProvider(config.languageId, {
70+
resolveDebugConfiguration() {
71+
return {
72+
name: 'Test debugger',
73+
type: config.languageId,
74+
request: 'launch'
75+
};
76+
}
77+
});
78+
79+
api.debug.registerDebugAdapterDescriptorFactory(config.languageId, {
80+
async createDebugAdapterDescriptor() {
81+
const websocket = new WebSocket(config.debuggerUrl);
82+
83+
await new Promise((resolve, reject) => {
84+
websocket.onopen = resolve;
85+
websocket.onerror = () =>
86+
reject(new Error('Unable to connect to debugger server. Run `npm run start:debugServer`'));
87+
});
88+
89+
const file = config.files.get('hello.py');
90+
if (file === undefined) {
91+
throw new Error('No file found');
92+
} else {
93+
console.log(`Sending file: ${file.uri.path}`);
94+
websocket.send(
95+
JSON.stringify({
96+
main: file.uri.path,
97+
files: {
98+
file: new TextDecoder().decode(
99+
await api.workspace.fs.readFile(
100+
file.uri
101+
)
102+
)
103+
}
104+
})
105+
);
106+
}
107+
const adapter = new WebsocketDebugAdapter(websocket);
108+
109+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
110+
adapter.onDidSendMessage((message: any) => {
111+
if (message.type === 'event' && message.event === 'output') {
112+
console.log('OUTPUT', message.body.output);
113+
}
114+
});
115+
return new api.DebugAdapterInlineImplementation(adapter);
116+
}
117+
});
118+
};

packages/examples/src/debugger/debugServer.ts renamed to packages/examples/src/debugger/server/debugServer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See LICENSE in the package root for license information.
44
* ------------------------------------------------------------------------------------------ */
55

6-
// this is derived from:
6+
// This is derived from:
77
// https://github.com/CodinGame/monaco-vscode-api/blob/main/demo/src/debugServer.ts
88
// the major difference is that the debug server runs already inside the container
99

@@ -125,6 +125,7 @@ wss.on('connection', (ws) => {
125125
ws.on(
126126
'message',
127127
sequential(async (message: string) => {
128+
console.log('Received message', message);
128129
if (!initialized) {
129130
try {
130131
initialized = true;
@@ -184,5 +185,5 @@ wss.on('connection', (ws) => {
184185
});
185186

186187
server.listen(PORT, () => {
187-
console.log(`Server started on port ${PORT}`);
188+
console.log(`Server started on port ${PORT}!`);
188189
});

0 commit comments

Comments
 (0)