Skip to content

lisez/xevt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

78 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xevt

another event emiiter.

features:

  • can listen async/conjoined event.
  • support to mixed async/sync handlers
  • conditional event handlers.
  • return unscriber when you subscribe an event.

Coverage Status License: MIT Github release NPM Version JSR

Installation

npm install xevt

Then:

import { Xevt } from "xevt";

Usage

Basic usage

const emitter = new Xevt();

let result = 0;
emitter.on("event", () => {
  result++;
});
emitter.emit("event");

Async event

const emitter = new Xevt();

let result = 0;
emitter.on("event", async () => {
  result++;
});
await emitter.emit("event");

Conditional event handlers.

IMPORTANT:

  • NOT supported in conjoined events.
  • NOT supported any arguments in handlers.
  • It will be executed after the triggered event finished. (Blocking mode.)
const emitter = new Xevt();
const result: any[] = [];
emitter.on("event", async (arg: number) => {
  result.push(arg);
  return arg % 2 === 0;
});

emitter.on("event", {
  true: async () => {
    result.push("first");
  },
});

emitter.on("event", {
  false: async () => {
    result.push("fail");
  },
});

emitter.on("event", {
  true: () => {
    result.push(100);
  },
  false: () => {
    result.push(99);
  },
});

emitter.emit("event", 1);
emitter.emit("event", 2);
await delay(10);
// [1, "fail", 99, 2, "first", 100]

Conjoined event

IMPORTANT: conjoined events are not supported any arguments in handlers.

const emitter = new Xevt();

let count = 0;
emitter.on(["event1", "event2"], () => {
  count++;
});
emitter.emit("event1");
emitter.emit("event2");

console.log(count); // 1

Mixed async/sync handlers

Non-blocking in default.

const emitter = new Xevt();
const result: number[] = [];
emitter.on("event", (data) => {
  result.push(data);
});
emitter.on(
  "event",
  async (data) =>
    new Promise((res) => {
      setTimeout(() => {
        result.push(data);
        res(true);
      }, 10);
    }),
);

for (let i = 0; i < 5; i++) {
  emitter.emit("event", i);
}

// [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

Blocking mode.

const emitter = new Xevt();
const result: number[] = [];
emitter.on("event", (data) => {
  result.push(data);
});
emitter.on(
  "event",
  // deno-lint-ignore require-await
  async (data) =>
    new Promise((res) => {
      setTimeout(() => {
        result.push(data);
        res(true);
      }, 1);
    }),
  { async: true },
);

for (let i = 0; i < 5; i++) {
  emitter.emit("event", i);
}
await delay(15);

// [0, 0, 1, 1, 2, 2, 3, 3, 4, 4]

Return unscriber after registered an event

const emitter = new Xevt();
const result: number[] = [];
const unscribe = emitter.on("event", (arg: number) => {
  result.push(arg);
});
unscribe();
const emitter = new Xevt();
const result: number[] = [];
const unscribe = emitter.conjoin(["event1", "event2"], () => {
  result.push(1);
});
unscribe();

Debug mode

const emitter = new Xevt();
emitter.debug = true;

Then you can see the debug information in the console.

Similar projects