-
Notifications
You must be signed in to change notification settings - Fork 1
Fiber
runtoolkit edited this page Apr 13, 2026
·
1 revision
Cooperative coroutines implemented via async generators. A fiber runs until it yields, then suspends until resumed externally or after a timer.
import { FiberManager } from './src/fiber.js';
const fibers = new FiberManager();generatorFn must be an async generator function. It receives a FiberHandle as its argument.
fibers.spawn(id, generatorFn);If a fiber with the same id already exists, it is killed before the new one starts.
async function* countdown(fiber) {
for (let i = 3; i >= 0; i--) {
console.log(i);
await fiber.wait(1000); // suspend for 1s, then auto-resume
if (!fiber.alive) break;
}
}
fibers.spawn('countdown', countdown);Passed as the first argument to the generator function.
fiber.yield(); // suspend until fibers.resume(id) is called externally
fiber.wait(ms); // suspend for ms milliseconds, then auto-resume
fiber.alive; // boolean — false once the fiber is killed or finishesyield() returns a Promise. If resume() was already called before yield() is awaited, it resolves immediately.
fibers.resume(id); // resume a yielded fiber; → true if found and alive
fibers.kill(id); // terminate immediately; → true if found
fibers.isAlive(id); // → boolean
fibers.list(); // → ['countdown', ...]Killing a fiber that is currently suspended on fiber.yield() resolves the pending Promise so the generator can exit cleanly.
async function* interactive(fiber) {
console.log('waiting...');
await fiber.yield();
console.log('resumed!');
}
fibers.spawn('interactive', interactive);
// Later, from an event handler or command:
fibers.resume('interactive');Unhandled errors inside a fiber are caught and logged as [Fiber:<id>] <error>. The fiber is then cleaned up.