Observable
A javascript event bus implementing multiple patterns: observable, collector and pipe.
v2 is incomptable with v1, it is a complete rewrite.
Observable:
const Observable = require("@kuindji/observable");
const o = new Observable;
o.on("event", (x, y, z) => console.log([x, y, z]));
o.trigger("event", 1, 2, 3);
o.untilTrue("event")
o.untilFalse("event")
Collector:
const Observable = require("@kuindji/observable");
const o = new Observable;
o.on("collectStuff", () => 1);
o.on("collectStuff", () => 2);
const results = o.all("collectStuff");
const Observable = require("@kuindji/observable");
const o = new Observable;
o.on("collectStuff", () => Promise.resolve(1));
o.on("collectStuff", () => Promise.resolve(2));
o.on("collectStuff", () => 3);
const results = await o.resolveAll("collectStuff");
Other collector methods:
o.first("event")
o.last("event")
o.firstNonEmpty("event")
o.concat("event")
o.merge("event")
o.raw("event")
Pipe:
const Observable = require("@kuindji/observable");
const o = new Observable;
o.on("some-job", (value) => value + value);
o.on("some-job", (value) => value * value);
const result = o.pipe("some-job", 1);
const Observable = require("@kuindji/observable");
const o = new Observable;
o.on("some-job", (value) => Promise.resolve(value + value));
o.on("some-job", (value) => Promise.resolve(value * value));
const result = await o.resolvePipe("some-job", 1);
Autotrigger:
const o = new Observable;
o.createEvent("auto", { autoTrigger: true });
o.trigger("auto", 1, 2);
o.on("auto", (a, b) => console.log(a, b));
Promise:
const o = new Observable;
o.promise("event").then(payload => console.log(payload));
o.trigger("event", { data: "hello world" });
Relay:
const o1 = new Observable;
const o2 = new Observable;
o2.relay(o1, "some-event");
o2.on("some-event", () => console.log("OK!"));
o1.trigger("some-event");
o2.relay(o1, "another-event", "local-name");
o2.on("local-name", () => console.log("OK!"));
o1.trigger("another-event");
o2.unrelay(o1, "some-event");
Filter:
const o = new Observable;
o.createEvent("filtered", {
filter: (args, l) => {
if (l.extraData?.always) {
return true;
}
if (l.extraData?.param === args[0]) {
return true;
}
return false;
}
});
o.on("filtered", () => console.log("always"), {
extraData: { always: true }
});
o.on("filtered", () => console.log("param"), {
extraData: { param: 1 }
});
o.trigger("filtered", 2);
o.trigger("filtered", 1);
Any event:
const o = new Observable;
o.on("*", (eventName, x, y) => console.log(eventName, x, y));
o.trigger("event1", 1, 2);
o.trigger("event2", 3, 4);
API:
o.on(
"eventName",
() => {},
{
"context": null,
"filter": function(args, listener?) {},
"filterContext": any,
"first": false,
"alwaysFirst": false,
"alwaysLast": false,
"limit": 0,
"start": 0,
"appendArgs": array | (listener, args) => [],
"prependArgs": array | (listener, args) => [],
"replaceArgs": array | (listener, args) => [],
"async": boolean | number
}
);
o.once(
"eventName",
() => {},
{}
);
o.trigger( "eventName", ...args);
o.untilTrue( "eventName", ...args);
o.untilFalse( "eventName", ...args);
const arr = o.raw( "eventName", ...args);
const arr = o.all( "eventName", ...args);
const obj = o.merge( "eventName", ...args);
const arr = o.concat( "eventName", ...args);
const value = o.firstNonEmpty( "eventName", ...args);
const value = o.first( "eventName", ...args);
const value = o.last( "eventName", ...args);
const all = await o.resolveAll( "eventName", ...args);
const obj = await o.resolveMerge( "eventName", ...args);
const arr = await o.resolveConcat( "eventName", ...args);
const value = await o.resolveFirstNonEmpty( "eventName", ...args);
const value = await o.resolveFirst( "eventName", ...args);
const value = o.pipe( "eventName", arg);
const value = await o.resolvePipe( "eventName", arg);
await o.promise("eventName");
o.un(
"eventName",
() => {},
context
);
o.relayEvent(
anotherObservable,
"eventName" | "*",
"triggerName" | null,
"triggerPrefix" | null
);
o.unrelayEvent(
anotherObservable,
"eventName" | "*"
);
o.suspendEvent("eventName");
o.suspendAllEvents();
o.resumeEvent("eventName");
o.resumeAllEvents();
o.hasListener(
"eventName",
function | number,
context
);
o.removeAllListeners("eventName");
class A = {
handler() {}
}
const a = new A;
const b = new A;
o.on("event", a.handler, { context: a });
o.on("event", b.handler, { context: b });
o.createEvent(
"eventName",
{
"autoTrigger": boolean,
"filter": function(args, listener?) {},
"filterContext": any,
"appendArgs": array | (listener, args) => [],
"prependArgs": array | (listener, args) => [],
"replaceArgs": array | (listener, args) => [],
"async": boolean | number,
}
);
o.destroyEvent("eventName");