diff --git a/src/subscriber/map.ts b/src/subscriber/map.ts new file mode 100644 index 0000000..5439e4c --- /dev/null +++ b/src/subscriber/map.ts @@ -0,0 +1,6 @@ +import type { SubscribedEvent } from "./event.js"; +import type { Subscriber } from "./subscriber.js"; + +export type SubscriberMap = Map>; + +export const map: SubscriberMap = new Map(); diff --git a/src/subscriber/registry.ts b/src/subscriber/registry.ts new file mode 100644 index 0000000..c44b8ba --- /dev/null +++ b/src/subscriber/registry.ts @@ -0,0 +1,32 @@ +import type { SubscribedEvent } from "./event.js"; +import type { SubscriberMap } from "./map.js"; +import type { SubscriberInterface } from "./subscriber.js"; + +/** + * Registers the subscribers' id in the configuration file. + */ +export interface SubscriberRegistryInterface { + register(...id: string[]): void; + + all(): SubscriberInterface[]; +} + +export class SubscriberRegistry implements SubscriberRegistryInterface { + private subscribers: SubscriberInterface[] = []; + private map: SubscriberMap; + + constructor(subscribersId: string[], map: SubscriberMap) { + this.map = map; + this.register(...subscribersId); + } + + register(...id: string[]): void { + const subscribers = id.filter((id) => this.map.has(id)).map((id) => this.map.get(id)!); + + this.subscribers.push(...subscribers); + } + + all(): SubscriberInterface[] { + return this.subscribers; + } +} diff --git a/tests/fixtures/generic-subscriber.ts b/tests/fixtures/generic-subscriber.ts new file mode 100644 index 0000000..00f7872 --- /dev/null +++ b/tests/fixtures/generic-subscriber.ts @@ -0,0 +1,17 @@ +import { ConfigObject } from "../../src/configuration"; +import { ContextDecorator } from "../../src/context"; +import { Subscriber } from "../../src/subscriber/subscriber"; + +export class GenericSubscriber extends Subscriber { + constructor(config: ConfigObject) { + super(config); + } + + async process(context: ContextDecorator): Promise { + await Promise.resolve(); + } + + getSubscribedEvents(): any[] { + return []; + } +} diff --git a/tests/subscriber/registry.test.ts b/tests/subscriber/registry.test.ts new file mode 100644 index 0000000..8aa5a00 --- /dev/null +++ b/tests/subscriber/registry.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, test } from "vitest"; +import { ConfigObject } from "../../src/configuration.js"; +import { map } from "../../src/subscriber/map.js"; +import { SubscriberRegistry } from "../../src/subscriber/registry.js"; +import { GenericSubscriber } from "../fixtures/generic-subscriber.js"; + +describe("subscriber registry", () => { + const config = { + version: 1, + settings: { + active_subscribers: ["test_1", "test_2"], + }, + } as ConfigObject; + + map.set("test_1", new GenericSubscriber(config)); + map.set("test_2", new GenericSubscriber(config)); + + test("Registry can register subscribers", () => { + const registry = new SubscriberRegistry(config.settings.active_subscribers, map); + const allSubscribers = registry.all(); + + expect(allSubscribers.length).toBe(2); + expect(allSubscribers[0]).toBeInstanceOf(GenericSubscriber); + expect(allSubscribers[1]).toBeInstanceOf(GenericSubscriber); + }); + + test("Registry filters out unmatched subscribers", () => { + const registry = new SubscriberRegistry(["test_1", "test_2", "test_3"], map); + const allSubscribers = registry.all(); + + expect(allSubscribers.length).toBe(2); + expect(allSubscribers[0]).toBeInstanceOf(GenericSubscriber); + expect(allSubscribers[1]).toBeInstanceOf(GenericSubscriber); + }); + + test('Registry can register subscribers with "register" method', () => { + const registry = new SubscriberRegistry([], map); + registry.register("test_1", "test_2"); + + const allSubscribers = registry.all(); + + expect(allSubscribers.length).toBe(2); + expect(allSubscribers[0]).toBeInstanceOf(GenericSubscriber); + expect(allSubscribers[1]).toBeInstanceOf(GenericSubscriber); + }); +}); diff --git a/tests/subscriber/subscriber.test.ts b/tests/subscriber/subscriber.test.ts index a9d1fe1..fc8664a 100644 --- a/tests/subscriber/subscriber.test.ts +++ b/tests/subscriber/subscriber.test.ts @@ -1,21 +1,6 @@ import { describe, expect, test } from "vitest"; -import { ConfigObject } from "../../src/configuration"; -import { ContextDecorator } from "../../src/context"; import { Subscriber } from "../../src/subscriber/subscriber"; - -class GenericSubscriber extends Subscriber { - constructor(config: ConfigObject) { - super(config); - } - - async process(context: ContextDecorator): Promise { - await Promise.resolve(); - } - - getSubscribedEvents(): any[] { - return []; - } -} +import { GenericSubscriber } from "../../tests/fixtures/generic-subscriber"; describe("generic subscriber", () => { test("Can create a generic subscriber", () => {