diff --git a/package.json b/package.json index 3991bbb..bee22e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ampt-data-mock", - "version": "1.0.6", + "version": "1.1.0", "description": "", "main": "lib/index.js", "scripts": { diff --git a/src/__tests__/events.spec.ts b/src/__tests__/events.spec.ts new file mode 100644 index 0000000..d566721 --- /dev/null +++ b/src/__tests__/events.spec.ts @@ -0,0 +1,33 @@ +import { events } from "../events"; + +describe("events", () => { + beforeEach(events.reset); + + it("Should publish an event", () => { + const spy = jest.fn(); + events.on("my.event", spy); + events.publish("my.event", { message: "Hello, World!" }); + + expect(spy).toHaveBeenCalledWith({ + body: { message: "Hello, World!" }, + name: "my.event", + }); + }); + + it("Should ignore timeouts and config and just test the event", () => { + const spy = jest.fn(); + events.on("my.event", { timeout: 10000 }, spy); + events.publish( + "my.event", + { + timeout: 1000, + }, + { message: "Hello, World!" } + ); + + expect(spy).toHaveBeenCalledWith({ + body: { message: "Hello, World!" }, + name: "my.event", + }); + }); +}); diff --git a/src/events.ts b/src/events.ts new file mode 100644 index 0000000..8eb180b --- /dev/null +++ b/src/events.ts @@ -0,0 +1,62 @@ +let subscriptions = {}; + +interface EventHandlerEvent { + target: string; + id: string; + name: string; + body: BodyType; + time: number; + delay: number; + attempt?: number; +} + +interface HandlerContext { + setTimeout(ms: number): void; +} + +interface EventHandlerFunction { + (event: EventHandlerEvent, context: HandlerContext): void; +} + +type StringNumberDate = string | number | Date; + +interface Handler { + name: string; + callbacks: Array; + timeout: Number; + push(handler: Function): void; + setTimeout(ms: Number): void; + invoke(event: any, context: any): Promise; +} + +export const events = { + on: ( + event: string, + callbackOrConfig: EventHandlerFunction | { timeout: number }, + callback?: EventHandlerFunction + ): Handler | null => { + if (!subscriptions[event]) { + subscriptions[event] = []; + } + + const callbackFn = callback || callbackOrConfig; + subscriptions[event].push(callbackFn); + return null; + }, + publish: ( + name: string, + eventOrConfig: { after: StringNumberDate } | any, + event?: any + ) => { + const body = event || eventOrConfig; + if (!subscriptions[name]) { + return; + } + subscriptions[name].forEach((callback) => { + callback({ name, body }); + }); + }, + reset: () => { + subscriptions = {}; + }, +}; diff --git a/src/index.ts b/src/index.ts index ff7ba27..b678ee7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ export * from "./data"; +export * from "./events";