Skip to content
Typescript/Javascript implementation of Sodium FRP (Functional Reactive Programming) library
Branch: master
Clone or download
the-real-blackh Merge pull request #80 from clinuxrulz/collect-cycles-performance
reduced how often collect cycles is called
Latest commit bd14e2b Mar 18, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.

Build Status npm version Bower version Downloads


A Functional Reactive Programming (FRP) library for TypeScript/JavaScript


Here are some demos from the community you can try in your browser:

Prerequisite: Node.js

Install Node.js® and npm if they are not already on your machine.


via NPM

$> npm install sodiumjs
$> npm install -g sodiumjs

via Yarn

$> yarn add sodiumjs
$> yarn global add sodiumjs

via html include

<script src=""></script>

this requires also including sanctuary-type-classes and typescript-collections dependencies

How to use


import { Cell } from 'sodiumjs';


const c = new Cell(12);


const c = new Cell<number>(12);

In a browser

    var cell = new Sodium.Cell(12);


The usual npm run build/test/clean commands are available to produce the distribution package.

However, a more comfortable iteration style may be using the the live integration testing approach:

  1. cd src/tests/integration
  2. npm run dev:auto-reload (or just npm run dev without live reloading)

This starts up a local development server and showcases integration with a webpack app.

Changes to the core lib are then seen live since it uses a local alias rather than reference the lastest build or distribution of the library

Sodium library code is in src/lib

Packaging/tree-shaking and bundling of the library is done with Rollup

Testing is via Jest


Distributed under BSD 3-Clause


Stephen Blackheath, 9 Jul 2016

I am very happy to announce that the Typescript implementation of Sodium is ready!

It features a newly developed scheme for memory management, which was needed because Javascript has no finalizers. Memory management in Sodium is 100% automatic.

This scheme imposes one small requirement on the API: You must declare any Sodium objects held inside closures using wrapper functions lambda1, lambda2 .. lambda6 - depending on the number of arguments that the closure has. These take a second argument, which is a list of the Sodium objects contained in the context of the closure. For example:

csw = => sw == "sa" ? sa : sb, [sa, sb])),

This allows Sodium to track all dependencies. There are some limitations to this scheme - for example, it can't track dependencies if you poke arbitrary Sodium objects into a StreamSink, but I think these should not affect any normal usages. Time will tell.


1.0.5 Migrate build environment over to fuse-box. Begin adding fantasy-land compatibility

1.0.0 Add snapshot3(), snapshot4(), snapshot5() and snapshot6(). Fix a serious bug in TimerSystem where timers sometimes don't fire.

You can’t perform that action at this time.