Skip to content

Commit

Permalink
Add SubscriberProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
paulbalandan committed Jan 21, 2025
1 parent 4f46b8c commit d5fcfb9
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/subscriber/provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import type { SubscribedEvent } from "./event.js";
import type { SubscriberRegistryInterface } from "./registry.js";
import type { SubscriberInterface } from "./subscriber.js";

export interface SubscriberProviderInterface {
/**
* Gets all subscribers which are subscribed to the received event.
*
* @param event Event received.
*/
getSubscribersForEvent<T extends SubscribedEvent>(event: T): SubscriberInterface<T>[];
}

export class SubscriberProvider implements SubscriberProviderInterface {
private subscribers: SubscriberInterface<SubscribedEvent>[];

constructor(registry: SubscriberRegistryInterface) {
this.subscribers = registry.all();
}

getSubscribersForEvent<T extends SubscribedEvent>(event: T): SubscriberInterface<T>[] {
const subscribers = this.subscribers.filter((subscriber): boolean =>
subscriber.getSubscribedEvents().includes(event),
) as SubscriberInterface<T>[];

return subscribers;
}
}
17 changes: 17 additions & 0 deletions tests/fixtures/push-subscriber.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ConfigObject } from "../../src/configuration";
import { ContextDecorator } from "../../src/context";
import { Subscriber } from "../../src/subscriber/subscriber";

export class PushSubscriber extends Subscriber<"push"> {
constructor(config: ConfigObject) {
super(config);
}

async process(context: ContextDecorator<"push">): Promise<void> {
await Promise.resolve();
}

getSubscribedEvents(): ["push"] {
return ["push"];
}
}
36 changes: 36 additions & 0 deletions tests/subscriber/provider.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { describe, expect, test } from "vitest";
import { ConfigObject } from "../../src/configuration";
import { map } from "../../src/subscriber/map";
import { SubscriberProvider } from "../../src/subscriber/provider";
import { SubscriberRegistry } from "../../src/subscriber/registry";
import { GenericSubscriber } from "../fixtures/generic-subscriber";
import { PushSubscriber } from "../fixtures/push-subscriber";

describe("subscriber provider", () => {
const config = {
version: 1,
settings: {
active_subscribers: ["generic", "push"],
},
} as ConfigObject;

map.set("generic", new GenericSubscriber(config));
map.set("push", new PushSubscriber(config));

const registry = new SubscriberRegistry(config.settings.active_subscribers, map);

test("Provider can get subscribers for event", () => {
const provider = new SubscriberProvider(registry);
const subscribers = provider.getSubscribersForEvent("push");

expect(subscribers.length).toBe(1);
expect(subscribers[0]).toBeInstanceOf(PushSubscriber);
});

test("Provider returns empty array if no subscribers found", () => {
const provider = new SubscriberProvider(registry);
const subscribers = provider.getSubscribersForEvent("pull_request.opened");

expect(subscribers.length).toBe(0);
});
});

0 comments on commit d5fcfb9

Please sign in to comment.