Giter Club home page Giter Club logo

Comments (5)

twrayden avatar twrayden commented on July 21, 2024 7

I ended up doing a custom implementation with eventemitter2 because I needed wildcard support. I thought I'd share in-case it helps somebody.

You could probably improve it with decorators, like remove the need for the abstract attach method but I didn't want to spend that much time on it and this meets my needs fine.

Here is the pub/sub classes:

import { EventEmitter2 } from "eventemitter2";

export interface IEventPublisherArgs {
  subscribers: EventSubscriber[];
}

export class EventPublisher {
  private emitter: EventEmitter2;

  constructor(args: IEventPublisherArgs) {
    this.emitter = new EventEmitter2({ wildcard: true, delimiter: "." });

    const bus: IEventBus = {
      subscribe: (id, cb) => {
        this.emitter.on(id, cb);
      }
    };

    for (const subscriber of args.subscribers) {
      subscriber.attach(bus);
    }
  }

  publish(event: PublishEvent) {
    this.emitter.emit(event.id, event);
  }
}

export class PublishEvent {
  constructor(public id: string) {}
}

export type SubscribeListenerFunction = (event: PublishEvent) => void;

export type SubscribeFunction = (
  id: string,
  cb: SubscribeListenerFunction
) => void;

export interface IEventBus {
  subscribe: SubscribeFunction;
}

export abstract class EventSubscriber {
  abstract attach(bus: IEventBus): void;
}

Here is a basic example on how it is used (w/ dependency injection):

import { Container } from "typedi";

export class IntegrationConnectedEvent extends PublishEvent {
  constructor(public payload: any) {
    super("integration.connected");
  }
}

export class IntegrationSubscriber extends EventSubscriber {
  attach(bus: IEventBus) {
    bus.subscribe(
      "integration.connected",
      this.onIntegrationConnectedEvent
    );
  }

  async onIntegrationConnectedEvent(event: PublishEvent) {
    if (event instanceof IntegrationConnectedEvent) {
      console.log(event.payload);
    }
  }
}

Container.set("publisher", new EventPublisher({ subscribers: [new IntegrationSubscriber()] }));

const publisher = Container.get("publisher");

publisher.publish(new IntegrationConnectedEvent("Hello World!"));

// Console output: Hello World!

from bulletproof-nodejs.

jblyberg avatar jblyberg commented on July 21, 2024 1

You might want to check out https://github.com/KeesCBakker/Strongly-Typed-Events-for-TypeScript

I'm in the process of replacing event-dispatch with it for the project I'm currently working on.

from bulletproof-nodejs.

santiq avatar santiq commented on July 21, 2024

Oh well, that's sad I liked that package :(

I will try to find an alternative, or write a service that does the same

from bulletproof-nodejs.

jlison avatar jlison commented on July 21, 2024

I just found about that package as well, and it looks awesome. Hopefully there are some similar alternatives out there. If you decide to create a similar service, and if you accept PRs, I will be happy to collaborate :)

from bulletproof-nodejs.

twrayden avatar twrayden commented on July 21, 2024

I just found this package which I am going to use in my project as an alternative.

https://github.com/j/type-events

I particularly like how events are dispatched as class instances so you can depend on the arguments that are passed to the subscribers.

from bulletproof-nodejs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.