Skip to content

Commit 91cf1a1

Browse files
committed
still not work in worker
1 parent efabab1 commit 91cf1a1

File tree

10 files changed

+215
-84
lines changed

10 files changed

+215
-84
lines changed

masm-tasm/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ node_modules
88
**/.DS_store
99
dev/*.tgz
1010
resources/*.zip
11+
12+
src/jsdos

masm-tasm/dev/copy-jsdos.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// copy files to resources
2+
const fs=require("fs");
3+
const path=require("path")
4+
5+
const Files=[
6+
{from:"node_modules/emulators/dist/*.js",to:"resources/jsdos"},
7+
{from:"node_modules/emulators/dist/*.js",to:"resources/jsdos"},
8+
]
9+
10+
const folder="node_modules/emulators/dist/"
11+
const files=fs.readdirSync(folder);
12+
for(const file of files){
13+
const source=path.resolve(folder,file)
14+
if(file.endsWith("x.js")){
15+
const header=fs.readFileSync("dev/header.js","utf-8")
16+
const body=fs.readFileSync(source,"utf-8");
17+
fs.writeFileSync("resources/jsdos/"+file,(header+body).replace(/\r\n/g,"\n"))
18+
}
19+
if(file.endsWith(".wasm")){
20+
fs.copyFileSync(source,"resources/jsdos/"+file)
21+
}
22+
}
23+

masm-tasm/dev/header.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
2+
3+
if (isNode) {
4+
const { isMainThread } = require('node:worker_threads');
5+
if (isMainThread) {
6+
console.log("main")
7+
}
8+
else {
9+
const { parentPort } = require('node:worker_threads');
10+
var self = parentPort;
11+
var worker = parentPort;
12+
function importScripts(...args) {
13+
console.log(args)
14+
}
15+
var onmessage = function (e) {
16+
17+
}
18+
parentPort.on('message', (message) => {
19+
onmessage({ data: message })
20+
});
21+
function postMessage(msg) {
22+
parentPort.postMessage(msg);
23+
}
24+
}
25+
} else {
26+
class Self {
27+
calls = []
28+
location=location
29+
constructor() {
30+
onmessage = (e) => {
31+
this.calls.forEach(a => a && a(e))
32+
}
33+
}
34+
addEventListener(msg, call) {
35+
if (msg === "message")
36+
this.calls.push(call)
37+
}
38+
removeEventListener(msg, call) {
39+
this.calls.forEach((value, index) => {
40+
if (value === call) {
41+
this.calls[idx] = undefined
42+
}
43+
})
44+
}
45+
}
46+
var self = new Self();
47+
}
48+
49+
50+

masm-tasm/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@
483483
"assert": "^2.0.0",
484484
"del": "^7.0.0",
485485
"download": "^8.0.0",
486-
"emulators": "./dev/emulators-v8.3.3-dosasm2.1.tgz",
486+
"emulators": "./dev/emulators-v8.3.3-dosasm2.3.tgz",
487487
"eslint": "^8.20.0",
488488
"glob": "^8.0.3",
489489
"http-proxy-agent": "^7.0.2",

masm-tasm/pnpm-lock.yaml

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

masm-tasm/resources/jsdos/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.js
2+
*.wasm

masm-tasm/src/emulators/jsdos-ci.ts

+42-32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as vscode from 'vscode';
22
import * as conf from '../utils/configuration';
3-
import { CommandInterface, utils } from 'emulators/dist/out/emulators';
3+
import { CommandInterface, utils } from 'emulators';
44

55
class JsdosTerminal implements vscode.Pseudoterminal {
66
onDidWrite: vscode.Event<string>;
@@ -66,32 +66,49 @@ function getWebviewContent(webview: vscode.Webview, extensionUri: vscode.Uri) {
6666

6767

6868
class Manager {
69-
hasCi: {ci: CommandInterface|undefined}={ci:undefined};
70-
terminal:vscode.Terminal|undefined=undefined;
71-
shell:utils.Shell|undefined=undefined;
69+
hasCi: { ci: CommandInterface | undefined } = { ci: undefined };
70+
terminal: vscode.Terminal | undefined = undefined;
71+
shell: utils.Shell | undefined = undefined;
7272
bar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
73-
updateci(hasCi:{ci: CommandInterface}) {
73+
updateci(hasCi: { ci: CommandInterface }) {
7474
this.bar.command = 'masmtasm.emulatorStatus';
7575
this.bar.text = `jsdos`;
7676
this.bar.show();
77-
this.bar.color=new vscode.ThemeColor("activityBar.activeBackground")
77+
this.bar.color = new vscode.ThemeColor("activityBar.activeBackground")
7878

7979
this.hasCi = hasCi;
8080
const pty = new JsdosTerminal(hasCi.ci);
81-
this.terminal=vscode.window.createTerminal({ name: "jsdos", pty, });
82-
this.shell=pty.shell
81+
this.terminal = vscode.window.createTerminal({ name: "jsdos", pty, });
82+
this.shell = pty.shell
83+
84+
this.hasCi.ci?.events().onFrame((rgb, rgba) => {
85+
if(this.panel)
86+
this.panel.webview.postMessage({
87+
command: 'rgb',
88+
time: new Date().getTime(),
89+
data: rgb
90+
});
91+
});
8392
}
84-
webview(context:vscode.ExtensionContext) {
85-
let ci=this.hasCi.ci;
93+
panel: vscode.WebviewPanel | undefined = undefined
94+
webview(context: vscode.ExtensionContext) {
95+
const ci = this.hasCi.ci;
8696
if (ci) {
87-
const panel = vscode.window.createWebviewPanel(
88-
"jsdos",
89-
"jsdos panel",
90-
{ viewColumn: vscode.ViewColumn.Beside },
91-
{
92-
enableScripts: true
93-
}
94-
)
97+
if (!this.panel?.active) {
98+
this.panel?.reveal()
99+
}
100+
if (this.panel === undefined) {
101+
this.panel=vscode.window.createWebviewPanel(
102+
"jsdos",
103+
"jsdos panel",
104+
{ viewColumn: vscode.ViewColumn.Beside },
105+
{
106+
enableScripts: true
107+
}
108+
)
109+
}
110+
const panel =this.panel as vscode.WebviewPanel
111+
95112
const currentTime = new Date().getTime();
96113

97114
panel.webview.html = getWebviewContent(panel.webview, context.extensionUri);
@@ -102,13 +119,6 @@ class Manager {
102119
width: ci?.width(),
103120
height: ci?.height()
104121
});
105-
ci?.events().onFrame((rgb, rgba) => {
106-
panel.webview.postMessage({
107-
command: 'rgb',
108-
time: new Date().getTime(),
109-
data: rgb
110-
});
111-
});
112122
panel.webview.onDidReceiveMessage(
113123
message => {
114124
console.log(message);
@@ -135,25 +145,25 @@ class Manager {
135145
}
136146
}
137147

138-
export const manager=new Manager();
148+
export const manager = new Manager();
139149

140150

141151

142152
export function activate(context: vscode.ExtensionContext): void {
143153
async function statusBarCommand() {
144-
const items = ["show jsdos view", "show terminal","exit"];
145-
154+
const items = ["show jsdos view", "show terminal", "exit"];
155+
146156
const placeHolder = 'manipulate emulator';
147157
const seleted = await vscode.window.showQuickPick(items, { placeHolder });
148-
if (seleted===items[0]) {
158+
if (seleted === items[0]) {
149159
manager.webview(context);
150160
}
151-
if(seleted===items[1]){
161+
if (seleted === items[1]) {
152162
manager.terminal?.show();
153163
}
154-
if(seleted===items[2]){
164+
if (seleted === items[2]) {
155165
manager.hasCi.ci?.exit()
156-
manager.hasCi.ci=undefined
166+
manager.hasCi.ci = undefined
157167
manager.bar.hide()
158168
manager.terminal?.hide()
159169
}

masm-tasm/src/emulators/jsdos.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ExtensionContext, ExtensionMode, Uri } from "vscode";
22
import * as vscode from "vscode"
33
import { ActionContext, AsmResult, ExecAction } from "../ASM/manager";
44
import { DosEmulatorType } from "../utils/configuration";
5-
import { CommandInterface, getEmulators,platform } from 'emulators/dist/out/emulators';
5+
import { CommandInterface, getEmulators} from 'emulators';
66
import { manager } from "./jsdos-ci";
77
import { createBundle } from "./bundle";
88

@@ -31,7 +31,7 @@ export class JSDosHost implements ExecAction{
3131

3232
if(runtime===undefined||runtime.ci===undefined){
3333
if(context.extensionMode==ExtensionMode.Development){
34-
runtime=new JsdosRuntime(Uri.joinPath(context.extensionUri,"node_modules/emulators/dist/").fsPath);
34+
runtime=new JsdosRuntime(Uri.joinPath(context.extensionUri,"resources/jsdos/").fsPath);
3535
}else{
3636
throw new Error("not implemented");
3737
}
@@ -48,12 +48,12 @@ c:
4848
await runtime.run(data);
4949
if(runtime && runtime.ci){
5050
manager.updateci(runtime as {ci:CommandInterface});
51+
runtime.ci.resume()
5152
}
52-
vscode.workspace.fs.writeFile(Uri.joinPath(context.extensionUri,"resources","test.zip"),data)
5353
}
5454

5555
if(manager.hasCi.ci&&manager.terminal){
56-
manager.shell?.exec("echo hello")
56+
manager.shell?.exec("echo hello",1000,1000,100000000)
5757
}
5858

5959
return {

masm-tasm/src/extension.ts

+44-9
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,54 @@ import { localize, loadI18n } from './utils/i18n';
44
import * as lan from './language/main';
55
import * as asm from './ASM/main';
66

7-
import { XhrOptions } from "emulators/dist/out/impl/http";
8-
import { platform } from 'emulators/dist/out/emulators';
7+
import { Platform, platform, XhrOptions } from 'emulators';
98

10-
const request=platform.current.httpRequest
11-
platform.current.httpRequest=function(url:string,options:XhrOptions){
12-
return request(url,options)
13-
}
149

15-
platform.current.node_require=function(url:string){
16-
return __non_webpack_require__(url);
17-
};
10+
class Nodejs implements Platform{
11+
name="vscode nodejs host"
12+
jsdos = ""
13+
constructor(private context: vscode.ExtensionContext) {
14+
if (context.extensionMode == vscode.ExtensionMode.Development) {
15+
this.jsdos = "resources/jsdos/"
16+
}
17+
}
18+
async createWorker(workerUrl: string, onerror: (e: ErrorEvent) => void, onmessage: (e: MessageEvent) => void): Promise<Worker> {
19+
const node_workder_threads=__non_webpack_require__("node:worker_threads")
20+
const w=new node_workder_threads.Worker(workerUrl)
21+
w.on('message', (message:any) => {
22+
onmessage({data:message} as any)
23+
});
24+
w.on('error',(error:any)=>{
25+
onerror({type:"node worker thread",filename:error.stack,message:error.message} as any)
26+
})
27+
return w
28+
}
29+
node_require(path: string) {
30+
return __non_webpack_require__(path);
31+
}
32+
async httpRequest(url: string, options: XhrOptions) {
33+
if (url.endsWith("wasm")) {
34+
const uri = vscode.Uri.file(url)
35+
const filename = uri.path.substring(uri.path.lastIndexOf('/'));
36+
const uri2 = vscode.Uri.joinPath(this.context.extensionUri, this.jsdos, filename)
37+
return await vscode.workspace.fs.readFile(uri2)
38+
}
39+
40+
if (url.endsWith("js")) {
41+
const uri = vscode.Uri.file(url)
42+
const filename = uri.path.substring(uri.path.lastIndexOf('/'));
43+
const uri2 = vscode.Uri.joinPath(this.context.extensionUri, this.jsdos, filename)
44+
const data = await vscode.workspace.fs.readFile(uri2)
45+
const text = new TextDecoder("utf-8").decode(data)
46+
return text
47+
}
48+
throw new Error(" ")
49+
}
50+
51+
}
1852

1953
export function activate(context: vscode.ExtensionContext): void {
54+
platform.set(new Nodejs(context));
2055

2156
loadI18n(context);
2257

0 commit comments

Comments
 (0)