@tindalabs/shield 0.1.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/LICENSE +9 -0
- package/README.md +357 -0
- package/dist/assess.d.ts +16 -0
- package/dist/assess.js +220 -0
- package/dist/config/default-extensions-config.json +103 -0
- package/dist/core/ContentProtector.d.ts +63 -0
- package/dist/core/ContentProtector.js +281 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +2 -0
- package/dist/core/mediator/ContentProtectionMediator.d.ts +86 -0
- package/dist/core/mediator/ContentProtectionMediator.js +238 -0
- package/dist/core/mediator/eventDataTypes.d.ts +112 -0
- package/dist/core/mediator/eventDataTypes.js +23 -0
- package/dist/core/mediator/handlers/abstractEventHandler.d.ts +41 -0
- package/dist/core/mediator/handlers/abstractEventHandler.js +59 -0
- package/dist/core/mediator/handlers/devToolsEventHandler.d.ts +9 -0
- package/dist/core/mediator/handlers/devToolsEventHandler.js +95 -0
- package/dist/core/mediator/handlers/eventHandlerRegistry.d.ts +9 -0
- package/dist/core/mediator/handlers/eventHandlerRegistry.js +34 -0
- package/dist/core/mediator/handlers/extensionEventHandlers.d.ts +40 -0
- package/dist/core/mediator/handlers/extensionEventHandlers.js +140 -0
- package/dist/core/mediator/handlers/iFrameEventHandlers.d.ts +27 -0
- package/dist/core/mediator/handlers/iFrameEventHandlers.js +93 -0
- package/dist/core/mediator/handlers/screenShotEventHandlers.d.ts +34 -0
- package/dist/core/mediator/handlers/screenShotEventHandlers.js +111 -0
- package/dist/core/mediator/protection-event.d.ts +77 -0
- package/dist/core/mediator/protection-event.js +32 -0
- package/dist/core/mediator/types.d.ts +105 -0
- package/dist/core/mediator/types.js +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +7 -0
- package/dist/otel.d.ts +24 -0
- package/dist/otel.js +83 -0
- package/dist/policy.d.ts +98 -0
- package/dist/policy.js +97 -0
- package/dist/strategies/AbstractStrategy.d.ts +124 -0
- package/dist/strategies/AbstractStrategy.js +256 -0
- package/dist/strategies/ClipboardStrategy.d.ts +67 -0
- package/dist/strategies/ClipboardStrategy.js +291 -0
- package/dist/strategies/ContextMenuStrategy.d.ts +60 -0
- package/dist/strategies/ContextMenuStrategy.js +454 -0
- package/dist/strategies/DevToolsStrategy.d.ts +55 -0
- package/dist/strategies/DevToolsStrategy.js +314 -0
- package/dist/strategies/ExtensionStrategy.d.ts +66 -0
- package/dist/strategies/ExtensionStrategy.js +486 -0
- package/dist/strategies/IFrameStrategy.d.ts +49 -0
- package/dist/strategies/IFrameStrategy.js +255 -0
- package/dist/strategies/KeyboardStrategy.d.ts +35 -0
- package/dist/strategies/KeyboardStrategy.js +130 -0
- package/dist/strategies/PrintStrategy.d.ts +47 -0
- package/dist/strategies/PrintStrategy.js +201 -0
- package/dist/strategies/ScreenshotStrategy.d.ts +90 -0
- package/dist/strategies/ScreenshotStrategy.js +502 -0
- package/dist/strategies/SelectionStrategy.d.ts +49 -0
- package/dist/strategies/SelectionStrategy.js +216 -0
- package/dist/strategies/WatermarkStrategy.d.ts +56 -0
- package/dist/strategies/WatermarkStrategy.js +287 -0
- package/dist/strategies/index.d.ts +10 -0
- package/dist/strategies/index.js +11 -0
- package/dist/types/assessment.d.ts +62 -0
- package/dist/types/assessment.js +1 -0
- package/dist/types/index.d.ts +278 -0
- package/dist/types/index.js +17 -0
- package/dist/utils/DOMObserver.d.ts +68 -0
- package/dist/utils/DOMObserver.js +134 -0
- package/dist/utils/base/LoggableComponent.d.ts +44 -0
- package/dist/utils/base/LoggableComponent.js +56 -0
- package/dist/utils/detectors/AbstractDevToolsDetector.d.ts +98 -0
- package/dist/utils/detectors/AbstractDevToolsDetector.js +127 -0
- package/dist/utils/detectors/dateToStringDetector.d.ts +43 -0
- package/dist/utils/detectors/dateToStringDetector.js +96 -0
- package/dist/utils/detectors/debugLibDetector.d.ts +64 -0
- package/dist/utils/detectors/debugLibDetector.js +195 -0
- package/dist/utils/detectors/debuggerDetector.d.ts +51 -0
- package/dist/utils/detectors/debuggerDetector.js +211 -0
- package/dist/utils/detectors/defineGetterDetector.d.ts +48 -0
- package/dist/utils/detectors/defineGetterDetector.js +150 -0
- package/dist/utils/detectors/detectorInterface.d.ts +36 -0
- package/dist/utils/detectors/detectorInterface.js +1 -0
- package/dist/utils/detectors/devToolsDetectorManager.d.ts +88 -0
- package/dist/utils/detectors/devToolsDetectorManager.js +243 -0
- package/dist/utils/detectors/funcToStringDetector.d.ts +43 -0
- package/dist/utils/detectors/funcToStringDetector.js +90 -0
- package/dist/utils/detectors/regToStringDetector.d.ts +43 -0
- package/dist/utils/detectors/regToStringDetector.js +129 -0
- package/dist/utils/detectors/sizeDetector.d.ts +54 -0
- package/dist/utils/detectors/sizeDetector.js +134 -0
- package/dist/utils/detectors/timingDetector.d.ts +55 -0
- package/dist/utils/detectors/timingDetector.js +143 -0
- package/dist/utils/dom.d.ts +20 -0
- package/dist/utils/dom.js +83 -0
- package/dist/utils/environment.d.ts +29 -0
- package/dist/utils/environment.js +267 -0
- package/dist/utils/eventManager.d.ts +162 -0
- package/dist/utils/eventManager.js +548 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/intervalManager.d.ts +91 -0
- package/dist/utils/intervalManager.js +221 -0
- package/dist/utils/keyboardShortcutManager/keyboardShortcutManager.d.ts +41 -0
- package/dist/utils/keyboardShortcutManager/keyboardShortcutManager.js +135 -0
- package/dist/utils/keyboardShortcutManager/keyboardShortcuts.d.ts +18 -0
- package/dist/utils/keyboardShortcutManager/keyboardShortcuts.js +195 -0
- package/dist/utils/logging/simple/Loggable.d.ts +33 -0
- package/dist/utils/logging/simple/Loggable.js +1 -0
- package/dist/utils/logging/simple/LoggingDelegate.d.ts +42 -0
- package/dist/utils/logging/simple/LoggingDelegate.js +53 -0
- package/dist/utils/logging/simple/SimpleLoggingService.d.ts +39 -0
- package/dist/utils/logging/simple/SimpleLoggingService.js +58 -0
- package/dist/utils/orientation.d.ts +15 -0
- package/dist/utils/orientation.js +32 -0
- package/dist/utils/protectedContentManager.d.ts +155 -0
- package/dist/utils/protectedContentManager.js +424 -0
- package/dist/utils/securityOverlayManager.d.ts +253 -0
- package/dist/utils/securityOverlayManager.js +786 -0
- package/dist/utils/timeoutManager.d.ts +50 -0
- package/dist/utils/timeoutManager.js +113 -0
- package/package.json +61 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// FEATURE/ENVIRONMENT DETECTION
|
|
2
|
+
/**
|
|
3
|
+
* Detect browser environment
|
|
4
|
+
*/
|
|
5
|
+
export const isBrowser = () => {
|
|
6
|
+
return typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Detect mobile device
|
|
10
|
+
*/
|
|
11
|
+
export const isMobile = () => {
|
|
12
|
+
if (!isBrowser())
|
|
13
|
+
return false;
|
|
14
|
+
const userAgent = navigator.userAgent;
|
|
15
|
+
// Standard mobile OS and browser detection
|
|
16
|
+
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// Chinese mobile devices
|
|
20
|
+
if (/Huawei|HUAWEI|Honor|HONOR|Xiaomi|MI\/|Redmi|POCO|OPPO|vivo|OnePlus|Realme/i.test(userAgent)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
// Korean mobile devices
|
|
24
|
+
if (/Samsung|SAMSUNG|LG|Tizen/i.test(userAgent)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// Japanese mobile devices
|
|
28
|
+
if (/Sony|SONY|Xperia|Sharp|SHARP|Fujitsu|FOMA|KDDI/i.test(userAgent)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Russian mobile devices
|
|
32
|
+
if (/Yandex.Phone|YandexPhone|BQ-|BQru/i.test(userAgent)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Other mobile platforms
|
|
36
|
+
if (/Windows Phone|WindowsPhone|Lumia|Mobile|Tablet|Phone|WPDesktop|ZuneWP|WP7|wds|Fennec|Firefox OS|KaiOS|KAIOS|Sailfish/i.test(userAgent)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Mobile browser detection
|
|
40
|
+
if (/Mobile|Tablet|Android|Touch/i.test(userAgent) && !/Windows NT|Mac OS X/i.test(userAgent)) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
// Feature detection for touch devices (most mobile devices have touch capability)
|
|
44
|
+
if (isBrowser() && ("ontouchstart" in window || navigator.maxTouchPoints > 0)) {
|
|
45
|
+
// Additional check to avoid false positives on desktops with touch screens
|
|
46
|
+
if (window.innerWidth <= 1024 || /Mobi|Android/i.test(userAgent)) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Detect specific browser
|
|
54
|
+
*/
|
|
55
|
+
export const getBrowser = () => {
|
|
56
|
+
if (!isBrowser())
|
|
57
|
+
return { name: "unknown", version: "0" };
|
|
58
|
+
const ua = navigator.userAgent;
|
|
59
|
+
let browserName = "unknown";
|
|
60
|
+
let version = "0";
|
|
61
|
+
// Order matters here - we need to check more specific browsers first
|
|
62
|
+
// before falling back to more generic ones
|
|
63
|
+
// --- Chinese Browsers ---
|
|
64
|
+
if (/MicroMessenger|WeChat/.test(ua)) {
|
|
65
|
+
browserName = "wechat";
|
|
66
|
+
const match = ua.match(/MicroMessenger\/(\d+\.\d+)/);
|
|
67
|
+
version = match ? match[1] : "0";
|
|
68
|
+
}
|
|
69
|
+
// QQ Browser
|
|
70
|
+
else if (/QQBrowser/.test(ua)) {
|
|
71
|
+
browserName = "qq";
|
|
72
|
+
const match = ua.match(/QQBrowser\/(\d+\.\d+)/);
|
|
73
|
+
version = match ? match[1] : "0";
|
|
74
|
+
}
|
|
75
|
+
// UC Browser
|
|
76
|
+
else if (/UCBrowser/.test(ua)) {
|
|
77
|
+
browserName = "uc";
|
|
78
|
+
const match = ua.match(/UCBrowser\/(\d+\.\d+)/);
|
|
79
|
+
version = match ? match[1] : "0";
|
|
80
|
+
}
|
|
81
|
+
// Baidu Browser
|
|
82
|
+
else if (/Baidu|BIDUBrowser|baiduboxapp/.test(ua)) {
|
|
83
|
+
browserName = "baidu";
|
|
84
|
+
const match = ua.match(/(?:Baidu|BIDUBOX)(?:Browser)?\/(\d+\.\d+)/);
|
|
85
|
+
version = match ? match[1] : "0";
|
|
86
|
+
}
|
|
87
|
+
// Mi Browser
|
|
88
|
+
else if (/MiuiBrowser/.test(ua)) {
|
|
89
|
+
browserName = "mi";
|
|
90
|
+
const match = ua.match(/MiuiBrowser\/(\d+\.\d+)/);
|
|
91
|
+
version = match ? match[1] : "0";
|
|
92
|
+
}
|
|
93
|
+
// --- Russian Browsers ---
|
|
94
|
+
// Yandex Browser
|
|
95
|
+
else if (/YaBrowser/.test(ua)) {
|
|
96
|
+
browserName = "yandex";
|
|
97
|
+
const match = ua.match(/YaBrowser\/(\d+\.\d+)/);
|
|
98
|
+
version = match ? match[1] : "0";
|
|
99
|
+
}
|
|
100
|
+
// --- Korean Browsers ---
|
|
101
|
+
// Naver Whale
|
|
102
|
+
else if (/Whale/.test(ua)) {
|
|
103
|
+
browserName = "whale";
|
|
104
|
+
const match = ua.match(/Whale\/(\d+\.\d+)/);
|
|
105
|
+
version = match ? match[1] : "0";
|
|
106
|
+
}
|
|
107
|
+
// --- Mobile Browsers ---
|
|
108
|
+
// Samsung Internet
|
|
109
|
+
else if (/SamsungBrowser/.test(ua)) {
|
|
110
|
+
browserName = "samsung";
|
|
111
|
+
const match = ua.match(/SamsungBrowser\/(\d+\.\d+)/);
|
|
112
|
+
version = match ? match[1] : "0";
|
|
113
|
+
}
|
|
114
|
+
// Huawei Browser
|
|
115
|
+
else if (/HuaweiBrowser/.test(ua)) {
|
|
116
|
+
browserName = "huawei";
|
|
117
|
+
const match = ua.match(/HuaweiBrowser\/(\d+\.\d+)/);
|
|
118
|
+
version = match ? match[1] : "0";
|
|
119
|
+
}
|
|
120
|
+
// --- Alternative Browsers ---
|
|
121
|
+
// Vivaldi
|
|
122
|
+
else if (/Vivaldi/.test(ua)) {
|
|
123
|
+
browserName = "vivaldi";
|
|
124
|
+
const match = ua.match(/Vivaldi\/(\d+\.\d+)/);
|
|
125
|
+
version = match ? match[1] : "0";
|
|
126
|
+
}
|
|
127
|
+
// Lunascape
|
|
128
|
+
else if (/Lunascape/.test(ua)) {
|
|
129
|
+
browserName = "lunascape";
|
|
130
|
+
const match = ua.match(/Lunascape[/| ](\d+\.\d+)/);
|
|
131
|
+
version = match ? match[1] : "0";
|
|
132
|
+
}
|
|
133
|
+
// Opera
|
|
134
|
+
else if (/OPR|Opera/.test(ua)) {
|
|
135
|
+
browserName = "opera";
|
|
136
|
+
const match = ua.match(/(?:OPR|Opera)[/| ](\d+\.\d+)/);
|
|
137
|
+
version = match ? match[1] : "0";
|
|
138
|
+
}
|
|
139
|
+
// --- Emulators ---
|
|
140
|
+
// Nox Browser/Emulator
|
|
141
|
+
else if (/Nox/.test(ua)) {
|
|
142
|
+
browserName = "nox";
|
|
143
|
+
const match = ua.match(/Nox\/(\d+\.\d+)/);
|
|
144
|
+
version = match ? match[1] : "0";
|
|
145
|
+
}
|
|
146
|
+
// BlueStacks
|
|
147
|
+
else if (/BlueStacks/.test(ua)) {
|
|
148
|
+
browserName = "bluestacks";
|
|
149
|
+
const match = ua.match(/BlueStacks\/(\d+\.\d+)/);
|
|
150
|
+
version = match ? match[1] : "0";
|
|
151
|
+
}
|
|
152
|
+
// --- Major Browsers (keep these last as fallbacks) ---
|
|
153
|
+
// Edge
|
|
154
|
+
else if (/Edg/.test(ua)) {
|
|
155
|
+
browserName = "edge";
|
|
156
|
+
const match = ua.match(/Edg\/(\d+\.\d+)/);
|
|
157
|
+
version = match ? match[1] : "0";
|
|
158
|
+
}
|
|
159
|
+
// Chrome
|
|
160
|
+
else if (/Chrome/.test(ua) && !/Chromium|Edge|Edg|OPR|Opera/.test(ua)) {
|
|
161
|
+
browserName = "chrome";
|
|
162
|
+
const match = ua.match(/Chrome\/(\d+\.\d+)/);
|
|
163
|
+
version = match ? match[1] : "0";
|
|
164
|
+
}
|
|
165
|
+
// Firefox
|
|
166
|
+
else if (/Firefox/.test(ua)) {
|
|
167
|
+
browserName = "firefox";
|
|
168
|
+
const match = ua.match(/Firefox\/(\d+\.\d+)/);
|
|
169
|
+
version = match ? match[1] : "0";
|
|
170
|
+
}
|
|
171
|
+
// Safari
|
|
172
|
+
else if (/Safari/.test(ua) && !/Chrome/.test(ua)) {
|
|
173
|
+
browserName = "safari";
|
|
174
|
+
const match = ua.match(/Version\/(\d+\.\d+)/);
|
|
175
|
+
version = match ? match[1] : "0";
|
|
176
|
+
}
|
|
177
|
+
// IE
|
|
178
|
+
else if (/Trident|MSIE/.test(ua)) {
|
|
179
|
+
browserName = "ie";
|
|
180
|
+
const match = ua.match(/(?:rv:|MSIE )(\d+\.\d+)/);
|
|
181
|
+
version = match ? match[1] : "0";
|
|
182
|
+
}
|
|
183
|
+
// Chromium-based browsers not caught above
|
|
184
|
+
else if (/Chromium/.test(ua)) {
|
|
185
|
+
browserName = "chromium";
|
|
186
|
+
const match = ua.match(/Chromium\/(\d+\.\d+)/);
|
|
187
|
+
version = match ? match[1] : "0";
|
|
188
|
+
}
|
|
189
|
+
return { name: browserName, version };
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Detect operating system
|
|
193
|
+
*/
|
|
194
|
+
export const getOS = () => {
|
|
195
|
+
if (!isBrowser())
|
|
196
|
+
return { name: "unknown" };
|
|
197
|
+
const platform = navigator.platform.toLowerCase();
|
|
198
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
199
|
+
// macOS and iOS devices
|
|
200
|
+
if (platform.includes("mac") ||
|
|
201
|
+
platform.includes("ipad") ||
|
|
202
|
+
platform.includes("ipod") ||
|
|
203
|
+
platform.includes("iphone") ||
|
|
204
|
+
userAgent.includes("mac") ||
|
|
205
|
+
userAgent.includes("iphone") ||
|
|
206
|
+
userAgent.includes("ipad") ||
|
|
207
|
+
(userAgent.includes("safari") && !userAgent.includes("chrome") && !userAgent.includes("android"))) {
|
|
208
|
+
return { name: "mac" };
|
|
209
|
+
}
|
|
210
|
+
// Windows detection
|
|
211
|
+
else if (platform.includes("win") || userAgent.includes("win") || userAgent.includes("windows nt")) {
|
|
212
|
+
return { name: "windows" };
|
|
213
|
+
}
|
|
214
|
+
// Linux and Linux-based OS detection
|
|
215
|
+
else if (
|
|
216
|
+
// Standard Linux
|
|
217
|
+
platform.includes("linux") ||
|
|
218
|
+
userAgent.includes("linux") ||
|
|
219
|
+
// Android (Linux-based)
|
|
220
|
+
userAgent.includes("android") ||
|
|
221
|
+
// Chinese OS (most are Linux-based)
|
|
222
|
+
userAgent.includes("harmonyos") ||
|
|
223
|
+
userAgent.includes("deepin") ||
|
|
224
|
+
userAgent.includes("uos") ||
|
|
225
|
+
userAgent.includes("cos") ||
|
|
226
|
+
// Russian Linux distributions
|
|
227
|
+
userAgent.includes("astra linux") ||
|
|
228
|
+
userAgent.includes("alt linux") ||
|
|
229
|
+
userAgent.includes("rosa") ||
|
|
230
|
+
// Korean OS
|
|
231
|
+
userAgent.includes("tizen") ||
|
|
232
|
+
userAgent.includes("gooroom") ||
|
|
233
|
+
// Other Linux-based OS
|
|
234
|
+
userAgent.includes("ubuntu") ||
|
|
235
|
+
userAgent.includes("debian") ||
|
|
236
|
+
userAgent.includes("fedora") ||
|
|
237
|
+
userAgent.includes("red hat") ||
|
|
238
|
+
userAgent.includes("suse") ||
|
|
239
|
+
userAgent.includes("mint") ||
|
|
240
|
+
// Chrome OS (Linux-based)
|
|
241
|
+
userAgent.includes("cros") ||
|
|
242
|
+
userAgent.includes("chromium os") ||
|
|
243
|
+
userAgent.includes("chrome os") ||
|
|
244
|
+
// BSD variants (Unix-like, grouped with Linux for simplicity)
|
|
245
|
+
userAgent.includes("freebsd") ||
|
|
246
|
+
userAgent.includes("openbsd") ||
|
|
247
|
+
userAgent.includes("netbsd")) {
|
|
248
|
+
return { name: "linux" };
|
|
249
|
+
}
|
|
250
|
+
// Fallback for undetected OS
|
|
251
|
+
return { name: "unknown" };
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Check if print is supported
|
|
255
|
+
*/
|
|
256
|
+
export const isPrintSupported = () => {
|
|
257
|
+
return isBrowser() && typeof window.print === 'function';
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* Check if beforeprint event is supported
|
|
261
|
+
*/
|
|
262
|
+
export const isBeforePrintSupported = () => {
|
|
263
|
+
if (!isBrowser())
|
|
264
|
+
return false;
|
|
265
|
+
const mediaQueryList = window.matchMedia('print');
|
|
266
|
+
return !!mediaQueryList.addListener || 'onbeforeprint' in window;
|
|
267
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { LoggableComponent } from "./base/LoggableComponent";
|
|
2
|
+
/**
|
|
3
|
+
* Options for event registration
|
|
4
|
+
*/
|
|
5
|
+
export interface EventRegistrationOptions extends AddEventListenerOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Optional ID for the event (auto-generated if not provided)
|
|
8
|
+
*/
|
|
9
|
+
id?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Priority for the event handler (higher executes first)
|
|
12
|
+
* @default 0
|
|
13
|
+
*/
|
|
14
|
+
priority?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* EventManager centralizes event handling across protection strategies
|
|
18
|
+
* It provides a unified API for registering and removing event listeners
|
|
19
|
+
* and ensures proper cleanup when strategies are removed
|
|
20
|
+
*/
|
|
21
|
+
export declare class EventManager extends LoggableComponent {
|
|
22
|
+
private static instance;
|
|
23
|
+
private events;
|
|
24
|
+
private targetMap;
|
|
25
|
+
private readonly DOCUMENT_SYMBOL;
|
|
26
|
+
private readonly WINDOW_SYMBOL;
|
|
27
|
+
/**
|
|
28
|
+
* Create a new EventManager
|
|
29
|
+
* @param debugMode Enable debug mode for troubleshooting
|
|
30
|
+
*/
|
|
31
|
+
private constructor();
|
|
32
|
+
/**
|
|
33
|
+
* Get the EventManager instance (singleton)
|
|
34
|
+
* @param debugMode Enable debug mode for troubleshooting
|
|
35
|
+
*/
|
|
36
|
+
static getInstance(debugMode?: boolean): EventManager;
|
|
37
|
+
/**
|
|
38
|
+
* Register an event listener
|
|
39
|
+
* @param target The target element, document, or window
|
|
40
|
+
* @param eventType The type of event (e.g., "click", "keydown")
|
|
41
|
+
* @param handler The event handler function
|
|
42
|
+
* @param owner The component or strategy that owns this event
|
|
43
|
+
* @param options Additional options for the event listener
|
|
44
|
+
* @returns The ID of the registered event
|
|
45
|
+
*/
|
|
46
|
+
addEventListener(target: EventTarget | null, eventType: string, handler: EventListener, owner: string, options?: EventRegistrationOptions): string;
|
|
47
|
+
/**
|
|
48
|
+
* Remove a specific event listener by ID
|
|
49
|
+
* @param target The target element, document, or window
|
|
50
|
+
* @param eventId The ID of the event to remove
|
|
51
|
+
* @returns True if the event was removed, false otherwise
|
|
52
|
+
*/
|
|
53
|
+
removeEventListener(target: EventTarget | null, eventId: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Remove all event listeners for a specific owner (strategy/component)
|
|
56
|
+
* @param owner The owner to remove events for
|
|
57
|
+
* @returns The number of events removed
|
|
58
|
+
*/
|
|
59
|
+
removeEventsByOwner(owner: string): number;
|
|
60
|
+
/**
|
|
61
|
+
* Remove all event listeners for a specific target
|
|
62
|
+
* @param target The target to remove events from
|
|
63
|
+
* @returns The number of events removed
|
|
64
|
+
*/
|
|
65
|
+
removeAllEventsForTarget(target: EventTarget | null): number;
|
|
66
|
+
/**
|
|
67
|
+
* Get all event IDs for a specific owner
|
|
68
|
+
* @param owner The owner to get events for
|
|
69
|
+
* @returns Array of event IDs
|
|
70
|
+
*/
|
|
71
|
+
getEventsByOwner(owner: string): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Check if an event exists
|
|
74
|
+
* @param target The target element
|
|
75
|
+
* @param eventId The event ID
|
|
76
|
+
* @returns True if the event exists
|
|
77
|
+
*/
|
|
78
|
+
hasEvent(target: EventTarget | null, eventId: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Get a unique identifier for a target
|
|
81
|
+
* @param target The target element, document, or window
|
|
82
|
+
* @param create Whether to create a new ID if one doesn't exist
|
|
83
|
+
* @returns The target ID
|
|
84
|
+
*/
|
|
85
|
+
private getTargetId;
|
|
86
|
+
/**
|
|
87
|
+
* Get a target from its ID
|
|
88
|
+
* @param targetId The target ID
|
|
89
|
+
* @returns The target element or null
|
|
90
|
+
*/
|
|
91
|
+
private getTargetFromId;
|
|
92
|
+
/**
|
|
93
|
+
* Get the number of registered events
|
|
94
|
+
* @returns The total number of registered events
|
|
95
|
+
*/
|
|
96
|
+
getEventCount(): number;
|
|
97
|
+
/**
|
|
98
|
+
* Get debug information about registered events
|
|
99
|
+
* @returns Object with debug information
|
|
100
|
+
*/
|
|
101
|
+
getDebugInfo(): {
|
|
102
|
+
totalEvents: number;
|
|
103
|
+
eventsByOwner: Record<string, number>;
|
|
104
|
+
eventsByType: Record<string, number>;
|
|
105
|
+
eventDetails: Array<{
|
|
106
|
+
targetId: string | symbol;
|
|
107
|
+
eventId: string;
|
|
108
|
+
eventType: string;
|
|
109
|
+
owner: string;
|
|
110
|
+
priority: number;
|
|
111
|
+
}>;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Clear all registered events
|
|
115
|
+
* @returns The number of events removed
|
|
116
|
+
*/
|
|
117
|
+
clearAllEvents(): number;
|
|
118
|
+
/**
|
|
119
|
+
* Check if an event handler is already registered for this target, event type, and owner
|
|
120
|
+
* This helps prevent duplicate registrations
|
|
121
|
+
* @param target The target element
|
|
122
|
+
* @param eventType The event type (e.g., "click", "contextmenu")
|
|
123
|
+
* @param owner The owner of the event handler
|
|
124
|
+
* @returns True if an event handler is already registered
|
|
125
|
+
*/
|
|
126
|
+
hasRegisteredEventType(target: EventTarget | null, eventType: string, owner: string): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Check for potential conflicts with existing event listeners
|
|
129
|
+
* @param target The target element
|
|
130
|
+
* @param eventType The event type (e.g., "click", "contextmenu")
|
|
131
|
+
* @param owner The owner of the event handler
|
|
132
|
+
* @returns Object with conflict information
|
|
133
|
+
*/
|
|
134
|
+
checkForConflicts(target: EventTarget | null, eventType: string, owner: string): {
|
|
135
|
+
hasConflicts: boolean;
|
|
136
|
+
conflictsWith: Array<{
|
|
137
|
+
owner: string;
|
|
138
|
+
eventId: string;
|
|
139
|
+
}>;
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Get events of a specific type for a target
|
|
143
|
+
* @param target The target element
|
|
144
|
+
* @param eventType The event type (e.g., "click", "contextmenu")
|
|
145
|
+
* @returns Array of event information
|
|
146
|
+
*/
|
|
147
|
+
getEventsByType(target: EventTarget | null, eventType: string): Array<{
|
|
148
|
+
eventId: string;
|
|
149
|
+
owner: string;
|
|
150
|
+
priority: number;
|
|
151
|
+
}>;
|
|
152
|
+
/**
|
|
153
|
+
* Remove event listeners by selector
|
|
154
|
+
* Useful for Vue components and other dynamically created elements
|
|
155
|
+
* @param selector CSS selector to match elements
|
|
156
|
+
* @param eventType The event type (e.g., "click", "contextmenu")
|
|
157
|
+
* @param owner The owner of the event handler
|
|
158
|
+
* @returns The number of events removed
|
|
159
|
+
*/
|
|
160
|
+
removeEventsBySelector(selector: string, eventType: string, owner: string): number;
|
|
161
|
+
}
|
|
162
|
+
export declare const eventManager: EventManager;
|