https://github.com/meh/shumei
Shumei brings an actor system and other concurrency plumbing primitives to the web.
https://github.com/meh/shumei
actor-model browser typescript-library web-worker
Last synced: 6 months ago
JSON representation
Shumei brings an actor system and other concurrency plumbing primitives to the web.
- Host: GitHub
- URL: https://github.com/meh/shumei
- Owner: meh
- License: mit
- Created: 2020-10-17T13:05:42.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2022-03-06T21:37:44.000Z (over 3 years ago)
- Last Synced: 2025-03-29T06:04:58.768Z (7 months ago)
- Topics: actor-model, browser, typescript-library, web-worker
- Language: TypeScript
- Homepage:
- Size: 73.2 KB
- Stars: 6
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Shumei
======
>Shūmei (襲名, "name succession") are grand naming ceremonies held in kabuki
>theatre. Most often, a number of actors will participate in a single ceremony,
>taking on new stage-names.Shumei brings an actor system and other concurrency plumbing primitives to the
web.Example
=======
This is an example using [rollup-plugin-rollup](https://github.com/meh/rollup-plugin-rollup)
to be able to inline the worker code.A file named `worker.rollup.js`:
```js
import path from 'path';
import resolve from '@rollup/plugin-node-resolve';
import alias from '@rollup/plugin-alias';
import typescript from '@rollup/plugin-typescript';
import commonjs from '@rollup/plugin-commonjs';
import rust from '@wasm-tool/rollup-plugin-rust';
import rollup from 'rollup-plugin-rollup';
import json from '@rollup/plugin-json';
import { terser } from 'rollup-plugin-terser';const dev = process.env.NODE_ENV !== 'production';
export default {
input: 'src/worker.ts',output: {
format: 'es',
sourcemap: dev && 'inline',
},plugins: [
resolve({
browser: true,
preferBuiltins: false,
}),
alias({
resolve: ['.js', '.mjs', '.html', '.ts'],
entries:[{
find: '~',
replacement: path.join(__dirname, '.')
}]
}),
commonjs({
include: '../node_modules/**'
}),
typescript({ sourceMap: dev }),
rust({ debug: dev }),
json(),
rollup(),
!dev && terser(),
]
}
```A file named `worker.ts`:
```ts
import { stage } from "shumei";stage.register("add", async function*() {
while (true) {
const { from, a, b } = yield;
from.send(a + b);
}
});stage.register("sub", async function*() {
while (true) {
const { from, a, b } = yield;
from.send(a - b);
}
});stage.ready();
```A file named `index.ts`:
```ts
import WORKER from 'worker.rollup';
import { stage, Actor } from "shumei";(async () => {
await stage.dedicated(WORKER);stage.spawn(async function*(self: Actor) {
const add = await stage.actor("add");
const sub = await stage.actor("sub");let result = 0;
add.send({ from: self, a: 2, b: 3 });
result = yield;
sub.send({ from: self, a: result, b: 2 });
result = yield;console.log(`IT'S ${result} GODDAMMIT!`);
});
})();
```Actor System
============
This section is not going to explain what the actor system is and why this is a
good idea, but instead explain how the system works and how to use it.Channel
-------
TODORemote Values
-------------
TODO