Clooney
Clooney is an actor (ayooo) library for the web. Classes given to Clooney will be instantiated and run in a worker, keeping the main thread responsive.
Quickstart
An example says more than 1000 words:
<script src="/clooney.bundle.js"></script>
<script>
(async function() {
class MyRemoteClass {
doExpensiveCalculation(a, b) {
return a + b;
}
}
const instance = await Clooney.spawn(MyRemoteClass);
console.log(await instance.doExpensiveCalculation(5, 23));
})();
</script>
API
Clooney’s job is to take actors (class definitions) and spawn those actors in containers (Web Workers). You can use that instance as if it was a local instance (this is magic provided by Comlink).
Clooney.spawn(class)
This call is equivalent to Clooney.defaultStrategy.spawn(class)
. Clooney creates an instance of RoundRobinStrategy
as the default strategy.
Strategies
Strategies decide how many containers are spun up and where a new instance is created.
export interface Strategy {
spawn<T>(actor: new () => T, opts: Object): Promise<T>;
terminate(): Promise<void>;
}
Clooney.RoundRobinStrategy(opts)
RoundRobingStrategy
creates up to n containers and cycles through the containers with every spawn
call. RoundRobinStrategy
is the default strategy.
Default options:
const strategy = new Clooney.RoundRobinStrategy({
workerFile: thisScriptSrc,
maxNumContainers: 1,
newContainerFunc: async (path: string) => new Worker(path),
})
CDN
If you want to use Clooney from a CDN, you need to work around the same-origin restrictions that workers have:
<script src="https://cdn.jsdelivr.net/npm/clooneyjs@0.3.0/clooney.bundle.min.js"></script>
<script>
async function newContainerFunc() {
const blob = await fetch(Clooney.defaultWorkerSrc).then(resp => resp.blob())
return new Worker(URL.createObjectURL(blob));
}
const strategy = new Clooney.RoundRobinStrategy({newContainerFunc});
</script>
License Apache-2.0