Skip to content
This repository was archived by the owner on Feb 14, 2024. It is now read-only.

Commit 3b5c168

Browse files
committed
Workaround issue with getting a Stream instead of a Node
1 parent 1364129 commit 3b5c168

File tree

1 file changed

+60
-24
lines changed

1 file changed

+60
-24
lines changed

src/worker.ts

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,68 @@
44

55
import { expose } from 'comlink';
66

7-
import { DriveFS } from '@jupyterlite/contents';
7+
import { DriveFS, DriveFSEmscriptenNodeOps, IEmscriptenFSNode, IStats } from '@jupyterlite/contents';
88

99
declare function createXeusModule(options: any): any;
1010

1111
globalThis.Module = {};
1212

13+
// TODO Remove this. This is to ensure we always perform node ops on Nodes and
14+
// not Streams, but why is it needed??? Why do we get Streams and not Nodes from
15+
// emscripten in the case of xeus-python???
16+
class StreamNodeOps extends DriveFSEmscriptenNodeOps {
17+
18+
private getNode(nodeOrStream: any) {
19+
if (nodeOrStream["node"]) {
20+
return nodeOrStream["node"];
21+
}
22+
return nodeOrStream;
23+
};
24+
25+
lookup(parent: IEmscriptenFSNode, name: string): IEmscriptenFSNode {
26+
return super.lookup(this.getNode(parent), name);
27+
};
28+
29+
getattr(node: IEmscriptenFSNode): IStats {
30+
return super.getattr(this.getNode(node));
31+
};
32+
33+
setattr(node: IEmscriptenFSNode, attr: IStats): void {
34+
super.setattr(this.getNode(node), attr);
35+
};
36+
37+
mknod(
38+
parent: IEmscriptenFSNode,
39+
name: string,
40+
mode: number,
41+
dev: any
42+
): IEmscriptenFSNode {
43+
return super.mknod(this.getNode(parent), name, mode, dev);
44+
};
45+
46+
rename(oldNode: IEmscriptenFSNode, newDir: IEmscriptenFSNode, newName: string): void {
47+
super.rename(this.getNode(oldNode), this.getNode(newDir), newName);
48+
};
49+
50+
rmdir(parent: IEmscriptenFSNode, name: string): void {
51+
super.rmdir(this.getNode(parent), name);
52+
};
53+
54+
readdir(node: IEmscriptenFSNode): string[] {
55+
return super.readdir(this.getNode(node));
56+
};
57+
58+
}
59+
60+
// TODO Remove this when we don't need StreamNodeOps anymore
61+
class LoggingDrive extends DriveFS {
62+
constructor(options: DriveFS.IOptions) {
63+
super(options);
64+
65+
this.node_ops = new StreamNodeOps(this);
66+
}
67+
}
68+
1369
// when a toplevel cell uses an await, the cell is implicitly
1470
// wrapped in a async function. Since the webloop - eventloop
1571
// implementation does not support `eventloop.run_until_complete(f)`
@@ -46,35 +102,26 @@ class XeusPythonKernel {
46102
mount(driveName: string, mountpoint: string, baseUrl: string): void {
47103
const { FS, PATH, ERRNO_CODES } = globalThis.Module;
48104

49-
console.log('mounting drivefs', driveName, mountpoint, baseUrl);
50-
51-
this._drive = new DriveFS({
105+
this._drive = new LoggingDrive({
52106
FS,
53107
PATH,
54108
ERRNO_CODES,
55109
baseUrl,
56110
driveName,
57111
mountpoint
58112
});
59-
console.log('mkdir mountpoint');
60113

61114
FS.mkdir(mountpoint);
62115
FS.mount(this._drive, {}, mountpoint);
63-
console.log('chdir mountpoint');
64116
FS.chdir(mountpoint);
65-
console.log('done chdir mountpoint');
66117
}
67118

68119
cd(path: string) {
69120
if (!path) {
70121
return;
71122
}
72123

73-
const { FS } = globalThis.Module;
74-
75-
console.log('chdir path', path);
76-
FS.chdir(path);
77-
console.log('done chdir path');
124+
globalThis.Module.FS.chdir(path);
78125
}
79126

80127
async processMessage(event: any): Promise<void> {
@@ -90,8 +137,6 @@ class XeusPythonKernel {
90137
globalThis.toplevel_promise = null;
91138
}
92139

93-
console.log('received this in the worker', event);
94-
95140
const msg_type = event.msg.header.msg_type;
96141

97142
if (msg_type === 'input_reply') {
@@ -104,20 +149,12 @@ class XeusPythonKernel {
104149
private async initialize(resolve: () => void) {
105150
importScripts('./xpython_wasm.js');
106151

107-
console.log('init xeus kernel');
108-
109152
globalThis.Module = await createXeusModule({});
110153

111-
console.log('done init xeus kernel');
112-
113154
importScripts('./python_data.js');
114155

115-
console.log('loaded python data');
116-
117156
await this.waitRunDependency();
118157

119-
console.log('waited run deps');
120-
121158
this._raw_xkernel = new globalThis.Module.xkernel();
122159
this._raw_xserver = this._raw_xkernel.get_server();
123160

@@ -131,10 +168,9 @@ class XeusPythonKernel {
131168
}
132169

133170
private async waitRunDependency() {
134-
const promise = new Promise((resolve: any) => {
171+
const promise = new Promise<void>(resolve => {
135172
globalThis.Module.monitorRunDependencies = (n: number) => {
136173
if (n === 0) {
137-
console.log('all `RunDependencies` loaded');
138174
resolve();
139175
}
140176
};

0 commit comments

Comments
 (0)