Security News
The Risks of Misguided Research in Supply Chain Security
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.
enchannel-zmq-backend
Advanced tools
Installation | Usage | Contributors and developers | Learn more about nteract
enchannel-zmq-backend offers the ZeroMQ backend implementation for
enchannel
.
As a refresher for the reader, enchannel details nteract's lightweight, implementation-flexible specification for communication between a user frontend and a backend, such as a language kernel. The enchannel specification offers a simple description of "what" messages may be passed between frontends and backends, while leaving a developer freedom in "how" to achieve message communication.
enchannel-zmq-backend takes a classic design approach using ZeroMQ, the foundation messaging protocol for the Jupyter project. enchannel-zmq-backend implements backend support for the messaging channels described in the Jupyter messaging specification. This spec explains how front end clients should communicate with backend language kernels which implement the Jupyter messaging specification.
enchannel-zmq-backend implements the "how" to communicate messages to and from a backend.
We provide functions to create RxJS Subjects (two way Observables for four of the channels described in the Jupyter messaging specification):
shell
control
iopub
stdin
That's it. Functions for four channels; simplicity in action.
Prerequisite: Node.js and npm
You may use whichever package manager (npm
or yarn
) best suits your workflow. The nteract
team internally uses yarn
.
npm install enchannel-zmq-backend
# OR
yarn add enchannel-zmq-backend
To get access to all of the channels
for messaging (shell
, control
,
iopub
, and stdin
), import and use the createChannels
function:
import { createChannels } from 'enchannel-zmq-backend'
The createChannels
function accepts two things:
an identity
You'll want to set up your identity, relying on the node uuid
package:
const uuidv4 = require('uuid/v4');
const identity = uuidv4();
a runtime object, such as a kernel (which matches the on-disk JSON).
Using spawnteract
with
this project helps streamline spawning a kernel.
const runtimeConfig = {
stdin_port: 58786,
ip: '127.0.0.1',
control_port: 58787,
hb_port: 58788,
signature_scheme: 'hmac-sha256',
key: 'dddddddd-eeee-aaaa-dddd-dddddddddddd',
shell_port: 58784,
transport: 'tcp',
iopub_port: 58785
}
To create the channels object:
const channels = createChannels(identity, runtimeConfig)
const { shell, iopub, stdin, control } = channels;
enchannel-zmq-backend
also gives access to all of the channels
via a
single multipled channel exposed via createMainChannel
.
import { createMainChannel } from 'enchannel-zmq-backend';
Similar to the createChannels
function, the createMainChannel
function
accepts both an identity and a runtime object.
const channel = createMainChannel(identity, runtimeConfig);
Messages that are sent via the mutliplexed channel need to define a type
property that outlines which channel they should be sent under.
const body = {
header: {
msg_id: `execute_9ed11a0f-707e-4f71-829c-a19b8ff8eed8`,
username: "rgbkrk",
session: "00000000-0000-0000-0000-000000000000",
msg_type: "execute_request",
version: "5.0"
},
content: {
code: 'print("woo")',
silent: false,
store_history: true,
user_expressions: {},
allow_stdin: false
}
};
const message = { type: "shell", body };
enchannel-zmq-backend
also offers four convenience functions to
easily create the messaging channels for control
, stdin
, iopub
,
and shell
:
import {
createControlSubject,
createStdinSubject,
createIOPubSubject,
createShellSubject,
} from 'enchannel-zmq-backend';
Creating a subject for the shell
channel:
const shell = createShellSubject(identity, runtimeConfig)
Here's an example about how to subscribe to iopub
messages:
const iopub = createIOPubSubject(identity, runtimeConfig);
var subscription = iopub.subscribe(msg => {
console.log(msg);
}
// later, run subscription.unsubscribe()
Since these channels are RxJS Observables, you can use filter
, map
,
scan
and many other RxJS operators:
iopub.filter(msg => msg.header.msg_type === 'execute_result')
.map(msg => msg.content.data)
.subscribe(x => { console.log(`DATA! ${util.inspect(x)}`)})
Executing code will rely on sending an execute_request
to the shell
channel.
var message = {
header: {
msg_id: `execute_9ed11a0f-707e-4f71-829c-a19b8ff8eed8`,
username: 'rgbkrk',
session: '00000000-0000-0000-0000-000000000000',
msg_type: 'execute_request',
version: '5.0',
},
content: {
code: 'print("woo")',
silent: false,
store_history: true,
user_expressions: {},
allow_stdin: false,
},
};
Currently, you'll need to have at least one subscription activated before you can send on a channel.
> shell.subscribe(console.log)
> shell.next(message)
> Message {
header:
{ username: 'rgbkrk',
msg_type: 'execute_reply',
msg_id: '0f6d37f3-56a2-41fd-b3ed-90cc189ac423',
version: '5.1',
session: '40472e70-e008-48d1-9537-55837a905c05',
date: '2016-01-12T00:39:44.686986' },
parent_header:
{ username: 'rgbkrk',
session: '00000000-0000-0000-0000-000000000000',
version: '5.0',
msg_id: 'execute_9ed11a0f-707e-4f71-829c-a19b8ff8eed8',
msg_type: 'execute_request' },
metadata:
{ dependencies_met: true,
engine: '34d73425-4f04-4b57-9bc7-b46e3100e1fd',
status: 'ok',
started: '2016-01-12T00:39:44.684534' },
content:
{ status: 'ok',
execution_count: 60,
user_expressions: {},
payload: [] } }
If you plan to contribute to this project or extend it, you will need
to have ZeroMQ installed on
your system. The easiest way to do this is to install nteract's
zmq-prebuilt
binary for your operating system.
To set up a development environment, you'll need to install:
Then, fork and clone this repo:
git clone https://github.com/nteract/enchannel-zmq-backend.git
cd enchannel-zmq-backend
yarn
Develop! We welcome new and first time contributors.
FAQs
Channeling jupyter over zmq
The npm package enchannel-zmq-backend receives a total of 8,133 weekly downloads. As such, enchannel-zmq-backend popularity was classified as popular.
We found that enchannel-zmq-backend demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 19 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.
Research
Security News
Socket researchers found several malicious npm packages typosquatting Chalk and Chokidar, targeting Node.js developers with kill switches and data theft.
Security News
pnpm 10 blocks lifecycle scripts by default to improve security, addressing supply chain attack risks but sparking debate over compatibility and workflow changes.