jp-kernel
is an npm module for implementing a
Jupyter kernel
that interacts with a Node.js session.
jp-kernel
is a spin-off library from
IJavascript, a Javascript kernel for
the Jupyter notebook. It is currently used to implement
the following kernels:
-
Version 2.0.0 require Node.js v6 or above so that we can use
jmp@2
. -
Version 1.3.0 (unpublished) use
jmp@2
if compatible with the version of Node.js. -
Version 1.2.0 implements message
clear_output
. -
Version 1.1.0 ensures metadata is defined in
display_data
messages. -
Version 1.0.0 (stable API) handles flag
--hide-execution-result
. -
Version 0.1.5 handles
input_request
andinput_reply
messages. -
Version 0.1.4 handles
display_data
andupdate_display_data
messages. -
Version 0.1.0 depends on
[email protected]
, and[email protected]
depends onzeromq
(which provides prebuilt bindings to the ZMQ library and is now maintained by the zeromq organisation). -
Version 0.0.1 is the initial release based on IJavascript v5.0.13.
The latest stable release is published on
npm
and can be installed by
running:
npm install jp-kernel
The master branch in the github repository provides the latest development version and can be installed by:
git clone https://github.com/n-riesco/jp-kernel.git
cd jp-kernel
npm install
The source code documentation generated using JSDoc can be found here.
For real examples of usage, see the source documentation for:
First of all, thank you for taking the time to contribute. Please, read CONTRIBUTING.md and use the issue tracker for any contributions: support requests, bug reports, enhancement requests, pull requests, ...
The jp-kernel
API in the initial release v0.0.1 came into existence by a
process of evolution. I want to take the opportunity that distributing
jp-kernel
as a package offers to design a new API. Below is a preview of what
I have in mind:
class Kernel {
constructor(config) {
this.config = config;
this.executionCount = 0;
this.session = new Session({
cwd: this.config.cwd,
parser: this.config.parser,
transpile: this.config.transpile,
});
this._init();
}
_init(initCB) {}
interrupt(interruptCB) {}
destroy(destroyCB) {}
restart(restartCB) {}
_onShellMessage(message) {}
_onControlMessage(message) {}
_onIOPubMessage(message) {}
_onHBMessage(message) {}
}
class KernelV4 extends Kernel {
onStdout(data) {}
onStderr(data) {}
onShell_xxx(request) {}
}
class KernelV5 extends Kernel {
onStdout(data) {}
onStderr(data) {}
onShell_xxx(request) {}
}
class Config {
constructor(kernelConfig) {
this.hideUndefined = kernelConfig.hideUndefined;
this.initSession = kernelConfig.initSession;
this.initScripts = kernelConfig.initScripts;
this.kernelInfoReply = kernelConfig.kernelInfoReply;
this.protocolVersion = kernelConfig.protocolVersion;
this.connection = kernelConfig.connection;
this.parser = kernelConfig.parser;
}
}
class Connection {
constructor(connectionConfig) {
this.config = connectionConfig;
this.socket = {
control: new jmp.Socket("router", scheme, key),
shell: new jmp.Socket("router", scheme, key),
iopub: new jmp.Socket("pub", scheme, key),
hb: zmq.createSocket("rep"),
};
}
connect(listeners) {}
disconnect() {}
}
class Parser{
constructor() {
throw new Error("Cannot construct an abstract class");
}
getIdentifier(code, position) {
throw new Error("Not implemented");
}
validate(code) {
throw new Error("Not implemented");
}
}