@@ -30,29 +30,32 @@ npm install @nextorders/queue
3030Create type definitions for your events:
3131
3232``` typescript
33- import type { BaseEventMessage } from ' @nextorders/queue'
33+ import type { BaseEventMap , BaseEventMessage , BaseEventMessageHandlerMap } from ' @nextorders/queue'
3434
3535export enum Events {
3636 UserCreated = ' userCreated' ,
3737 EmailSent = ' emailSent' ,
3838}
3939
40- export type EventMessage = UserCreated | EmailSent
40+ type EventMessage = UserCreated | EmailSent
41+ type EventMap = BaseEventMap <EventMessage >
4142
42- export interface UserCreated extends BaseEventMessage {
43+ export type EventHandlerMap = Partial <BaseEventMessageHandlerMap <EventMap >>
44+
45+ type UserCreatedData = {
46+ id: string
47+ name: string
48+ email: string
49+ }
50+ export interface UserCreated extends BaseEventMessage <UserCreatedData > {
4351 event: typeof Events .UserCreated
44- data: {
45- id: string
46- name: string
47- email: string
48- }
4952}
5053
51- export interface EmailSent extends BaseEventMessage {
54+ type EmailSentData = {
55+ email: string
56+ }
57+ export interface EmailSent extends BaseEventMessage <EmailSentData > {
5258 event: typeof Events .EmailSent
53- data: {
54- email: string
55- }
5659}
5760```
5861
@@ -97,14 +100,6 @@ import { Email, User } from './entities'
97100class QueueRepository extends Repository {
98101 user: User = new User (this )
99102 email: Email = new Email (this )
100-
101- // Override publish method with proper typing
102- publish<T extends EventMessage >(
103- event : T [' event' ],
104- data : T [' data' ]
105- ): Promise <void > {
106- return super .publish (event , data )
107- }
108103}
109104
110105export const repository = new QueueRepository ()
@@ -125,7 +120,7 @@ await repository.connect('amqp://guest:guest@localhost:5672')
125120Create and publish events from your services:
126121
127122``` typescript
128- await repository .publish (Events .UserCreated , {
123+ await repository .publish < UserCreated > (Events .UserCreated , {
129124 id: newUser .id ,
130125 name: newUser .name ,
131126 email: newUser .email ,
@@ -137,9 +132,14 @@ await repository.publish(Events.UserCreated, {
137132Subscribe to events and handle them:
138133
139134``` typescript
140- import type { UserCreated } from ' ./types'
141- import { repository } from ' ./repository'
142- import { Events } from ' ./types'
135+ import type { EmailSent , EventHandlerMap , UserCreated } from ' ../repository/types'
136+ import { repository } from ' ../repository'
137+ import { Events } from ' ../repository/types'
138+
139+ // Subscribe to Events and handle them
140+ repository .consume <EventHandlerMap >(repository .email .name , {
141+ userCreated: handleUserCreated ,
142+ })
143143
144144// Define event handlers
145145async function handleUserCreated(data : UserCreated [' data' ]): Promise <boolean > {
@@ -155,14 +155,11 @@ async function handleUserCreated(data: UserCreated['data']): Promise<boolean> {
155155async function sendEmail(email : string ): Promise <void > {
156156 console .warn (' Sending email to:' , email )
157157
158- // Publish EmailSent event
159- await repository .publish (Events .EmailSent , { email })
158+ // Publish Event for other services
159+ await repository .publish <EmailSent >(Events .EmailSent , {
160+ email ,
161+ })
160162}
161-
162- // Subscribe to events
163- await repository .consume (repository .email .name , {
164- [Events .UserCreated ]: handleUserCreated ,
165- })
166163```
167164
168165## 💁♂️ Example: Microservices Architecture
0 commit comments