0.5.1 • Public • Published


libPlasma bindings/implementation for Node.js. Work in progress.

npm version

g-speak version

Since it has a native component, gelatin requires the g-speak platform to be installed wherever it's used. At build/npm install time, the version of g-speak used is determined this way:

  1. If GELATIN_G_SPEAK_HOME is set in the environment, use that path to look up g-speak. For example, GELATIN_G_SPEAK_HOME=/opt/oblong/g-speak3.26 npm install will build/link against g-speak 3.26 installed to /opt/oblong.
  2. Otherwise, look up the most recent compatible version of g-speak in /opt/oblong.

build dependencies

gelatin has these dependencies at build/npm install time:

  • python3 and python2.7, for node-gyp
  • oblong-loamX.Y
  • oblong-plasmaX.Y

where X.Y is the g-speak version determined above.

Some older versions of g-speak require also, on Ubuntu 16.04:

  • libjpeg-dev
  • libpng12-dev
  • libtiff5-dev

runtime dependencies

At runtime, gelatin depends on:

  • oblong-loamX.Y
  • oblong-plasmaX.Y
  • oblong-system-protistX.Y

where X.Y is the g-speak version used at build time.

The location of peek and poke binaries are found using the G_SPEAK_HOME path computed in the g-speak version section. This path can be overridden at runtime by setting GELATIN_G_SPEAK_HOME in the environment; useful if paths are relocated in a container or snap.


Check the examples/ directory for some commented examples of using gelatin. examples/wandsplit.js is quite practical (inspired by a real-world use case) and uses the most gelatin features of the examples.

const util = require('util');
const peek = require('gelatin').peek;
const pool = process.argv[2];
function main() {
  if (!pool) {
    console.error('pool argument required.');
    process.exitCode = 1;
  const p = peek(pool);
  p.on('data', (protein) => {
    console.log('metabolized protein with descrips:', protein.descrips);
    if (protein.descrips.indexOf('hangup') >= 0) {
  p.on('error', (err) => {
    console.error(`peek error: ${util.inspect(err)}`);
  console.log('now deposit/poke a protein to pool', pool);

API documentation

To generate API documentation from the source repo:

npm install
npm run doc

The documentation will be available at doc/out/index.html

type conversions

Conversions are defined for converting JavaScript values to Slaw values, and for converting Slaw values to JavaScript's values. For JavaScript's primitive types, these are:

Javascript type/value Slaw type/value
null (null) (null)
undefined (void 0) (null)
boolean (true) boolean
number (-5 or 23 or 4.56) unt32/int32/float64 (see note)
string ("hello world") string

Numeric conversions are a pain because, where slaw has a plethora of numeric types, JavaScript (from a high-level perspective) has just one number type: double-precision float. JavaScript does, under the hood, support int32_t and uint32_t representations of certain numbers (see, for example ), and when a JavaScript number is represented this way its slaw conversion is to the appropriate slaw number type. But it's not always obvious which representation a JavaScript number has, so be careful. Note also that conversions from slaw int64/unt64 to JavaScript number values may be lossy.

For object types and the special Slaw.nil value, the conversions are:

Javascript type/value Slaw type/value
Map (new Map([["hello", 123]])) map
Array ([ true, false ]) list
gelatin.Slaw.nil (gelatin.Slaw.nil) nil
gelatin.Vect (new gelatin.Vect([0.0, 1.0, 0.])) v3float64
gelatin.Vect2 (new gelatin.Vect2([0.0, 1.0])) v2float64
gelatin.Vect4 (new gelatin.Vect4([0, 1, 2, 3])) v4float64
gelatin.Protein (new gelatin.Protein(["foo"], {})) protein
Object (other) ({foo: 123}) (note: only from JS) map

Composite values like Maps and Arrays convert each of their elements to slaw. For convenience, it's possible to create a slaw map using a "Plain Old JavaScript Object", but a slaw map always converts to a JavaScript Map value.

platform compatibility

gelatin officially supports the Node.JS v4.2 "Argon" LTS release on Linux and OS X/macOS. Unofficially, gelatin also tries its best to support the latest Node versions released through Homebrew for OS X/macOS.

plasma-js-bridge compatibility

Limited plasma-js-bridge compatibility is offered. peek() accepts an optional callback argument, and a gelatin/compat module is provided for plasma-js-bridge compatible functions such as oldestIndex and newest. Access the compat module like so:

const plas = require('gelatin/compat');

copyright & license

Copyright (c) 2016 Oblong Industries, Inc. Code released under the MIT license.



Package Sidebar


npm i gelatin

Weekly Downloads






Unpacked Size

71 kB

Total Files


Last publish


  • oblong-dev