The Power of EventEmitter in the Palm of your Promises
(in other words: I figured out how to model goroutines in JavaScript - shhhh! don't tell!)
let socket = EventSocket.create({ explicit: ['_internalEvent'] });
// Event Socket Connection (Listener)
let conn = socket.listen(['*', 'error']);
for (;;) {
let msg = await conn.accept().catch(Object);
console.log(msg);
if (msg instanceof Error) {
break;
}
}
// Event Socket Server (Emitter)
socket.resolveAll('fruit', ['apple', 'banana', 'grape']);
socket.resolveAll('_internalEvent', { housekeeping: true });
let err = new Error('no more events available');
// Note: if no conns subscribe to the error event,
// then the error will cause all to reject.
socket.rejectAll(err);
In the initial version, this may not work as expected:
If an event comes before the next await accept(), that event will not be available.
Missed events were queued in an earlier draft, but was removed intentionally.
There's a simple solution but, of course, it comes with a caveat - it will leak memory unless 'close()' is called.
A best-set-of-trade-offs approach would be to have a buffered mode, with a configurable max number of messages to buffer.
Buffered,
listen()
ison()
andclose()
isoff()
.Unbuffered,
accept()
isonce()
.