@adrianbutt/evutils 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.
@@ -0,0 +1,225 @@
1
+ export class BasicEventManager {
2
+ _safeMode;
3
+ _listeners;
4
+ _argProcessors;
5
+ _logger;
6
+ constructor() {
7
+ this._safeMode = true;
8
+ this._listeners = {};
9
+ this._argProcessors = {};
10
+ }
11
+ trigger(eventName) {
12
+ if (!eventName) {
13
+ return false;
14
+ }
15
+ if (!this._listeners[eventName]) {
16
+ return false;
17
+ }
18
+ let args;
19
+ // parse the args.
20
+ if (arguments.length < 2) {
21
+ // called like this 'trigger(eventName)'
22
+ args = [];
23
+ }
24
+ else {
25
+ args = arguments[1];
26
+ }
27
+ if (this._argProcessors[eventName]) {
28
+ let processedArgs;
29
+ try {
30
+ processedArgs = this._argProcessors[eventName].processor.apply(this._argProcessors[eventName].context, [eventName, args]);
31
+ }
32
+ catch (e) {
33
+ if (!this._safeMode) {
34
+ throw e;
35
+ }
36
+ else if (this._logger) {
37
+ this._logger.error(`Arg processor error for '${eventName}'`, e);
38
+ }
39
+ return false;
40
+ }
41
+ if (!processedArgs) {
42
+ // cancel
43
+ return false;
44
+ }
45
+ if (processedArgs === true) {
46
+ // use existing args
47
+ }
48
+ else if (!Array.isArray(processedArgs)) {
49
+ if (!this._safeMode) {
50
+ throw `Invalid result '${processedArgs}' from arg processor for '${eventName}'`;
51
+ }
52
+ else if (this._logger) {
53
+ this._logger.error(`Invalid result from arg processor for '${eventName}'`, processedArgs);
54
+ }
55
+ return false;
56
+ }
57
+ else {
58
+ args = processedArgs;
59
+ }
60
+ }
61
+ // get a copy of the array in case someone unregisters
62
+ let handlerArr = this._listeners[eventName].slice(0);
63
+ for (let i = 0; i < handlerArr.length; i++) {
64
+ let curHandlerMap = handlerArr[i];
65
+ // find out if we still have the listener registered
66
+ let stillRegistered = false;
67
+ let numListeners = this._listeners[eventName]
68
+ ? this._listeners[eventName].length
69
+ : 0;
70
+ for (let j = 0; j < numListeners; j++) {
71
+ if (curHandlerMap == this._listeners[eventName][j]) {
72
+ stillRegistered = true;
73
+ break;
74
+ }
75
+ }
76
+ // if we can call the method, do so.
77
+ if (stillRegistered) {
78
+ try {
79
+ curHandlerMap.handler.apply(curHandlerMap.context, args);
80
+ }
81
+ catch (err) {
82
+ if (!this._safeMode) {
83
+ throw err;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ return true;
89
+ }
90
+ on(eventName, handler, context) {
91
+ if (!eventName) {
92
+ return false;
93
+ }
94
+ if (!handler) {
95
+ return false;
96
+ }
97
+ if (!this._listeners[eventName]) {
98
+ this._listeners[eventName] = [];
99
+ }
100
+ this._listeners[eventName].push({
101
+ handler,
102
+ context
103
+ });
104
+ return true;
105
+ }
106
+ off(eventName, handler, context) {
107
+ if (!eventName) {
108
+ return false;
109
+ }
110
+ if (!handler) {
111
+ return false;
112
+ }
113
+ const relListeners = this._listeners[eventName];
114
+ if (!relListeners) {
115
+ return false;
116
+ }
117
+ let fndIndex = -1;
118
+ for (let i = 0; i < relListeners.length; i++) {
119
+ if (relListeners[i].handler === handler &&
120
+ relListeners[i].context === context) {
121
+ fndIndex = i;
122
+ break;
123
+ }
124
+ }
125
+ if (fndIndex === -1) {
126
+ return false;
127
+ }
128
+ relListeners.splice(fndIndex, 1);
129
+ if (!relListeners.length) {
130
+ delete this._listeners[eventName];
131
+ }
132
+ return true;
133
+ }
134
+ register(toState, eventName, handler, context) {
135
+ if (arguments.length > 3) {
136
+ return this[toState ? "on" : "off"](eventName, handler, context);
137
+ }
138
+ else {
139
+ return this[toState ? "on" : "off"](eventName, handler);
140
+ }
141
+ }
142
+ hasCustomArgumentProcessor(eventName) {
143
+ return !!this._argProcessors[eventName];
144
+ }
145
+ setCustomArgumentProcessor(eventName, processor, context) {
146
+ if (!eventName) {
147
+ return false;
148
+ }
149
+ if (!processor) {
150
+ if (this.hasCustomArgumentProcessor(eventName)) {
151
+ delete this._argProcessors[eventName];
152
+ return true;
153
+ }
154
+ return false;
155
+ }
156
+ this._argProcessors[eventName] = {
157
+ processor: processor,
158
+ context: context
159
+ };
160
+ return true;
161
+ }
162
+ get ignoreErrors() {
163
+ return this._safeMode;
164
+ }
165
+ set ignoreErrors(v) {
166
+ this._safeMode = !!v;
167
+ }
168
+ get logger() {
169
+ return this._logger ?? null;
170
+ }
171
+ set logger(v) {
172
+ if (v) {
173
+ this._logger = v;
174
+ }
175
+ else {
176
+ delete this._logger;
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Utility class that allows for simple setup of event registration,
182
+ * whilst keeping triggering hidden.
183
+ */
184
+ export class BasicEventPublisher {
185
+ _evManager;
186
+ constructor(evManager) {
187
+ this._evManager = evManager ?? new BasicEventManager();
188
+ this.on = this._evManager.on.bind(this._evManager);
189
+ this.off = this._evManager.off.bind(this._evManager);
190
+ this.register = this._evManager.register.bind(this._evManager);
191
+ this._trigger = this._evManager.trigger.bind(this._evManager);
192
+ }
193
+ on;
194
+ off;
195
+ register;
196
+ _trigger;
197
+ }
198
+ export function mixinEventPublisherUsingManager(ontoObject, usingManager) {
199
+ // // example usage:
200
+ // type MyEventMap = {
201
+ // myevent: (eventCode: number, label: string) => void;
202
+ // };
203
+ // interface MyEventPublisher extends IBasicEventPublisher<MyEventMap> {}
204
+ // class MyEventPublisher {
205
+ // private _evManager: BasicEventManager<MyEventMap>;
206
+ // constructor() {
207
+ // this._evManager = new BasicEventManager<MyEventMap>();
208
+ // mixinEventPublisherUsingManager<MyEventMap>(this, this._evManager);
209
+ // }
210
+ // sendMyEvent(eventCode: number, label: string) {
211
+ // this._evManager.trigger("myevent", [eventCode, label]);
212
+ // }
213
+ // }
214
+ let mixinProps = {
215
+ on: usingManager.on.bind(usingManager),
216
+ off: usingManager.off.bind(usingManager),
217
+ register: usingManager.register.bind(usingManager)
218
+ };
219
+ for (let key in mixinProps) {
220
+ ontoObject[key] =
221
+ mixinProps[key];
222
+ }
223
+ }
224
+ export default BasicEventManager;
225
+ //# sourceMappingURL=BasicEventManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasicEventManager.js","sourceRoot":"","sources":["../../../src/BasicEventManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { BasicEventManager } from "./BasicEventManager.js";
@@ -0,0 +1,2 @@
1
+ export { BasicEventManager } from "./BasicEventManager.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,265 @@
1
+ import type { IBasicEventPublisher, DefaultEventMap, EventHandlerContext, EventMapDef } from "../../src/BasicEventManager.js";
2
+ /**
3
+ * Event param conditions
4
+ * <br> If a string, will be parsed and converted into an EvParamCondition
5
+ * @example
6
+ * ```ts
7
+ * // would check if the param at index 1 does exist (ie arguments >= 2 in length)
8
+ * '1'
9
+ * // would check if the param at index 1 does not exist (ie arguments < 2 in length)
10
+ * '1!'
11
+ * // would check if the param at index 1 IS 'Monday'
12
+ * '1="Monday"'
13
+ * '1="Monday" i' // (case insensitive)
14
+ * // would check if the param at index 1 is NOT 'Monday'
15
+ * '1!="Monday"'
16
+ * '1!="Monday" i' // (case insensitive)
17
+ * // would check if the param at index 1 starts with 'Mon'
18
+ * '1^="Mon"'
19
+ * '1^="Mon" i' // (case insensitive)
20
+ * // would check if the param at index 1 ends with 'day'
21
+ * '1$="day"'
22
+ * '1$="day" i' // (case insensitive)
23
+ * // would check if the param at index 1 contains the string 'day'
24
+ * '1*="day"'
25
+ * '1*="day" i' // (case insensitive)
26
+ * // would check if the param at index 1 was equal to 'Monday' or 'Tuesday'
27
+ * '1~="Monday Tuesday"'
28
+ * '1~="Monday Tuesday" i' // (case insensitive)
29
+ * ```
30
+ */
31
+ export type EvParamConditionLike = EvParamCondition | string;
32
+ /**
33
+ * Event parameter forwarding instructions
34
+ * <br> If a string, will be parsed and converted into an EvParamCondition
35
+ * @example
36
+ * ```ts
37
+ * // No parameters should be forwarded
38
+ * '!'
39
+ *
40
+ * '1' // -> { from: 1, to: 1 }
41
+ * '2+' // -> { from: 2, to: Number.POSITIVE_INFINITY }
42
+ * '2-' // -> { from: 2, to: Number.NEGATIVE_INFINITY }
43
+ * '6-7' // -> { from: 6, to: 7 }
44
+ * ```
45
+ */
46
+ export type EvParamForwardInstructionLike = EvParamForwardInstruction | string;
47
+ /**
48
+ * Essentially an {@link EvForwarderMap} with the option to specify strings as param properties
49
+ */
50
+ export type EvForwarderConstructorEventMap = {
51
+ eventName: string;
52
+ forwardedEventName?: string;
53
+ paramConditions: EvParamConditionLike[];
54
+ paramForwardInstructions: EvParamForwardInstructionLike[];
55
+ };
56
+ /**
57
+ * Options to create an EvForwarder
58
+ * @property eventReceiver - the original or 'root' event broadcaster
59
+ * @property eventMaps - event forwarding instructions
60
+ * @property autoEnable - whether the forwarder should automatically connect to the eventReceiver
61
+ */
62
+ export type EvForwarderConstructorOptions = {
63
+ eventReceiver: IBasicEventPublisher;
64
+ eventMaps: EvForwarderConstructorEventMap[];
65
+ autoEnable?: boolean;
66
+ };
67
+ /**
68
+ * Event forwarding instructions
69
+ * @property eventName - original event name
70
+ * @property forwardedEventName - the forwarded event name
71
+ * (if not provided, the original event name will be used)
72
+ * @property paramConditions - parameter conditions that the original event must clear
73
+ * @property paramForwardInstructions - how the original event's parameters should be forwarded.
74
+ * (All will be forwarded if not present)
75
+ */
76
+ export type EvForwarderMap = {
77
+ eventName: string;
78
+ forwardedEventName?: string;
79
+ paramConditions: EvParamCondition[];
80
+ paramForwardInstructions: EvParamForwardInstruction[];
81
+ };
82
+ /**
83
+ * Used to verify event params
84
+ * @property index - relevant zero-based parameter index
85
+ * @property operator - condition operator to run
86
+ * @property comparison - strings to compare with
87
+ * @property caseSensitive - whether the comparison should be case sensitive
88
+ *
89
+ */
90
+ export type EvParamCondition = {
91
+ index: number;
92
+ operator: EvParamOperator;
93
+ comparison: string[];
94
+ caseSensitive: boolean;
95
+ };
96
+ /**
97
+ * Used to define what params should be forwarded in an event.
98
+ * <br><br>If both "from" and "to" are NaN -> no parameters should be forwarded
99
+ * <br><br>If both "from" or "to" are less than 0 -> the index is assumed to be an offset from params length
100
+ * @property from - start index
101
+ * @property to - end index
102
+ */
103
+ export type EvParamForwardInstruction = {
104
+ from: number;
105
+ to: number;
106
+ };
107
+ /**
108
+ * Operator for param verification.
109
+ * @sortStrategy source-order
110
+ */
111
+ export declare enum EvParamOperator {
112
+ /**
113
+ * Whether the parameter does not exist.
114
+ * <br> NOTE: No suffix is expected after using EXISTS.
115
+ * @example
116
+ * ```ts
117
+ * // would check if the param at index 1 does exist (ie arguments >= 2 in length)
118
+ * '1_'
119
+ * // is functionally equivalent to having NO operator
120
+ * '1'
121
+ * ```
122
+ */
123
+ EXISTS = "_",
124
+ /**
125
+ * Whether the parameter does not exist.
126
+ * <br> NOTE: No suffix is expected after using NOT_EXISTS.
127
+ * @example
128
+ * ```ts
129
+ * // would check if the param at index 1 does not exist (ie arguments < 2 in length)
130
+ * '1!'
131
+ * ```
132
+ */
133
+ NOT_EXISTS = "!",
134
+ /**
135
+ * Whether the value is equal to a string
136
+ * @example
137
+ * ```ts
138
+ * // would check if the param at index 1 IS 'monday'
139
+ * '1="monday"'
140
+ * ```
141
+ */
142
+ EQUAL = "=",
143
+ /**
144
+ * Whether the value is not equal to a string
145
+ * @example
146
+ * ```ts
147
+ * // would check if the param at index 1 is NOT 'monday'
148
+ * '1!="monday"'
149
+ * ```
150
+ */
151
+ NOT_EQUAL = "!=",
152
+ /**
153
+ * Whether the value ends with a string
154
+ * @example
155
+ * ```ts
156
+ * // would check if the param at index 1 starts with 'mon'
157
+ * '1^="mon"'
158
+ * ```
159
+ */
160
+ STARTS_WITH = "^=",
161
+ /**
162
+ * Whether the value ends with a string
163
+ * @example
164
+ * ```ts
165
+ * // would check if the param at index 1 ends with 'day'
166
+ * '1$="day"'
167
+ * ```
168
+ */
169
+ ENDS_WITH = "$=",
170
+ /**
171
+ * Whether the value contains a string
172
+ * @example
173
+ * ```ts
174
+ * // would check if the param at index 1 contains the string 'day'
175
+ * '1*="day"'
176
+ * ```
177
+ */
178
+ CONTAINS = "*=",
179
+ /**
180
+ * Exact match for space separated words
181
+ * @example
182
+ * ```ts
183
+ * // would check if the param at index 1 was equal to 'monday' or 'tuesday'
184
+ * '1~="monday tuesday"'
185
+ * ```
186
+ */
187
+ MATCHES_WORD = "~="
188
+ }
189
+ /**
190
+ * Event forwarder
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * const rootEvMgr = new BasicEventManager();
195
+ * const evFwder = new EvForwarder({
196
+ * eventReceiver: rootEvMgr,
197
+ * eventMaps: [{
198
+ * eventName: "FoodEvent",
199
+ * paramConditions: [],
200
+ * paramForwardInstructions: []
201
+ * }, {
202
+ * eventName: "FoodEvent",
203
+ * forwardedEventName: "AteFood",
204
+ * paramConditions: ['0="Ate"'],
205
+ * paramForwardInstructions: ["2"]
206
+ * }, {
207
+ * eventName: "FoodEvent",
208
+ * forwardedEventName: "AteSnack",
209
+ * paramConditions: ['0="Ate"', '1="Snack"'],
210
+ * paramForwardInstructions: ["2"]
211
+ * }],
212
+ * autoEnable: true
213
+ * });
214
+ *
215
+ * const handleFoodEvent = function () {};
216
+ * const handleAteFood = function () {};
217
+ * const handleAteSnack = function () {};
218
+ * evFwder.on("FoodEvent", handleFoodEvent);
219
+ * evFwder.on("AteFood", handleAteFood);
220
+ * evFwder.on("AteSnack", handleAteSnack);
221
+ *
222
+ * rootEvMgr.trigger("FoodEvent", []);
223
+ * rootEvMgr.trigger("FoodEvent", ["Ate", "Snack", "Chocolate"]);
224
+ * rootEvMgr.trigger("FoodEvent", ["Ate", "Snack", "Biscuit"]);
225
+ * rootEvMgr.trigger("FoodEvent", ["Ate", "Meal", "Sandwich"]);
226
+ * rootEvMgr.trigger("FoodEvent", ["Drank", "Soft", "Lemonade"]);
227
+ * rootEvMgr.trigger("FoodEvent", ["Drank", "Hard", "Vodka"]);
228
+ *
229
+ * // handleFoodEvent invocations:
230
+ * // handleFoodEvent();
231
+ * // handleFoodEvent("Ate", "Snack", "Chocolate");
232
+ * // handleFoodEvent("Ate", "Snack", "Biscuit");
233
+ * // handleFoodEvent("Ate", "Meal", "Sandwich");
234
+ * // handleFoodEvent("Drank", "Soft", "Lemonade");
235
+ * // handleFoodEvent("Drank", "Hard", "Vodka");
236
+ *
237
+ * // handleAteFood invocations:
238
+ * // handleAteFood("Chocolate");
239
+ * // handleAteFood("Biscuit");
240
+ * // handleAteFood("Sandwich");
241
+ *
242
+ * // handleAteSnack invocations:
243
+ * // handleAteSnack("Chocolate");
244
+ * // handleAteSnack("Biscuit");
245
+ * ```
246
+ */
247
+ export declare class EvForwarder<TEventMap extends EventMapDef<TEventMap> = DefaultEventMap> implements IBasicEventPublisher<TEventMap> {
248
+ private _evReceiver;
249
+ private _evMgr;
250
+ private _evMaps;
251
+ private _active?;
252
+ constructor(options: EvForwarderConstructorOptions);
253
+ /**
254
+ * Whether the forwarder should forward events or not.
255
+ */
256
+ get active(): boolean;
257
+ /**
258
+ * Whether the forwarder should forward events or not.
259
+ */
260
+ set active(to: boolean);
261
+ on<T extends keyof TEventMap & string>(eventName: T, handler: TEventMap[T], context?: EventHandlerContext): boolean;
262
+ off<T extends keyof TEventMap & string>(eventName: T, handler: TEventMap[T], context?: EventHandlerContext): boolean;
263
+ register<T extends keyof TEventMap & string>(toState: boolean, eventName: T, handler: TEventMap[T], context?: EventHandlerContext): boolean;
264
+ private _refreshListeners;
265
+ }