Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/lib/AwaitedEventTarget.ts
1028 views
1
import { IJsPath } from 'awaited-dom/base/AwaitedPath';
2
import IAwaitedEventTarget from '../interfaces/IAwaitedEventTarget';
3
import IJsPathEventTarget from '../interfaces/IJsPathEventTarget';
4
5
export default class AwaitedEventTarget<T> implements IAwaitedEventTarget<T> {
6
constructor(
7
readonly getEventTarget: () => { target: Promise<IJsPathEventTarget>; jsPath?: IJsPath },
8
) {}
9
10
public async addEventListener<K extends keyof T>(
11
eventType: K,
12
listenerFn: (this: this, event: T[K]) => any,
13
options?,
14
): Promise<void> {
15
const { target, jsPath } = await this.getEventTarget();
16
return (await target).addEventListener(jsPath, eventType as string, listenerFn, options);
17
}
18
19
public async removeEventListener<K extends keyof T>(
20
eventType: K,
21
listenerFn: (this: this, event: T[K]) => any,
22
): Promise<void> {
23
const { target, jsPath } = await this.getEventTarget();
24
return (await target).removeEventListener(jsPath, eventType as string, listenerFn);
25
}
26
27
// aliases
28
29
public on<K extends keyof T>(
30
eventType: K,
31
listenerFn: (this: this, event: T[K]) => any,
32
options?,
33
): Promise<void> {
34
return this.addEventListener(eventType, listenerFn, options);
35
}
36
37
public off<K extends keyof T>(
38
eventType: K,
39
listenerFn: (this: this, event: T[K]) => any,
40
): Promise<void> {
41
return this.removeEventListener(eventType, listenerFn);
42
}
43
44
public once<K extends keyof T>(
45
eventType: K,
46
listenerFn: (this: this, event: T[K]) => any,
47
options?,
48
): Promise<void> {
49
const wrappedListener = (event: T[K]): Promise<void> => {
50
listenerFn.call(this, event);
51
return this.removeEventListener(eventType, listenerFn);
52
};
53
return this.addEventListener(eventType, wrappedListener, options);
54
}
55
}
56
57