diff --git a/.gitignore b/.gitignore index 9432f5a..df4d4f4 100644 --- a/.gitignore +++ b/.gitignore @@ -123,3 +123,9 @@ dmypy.json # Yarn cache .yarn/ + + + +# experiments +experiment.sh +env.yml \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f4a3328..c948fda 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,50 +12,50 @@ import { IKernel, IKernelSpecs } from '@jupyterlite/kernel'; import { WebWorkerKernel } from './web_worker_kernel'; +const rel_path = '../extensions/@jupyterlite/xeus-python-kernel/static/'; - - -const rel_path = "../extensions/@jupyterlite/xeus-python-kernel/static/"; - -// helper function to fetch json +// helper function to fetch json function getPkgJson(url: string) { const json_url = rel_path + url; const xhr = new XMLHttpRequest(); - xhr.open("GET", json_url, false); + xhr.open('GET', json_url, false); xhr.send(null); return JSON.parse(xhr.responseText); } -let kernel_dir : string[] = []; -try{ - kernel_dir = getPkgJson("share/jupyter/kernels.json") -} -catch(err){ +let kernel_dir: string[] = []; +try { + kernel_dir = getPkgJson('share/jupyter/kernels.json'); +} catch (err) { console.log(err); - console.log("could not fetch share/jupyter/kernels/kernels.json"); - kernel_dir = [] + console.log('could not fetch share/jupyter/kernels/kernels.json'); + kernel_dir = []; throw err; } console.log(kernel_dir); // fetch kernel spec for each kernel -const kernel_specs = kernel_dir.map((kernel_dir) => { - let spec : any = getPkgJson("share/jupyter/kernels/" + kernel_dir + "/kernel.json") +const kernel_specs = kernel_dir.map(kernel_dir => { + const spec: any = getPkgJson( + 'share/jupyter/kernels/' + kernel_dir + '/kernel.json' + ); spec.name = kernel_dir; spec.dir = kernel_dir; spec.resources = { - 'logo-32x32': rel_path + "share/jupyter/kernels/" + kernel_dir + "/logo-32x32.png", - 'logo-64x64': rel_path + "share/jupyter/kernels/" + kernel_dir + "/logo-64x64.png", - } + 'logo-32x32': + rel_path + 'share/jupyter/kernels/' + kernel_dir + '/logo-32x32.png', + 'logo-64x64': + rel_path + 'share/jupyter/kernels/' + kernel_dir + '/logo-64x64.png' + }; return spec; }); console.log(kernel_specs); -const server_kernels = kernel_specs.map((spec) => { - let server_kernel : JupyterLiteServerPlugin = { +const server_kernels = kernel_specs.map(spec => { + const server_kernel: JupyterLiteServerPlugin = { // use name from spec - id: `@jupyterlite/${spec.name}-extension:kernel`, + id: `@jupyterlite/${spec.name}-extension:kernel`, autoStart: true, requires: [IKernelSpecs], optional: [IServiceWorkerManager, IBroadcastChannelWrapper], @@ -71,7 +71,7 @@ const server_kernels = kernel_specs.map((spec) => { const mountDrive = !!( serviceWorker?.enabled && broadcastChannel?.enabled ); - + if (mountDrive) { console.info( `${spec.name} contents will be synced with Jupyter Contents` @@ -81,12 +81,13 @@ const server_kernels = kernel_specs.map((spec) => { `${spec.name} contents will NOT be synced with Jupyter Contents` ); } - - return new WebWorkerKernel({ - ...options, - mountDrive - }, - spec + + return new WebWorkerKernel( + { + ...options, + mountDrive + }, + spec ); } }); @@ -95,9 +96,6 @@ const server_kernels = kernel_specs.map((spec) => { return server_kernel; }); - - - const plugins: JupyterLiteServerPlugin[] = server_kernels; export default plugins; diff --git a/src/web_worker_kernel.ts b/src/web_worker_kernel.ts index 67ab7e3..d0d1eb4 100644 --- a/src/web_worker_kernel.ts +++ b/src/web_worker_kernel.ts @@ -29,17 +29,14 @@ export class WebWorkerKernel implements IKernel { * * @param options The instantiation options for a new WebWorkerKernel */ - constructor( - options: WebWorkerKernel.IOptions, - spec: any, - ) { - const { id, name, sendMessage, location} = options; + constructor(options: WebWorkerKernel.IOptions, spec: any) { + const { id, name, sendMessage, location } = options; this._id = id; this._name = name; this._location = location; this._spec = spec; this._sendMessage = sendMessage; - this._worker = new Worker(new URL(`./worker.js`, import.meta.url), { + this._worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' }); @@ -48,10 +45,12 @@ export class WebWorkerKernel implements IKernel { }; this._remote = wrap(this._worker); this._remote.processMessage({ - msg:{header: { - msg_type: 'initialize', - }}, - spec : this._spec + msg: { + header: { + msg_type: 'initialize' + } + }, + spec: this._spec }); this.initFileSystem(options); } diff --git a/src/worker.ts b/src/worker.ts index 03d0969..4f686f4 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -97,13 +97,9 @@ async function get_stdin() { (self as any).get_stdin = get_stdin; - - - class XeusKernel { constructor(resolve: any) { this._resolve = resolve; - } async ready(): Promise { @@ -141,8 +137,7 @@ class XeusKernel { async processMessage(event: any): Promise { const msg_type = event.msg.header.msg_type; - if(msg_type === 'initialize') { - + if (msg_type === 'initialize') { const spec = event.spec; this._spec = spec; await this.initialize(); @@ -150,7 +145,6 @@ class XeusKernel { return; } - await this.ready(); if ( @@ -163,7 +157,6 @@ class XeusKernel { globalThis.toplevel_promise = null; } - if (msg_type === 'input_reply') { resolveInputReply(event.msg); } else { @@ -174,7 +167,7 @@ class XeusKernel { private async initialize() { const dir = this._spec.dir; const binary_js = this._spec.argv[0]; - const binary_wasm = binary_js.replace(".js", ".wasm"); + const binary_wasm = binary_js.replace('.js', '.wasm'); console.log(binary_js); console.log(binary_wasm); @@ -189,36 +182,37 @@ class XeusKernel { } }); try { - await this.waitRunDependency(); console.log(globalThis.Module); - if(globalThis.Module['async_init'] !== undefined) { - const kernel_root_url=`share/jupyter/kernels/${dir}` - const pkg_root_url = "share/jupyter/kernel_packages" + if (globalThis.Module['async_init'] !== undefined) { + const kernel_root_url = `share/jupyter/kernels/${dir}`; + const pkg_root_url = 'share/jupyter/kernel_packages'; const verbose = true; - await globalThis.Module['async_init'](kernel_root_url, pkg_root_url, verbose); + await globalThis.Module['async_init']( + kernel_root_url, + pkg_root_url, + verbose + ); } await this.waitRunDependency(); - + this._raw_xkernel = new globalThis.Module.xkernel(); this._raw_xserver = this._raw_xkernel.get_server(); if (!this._raw_xkernel) { console.error('Failed to start kernel!'); } this._raw_xkernel.start(); - } - catch (e) { - if( typeof e === 'number' ) { - const msg = globalThis.Module.get_exception_message(e); - console.error(msg); - throw new Error(msg); - } - else { - console.error(e); - throw(e); - } + } catch (e) { + if (typeof e === 'number') { + const msg = globalThis.Module.get_exception_message(e); + console.error(msg); + throw new Error(msg); + } else { + console.error(e); + throw e; + } } this._resolve(); } @@ -249,6 +243,3 @@ class XeusKernel { globalThis.ready = new Promise(resolve => { expose(new XeusKernel(resolve)); }); - - -