A tiny utility to create an event that can be subscribed to.
npm add @wopjs/event
import { event, send } from "@wopjs/event";
const onDidChange = event<string>();
const dispose = onDidChange(data => console.log(data));
send(onDidChange, "data"); // logs "data"
dispose();In general, you would export the event directly (which is the AddEventListener type) and send it from the class that owns it.
// module-a.ts
import { event, send } from "@wopjs/event";
import { disposableStore } from "@wopjs/disposable";
export class A {
  public readonly dispose = disposableStore();
  public readonly onStatusDidChange = event<string>();
  public constructor() {
    this.dispose.add(this.onStatusDidChange);
    this.dispose.add(
      onOtherEvent(() => {
        send(this.onStatusDidChange, "loading");
      }),
    );
  }
}Other modules can then subscribe to the event, but generally not send it.
// module-b.ts
import type { A } from "./module-a";
import { event, send } from "@wopjs/event";
import { disposableStore } from "@wopjs/disposable";
export class B {
  public readonly dispose = disposableStore();
  public constructor(a: A) {
    this.dispose.add(
      a.onStatusDidChange(status => {
        console.log(status);
      }),
    );
  }
}You can also let module-b depend only on the event itself so that it does not need to import module-a (hence more "pure").
In this case generally you would use the simpler IEvent type to define the event.
// module-b.ts
import { event, send, IEvent } from "@wopjs/event";
import { disposableStore } from "@wopjs/disposable";
export class B {
  public readonly dispose = disposableStore();
  public constructor(onAStatusDidChange: IEvent<string>) {
    this.dispose.add(
      onAStatusDidChange(status => {
        console.log(status);
      }),
    );
  }
}If you need to let other modules send the event, it is recommended to expose a dedicated method for that.
// module-a.ts
import { event, send } from "@wopjs/event";
import { disposableStore } from "@wopjs/disposable";
export class A {
  public readonly dispose = disposableStore();
  public readonly onStatusDidChange = event<string>();
  public constructor() {
    this.dispose.add(onStatusDidChange);
  }
  public changeStatus(status: string) {
    send(this.onStatusDidChange, status);
  }
}MIT @ wopjs