Skip to content

Instantly share code, notes, and snippets.

@leetcode-notes
Created June 19, 2020 08:11
Show Gist options
  • Save leetcode-notes/9b75b5ad6974ac13dacf5f8186f53e8e to your computer and use it in GitHub Desktop.
Save leetcode-notes/9b75b5ad6974ac13dacf5f8186f53e8e to your computer and use it in GitHub Desktop.

👧 tangi

ತಂಗಿ [tangi] Kan. younger sister
ಅಕ್ಕ [akka] Kan. older sister

Lightweight actor library for Web Workers inspired by Akka.

What is this?

Type-safe, production-ready and lightweight messaging layer for Web Workers.

Best served with:

Why?

For people to scale Web Workers beyond the simple patterns of communication.

Basic usage

messages.ts

type PingMessage = {
  _tag: "PING";
}

type PongMessage = {
  _tag: "PONG";
}

main.ts

import { makeActorContext } from "tangi";
import { PingMessage, PongMessage } from "./messages";

const worker = new (require("worker-loader!./worker"))();
const workerRemoteContext = makeActorContext<PingMessage, never>(worker);
const response = await workerRemoteContext.ask<string, PongMessage>(id => ({ _tag: "PING", id }));
switch (response._tag) {
  case "Right": {  
    console.log(response.right);
  }
  case "Left": {  
    console.error(response.left);
  }
}

worker.ts

import { makeActorContext, REPLY } from "tangi";
import { PongMessage } from "./messages";

const workerLocalContext = makeActorContext<never, PongMessage>(globalThis as any);
workerLocalContext.receiveMessage(message => {
  switch (message._tag) {
    case "PING": {
      message[REPLY]({ _tag: "PONG" });
      return;
    }  
  }
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment