@xbg.solutions/utils-events 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/event-bus.d.ts +42 -0
- package/lib/event-bus.d.ts.map +1 -0
- package/lib/event-bus.js +93 -0
- package/lib/event-bus.js.map +1 -0
- package/lib/event-types.d.ts +146 -0
- package/lib/event-types.d.ts.map +1 -0
- package/lib/event-types.js +49 -0
- package/lib/event-types.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/package.json +22 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Event Bus
|
|
3
|
+
*
|
|
4
|
+
* Decouples components via publish/subscribe pattern.
|
|
5
|
+
* Uses Node.js EventEmitter for reliability.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
import { EventType, BaseEventPayload } from './event-types';
|
|
9
|
+
declare class EventBus extends EventEmitter {
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Emit an event with type-safe payload
|
|
13
|
+
*/
|
|
14
|
+
publish<T extends BaseEventPayload>(eventType: EventType, payload: T): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Subscribe to an event
|
|
17
|
+
*/
|
|
18
|
+
subscribe<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Subscribe to an event (one-time only)
|
|
21
|
+
*/
|
|
22
|
+
subscribeOnce<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
|
|
23
|
+
/**
|
|
24
|
+
* Unsubscribe from an event
|
|
25
|
+
*/
|
|
26
|
+
unsubscribe<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
|
|
27
|
+
/**
|
|
28
|
+
* Unsubscribe all handlers for an event type
|
|
29
|
+
*/
|
|
30
|
+
unsubscribeAll(eventType: EventType): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get count of listeners for an event type
|
|
33
|
+
*/
|
|
34
|
+
listenerCount(eventType: EventType): number;
|
|
35
|
+
/**
|
|
36
|
+
* Clear all event listeners (useful for testing)
|
|
37
|
+
*/
|
|
38
|
+
clear(): void;
|
|
39
|
+
}
|
|
40
|
+
export declare const eventBus: EventBus;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE5D,cAAM,QAAS,SAAQ,YAAY;;IAQjC;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,gBAAgB,EAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,GACT,OAAO;IAqCV;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,gBAAgB,EACtC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,WAAW,CAAC,CAAC,SAAS,gBAAgB,EACpC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAI1C;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAI3C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|
package/lib/event-bus.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Internal Event Bus
|
|
4
|
+
*
|
|
5
|
+
* Decouples components via publish/subscribe pattern.
|
|
6
|
+
* Uses Node.js EventEmitter for reliability.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.eventBus = void 0;
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
class EventBus extends events_1.EventEmitter {
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
// Increase max listeners to avoid warnings in complex workflows
|
|
15
|
+
this.setMaxListeners(100);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Emit an event with type-safe payload
|
|
19
|
+
*/
|
|
20
|
+
publish(eventType, payload) {
|
|
21
|
+
// Add timestamp if not provided
|
|
22
|
+
if (!payload.timestamp) {
|
|
23
|
+
payload.timestamp = new Date();
|
|
24
|
+
}
|
|
25
|
+
// Check if there are any listeners
|
|
26
|
+
const listenerCount = this.listenerCount(eventType);
|
|
27
|
+
if (listenerCount === 0) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Call each listener and catch any errors to prevent one failing listener
|
|
31
|
+
// from stopping others from being called
|
|
32
|
+
const rawListeners = this.rawListeners(eventType);
|
|
33
|
+
for (const rawListener of rawListeners) {
|
|
34
|
+
try {
|
|
35
|
+
// Check if this is a once listener (has a 'listener' property)
|
|
36
|
+
if (typeof rawListener === 'function' && rawListener.listener) {
|
|
37
|
+
// For once listeners, remove them first, then call
|
|
38
|
+
this.off(eventType, rawListener);
|
|
39
|
+
rawListener.listener(payload);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Regular listener
|
|
43
|
+
rawListener(payload);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Silently catch errors from listeners
|
|
48
|
+
// This matches the behavior expected by the tests
|
|
49
|
+
// where one failing listener doesn't stop others
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Subscribe to an event
|
|
56
|
+
*/
|
|
57
|
+
subscribe(eventType, handler) {
|
|
58
|
+
this.on(eventType, handler);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Subscribe to an event (one-time only)
|
|
62
|
+
*/
|
|
63
|
+
subscribeOnce(eventType, handler) {
|
|
64
|
+
this.once(eventType, handler);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Unsubscribe from an event
|
|
68
|
+
*/
|
|
69
|
+
unsubscribe(eventType, handler) {
|
|
70
|
+
this.off(eventType, handler);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Unsubscribe all handlers for an event type
|
|
74
|
+
*/
|
|
75
|
+
unsubscribeAll(eventType) {
|
|
76
|
+
this.removeAllListeners(eventType);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get count of listeners for an event type
|
|
80
|
+
*/
|
|
81
|
+
listenerCount(eventType) {
|
|
82
|
+
return super.listenerCount(eventType);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Clear all event listeners (useful for testing)
|
|
86
|
+
*/
|
|
87
|
+
clear() {
|
|
88
|
+
this.removeAllListeners();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Singleton instance
|
|
92
|
+
exports.eventBus = new EventBus();
|
|
93
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAsC;AAGtC,MAAM,QAAS,SAAQ,qBAAY;IACjC;QACE,KAAK,EAAE,CAAC;QAER,gEAAgE;QAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO,CACL,SAAoB,EACpB,OAAU;QAEV,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0EAA0E;QAC1E,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAClD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,+DAA+D;gBAC/D,IAAI,OAAO,WAAW,KAAK,UAAU,IAAK,WAAmB,CAAC,QAAQ,EAAE,CAAC;oBACvE,mDAAmD;oBACnD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAuC,CAAC,CAAC;oBAC5D,WAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,mBAAmB;oBAClB,WAAwC,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uCAAuC;gBACvC,kDAAkD;gBAClD,iDAAiD;YACnD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,CACP,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa,CACX,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,WAAW,CACT,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAoB;QACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAoB;QAChC,OAAO,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,qBAAqB;AACR,QAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Base event types for the internal event bus. These cover the standard
|
|
5
|
+
* lifecycle events that most applications need out of the box.
|
|
6
|
+
*
|
|
7
|
+
* ─── Extending with project-specific events ───────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* The code generator adds entity-specific CRUD events automatically
|
|
10
|
+
* (e.g. ORDER_CREATED, PRODUCT_UPDATED) via BaseService.publishEvent().
|
|
11
|
+
* Those events are cast to EventType at runtime, so they work with the
|
|
12
|
+
* event bus without being listed here.
|
|
13
|
+
*
|
|
14
|
+
* To add custom domain events (e.g. ORDER_SHIPPED, PAYMENT_FAILED):
|
|
15
|
+
*
|
|
16
|
+
* 1. Add the new member to this enum.
|
|
17
|
+
* 2. Optionally define a typed payload interface below.
|
|
18
|
+
* 3. Add the mapping to EventPayloadMap for full type safety.
|
|
19
|
+
* 4. Subscribe in your service or in subscribers/.
|
|
20
|
+
*
|
|
21
|
+
* The enum is deliberately kept small so that new projects start clean
|
|
22
|
+
* and only grow the event catalogue as needed.
|
|
23
|
+
*/
|
|
24
|
+
export declare enum EventType {
|
|
25
|
+
USER_CREATED = "user.created",
|
|
26
|
+
USER_UPDATED = "user.updated",
|
|
27
|
+
USER_DELETED = "user.deleted",
|
|
28
|
+
AUTH_LOGIN = "auth.login",
|
|
29
|
+
AUTH_LOGOUT = "auth.logout",
|
|
30
|
+
AUTH_TOKEN_REFRESHED = "auth.token_refreshed",
|
|
31
|
+
AUTH_TOKEN_BLACKLISTED = "auth.token_blacklisted",
|
|
32
|
+
AUTH_PASSWORD_CHANGED = "auth.password_changed",
|
|
33
|
+
FILE_UPLOADED = "file.uploaded",
|
|
34
|
+
FILE_DELETED = "file.deleted",
|
|
35
|
+
NOTIFICATION_SENT = "notification.sent",
|
|
36
|
+
NOTIFICATION_FAILED = "notification.failed",
|
|
37
|
+
/** Catch-all for external data changes (Firebase triggers, webhooks, etc.) */
|
|
38
|
+
EXTERNAL_DATA_CHANGE = "external.data.change"
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Every event payload extends this interface.
|
|
42
|
+
* The event bus adds a `timestamp` automatically if one is not provided.
|
|
43
|
+
*/
|
|
44
|
+
export interface BaseEventPayload {
|
|
45
|
+
timestamp?: Date;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
}
|
|
48
|
+
/** Payload published by BaseService on entity creation */
|
|
49
|
+
export interface EntityCreatedPayload extends BaseEventPayload {
|
|
50
|
+
entityId: string;
|
|
51
|
+
entityType: string;
|
|
52
|
+
action: 'CREATED';
|
|
53
|
+
userId?: string;
|
|
54
|
+
requestId?: string;
|
|
55
|
+
data?: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
/** Payload published by BaseService on entity update */
|
|
58
|
+
export interface EntityUpdatedPayload extends BaseEventPayload {
|
|
59
|
+
entityId: string;
|
|
60
|
+
entityType: string;
|
|
61
|
+
action: 'UPDATED';
|
|
62
|
+
userId?: string;
|
|
63
|
+
requestId?: string;
|
|
64
|
+
data?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
/** Payload published by BaseService on entity deletion */
|
|
67
|
+
export interface EntityDeletedPayload extends BaseEventPayload {
|
|
68
|
+
entityId: string;
|
|
69
|
+
entityType: string;
|
|
70
|
+
action: 'DELETED';
|
|
71
|
+
userId?: string;
|
|
72
|
+
requestId?: string;
|
|
73
|
+
data?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
/** User lifecycle events */
|
|
76
|
+
export interface UserCreatedPayload extends BaseEventPayload {
|
|
77
|
+
userUID: string;
|
|
78
|
+
email?: string;
|
|
79
|
+
}
|
|
80
|
+
export interface UserUpdatedPayload extends BaseEventPayload {
|
|
81
|
+
userUID: string;
|
|
82
|
+
}
|
|
83
|
+
export interface UserDeletedPayload extends BaseEventPayload {
|
|
84
|
+
userUID: string;
|
|
85
|
+
}
|
|
86
|
+
/** Authentication events */
|
|
87
|
+
export interface AuthLoginPayload extends BaseEventPayload {
|
|
88
|
+
userUID: string;
|
|
89
|
+
method?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface AuthLogoutPayload extends BaseEventPayload {
|
|
92
|
+
userUID: string;
|
|
93
|
+
}
|
|
94
|
+
export interface AuthTokenBlacklistedPayload extends BaseEventPayload {
|
|
95
|
+
userUID: string;
|
|
96
|
+
reason?: string;
|
|
97
|
+
}
|
|
98
|
+
/** File events */
|
|
99
|
+
export interface FileUploadedPayload extends BaseEventPayload {
|
|
100
|
+
filePath: string;
|
|
101
|
+
contentType?: string;
|
|
102
|
+
size?: number;
|
|
103
|
+
bucket?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface FileDeletedPayload extends BaseEventPayload {
|
|
106
|
+
filePath: string;
|
|
107
|
+
}
|
|
108
|
+
/** Notification events */
|
|
109
|
+
export interface NotificationSentPayload extends BaseEventPayload {
|
|
110
|
+
channel: 'email' | 'sms' | 'push' | string;
|
|
111
|
+
recipientId?: string;
|
|
112
|
+
}
|
|
113
|
+
export interface NotificationFailedPayload extends BaseEventPayload {
|
|
114
|
+
channel: 'email' | 'sms' | 'push' | string;
|
|
115
|
+
recipientId?: string;
|
|
116
|
+
error?: string;
|
|
117
|
+
}
|
|
118
|
+
/** External data change (Firebase triggers, webhooks, etc.) */
|
|
119
|
+
export interface ExternalDataChangePayload extends BaseEventPayload {
|
|
120
|
+
source: 'firestore' | 'auth' | 'storage' | string;
|
|
121
|
+
collection?: string;
|
|
122
|
+
documentId?: string;
|
|
123
|
+
operation?: string;
|
|
124
|
+
userId?: string;
|
|
125
|
+
filePath?: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Maps each EventType to its strongly-typed payload.
|
|
129
|
+
* Extend this map when adding new event types.
|
|
130
|
+
*/
|
|
131
|
+
export interface EventPayloadMap {
|
|
132
|
+
[EventType.USER_CREATED]: UserCreatedPayload;
|
|
133
|
+
[EventType.USER_UPDATED]: UserUpdatedPayload;
|
|
134
|
+
[EventType.USER_DELETED]: UserDeletedPayload;
|
|
135
|
+
[EventType.AUTH_LOGIN]: AuthLoginPayload;
|
|
136
|
+
[EventType.AUTH_LOGOUT]: AuthLogoutPayload;
|
|
137
|
+
[EventType.AUTH_TOKEN_REFRESHED]: BaseEventPayload;
|
|
138
|
+
[EventType.AUTH_TOKEN_BLACKLISTED]: AuthTokenBlacklistedPayload;
|
|
139
|
+
[EventType.AUTH_PASSWORD_CHANGED]: BaseEventPayload;
|
|
140
|
+
[EventType.FILE_UPLOADED]: FileUploadedPayload;
|
|
141
|
+
[EventType.FILE_DELETED]: FileDeletedPayload;
|
|
142
|
+
[EventType.NOTIFICATION_SENT]: NotificationSentPayload;
|
|
143
|
+
[EventType.NOTIFICATION_FAILED]: NotificationFailedPayload;
|
|
144
|
+
[EventType.EXTERNAL_DATA_CHANGE]: ExternalDataChangePayload;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=event-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../src/event-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event Type Definitions
|
|
4
|
+
*
|
|
5
|
+
* Base event types for the internal event bus. These cover the standard
|
|
6
|
+
* lifecycle events that most applications need out of the box.
|
|
7
|
+
*
|
|
8
|
+
* ─── Extending with project-specific events ───────────────────────────
|
|
9
|
+
*
|
|
10
|
+
* The code generator adds entity-specific CRUD events automatically
|
|
11
|
+
* (e.g. ORDER_CREATED, PRODUCT_UPDATED) via BaseService.publishEvent().
|
|
12
|
+
* Those events are cast to EventType at runtime, so they work with the
|
|
13
|
+
* event bus without being listed here.
|
|
14
|
+
*
|
|
15
|
+
* To add custom domain events (e.g. ORDER_SHIPPED, PAYMENT_FAILED):
|
|
16
|
+
*
|
|
17
|
+
* 1. Add the new member to this enum.
|
|
18
|
+
* 2. Optionally define a typed payload interface below.
|
|
19
|
+
* 3. Add the mapping to EventPayloadMap for full type safety.
|
|
20
|
+
* 4. Subscribe in your service or in subscribers/.
|
|
21
|
+
*
|
|
22
|
+
* The enum is deliberately kept small so that new projects start clean
|
|
23
|
+
* and only grow the event catalogue as needed.
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.EventType = void 0;
|
|
27
|
+
var EventType;
|
|
28
|
+
(function (EventType) {
|
|
29
|
+
// ── User lifecycle ────────────────────────────────────────
|
|
30
|
+
EventType["USER_CREATED"] = "user.created";
|
|
31
|
+
EventType["USER_UPDATED"] = "user.updated";
|
|
32
|
+
EventType["USER_DELETED"] = "user.deleted";
|
|
33
|
+
// ── Authentication ────────────────────────────────────────
|
|
34
|
+
EventType["AUTH_LOGIN"] = "auth.login";
|
|
35
|
+
EventType["AUTH_LOGOUT"] = "auth.logout";
|
|
36
|
+
EventType["AUTH_TOKEN_REFRESHED"] = "auth.token_refreshed";
|
|
37
|
+
EventType["AUTH_TOKEN_BLACKLISTED"] = "auth.token_blacklisted";
|
|
38
|
+
EventType["AUTH_PASSWORD_CHANGED"] = "auth.password_changed";
|
|
39
|
+
// ── File / Storage ────────────────────────────────────────
|
|
40
|
+
EventType["FILE_UPLOADED"] = "file.uploaded";
|
|
41
|
+
EventType["FILE_DELETED"] = "file.deleted";
|
|
42
|
+
// ── Notifications ─────────────────────────────────────────
|
|
43
|
+
EventType["NOTIFICATION_SENT"] = "notification.sent";
|
|
44
|
+
EventType["NOTIFICATION_FAILED"] = "notification.failed";
|
|
45
|
+
// ── System ────────────────────────────────────────────────
|
|
46
|
+
/** Catch-all for external data changes (Firebase triggers, webhooks, etc.) */
|
|
47
|
+
EventType["EXTERNAL_DATA_CHANGE"] = "external.data.change";
|
|
48
|
+
})(EventType || (exports.EventType = EventType = {}));
|
|
49
|
+
//# sourceMappingURL=event-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-types.js","sourceRoot":"","sources":["../src/event-types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,IAAY,SAwBX;AAxBD,WAAY,SAAS;IACnB,6DAA6D;IAC7D,0CAA6B,CAAA;IAC7B,0CAA6B,CAAA;IAC7B,0CAA6B,CAAA;IAE7B,6DAA6D;IAC7D,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;IAC3B,0DAA6C,CAAA;IAC7C,8DAAiD,CAAA;IACjD,4DAA+C,CAAA;IAE/C,6DAA6D;IAC7D,4CAA+B,CAAA;IAC/B,0CAA6B,CAAA;IAE7B,6DAA6D;IAC7D,oDAAuC,CAAA;IACvC,wDAA2C,CAAA;IAE3C,6DAA6D;IAC7D,8EAA8E;IAC9E,0DAA6C,CAAA;AAC/C,CAAC,EAxBW,SAAS,yBAAT,SAAS,QAwBpB"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event utilities barrel export
|
|
3
|
+
*/
|
|
4
|
+
export { eventBus } from './event-bus';
|
|
5
|
+
export { EventType } from './event-types';
|
|
6
|
+
export type { BaseEventPayload, EntityCreatedPayload, EntityUpdatedPayload, EntityDeletedPayload, UserCreatedPayload, UserUpdatedPayload, UserDeletedPayload, AuthLoginPayload, AuthLogoutPayload, AuthTokenBlacklistedPayload, FileUploadedPayload, FileDeletedPayload, NotificationSentPayload, NotificationFailedPayload, ExternalDataChangePayload, EventPayloadMap, } from './event-types';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,GAChB,MAAM,eAAe,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event utilities barrel export
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EventType = exports.eventBus = void 0;
|
|
7
|
+
var event_bus_1 = require("./event-bus");
|
|
8
|
+
Object.defineProperty(exports, "eventBus", { enumerable: true, get: function () { return event_bus_1.eventBus; } });
|
|
9
|
+
var event_types_1 = require("./event-types");
|
|
10
|
+
Object.defineProperty(exports, "EventType", { enumerable: true, get: function () { return event_types_1.EventType; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,6CAA0C;AAAjC,wGAAA,SAAS,OAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xbg.solutions/utils-events",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Event bus for domain events",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"files": ["lib"],
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"build:watch": "tsc --watch",
|
|
11
|
+
"clean": "rm -rf lib",
|
|
12
|
+
"prepublishOnly": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {},
|
|
15
|
+
"devDependencies": {"@types/node": "^20.11.0", "typescript": "^5.3.3"},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": "22"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
}
|
|
22
|
+
}
|