@unchainedshop/events 4.3.3 → 4.4.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/README.md CHANGED
@@ -1,3 +1,85 @@
1
- # Events (Unchained Engine)
1
+ [![npm version](https://img.shields.io/npm/v/@unchainedshop/events.svg)](https://npmjs.com/package/@unchainedshop/events)
2
+ [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](https://opensource.org/licenses/EUPL-1.2)
2
3
 
3
- This package contains business logic for the event emitter abstraction layer
4
+ # @unchainedshop/events
5
+
6
+ Event emitter abstraction layer for the Unchained Engine. Provides a pluggable event system for emitting and subscribing to business events.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @unchainedshop/events
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```typescript
17
+ import { emit, subscribe, registerEvents } from '@unchainedshop/events';
18
+
19
+ // Register custom events
20
+ registerEvents(['ORDER_CREATED', 'ORDER_PAID']);
21
+
22
+ // Subscribe to events
23
+ subscribe('ORDER_CREATED', ({ payload }) => {
24
+ console.log('Order created:', payload);
25
+ });
26
+
27
+ // Emit events
28
+ await emit('ORDER_CREATED', { orderId: '123', total: 99.99 });
29
+ ```
30
+
31
+ ## API Overview
32
+
33
+ ### Event Functions
34
+
35
+ | Export | Description |
36
+ |--------|-------------|
37
+ | `emit` | Emit an event with a payload |
38
+ | `subscribe` | Subscribe to an event with a callback handler |
39
+ | `registerEvents` | Register new event types |
40
+ | `getRegisteredEvents` | Get list of all registered event types |
41
+
42
+ ### Adapter Management
43
+
44
+ | Export | Description |
45
+ |--------|-------------|
46
+ | `getEmitAdapter` | Get the current emit adapter |
47
+ | `setEmitAdapter` | Set a custom emit adapter |
48
+ | `getEmitHistoryAdapter` | Get the current emit history adapter |
49
+ | `setEmitHistoryAdapter` | Set a custom emit history adapter |
50
+
51
+ ### Types
52
+
53
+ | Export | Description |
54
+ |--------|-------------|
55
+ | `EmitAdapter` | Interface for custom emit adapters |
56
+ | `RawPayloadType` | Type for event payload data |
57
+
58
+ ### Built-in Events
59
+
60
+ | Event | Description |
61
+ |-------|-------------|
62
+ | `PAGE_VIEW` | Registered by default for page view tracking |
63
+
64
+ ## Custom Adapters
65
+
66
+ You can implement custom emit adapters for different backends (Redis, Kafka, etc.):
67
+
68
+ ```typescript
69
+ import { setEmitAdapter, type EmitAdapter } from '@unchainedshop/events';
70
+
71
+ const customAdapter: EmitAdapter = {
72
+ publish: async (eventName, payload) => {
73
+ // Custom publish logic
74
+ },
75
+ subscribe: (eventName, callback) => {
76
+ // Custom subscribe logic
77
+ },
78
+ };
79
+
80
+ setEmitAdapter(customAdapter);
81
+ ```
82
+
83
+ ## License
84
+
85
+ EUPL-1.2
@@ -15,4 +15,3 @@ export declare const EventDirector: {
15
15
  emit: (eventName: string, data?: Record<string, any>) => Promise<void>;
16
16
  subscribe: <T extends Record<string, any>>(eventName: string, callback: (payload: RawPayloadType<T>) => void) => void;
17
17
  };
18
- //# sourceMappingURL=EventDirector.d.ts.map
@@ -2,8 +2,8 @@ import { createLogger } from '@unchainedshop/logger';
2
2
  const logger = createLogger('unchained:events');
3
3
  const RegisteredEventsSet = new Set();
4
4
  const RegisteredCallbacksSet = new Set();
5
- let Adapter; // Public (customizable)
6
- let HistoryAdapter; // (Per default: Core-events adapter to write into DB)
5
+ let Adapter;
6
+ let HistoryAdapter;
7
7
  export const EventDirector = {
8
8
  registerEvents: (events) => {
9
9
  if (events.length) {
@@ -34,7 +34,7 @@ export const EventDirector = {
34
34
  logger.debug(`EventDirector -> Emitted ${eventName} with ${JSON.stringify(data)}`);
35
35
  },
36
36
  subscribe: (eventName, callback) => {
37
- const currentSubscription = `${eventName}${callback?.toString()}`; // used to avaoid registering the same event handler callback
37
+ const currentSubscription = `${eventName}${callback?.toString()}`;
38
38
  if (!RegisteredEventsSet.has(eventName))
39
39
  throw new Error(`Event with ${eventName} is not registered`);
40
40
  if (!RegisteredCallbacksSet.has(currentSubscription)) {
@@ -44,4 +44,3 @@ export const EventDirector = {
44
44
  }
45
45
  },
46
46
  };
47
- //# sourceMappingURL=EventDirector.js.map
@@ -1,4 +1,4 @@
1
- import { EmitAdapter, RawPayloadType } from './EventDirector.js';
1
+ import { type EmitAdapter, type RawPayloadType } from './EventDirector.ts';
2
2
  declare const emit: (eventName: string, data?: Record<string, any>) => Promise<void>, getEmitAdapter: () => EmitAdapter, getEmitHistoryAdapter: () => EmitAdapter, getRegisteredEvents: () => string[], registerEvents: (events: string[]) => void, setEmitAdapter: (adapter: EmitAdapter) => void, setEmitHistoryAdapter: (adapter: EmitAdapter) => void, subscribe: <T extends Record<string, any>>(eventName: string, callback: (payload: RawPayloadType<T>) => void) => void;
3
- export { emit, getEmitAdapter, getEmitHistoryAdapter, getRegisteredEvents, registerEvents, setEmitAdapter, setEmitHistoryAdapter, subscribe, EmitAdapter, RawPayloadType, };
4
- //# sourceMappingURL=events-index.d.ts.map
3
+ export { emit, getEmitAdapter, getEmitHistoryAdapter, getRegisteredEvents, registerEvents, setEmitAdapter, setEmitHistoryAdapter, subscribe, };
4
+ export type { EmitAdapter, RawPayloadType };
@@ -1,6 +1,5 @@
1
- import { EventDirector } from './EventDirector.js';
1
+ import { EventDirector } from "./EventDirector.js";
2
2
  const { emit, getEmitAdapter, getEmitHistoryAdapter, getRegisteredEvents, registerEvents, setEmitAdapter, setEmitHistoryAdapter, subscribe, } = EventDirector;
3
3
  const GLOBAL_EVENTS = ['PAGE_VIEW'];
4
4
  registerEvents(GLOBAL_EVENTS);
5
5
  export { emit, getEmitAdapter, getEmitHistoryAdapter, getRegisteredEvents, registerEvents, setEmitAdapter, setEmitHistoryAdapter, subscribe, };
6
- //# sourceMappingURL=events-index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/events",
3
- "version": "4.3.3",
3
+ "version": "4.4.0",
4
4
  "main": "lib/events-index.js",
5
5
  "types": "lib/events-index.d.ts",
6
6
  "type": "module",
@@ -9,8 +9,8 @@
9
9
  "build": "tsc -b",
10
10
  "prepublishOnly": "npm run clean && npm run build",
11
11
  "watch": "tsc -w",
12
- "test": "tsx --test",
13
- "test:watch": "tsx --test --watch"
12
+ "test": "node --test",
13
+ "test:watch": "node --test --watch"
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
@@ -22,8 +22,10 @@
22
22
  "core"
23
23
  ],
24
24
  "authors": [
25
- "Joël Meiller",
26
- "Pascal Kaufmann"
25
+ "Pascal Kaufmann",
26
+ "Mikael Araya",
27
+ "Vedran Rudelj",
28
+ "Joël Meiller"
27
29
  ],
28
30
  "license": "EUPL-1.2",
29
31
  "bugs": {
@@ -31,11 +33,10 @@
31
33
  },
32
34
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
35
  "dependencies": {
34
- "@unchainedshop/logger": "^4.3.0"
36
+ "@unchainedshop/logger": "^4.4.0"
35
37
  },
36
38
  "devDependencies": {
37
- "@types/node": "^24.0.13",
38
- "tsx": "^4.20.3",
39
+ "@types/node": "^25.0.0",
39
40
  "typescript": "^5.8.3"
40
41
  }
41
42
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventDirector.d.ts","sourceRoot":"","sources":["../src/EventDirector.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC;CACZ;AACD,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CACtG;AAQD,eAAO,MAAM,aAAa;6BACC,MAAM,EAAE,KAAG,IAAI;+BAMf,MAAM,EAAE;8BAIP,WAAW,KAAG,IAAI;0BAIxB,WAAW;qCAEE,WAAW,KAAG,IAAI;iCAIxB,WAAW;sBAEd,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC;gBAiB9D,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aAC5B,MAAM,YACP,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,KAC7C,IAAI;CAYR,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventDirector.js","sourceRoot":"","sources":["../src/EventDirector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAUhD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;AACtC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC;AAEzC,IAAI,OAAoB,CAAC,CAAC,wBAAwB;AAClD,IAAI,cAA2B,CAAC,CAAC,sDAAsD;AAEvF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,CAAC,MAAgB,EAAQ,EAAE;QACzC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,mBAAmB,EAAE,GAAa,EAAE;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAa,CAAC;IACrD,CAAC;IAED,cAAc,EAAE,CAAC,OAAoB,EAAQ,EAAE;QAC7C,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;IAED,cAAc,EAAE,GAAgB,EAAE,CAAC,OAAO;IAE1C,qBAAqB,EAAE,CAAC,OAAoB,EAAQ,EAAE;QACpD,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,qBAAqB,EAAE,GAAgB,EAAE,CAAC,cAAc;IAExD,IAAI,EAAE,KAAK,EAAE,SAAiB,EAAE,IAA0B,EAAiB,EAAE;QAC3E,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,oBAAoB,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAE3B,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE;YAC1B,OAAO;SACR,CAAC,CAAC;QAEH,cAAc,EAAE,OAAO,CAAC,SAAS,EAAE;YACjC,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,4BAA4B,SAAS,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,SAAS,EAAE,CACT,SAAiB,EACjB,QAA8C,EACxC,EAAE;QACR,MAAM,mBAAmB,GAAG,GAAG,SAAS,GAAG,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,6DAA6D;QAEhI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,oBAAoB,CAAC,CAAC;QAE/D,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxC,cAAc,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC/C,sBAAsB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events-index.d.ts","sourceRoot":"","sources":["../src/events-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhF,QAAA,MACE,IAAI,oEACJ,cAAc,qBACd,qBAAqB,qBACrB,mBAAmB,kBACnB,cAAc,8BACd,cAAc,kCACd,qBAAqB,kCACrB,SAAS,4GACM,CAAC;AAKlB,OAAO,EACL,IAAI,EACJ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,cAAc,GACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events-index.js","sourceRoot":"","sources":["../src/events-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA+B,MAAM,oBAAoB,CAAC;AAEhF,MAAM,EACJ,IAAI,EACJ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,SAAS,GACV,GAAG,aAAa,CAAC;AAElB,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC,CAAC;AACpC,cAAc,CAAC,aAAa,CAAC,CAAC;AAE9B,OAAO,EACL,IAAI,EACJ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,SAAS,GAGV,CAAC"}
@@ -1,74 +0,0 @@
1
- import { createLogger } from '@unchainedshop/logger';
2
-
3
- const logger = createLogger('unchained:events');
4
-
5
- export interface RawPayloadType<T> {
6
- payload: T;
7
- }
8
- export interface EmitAdapter {
9
- publish(eventName: string, data: RawPayloadType<Record<string, any>>): void;
10
- subscribe(eventName: string, callback: (payload: RawPayloadType<Record<string, any>>) => void): void;
11
- }
12
-
13
- const RegisteredEventsSet = new Set();
14
- const RegisteredCallbacksSet = new Set();
15
-
16
- let Adapter: EmitAdapter; // Public (customizable)
17
- let HistoryAdapter: EmitAdapter; // (Per default: Core-events adapter to write into DB)
18
-
19
- export const EventDirector = {
20
- registerEvents: (events: string[]): void => {
21
- if (events.length) {
22
- events.forEach((e) => RegisteredEventsSet.add(e));
23
- }
24
- },
25
-
26
- getRegisteredEvents: (): string[] => {
27
- return Array.from(RegisteredEventsSet) as string[];
28
- },
29
-
30
- setEmitAdapter: (adapter: EmitAdapter): void => {
31
- Adapter = adapter;
32
- },
33
-
34
- getEmitAdapter: (): EmitAdapter => Adapter,
35
-
36
- setEmitHistoryAdapter: (adapter: EmitAdapter): void => {
37
- HistoryAdapter = adapter;
38
- },
39
-
40
- getEmitHistoryAdapter: (): EmitAdapter => HistoryAdapter,
41
-
42
- emit: async (eventName: string, data?: Record<string, any>): Promise<void> => {
43
- if (!RegisteredEventsSet.has(eventName))
44
- throw new Error(`Event with ${eventName} is not registered`);
45
-
46
- const payload = data || {};
47
-
48
- Adapter?.publish(eventName, {
49
- payload,
50
- });
51
-
52
- HistoryAdapter?.publish(eventName, {
53
- payload,
54
- });
55
-
56
- logger.debug(`EventDirector -> Emitted ${eventName} with ${JSON.stringify(data)}`);
57
- },
58
-
59
- subscribe: <T extends Record<string, any>>(
60
- eventName: string,
61
- callback: (payload: RawPayloadType<T>) => void,
62
- ): void => {
63
- const currentSubscription = `${eventName}${callback?.toString()}`; // used to avaoid registering the same event handler callback
64
-
65
- if (!RegisteredEventsSet.has(eventName))
66
- throw new Error(`Event with ${eventName} is not registered`);
67
-
68
- if (!RegisteredCallbacksSet.has(currentSubscription)) {
69
- Adapter?.subscribe(eventName, callback);
70
- HistoryAdapter?.subscribe(eventName, callback);
71
- RegisteredCallbacksSet.add(currentSubscription);
72
- }
73
- },
74
- };
@@ -1,28 +0,0 @@
1
- import { EventDirector, EmitAdapter, RawPayloadType } from './EventDirector.js';
2
-
3
- const {
4
- emit,
5
- getEmitAdapter,
6
- getEmitHistoryAdapter,
7
- getRegisteredEvents,
8
- registerEvents,
9
- setEmitAdapter,
10
- setEmitHistoryAdapter,
11
- subscribe,
12
- } = EventDirector;
13
-
14
- const GLOBAL_EVENTS = ['PAGE_VIEW'];
15
- registerEvents(GLOBAL_EVENTS);
16
-
17
- export {
18
- emit,
19
- getEmitAdapter,
20
- getEmitHistoryAdapter,
21
- getRegisteredEvents,
22
- registerEvents,
23
- setEmitAdapter,
24
- setEmitHistoryAdapter,
25
- subscribe,
26
- EmitAdapter,
27
- RawPayloadType,
28
- };
@@ -1,8 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
-
4
- describe('Worker', () => {
5
- it('Init', () => {
6
- assert(true);
7
- });
8
- });
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "../shared/base.tsconfig.json",
3
- "compilerOptions": {
4
- "declarationDir": "./lib",
5
- "rootDir": "./src",
6
- "outDir": "./lib",
7
-
8
- },
9
- "exclude": ["**/*.test.ts", "**/*.test.js", "tests", "lib"]
10
- }