@adonisjs/events 10.1.0-next.2 → 10.1.0-next.3

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.
@@ -0,0 +1,250 @@
1
+ import "node:module";
2
+ import is from "@sindresorhus/is";
3
+ import Emittery from "emittery";
4
+ import { moduleCaller, moduleImporter } from "@adonisjs/fold";
5
+ import { debuglog } from "node:util";
6
+ import string from "@poppinss/utils/string";
7
+ import { AssertionError } from "node:assert";
8
+ import diagnostics_channel from "node:diagnostics_channel";
9
+ var __defProp = Object.defineProperty;
10
+ var __export = (all, symbols) => {
11
+ let target = {};
12
+ for (var name in all) __defProp(target, name, {
13
+ get: all[name],
14
+ enumerable: true
15
+ });
16
+ if (symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
17
+ return target;
18
+ };
19
+ var debug_default = debuglog("adonisjs:events");
20
+ var EventsBuffer = class {
21
+ #events = [];
22
+ add(event, data) {
23
+ this.#events.push({
24
+ event,
25
+ data
26
+ });
27
+ }
28
+ all() {
29
+ return this.#events;
30
+ }
31
+ size() {
32
+ return this.#events.length;
33
+ }
34
+ exists(event, finder) {
35
+ return !!this.find(event, finder);
36
+ }
37
+ find(event, finder) {
38
+ return this.#events.find((bufferedEvent) => {
39
+ if (!finder) return bufferedEvent.event === event;
40
+ return bufferedEvent.event === event && finder(bufferedEvent);
41
+ }) || null;
42
+ }
43
+ assertEmitted(event, finder) {
44
+ if (!this.exists(event, finder)) throw new AssertionError({
45
+ message: is.class(event) ? `Expected "[class ${event.name}]" event to be emitted` : `Expected "${String(event)}" event to be emitted`,
46
+ expected: true,
47
+ actual: false,
48
+ operator: "strictEqual",
49
+ stackStartFn: this.assertEmitted
50
+ });
51
+ }
52
+ assertEmittedCount(event, count) {
53
+ const actual = this.all().filter((bufferedEvent) => bufferedEvent.event === event).length;
54
+ if (actual !== count) throw new AssertionError({
55
+ message: `Expected "${is.class(event) ? `[class ${event.name}]` : String(event)}" event to be emitted "${count}" ${string.pluralize("time", count)}, instead it was emitted "${actual}" ${string.pluralize("time", actual)}`,
56
+ actual,
57
+ expected: count
58
+ });
59
+ }
60
+ assertNotEmitted(event, finder) {
61
+ if (this.exists(event, finder)) throw new AssertionError({
62
+ message: is.class(event) ? `Unexpected "[class ${event.name}]" event was emitted` : `Unexpected "${String(event)}" event was emitted`,
63
+ expected: false,
64
+ actual: true,
65
+ operator: "strictEqual",
66
+ stackStartFn: this.assertNotEmitted
67
+ });
68
+ }
69
+ assertNoneEmitted() {
70
+ const eventsSize = this.size();
71
+ if (eventsSize > 0) throw new AssertionError(Object.assign({
72
+ message: `Expected zero events to be emitted. Instead received "${eventsSize}" ${string.pluralize("event", eventsSize)}`,
73
+ expected: 0,
74
+ actual: eventsSize,
75
+ operator: "strictEqual",
76
+ stackStartFn: this.assertNoneEmitted
77
+ }, { showDiff: true }));
78
+ }
79
+ flush() {
80
+ this.#events = [];
81
+ }
82
+ };
83
+ var tracing_channels_exports = /* @__PURE__ */ __export({ eventDispatch: () => eventDispatch });
84
+ const eventDispatch = diagnostics_channel.tracingChannel("adonisjs.event.dispatch");
85
+ var Emitter = class {
86
+ #eventsClassSymbols = /* @__PURE__ */ new Map();
87
+ #eventsListeners = /* @__PURE__ */ new Map();
88
+ #transport = new Emittery();
89
+ #eventsBuffer;
90
+ #eventsToFake = /* @__PURE__ */ new Set();
91
+ #errorHandler;
92
+ #app;
93
+ get eventsListeners() {
94
+ return this.#eventsListeners;
95
+ }
96
+ constructor(app) {
97
+ this.#app = app;
98
+ }
99
+ #isConstructor(value) {
100
+ return is.class(value);
101
+ }
102
+ #getEventClassSymbol(event) {
103
+ if (!this.#eventsClassSymbols.has(event)) this.#eventsClassSymbols.set(event, Symbol(event.name));
104
+ return this.#eventsClassSymbols.get(event);
105
+ }
106
+ #resolveEvent(event) {
107
+ if (this.#isConstructor(event)) return this.#getEventClassSymbol(event);
108
+ return event;
109
+ }
110
+ #getEventListeners(event) {
111
+ if (!this.#eventsListeners.has(event)) this.#eventsListeners.set(event, /* @__PURE__ */ new Map());
112
+ return this.#eventsListeners.get(event);
113
+ }
114
+ #normalizeEventListener(listener) {
115
+ if (typeof listener === "string") {
116
+ const parts = listener.split(".");
117
+ const method = parts.length === 1 ? "handle" : parts.pop();
118
+ const moduleRefId = parts.join(".");
119
+ return moduleImporter(() => this.#app.import(moduleRefId), method).toCallable(this.#app.container);
120
+ }
121
+ if (Array.isArray(listener)) {
122
+ const listenerModule = listener[0];
123
+ const method = listener[1] || "handle";
124
+ if (this.#isConstructor(listenerModule)) return moduleCaller(listenerModule, method).toCallable(this.#app.container);
125
+ return moduleImporter(listenerModule, method).toCallable(this.#app.container);
126
+ }
127
+ return listener;
128
+ }
129
+ #resolveEventListener(event, listener) {
130
+ const eventListeners = this.#getEventListeners(event);
131
+ if (!eventListeners.has(listener)) eventListeners.set(listener, this.#normalizeEventListener(listener));
132
+ return eventListeners.get(listener);
133
+ }
134
+ onError(callback) {
135
+ this.#errorHandler = callback;
136
+ return this;
137
+ }
138
+ listen(event, listeners) {
139
+ listeners.forEach((listener) => this.on(event, [listener, "handle"]));
140
+ }
141
+ on(event, listener) {
142
+ if (debug_default.enabled) debug_default("registering event listener, event: %O, listener: %O", event, listener);
143
+ const normalizedEvent = this.#resolveEvent(event);
144
+ const normalizedListener = this.#resolveEventListener(event, listener);
145
+ this.#transport.on(normalizedEvent, normalizedListener);
146
+ return () => this.off(event, listener);
147
+ }
148
+ listenIf(condition, event, listener) {
149
+ if (!condition || typeof condition === "function" && !condition()) return () => {};
150
+ return this.on(event, listener);
151
+ }
152
+ once(event, listener) {
153
+ if (debug_default.enabled) debug_default("registering one time event listener, event: %O, listener: %O", event, listener);
154
+ const normalizedEvent = this.#resolveEvent(event);
155
+ const normalizedListener = this.#normalizeEventListener(listener);
156
+ const off = this.#transport.on(normalizedEvent, async (data) => {
157
+ off();
158
+ debug_default("removing one time event listener, event: %O", event);
159
+ await normalizedListener(data);
160
+ });
161
+ }
162
+ onAny(listener) {
163
+ return this.#transport.onAny(listener);
164
+ }
165
+ async emit(event, data) {
166
+ if (this.#eventsToFake.has(event) || this.#eventsToFake.has("*")) {
167
+ debug_default("faking emit. event: %O, data: %O", event, data);
168
+ this.#eventsBuffer.add(event, data);
169
+ return;
170
+ }
171
+ try {
172
+ const normalizedEvent = this.#resolveEvent(event);
173
+ await eventDispatch.tracePromise(this.#transport.emit, eventDispatch.hasSubscribers ? {
174
+ event,
175
+ data
176
+ } : void 0, this.#transport, normalizedEvent, data);
177
+ } catch (error) {
178
+ if (this.#errorHandler) this.#errorHandler(event, error, data);
179
+ else throw error;
180
+ }
181
+ }
182
+ async emitSerial(event, data) {
183
+ if (this.#eventsToFake.has(event) || this.#eventsToFake.has("*")) {
184
+ debug_default("faking emit. event: %O, data: %O", event, data);
185
+ this.#eventsBuffer.add(event, data);
186
+ return;
187
+ }
188
+ try {
189
+ const normalizedEvent = this.#resolveEvent(event);
190
+ await eventDispatch.tracePromise(this.#transport.emitSerial, eventDispatch.hasSubscribers ? {
191
+ event,
192
+ data
193
+ } : void 0, this.#transport, normalizedEvent, data);
194
+ } catch (error) {
195
+ if (this.#errorHandler) this.#errorHandler(event, error, data);
196
+ else throw error;
197
+ }
198
+ }
199
+ off(event, listener) {
200
+ if (debug_default.enabled) debug_default("removing listener, event: %O, listener: %O", event, listener);
201
+ const normalizedEvent = this.#resolveEvent(event);
202
+ const listeners = this.#getEventListeners(event);
203
+ const normalizedListener = listeners.get(listener);
204
+ if (!normalizedListener) return;
205
+ listeners.delete(listener);
206
+ this.#transport.off(normalizedEvent, normalizedListener);
207
+ }
208
+ offAny(listener) {
209
+ this.#transport.offAny(listener);
210
+ return this;
211
+ }
212
+ clearListener(event, listener) {
213
+ return this.off(event, listener);
214
+ }
215
+ clearListeners(event) {
216
+ debug_default("clearing all listeners for event %O", event);
217
+ this.#transport.clearListeners(this.#resolveEvent(event));
218
+ this.#eventsListeners.delete(event);
219
+ }
220
+ clearAllListeners() {
221
+ debug_default("clearing all event listeners");
222
+ this.#transport.clearListeners();
223
+ this.#eventsListeners.clear();
224
+ }
225
+ listenerCount(event) {
226
+ return this.#transport.listenerCount(event ? this.#resolveEvent(event) : void 0);
227
+ }
228
+ hasListeners(event) {
229
+ return this.listenerCount(event) > 0;
230
+ }
231
+ fake(events) {
232
+ this.restore();
233
+ this.#eventsBuffer = new EventsBuffer();
234
+ if (!events) {
235
+ debug_default("faking all events");
236
+ this.#eventsToFake.add("*");
237
+ } else {
238
+ debug_default("faking events: %O", events);
239
+ events.forEach((event) => this.#eventsToFake.add(event));
240
+ }
241
+ return this.#eventsBuffer;
242
+ }
243
+ restore() {
244
+ debug_default("restoring existing fakes");
245
+ this.#eventsToFake.clear();
246
+ this.#eventsBuffer?.flush();
247
+ this.#eventsBuffer = void 0;
248
+ }
249
+ };
250
+ export { tracing_channels_exports as n, Emitter as t };
@@ -1,16 +1,7 @@
1
- import {
2
- Emitter
3
- } from "../chunk-R74HJGSQ.js";
4
-
5
- // factories/emitter.ts
1
+ import { t as Emitter } from "../emitter-Bpdlo50r.js";
6
2
  var EmitterFactory = class {
7
- /**
8
- * Create emitter instance
9
- */
10
- create(app) {
11
- return new Emitter(app);
12
- }
13
- };
14
- export {
15
- EmitterFactory
3
+ create(app) {
4
+ return new Emitter(app);
5
+ }
16
6
  };
7
+ export { EmitterFactory };
package/build/index.js CHANGED
@@ -1,48 +1,14 @@
1
- import {
2
- Emitter,
3
- tracing_channels_exports
4
- } from "./chunk-R74HJGSQ.js";
5
-
6
- // src/base_event.ts
1
+ import { n as tracing_channels_exports, t as Emitter } from "./emitter-Bpdlo50r.js";
7
2
  import { RuntimeException } from "@poppinss/utils/exception";
8
3
  var BaseEvent = class {
9
- /**
10
- * Base event constructor
11
- *
12
- * @param _ - Any constructor arguments (unused)
13
- */
14
- constructor(..._) {
15
- }
16
- /**
17
- * The emitter to use for dispatching events
18
- */
19
- static emitter;
20
- /**
21
- * Specify the emitter instance to use for dispatching events
22
- *
23
- * @param emitter - The emitter instance to use
24
- */
25
- static useEmitter(emitter) {
26
- this.emitter = emitter;
27
- }
28
- /**
29
- * Dispatch the current class as an event. The method takes the arguments
30
- * accepted by the class constructor.
31
- *
32
- * @param args - Constructor arguments for the event instance
33
- * @throws RuntimeException if no emitter is configured
34
- */
35
- static async dispatch(...args) {
36
- if (!this.emitter) {
37
- throw new RuntimeException(
38
- `Cannot dispatch "${this.name}" event. Make sure to pass emitter to the "BaseEvent" class for dispatch method to work`
39
- );
40
- }
41
- return this.emitter.emit(this, new this(...args));
42
- }
43
- };
44
- export {
45
- BaseEvent,
46
- Emitter,
47
- tracing_channels_exports as tracingChannels
4
+ constructor(..._) {}
5
+ static emitter;
6
+ static useEmitter(emitter) {
7
+ this.emitter = emitter;
8
+ }
9
+ static async dispatch(...args) {
10
+ if (!this.emitter) throw new RuntimeException(`Cannot dispatch "${this.name}" event. Make sure to pass emitter to the "BaseEvent" class for dispatch method to work`);
11
+ return this.emitter.emit(this, new this(...args));
12
+ }
48
13
  };
14
+ export { BaseEvent, Emitter, tracing_channels_exports as tracingChannels };
@@ -1,2 +1,2 @@
1
- declare const _default: import("util").DebugLogger;
1
+ declare const _default: import("node:util").DebugLogger;
2
2
  export default _default;
@@ -116,7 +116,6 @@ export declare class Emitter<EventsList extends Record<string | symbol | number,
116
116
  /**
117
117
  * Remove a specific listener for an event
118
118
  *
119
- * @alias "off"
120
119
  * @param event - The event to remove listener from
121
120
  * @param listener - The listener to remove
122
121
  */
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adonisjs/events",
3
3
  "description": "An implementation of the event emitter built on top of emittery",
4
- "version": "10.1.0-next.2",
4
+ "version": "10.1.0-next.3",
5
5
  "engines": {
6
6
  "node": ">=24.0.0"
7
7
  },
@@ -28,7 +28,7 @@
28
28
  "typecheck": "tsc --noEmit",
29
29
  "precompile": "npm run lint && npm run clean",
30
30
  "clean": "del-cli build",
31
- "compile": "tsup-node && tsc --emitDeclarationOnly --declaration",
31
+ "compile": "tsdown && tsc --emitDeclarationOnly --declaration",
32
32
  "build": "npm run compile",
33
33
  "version": "npm run build",
34
34
  "prepublishOnly": "npm run build",
@@ -36,31 +36,31 @@
36
36
  "quick:test": "node --import=@poppinss/ts-exec --enable-source-maps bin/test.ts"
37
37
  },
38
38
  "devDependencies": {
39
- "@adonisjs/application": "^9.0.0-next.4",
40
- "@adonisjs/config": "^6.0.0-next.1",
41
- "@adonisjs/eslint-config": "^3.0.0-next.1",
42
- "@adonisjs/fold": "^11.0.0-next.2",
39
+ "@adonisjs/application": "^9.0.0-next.12",
40
+ "@adonisjs/config": "^6.1.0-next.0",
41
+ "@adonisjs/eslint-config": "^3.0.0-next.5",
42
+ "@adonisjs/fold": "^11.0.0-next.3",
43
43
  "@adonisjs/prettier-config": "^1.4.5",
44
- "@adonisjs/tsconfig": "^2.0.0-next.0",
45
- "@japa/assert": "^4.1.1",
46
- "@japa/expect-type": "^2.0.3",
47
- "@japa/file-system": "^2.3.2",
48
- "@japa/runner": "^4.4.0",
44
+ "@adonisjs/tsconfig": "^2.0.0-next.3",
45
+ "@japa/assert": "^4.2.0",
46
+ "@japa/expect-type": "^2.0.4",
47
+ "@japa/file-system": "^3.0.0",
48
+ "@japa/runner": "^5.0.0",
49
49
  "@poppinss/ts-exec": "^1.4.1",
50
- "@release-it/conventional-changelog": "^10.0.1",
51
- "@types/node": "^24.3.0",
50
+ "@release-it/conventional-changelog": "^10.0.3",
51
+ "@types/node": "^25.0.2",
52
52
  "c8": "^10.1.3",
53
- "cross-env": "^10.0.0",
54
- "del-cli": "^6.0.0",
55
- "eslint": "^9.34.0",
56
- "prettier": "^3.6.2",
57
- "release-it": "^19.0.4",
58
- "tsup": "^8.5.0",
59
- "typescript": "^5.9.2"
53
+ "cross-env": "^10.1.0",
54
+ "del-cli": "^7.0.0",
55
+ "eslint": "^9.39.2",
56
+ "prettier": "^3.7.4",
57
+ "release-it": "^19.1.0",
58
+ "tsdown": "^0.17.4",
59
+ "typescript": "^5.9.3"
60
60
  },
61
61
  "dependencies": {
62
- "@poppinss/utils": "^7.0.0-next.3",
63
- "@sindresorhus/is": "^7.0.2",
62
+ "@poppinss/utils": "^7.0.0-next.4",
63
+ "@sindresorhus/is": "^7.1.1",
64
64
  "emittery": "^1.2.0"
65
65
  },
66
66
  "peerDependencies": {
@@ -85,7 +85,7 @@
85
85
  "access": "public",
86
86
  "provenance": true
87
87
  },
88
- "tsup": {
88
+ "tsdown": {
89
89
  "entry": [
90
90
  "./index.ts",
91
91
  "./src/types.ts",
@@ -94,8 +94,11 @@
94
94
  "outDir": "./build",
95
95
  "clean": true,
96
96
  "format": "esm",
97
+ "minify": "dce-only",
98
+ "fixedExtension": false,
97
99
  "dts": false,
98
- "sourcemap": false,
100
+ "treeshake": false,
101
+ "sourcemaps": false,
99
102
  "target": "esnext"
100
103
  },
101
104
  "release-it": {
@@ -1,547 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- // src/tracing_channels.ts
8
- var tracing_channels_exports = {};
9
- __export(tracing_channels_exports, {
10
- eventDispatch: () => eventDispatch
11
- });
12
- import diagnostics_channel from "diagnostics_channel";
13
- var eventDispatch = diagnostics_channel.tracingChannel("adonisjs.event.dispatch");
14
-
15
- // src/emitter.ts
16
- import is2 from "@sindresorhus/is";
17
- import Emittery from "emittery";
18
- import { moduleCaller, moduleImporter } from "@adonisjs/fold";
19
-
20
- // src/debug.ts
21
- import { debuglog } from "util";
22
- var debug_default = debuglog("adonisjs:events");
23
-
24
- // src/events_buffer.ts
25
- import is from "@sindresorhus/is";
26
- import string from "@poppinss/utils/string";
27
- import { AssertionError } from "assert";
28
- var EventsBuffer = class {
29
- /**
30
- * Buffered events
31
- */
32
- #events = [];
33
- /**
34
- * Track emitted event
35
- *
36
- * @param event - The event that was emitted
37
- * @param data - The data passed with the event
38
- */
39
- add(event, data) {
40
- this.#events.push({ event, data });
41
- }
42
- /**
43
- * Get all the emitted events
44
- *
45
- * @returns Array of all buffered events
46
- */
47
- all() {
48
- return this.#events;
49
- }
50
- /**
51
- * Returns the size of captured events
52
- *
53
- * @returns The number of captured events
54
- */
55
- size() {
56
- return this.#events.length;
57
- }
58
- /**
59
- * Find if an event was emitted
60
- *
61
- * @param event - The event to check for
62
- * @param finder - Optional callback to filter specific event instances
63
- * @returns True if the event was emitted
64
- */
65
- exists(event, finder) {
66
- return !!this.find(event, finder);
67
- }
68
- /**
69
- * Find a specific event
70
- *
71
- * @param event - The event to find
72
- * @param finder - Optional callback to filter specific event instances
73
- * @returns The found event or null
74
- */
75
- find(event, finder) {
76
- return this.#events.find((bufferedEvent) => {
77
- if (!finder) {
78
- return bufferedEvent.event === event;
79
- }
80
- return bufferedEvent.event === event && finder(bufferedEvent);
81
- }) || null;
82
- }
83
- /**
84
- * Assert a given event has been emitted
85
- *
86
- * @param event - The event to assert was emitted
87
- * @param finder - Optional callback to filter specific event instances
88
- * @throws AssertionError if the event was not emitted
89
- */
90
- assertEmitted(event, finder) {
91
- const hasEvent = this.exists(event, finder);
92
- if (!hasEvent) {
93
- const message = is.class(event) ? `Expected "[class ${event.name}]" event to be emitted` : `Expected "${String(event)}" event to be emitted`;
94
- throw new AssertionError({
95
- message,
96
- expected: true,
97
- actual: false,
98
- operator: "strictEqual",
99
- stackStartFn: this.assertEmitted
100
- });
101
- }
102
- }
103
- /**
104
- * Assert number of times an event has been emitted
105
- *
106
- * @param event - The event to check emission count for
107
- * @param count - The expected number of emissions
108
- * @throws AssertionError if the count doesn't match
109
- */
110
- assertEmittedCount(event, count) {
111
- const actual = this.all().filter((bufferedEvent) => bufferedEvent.event === event).length;
112
- if (actual !== count) {
113
- const eventName = is.class(event) ? `[class ${event.name}]` : String(event);
114
- throw new AssertionError({
115
- message: `Expected "${eventName}" event to be emitted "${count}" ${string.pluralize(
116
- "time",
117
- count
118
- )}, instead it was emitted "${actual}" ${string.pluralize("time", actual)}`,
119
- actual,
120
- expected: count
121
- });
122
- }
123
- }
124
- /**
125
- * Assert a given event has been not been emitted
126
- *
127
- * @param event - The event to assert was not emitted
128
- * @param finder - Optional callback to filter specific event instances
129
- * @throws AssertionError if the event was emitted
130
- */
131
- assertNotEmitted(event, finder) {
132
- const hasEvent = this.exists(event, finder);
133
- if (hasEvent) {
134
- const isClass = is.class(event);
135
- const message = isClass ? `Unexpected "[class ${event.name}]" event was emitted` : `Unexpected "${String(event)}" event was emitted`;
136
- throw new AssertionError({
137
- message,
138
- expected: false,
139
- actual: true,
140
- operator: "strictEqual",
141
- stackStartFn: this.assertNotEmitted
142
- });
143
- }
144
- }
145
- /**
146
- * Assert no events have been emitted
147
- *
148
- * @throws AssertionError if any events were emitted
149
- */
150
- assertNoneEmitted() {
151
- const eventsSize = this.size();
152
- if (eventsSize > 0) {
153
- throw new AssertionError(
154
- Object.assign(
155
- {
156
- message: `Expected zero events to be emitted. Instead received "${eventsSize}" ${string.pluralize(
157
- "event",
158
- eventsSize
159
- )}`,
160
- expected: 0,
161
- actual: eventsSize,
162
- operator: "strictEqual",
163
- stackStartFn: this.assertNoneEmitted
164
- },
165
- {
166
- showDiff: true
167
- }
168
- )
169
- );
170
- }
171
- }
172
- /**
173
- * Flush events collected within memory
174
- */
175
- flush() {
176
- this.#events = [];
177
- }
178
- };
179
-
180
- // src/emitter.ts
181
- var Emitter = class {
182
- /**
183
- * Event classes to symbols mapping. We need symbols as emittery
184
- * does not support class based event names
185
- */
186
- #eventsClassSymbols = /* @__PURE__ */ new Map();
187
- /**
188
- * A collection of events and their listeners. We do not track listeners
189
- * listening for events only once
190
- */
191
- #eventsListeners = /* @__PURE__ */ new Map();
192
- /**
193
- * Underlying transport to emit events
194
- */
195
- #transport = new Emittery();
196
- /**
197
- * Events buffer. The events are collected inside an in-memory
198
- * buffer during fakes
199
- */
200
- #eventsBuffer;
201
- /**
202
- * A set of events to fake
203
- */
204
- #eventsToFake = /* @__PURE__ */ new Set();
205
- /**
206
- * Error handler to catch all errors thrown by listeners
207
- */
208
- #errorHandler;
209
- /**
210
- * Reference to AdonisJS application, we need the application root
211
- * and container reference from it.
212
- */
213
- #app;
214
- /**
215
- * Returns a map of events and their registered listeners. The
216
- * map key is the event name and the value is another map
217
- * of listeners.
218
- *
219
- * The listeners map key is the original binding listener
220
- * and the value is a callback function.
221
- *
222
- * @returns The events listeners map
223
- */
224
- get eventsListeners() {
225
- return this.#eventsListeners;
226
- }
227
- /**
228
- * Creates a new Emitter instance
229
- *
230
- * @param app - The AdonisJS application instance
231
- */
232
- constructor(app) {
233
- this.#app = app;
234
- }
235
- /**
236
- * Check if the value is a constructor and narrow down its types
237
- *
238
- * @param value - The value to check
239
- * @returns True if the value is a constructor
240
- */
241
- #isConstructor(value) {
242
- return is2.class(value);
243
- }
244
- /**
245
- * Returns the symbol for a class based event.
246
- *
247
- * @param event - The event class constructor
248
- * @returns The symbol for the event class
249
- */
250
- #getEventClassSymbol(event) {
251
- if (!this.#eventsClassSymbols.has(event)) {
252
- this.#eventsClassSymbols.set(event, Symbol(event.name));
253
- }
254
- return this.#eventsClassSymbols.get(event);
255
- }
256
- /**
257
- * Normalizes the event to emittery supported data types. The class
258
- * constructors are cached against a unique symbol.
259
- *
260
- * @param event - The event to resolve
261
- * @returns The resolved event as string, symbol, or number
262
- */
263
- #resolveEvent(event) {
264
- if (this.#isConstructor(event)) {
265
- return this.#getEventClassSymbol(event);
266
- }
267
- return event;
268
- }
269
- /**
270
- * Returns the event listeners map
271
- *
272
- * @param event - The event to get listeners for
273
- * @returns The listeners map for the event
274
- */
275
- #getEventListeners(event) {
276
- if (!this.#eventsListeners.has(event)) {
277
- this.#eventsListeners.set(event, /* @__PURE__ */ new Map());
278
- }
279
- return this.#eventsListeners.get(event);
280
- }
281
- /**
282
- * Normalizes the event listener to a function that can be passed to
283
- * emittery.
284
- *
285
- * @param listener - The listener to normalize
286
- * @returns The normalized listener method
287
- */
288
- #normalizeEventListener(listener) {
289
- if (typeof listener === "string") {
290
- const parts = listener.split(".");
291
- const method = parts.length === 1 ? "handle" : parts.pop();
292
- const moduleRefId = parts.join(".");
293
- return moduleImporter(() => this.#app.import(moduleRefId), method).toCallable(
294
- this.#app.container
295
- );
296
- }
297
- if (Array.isArray(listener)) {
298
- const listenerModule = listener[0];
299
- const method = listener[1] || "handle";
300
- if (this.#isConstructor(listenerModule)) {
301
- return moduleCaller(listenerModule, method).toCallable(this.#app.container);
302
- }
303
- return moduleImporter(listenerModule, method).toCallable(this.#app.container);
304
- }
305
- return listener;
306
- }
307
- /**
308
- * Resolves the event listener either from the cache or normalizes
309
- * it and stores it inside the cache
310
- *
311
- * @param event - The event to resolve listener for
312
- * @param listener - The listener to resolve
313
- * @returns The resolved listener method
314
- */
315
- #resolveEventListener(event, listener) {
316
- const eventListeners = this.#getEventListeners(event);
317
- if (!eventListeners.has(listener)) {
318
- eventListeners.set(listener, this.#normalizeEventListener(listener));
319
- }
320
- return eventListeners.get(listener);
321
- }
322
- /**
323
- * Register a global error handler
324
- *
325
- * @param callback - The error handler callback
326
- * @returns The emitter instance for method chaining
327
- */
328
- onError(callback) {
329
- this.#errorHandler = callback;
330
- return this;
331
- }
332
- /**
333
- * Bind multiple listeners to listen for a single event. The listen
334
- * method is a convenience helper to be used with class based
335
- * events and listeners.
336
- *
337
- * @param event - The event class to listen for
338
- * @param listeners - Array of listener classes with handle methods
339
- */
340
- listen(event, listeners) {
341
- listeners.forEach((listener) => this.on(event, [listener, "handle"]));
342
- }
343
- on(event, listener) {
344
- if (debug_default.enabled) {
345
- debug_default("registering event listener, event: %O, listener: %O", event, listener);
346
- }
347
- const normalizedEvent = this.#resolveEvent(event);
348
- const normalizedListener = this.#resolveEventListener(event, listener);
349
- this.#transport.on(normalizedEvent, normalizedListener);
350
- return () => this.off(event, listener);
351
- }
352
- listenIf(condition, event, listener) {
353
- if (!condition || typeof condition === "function" && !condition()) {
354
- return () => {
355
- };
356
- }
357
- return this.on(event, listener);
358
- }
359
- once(event, listener) {
360
- if (debug_default.enabled) {
361
- debug_default("registering one time event listener, event: %O, listener: %O", event, listener);
362
- }
363
- const normalizedEvent = this.#resolveEvent(event);
364
- const normalizedListener = this.#normalizeEventListener(listener);
365
- const off = this.#transport.on(normalizedEvent, async (data) => {
366
- off();
367
- debug_default("removing one time event listener, event: %O", event);
368
- await normalizedListener(data);
369
- });
370
- }
371
- /**
372
- * Attach a listener to listen for all the events. Wildcard listeners
373
- * can only be defined as inline callbacks.
374
- *
375
- * @param listener - The wildcard listener callback
376
- * @returns The unsubscribe function
377
- */
378
- onAny(listener) {
379
- return this.#transport.onAny(listener);
380
- }
381
- async emit(event, data) {
382
- if (this.#eventsToFake.has(event) || this.#eventsToFake.has("*")) {
383
- debug_default("faking emit. event: %O, data: %O", event, data);
384
- this.#eventsBuffer.add(event, data);
385
- return;
386
- }
387
- try {
388
- const normalizedEvent = this.#resolveEvent(event);
389
- await eventDispatch.tracePromise(
390
- this.#transport.emit,
391
- eventDispatch.hasSubscribers ? {
392
- event,
393
- data
394
- } : void 0,
395
- this.#transport,
396
- normalizedEvent,
397
- data
398
- );
399
- } catch (error) {
400
- if (this.#errorHandler) {
401
- this.#errorHandler(event, error, data);
402
- } else {
403
- throw error;
404
- }
405
- }
406
- }
407
- async emitSerial(event, data) {
408
- if (this.#eventsToFake.has(event) || this.#eventsToFake.has("*")) {
409
- debug_default("faking emit. event: %O, data: %O", event, data);
410
- this.#eventsBuffer.add(event, data);
411
- return;
412
- }
413
- try {
414
- const normalizedEvent = this.#resolveEvent(event);
415
- await eventDispatch.tracePromise(
416
- this.#transport.emitSerial,
417
- eventDispatch.hasSubscribers ? {
418
- event,
419
- data
420
- } : void 0,
421
- this.#transport,
422
- normalizedEvent,
423
- data
424
- );
425
- } catch (error) {
426
- if (this.#errorHandler) {
427
- this.#errorHandler(event, error, data);
428
- } else {
429
- throw error;
430
- }
431
- }
432
- }
433
- /**
434
- * Remove a specific listener for an event
435
- *
436
- * @param event - The event to remove listener from
437
- * @param listener - The listener to remove
438
- */
439
- off(event, listener) {
440
- if (debug_default.enabled) {
441
- debug_default("removing listener, event: %O, listener: %O", event, listener);
442
- }
443
- const normalizedEvent = this.#resolveEvent(event);
444
- const listeners = this.#getEventListeners(event);
445
- const normalizedListener = listeners.get(listener);
446
- if (!normalizedListener) {
447
- return;
448
- }
449
- listeners.delete(listener);
450
- this.#transport.off(normalizedEvent, normalizedListener);
451
- }
452
- /**
453
- * Remove a specific listener listening for all the events
454
- *
455
- * @param listener - The wildcard listener to remove
456
- * @returns The emitter instance for method chaining
457
- */
458
- offAny(listener) {
459
- this.#transport.offAny(listener);
460
- return this;
461
- }
462
- /**
463
- * Remove a specific listener for an event
464
- *
465
- * @alias "off"
466
- * @param event - The event to remove listener from
467
- * @param listener - The listener to remove
468
- */
469
- clearListener(event, listener) {
470
- return this.off(event, listener);
471
- }
472
- /**
473
- * Clear all listeners for a specific event
474
- *
475
- * @param event - The event to clear listeners for
476
- */
477
- clearListeners(event) {
478
- debug_default("clearing all listeners for event %O", event);
479
- this.#transport.clearListeners(this.#resolveEvent(event));
480
- this.#eventsListeners.delete(event);
481
- }
482
- /**
483
- * Clear all listeners for all the events
484
- */
485
- clearAllListeners() {
486
- debug_default("clearing all event listeners");
487
- this.#transport.clearListeners();
488
- this.#eventsListeners.clear();
489
- }
490
- /**
491
- * Get count of listeners for a given event or all the events
492
- *
493
- * @param event - The event to count listeners for (optional)
494
- * @returns The number of listeners
495
- */
496
- listenerCount(event) {
497
- return this.#transport.listenerCount(event ? this.#resolveEvent(event) : void 0);
498
- }
499
- /**
500
- * Find if an event has one or more listeners
501
- *
502
- * @param event - The event to check listeners for (optional)
503
- * @returns True if the event has listeners
504
- */
505
- hasListeners(event) {
506
- return this.listenerCount(event) > 0;
507
- }
508
- /**
509
- * Fake one or more events. The listeners for faked events will
510
- * not be invoked.
511
- *
512
- * The return value is an events buffer that collects all the
513
- * events within memory.
514
- *
515
- * Calling this method one than once drops the existing fakes and
516
- * creates new one.
517
- *
518
- * @param events - Array of events to fake (optional, defaults to all events)
519
- * @returns The events buffer for assertions
520
- */
521
- fake(events) {
522
- this.restore();
523
- this.#eventsBuffer = new EventsBuffer();
524
- if (!events) {
525
- debug_default("faking all events");
526
- this.#eventsToFake.add("*");
527
- } else {
528
- debug_default("faking events: %O", events);
529
- events.forEach((event) => this.#eventsToFake.add(event));
530
- }
531
- return this.#eventsBuffer;
532
- }
533
- /**
534
- * Restore fakes
535
- */
536
- restore() {
537
- debug_default("restoring existing fakes");
538
- this.#eventsToFake.clear();
539
- this.#eventsBuffer?.flush();
540
- this.#eventsBuffer = void 0;
541
- }
542
- };
543
-
544
- export {
545
- tracing_channels_exports,
546
- Emitter
547
- };