portals_javascript
JavaScript worker SDK for Portals: call JavaScript from Elixir in supervised, pooled OS processes, on Node.js, Bun, Deno or QuickJS.
This package bundles one dependency-free JavaScript SDK (the
portals-worker module, under priv/javascript) and provides
Portals.JavaScript, which builds the launch options for
Portals.start_worker/1 and Portals.Pool and makes
require('portals-worker') resolve to the SDK on every runtime. Nothing is
installed from npm: the SDK comes from Hex, versioned in lockstep with
portals.
Installation
def deps do
[
{:portals_javascript, "~> 0.1.0"}
]
end
portals_javascript depends on portals, so this one line is enough. You
need one of the runtimes on the machine that runs the workers: Node.js 18+
(the default), Bun, Deno 2 or QuickJS-ng (qjs).
Usage
// priv/js/worker.js — the same file runs on every runtime
const { Worker } = require('portals-worker');
new Worker({ modules: { text_tools: require('./textTools') } }).run();
children = [
{Portals.Pool,
Portals.JavaScript.worker_opts(
script: Application.app_dir(:my_app, "priv/js/worker.js"),
runtime: :node, # or :bun, :deno, :quickjs
name: MyApp.JS,
size: 4
)}
]
{:ok, 2} = Portals.Pool.call(MyApp.JS, "text_tools", "word_count", ["hello world"])
The JavaScript guide walks through setup, callbacks, messaging, streaming, each runtime's trade-offs, deployment, gotchas and best practices.
Development
This package lives in the Portals monorepo
under packages/portals_javascript. mix test runs the shared conformance
and integration suites against the bundled SDK once per runtime; runtimes
that aren't installed are skipped unless PORTALS_REQUIRE_ALL_RUNTIMES=1.
See CONTRIBUTING.md at the repository root.
License
MIT