keyspy 1.0.7 → 1.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/README.md +110 -3
- package/bin/keyspy +24 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +359 -0
- package/{build → dist}/index.d.ts +10 -10
- package/{build → dist}/index.d.ts.map +1 -1
- package/dist/index.js +156 -0
- package/{build/ts/X11KeyServer.d.ts → dist/platforms/linux/index.d.ts} +5 -5
- package/dist/platforms/linux/index.d.ts.map +1 -0
- package/dist/platforms/linux/index.js +181 -0
- package/dist/platforms/linux/keymap.d.ts +3 -0
- package/dist/platforms/linux/keymap.d.ts.map +1 -0
- package/dist/platforms/linux/keymap.js +144 -0
- package/{build/ts/MacKeyServer.d.ts → dist/platforms/mac/index.d.ts} +5 -5
- package/dist/platforms/mac/index.d.ts.map +1 -0
- package/dist/platforms/mac/index.js +181 -0
- package/dist/platforms/mac/keymap.d.ts +3 -0
- package/dist/platforms/mac/keymap.d.ts.map +1 -0
- package/dist/platforms/mac/keymap.js +155 -0
- package/{build/ts/WinKeyServer.d.ts → dist/platforms/windows/index.d.ts} +5 -5
- package/dist/platforms/windows/index.d.ts.map +1 -0
- package/dist/platforms/windows/index.js +110 -0
- package/{build/ts/_data/WinGlobalKeyLookup.d.ts → dist/platforms/windows/keymap.d.ts} +2 -2
- package/dist/platforms/windows/keymap.d.ts.map +1 -0
- package/{build/ts/_data/WinGlobalKeyLookup.js → dist/platforms/windows/keymap.js} +1 -1
- package/{build/ts/_types → dist/types}/IConfig.d.ts +2 -0
- package/dist/types/IConfig.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IConfig.js +1 -1
- package/{build/ts/_types → dist/types}/IGlobalKey.d.ts +1 -1
- package/dist/types/IGlobalKey.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKey.js +1 -1
- package/dist/types/IGlobalKeyDownMap.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyDownMap.js +1 -1
- package/dist/types/IGlobalKeyEvent.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyEvent.js +1 -1
- package/dist/types/IGlobalKeyListener.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyListener.js +1 -1
- package/dist/types/IGlobalKeyListenerRaw.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyListenerRaw.js +1 -1
- package/dist/types/IGlobalKeyLookup.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyLookup.js +1 -1
- package/dist/types/IGlobalKeyResult.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyResult.js +1 -1
- package/dist/types/IGlobalKeyServer.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IGlobalKeyServer.js +1 -1
- package/{build/ts/_types → dist/types}/IMacConfig.d.ts +2 -0
- package/dist/types/IMacConfig.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IMacConfig.js +1 -1
- package/dist/types/IWindowsConfig.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IWindowsConfig.js +1 -1
- package/{build/ts/_types → dist/types}/IX11Config.d.ts +2 -0
- package/dist/types/IX11Config.d.ts.map +1 -0
- package/{build/ts/_types → dist/types}/IX11Config.js +1 -1
- package/dist/utils/permissions.d.ts +10 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +115 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +39 -0
- package/native/MacKeyServer/main.swift +326 -0
- package/native/WinKeyServer/main.cpp +402 -0
- package/native/X11KeyServer/main.cpp +118 -0
- package/package.json +49 -32
- package/runtime/MacKeyServer +0 -0
- package/scripts/download-binaries.js +7 -7
- package/build/index.js +0 -149
- package/build/ts/MacKeyServer.d.ts.map +0 -1
- package/build/ts/MacKeyServer.js +0 -159
- package/build/ts/WinKeyServer.d.ts.map +0 -1
- package/build/ts/WinKeyServer.js +0 -88
- package/build/ts/X11KeyServer.d.ts.map +0 -1
- package/build/ts/X11KeyServer.js +0 -159
- package/build/ts/_data/MacGlobalKeyLookup.d.ts +0 -3
- package/build/ts/_data/MacGlobalKeyLookup.d.ts.map +0 -1
- package/build/ts/_data/MacGlobalKeyLookup.js +0 -155
- package/build/ts/_data/WinGlobalKeyLookup.d.ts.map +0 -1
- package/build/ts/_data/X11GlobalKeyLookup.d.ts +0 -3
- package/build/ts/_data/X11GlobalKeyLookup.d.ts.map +0 -1
- package/build/ts/_data/X11GlobalKeyLookup.js +0 -144
- package/build/ts/_types/IConfig.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKey.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyDownMap.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyEvent.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyListener.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyListenerRaw.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyLookup.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyResult.d.ts.map +0 -1
- package/build/ts/_types/IGlobalKeyServer.d.ts.map +0 -1
- package/build/ts/_types/IMacConfig.d.ts.map +0 -1
- package/build/ts/_types/IWindowsConfig.d.ts.map +0 -1
- package/build/ts/_types/IX11Config.d.ts.map +0 -1
- package/build/ts/isSpawnEventSupported.d.ts +0 -6
- package/build/ts/isSpawnEventSupported.d.ts.map +0 -1
- package/build/ts/isSpawnEventSupported.js +0 -18
- /package/{build/ts/_types → dist/types}/IGlobalKeyDownMap.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyEvent.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyListener.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyListenerRaw.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyLookup.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyResult.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IGlobalKeyServer.d.ts +0 -0
- /package/{build/ts/_types → dist/types}/IWindowsConfig.d.ts +0 -0
package/README.md
CHANGED
|
@@ -47,6 +47,8 @@ Choosing the right keyboard listener for your Node.js project can be challenging
|
|
|
47
47
|
| macOS | ✅ Full | Swift (CGEventTap) | macOS 10.14+ |
|
|
48
48
|
| Linux | ✅ X11 Only | C++ (XInput2) | Ubuntu, Arch Linux |
|
|
49
49
|
|
|
50
|
+
|
|
51
|
+
|
|
50
52
|
## 🚀 Quick Start
|
|
51
53
|
|
|
52
54
|
```ts
|
|
@@ -60,6 +62,57 @@ keyspy.addListener((e, down) => {
|
|
|
60
62
|
});
|
|
61
63
|
```
|
|
62
64
|
|
|
65
|
+
## 🔍 Testing Your Setup
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Clone and test
|
|
69
|
+
git clone https://github.com/teomyth/keyspy.git
|
|
70
|
+
cd keyspy
|
|
71
|
+
npm install
|
|
72
|
+
npm run cli # General key monitoring with clean table output
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The test tool will show real-time key detection for all keyboard and mouse events.
|
|
76
|
+
|
|
77
|
+
**Features:**
|
|
78
|
+
- ✅ Clean, aligned table output (no terminal echo interference)
|
|
79
|
+
- ✅ Real-time event detection with optimized column widths
|
|
80
|
+
- ✅ Standard Unicode symbols for modifier keys (⇧⌃⌥⌘)
|
|
81
|
+
- ✅ Detailed key information (name, code, modifiers, location)
|
|
82
|
+
- ✅ Cross-platform compatibility
|
|
83
|
+
|
|
84
|
+
### Sample Output
|
|
85
|
+
|
|
86
|
+
When you run `npm run cli`, you'll see a clean, real-time table like this:
|
|
87
|
+
|
|
88
|
+
**Default output (KEYSPY_DEBUG=0 - clean table format):**
|
|
89
|
+
```
|
|
90
|
+
=== keyspy Key Monitor ===
|
|
91
|
+
Real-time keyboard and mouse event detection
|
|
92
|
+
Debug level: 0
|
|
93
|
+
Exit: ESC, Ctrl+C, or CMD+Q
|
|
94
|
+
==========================================
|
|
95
|
+
|
|
96
|
+
# Time State Key Name Mods Raw Key Loc vKey
|
|
97
|
+
#1 14:32:16 DN F3 kVK_F3 0.0,0.0 0x63
|
|
98
|
+
#2 14:32:16 UP F3 kVK_F3 0.0,0.0 0x63
|
|
99
|
+
#3 14:32:17 DN A kVK_ANSI_A 0.0,0.0 0x00
|
|
100
|
+
#4 14:32:17 UP A kVK_ANSI_A 0.0,0.0 0x00
|
|
101
|
+
#5 14:32:18 DN SPACE ⌘ kVK_Space 0.0,0.0 0x31
|
|
102
|
+
#6 14:32:19 DN MOUSE LEFT CGMouseButton.left 245.7,156.3 0x00
|
|
103
|
+
#7 14:32:20 DN C ⇧+⌃+⌥+⌘ kVK_ANSI_C 0.0,0.0 0x08
|
|
104
|
+
#8 14:32:21 DN UNKNOWN UNKNOWN_0xA0 0.0,0.0 0xA0
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Debug output (KEYSPY_DEBUG=1 - with unknown key detection):**
|
|
108
|
+
```
|
|
109
|
+
#8 14:32:21 DN UNKNOWN UNKNOWN_0xA0 0.0,0.0 0xA0
|
|
110
|
+
❓ UNKNOWN key detected - vKey: 0xA0, Raw: UNKNOWN_0xA0
|
|
111
|
+
This key is not in our lookup table but was captured successfully
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Some keys may appear as `UNKNOWN` if they're not in our lookup tables, but you'll still get the key code (vKey) to identify them.
|
|
115
|
+
|
|
63
116
|
## 📖 Usage Examples
|
|
64
117
|
|
|
65
118
|
### Basic Event Logging
|
|
@@ -100,15 +153,22 @@ keyspy.addListener((e, down) => {
|
|
|
100
153
|
|
|
101
154
|
```ts
|
|
102
155
|
const keyspy = new GlobalKeyboardListener({
|
|
156
|
+
// Global app name for permission requests (default: "KeySpy")
|
|
157
|
+
appName: "My Awesome App",
|
|
158
|
+
|
|
103
159
|
windows: {
|
|
104
160
|
onError: (errorCode) => console.error("Windows error:", errorCode),
|
|
105
161
|
onInfo: (info) => console.info("Windows info:", info)
|
|
106
162
|
},
|
|
107
163
|
mac: {
|
|
108
164
|
onError: (errorCode) => console.error("macOS error:", errorCode),
|
|
165
|
+
// Platform-specific app name (overrides global appName)
|
|
166
|
+
appName: "My Mac App"
|
|
109
167
|
},
|
|
110
168
|
x11: {
|
|
111
169
|
onError: (errorCode) => console.error("Linux error:", errorCode),
|
|
170
|
+
// Platform-specific app name (overrides global appName)
|
|
171
|
+
appName: "My Linux App"
|
|
112
172
|
}
|
|
113
173
|
});
|
|
114
174
|
```
|
|
@@ -152,7 +212,7 @@ npm run build:native
|
|
|
152
212
|
npm run dev # TypeScript watch mode
|
|
153
213
|
npm run build # Production build
|
|
154
214
|
npm test # Run all tests
|
|
155
|
-
npm run
|
|
215
|
+
npm run cli # Interactive testing with clean table output
|
|
156
216
|
```
|
|
157
217
|
|
|
158
218
|
### Building Native Binaries
|
|
@@ -191,8 +251,25 @@ npm run release:dry # Preview release without publishing
|
|
|
191
251
|
|
|
192
252
|
```bash
|
|
193
253
|
npm run test:unit # Unit tests
|
|
194
|
-
npm run test:integration # Integration tests
|
|
195
|
-
npm run test:
|
|
254
|
+
npm run test:integration # Integration tests (may prompt for permissions)
|
|
255
|
+
npm run test:integration:safe # Check permissions first, then run integration tests
|
|
256
|
+
npm run check-permissions # Check if permissions are granted
|
|
257
|
+
npm run dev:cli # Manual interactive testing with clean table output
|
|
258
|
+
|
|
259
|
+
# Verbose levels for CLI tool
|
|
260
|
+
npm run cli # Clean table output only (default)
|
|
261
|
+
npm run cli:v # + UNKNOWN key detection (-v)
|
|
262
|
+
npm run cli:vv # + All debug information (-vv)
|
|
263
|
+
npm run cli:vvv # + Detailed debug info (-vvv)
|
|
264
|
+
|
|
265
|
+
# Or use environment variable
|
|
266
|
+
KEYSPY_DEBUG=0 npm run cli # Clean table output only (default)
|
|
267
|
+
KEYSPY_DEBUG=1 npm run cli # + UNKNOWN key detection
|
|
268
|
+
KEYSPY_DEBUG=2 npm run cli # + All debug information
|
|
269
|
+
KEYSPY_DEBUG=3 npm run cli # + Detailed debug info
|
|
270
|
+
|
|
271
|
+
# Skip integration tests if permissions are not available
|
|
272
|
+
SKIP_INTEGRATION_TESTS=true npm test
|
|
196
273
|
```
|
|
197
274
|
|
|
198
275
|
## 📋 API Reference
|
|
@@ -224,6 +301,36 @@ interface IGlobalKeyEvent {
|
|
|
224
301
|
}
|
|
225
302
|
```
|
|
226
303
|
|
|
304
|
+
#### Configuration Options
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
interface IConfig {
|
|
308
|
+
appName?: string; // Default app name for permission requests (default: "KeySpy")
|
|
309
|
+
disposeDelay?: number; // Delay before disposing server when no listeners (default: 100ms)
|
|
310
|
+
|
|
311
|
+
// Platform-specific configurations
|
|
312
|
+
windows?: {
|
|
313
|
+
onError?: (errorCode: number) => void;
|
|
314
|
+
onInfo?: (info: string) => void;
|
|
315
|
+
serverPath?: string; // Custom path to Windows binary
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
mac?: {
|
|
319
|
+
onError?: (errorCode: number | null) => void;
|
|
320
|
+
onInfo?: (info: string) => void;
|
|
321
|
+
serverPath?: string; // Custom path to macOS binary
|
|
322
|
+
appName?: string; // macOS-specific app name (overrides global appName)
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
x11?: {
|
|
326
|
+
onError?: (errorCode: number | null) => void;
|
|
327
|
+
onInfo?: (info: string) => void;
|
|
328
|
+
serverPath?: string; // Custom path to Linux binary
|
|
329
|
+
appName?: string; // Linux-specific app name (overrides global appName)
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
227
334
|
## 🔒 Security & Permissions
|
|
228
335
|
|
|
229
336
|
### macOS
|
package/bin/keyspy
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
|
|
6
|
+
// Get the directory where this script is located
|
|
7
|
+
const binDir = __dirname;
|
|
8
|
+
// Get the package root directory (parent of bin/)
|
|
9
|
+
const packageRoot = path.dirname(binDir);
|
|
10
|
+
// Path to the compiled CLI script
|
|
11
|
+
const cliScript = path.join(packageRoot, 'dist', 'cli.js');
|
|
12
|
+
|
|
13
|
+
// Check if the compiled CLI script exists
|
|
14
|
+
if (!fs.existsSync(cliScript)) {
|
|
15
|
+
console.error('Error: CLI script not found at', cliScript);
|
|
16
|
+
console.error('Please run "npm run build" first to compile the TypeScript code.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Execute the CLI script
|
|
21
|
+
const { run } = require(cliScript);
|
|
22
|
+
|
|
23
|
+
// Call the run function with command line arguments
|
|
24
|
+
run({}, process.argv);
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main CLI function that can be called externally
|
|
3
|
+
* @param options Configuration options for the CLI
|
|
4
|
+
* @param args Command line arguments (defaults to process.argv)
|
|
5
|
+
*/
|
|
6
|
+
export declare function run(options?: {
|
|
7
|
+
debugLevel?: number;
|
|
8
|
+
}, args?: string[]): void;
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAqGA;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,EAAE,IAAI,GAAE,MAAM,EAAiB,QAwRvF"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
var _a;
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.run = run;
|
|
8
|
+
const index_1 = require("./index");
|
|
9
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
10
|
+
// ANSI color codes for better output
|
|
11
|
+
const colors = {
|
|
12
|
+
reset: "\x1b[0m",
|
|
13
|
+
bright: "\x1b[1m",
|
|
14
|
+
dim: "\x1b[2m",
|
|
15
|
+
red: "\x1b[31m",
|
|
16
|
+
green: "\x1b[32m",
|
|
17
|
+
yellow: "\x1b[33m",
|
|
18
|
+
blue: "\x1b[34m",
|
|
19
|
+
magenta: "\x1b[35m",
|
|
20
|
+
cyan: "\x1b[36m",
|
|
21
|
+
white: "\x1b[37m",
|
|
22
|
+
gray: "\x1b[90m",
|
|
23
|
+
bgRed: "\x1b[41m",
|
|
24
|
+
bgGreen: "\x1b[42m",
|
|
25
|
+
bgYellow: "\x1b[43m",
|
|
26
|
+
bgBlue: "\x1b[44m",
|
|
27
|
+
bgMagenta: "\x1b[45m",
|
|
28
|
+
bgCyan: "\x1b[46m",
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Parse command line arguments
|
|
32
|
+
* @param args Command line arguments (defaults to process.argv)
|
|
33
|
+
*/
|
|
34
|
+
function parseArgs(args = process.argv) {
|
|
35
|
+
const options = {};
|
|
36
|
+
for (let i = 2; i < args.length; i++) {
|
|
37
|
+
const arg = args[i];
|
|
38
|
+
if (arg === '--help' || arg === '-h') {
|
|
39
|
+
options.help = true;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === '-v') {
|
|
42
|
+
options.debugLevel = 1;
|
|
43
|
+
}
|
|
44
|
+
else if (arg === '-vv') {
|
|
45
|
+
options.debugLevel = 2;
|
|
46
|
+
}
|
|
47
|
+
else if (arg === '-vvv') {
|
|
48
|
+
options.debugLevel = 3;
|
|
49
|
+
}
|
|
50
|
+
else if (arg === '--verbose') {
|
|
51
|
+
const nextArg = args[i + 1];
|
|
52
|
+
if (nextArg && !nextArg.startsWith('-')) {
|
|
53
|
+
options.debugLevel = Number.parseInt(nextArg);
|
|
54
|
+
i++; // Skip next argument as it's the debug level
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
options.debugLevel = 1; // Default verbose level
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (arg.startsWith('--verbose=')) {
|
|
61
|
+
options.debugLevel = Number.parseInt(arg.split('=')[1]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return options;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Show help information
|
|
68
|
+
*/
|
|
69
|
+
function showHelp() {
|
|
70
|
+
console.log(`
|
|
71
|
+
${colors.cyan}${colors.bright}KeySpy - Global Keyboard and Mouse Listener${colors.reset}
|
|
72
|
+
|
|
73
|
+
${colors.bright}USAGE:${colors.reset}
|
|
74
|
+
keyspy [OPTIONS]
|
|
75
|
+
|
|
76
|
+
${colors.bright}OPTIONS:${colors.reset}
|
|
77
|
+
-h, --help Show this help message
|
|
78
|
+
-v Verbose mode (level 1) - show UNKNOWN key detection
|
|
79
|
+
-vv More verbose (level 2) - show all debug information
|
|
80
|
+
-vvv Most verbose (level 3) - show detailed debug info
|
|
81
|
+
--verbose [LEVEL] Set verbose level (1-3)
|
|
82
|
+
--verbose=LEVEL Set verbose level (1-3)
|
|
83
|
+
|
|
84
|
+
${colors.bright}VERBOSE LEVELS:${colors.reset}
|
|
85
|
+
0 Clean table output only (default)
|
|
86
|
+
1 + UNKNOWN key detection (-v)
|
|
87
|
+
2 + All debug information (-vv)
|
|
88
|
+
3 + Detailed debug info (-vvv)
|
|
89
|
+
|
|
90
|
+
${colors.bright}ENVIRONMENT VARIABLES:${colors.reset}
|
|
91
|
+
KEYSPY_DEBUG Set debug level (0-3)
|
|
92
|
+
SKIP_INTEGRATION_TESTS Skip integration tests
|
|
93
|
+
|
|
94
|
+
${colors.bright}EXIT KEYS:${colors.reset}
|
|
95
|
+
ESC Exit the application
|
|
96
|
+
Ctrl+C Exit the application
|
|
97
|
+
CMD+Q (macOS) Exit the application
|
|
98
|
+
|
|
99
|
+
${colors.bright}EXAMPLES:${colors.reset}
|
|
100
|
+
keyspy Start with default settings
|
|
101
|
+
keyspy -v Start with verbose mode (level 1)
|
|
102
|
+
keyspy -vv Start with more verbose mode (level 2)
|
|
103
|
+
keyspy -vvv Start with most verbose mode (level 3)
|
|
104
|
+
keyspy --verbose=2 Start with verbose level 2
|
|
105
|
+
keyspy --help Show this help message
|
|
106
|
+
`);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Main CLI function that can be called externally
|
|
110
|
+
* @param options Configuration options for the CLI
|
|
111
|
+
* @param args Command line arguments (defaults to process.argv)
|
|
112
|
+
*/
|
|
113
|
+
function run(options = {}, args = process.argv) {
|
|
114
|
+
var _a, _b, _c, _d;
|
|
115
|
+
// Parse command line arguments
|
|
116
|
+
const cliOptions = parseArgs(args);
|
|
117
|
+
// Show help if requested
|
|
118
|
+
if (cliOptions.help) {
|
|
119
|
+
showHelp();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Debug level configuration (CLI args override options, options override env)
|
|
123
|
+
// 0 = minimal (clean table output only)
|
|
124
|
+
// 1 = verbose (+ unknown key detection)
|
|
125
|
+
// 2 = more verbose (+ all debug info)
|
|
126
|
+
// 3 = most verbose (+ detailed debug info)
|
|
127
|
+
const DEBUG_LEVEL = (_b = (_a = cliOptions.debugLevel) !== null && _a !== void 0 ? _a : options.debugLevel) !== null && _b !== void 0 ? _b : Number.parseInt(process.env.KEYSPY_DEBUG || "0");
|
|
128
|
+
// Disable terminal echo to prevent key characters from appearing
|
|
129
|
+
(_d = (_c = process.stdin).setRawMode) === null || _d === void 0 ? void 0 : _d.call(_c, true);
|
|
130
|
+
process.stdin.resume();
|
|
131
|
+
let eventCount = 0;
|
|
132
|
+
const events = [];
|
|
133
|
+
function cleanup() {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
// Restore terminal settings
|
|
136
|
+
(_b = (_a = process.stdin).setRawMode) === null || _b === void 0 ? void 0 : _b.call(_a, false);
|
|
137
|
+
process.stdin.pause();
|
|
138
|
+
// Clear screen and show final summary
|
|
139
|
+
process.stdout.write("\x1b[2J\x1b[H");
|
|
140
|
+
console.log(`\n${colors.cyan}${"=".repeat(60)}${colors.reset}`);
|
|
141
|
+
console.log(`${colors.bright}${colors.white}📊 SESSION SUMMARY${colors.reset}`);
|
|
142
|
+
console.log(`${colors.green} Total events detected: ${eventCount}${colors.reset}`);
|
|
143
|
+
console.log(`${colors.yellow} Thank you for testing keyspy!${colors.reset}`);
|
|
144
|
+
console.log(`${colors.cyan}${"=".repeat(60)}${colors.reset}`);
|
|
145
|
+
process.exit(0);
|
|
146
|
+
}
|
|
147
|
+
// Handle Ctrl+C manually since we're in raw mode
|
|
148
|
+
process.stdin.on("data", (key) => {
|
|
149
|
+
// Ctrl+C is represented as \u0003
|
|
150
|
+
if (key.toString() === "\u0003") {
|
|
151
|
+
console.log(`\n${colors.red}🔴 Ctrl+C received...${colors.reset}`);
|
|
152
|
+
cleanup();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
console.log(`${colors.cyan}${colors.bright}=== keyspy Key Monitor ===${colors.reset}`);
|
|
156
|
+
console.log("Real-time keyboard and mouse event detection");
|
|
157
|
+
console.log(`${colors.gray}Verbose level: ${DEBUG_LEVEL} (set KEYSPY_DEBUG=0-3 to change)${colors.reset}`);
|
|
158
|
+
console.log(`${colors.red}Exit: ESC, Ctrl+C, or CMD+Q${colors.reset}`);
|
|
159
|
+
console.log(`${colors.cyan}==========================================${colors.reset}\n`);
|
|
160
|
+
const listener = new index_1.GlobalKeyboardListener({
|
|
161
|
+
windows: {
|
|
162
|
+
onError: (errorCode) => console.error("ERROR:", errorCode),
|
|
163
|
+
onInfo: (info) => console.info("INFO:", info),
|
|
164
|
+
},
|
|
165
|
+
mac: {
|
|
166
|
+
onError: (errorCode) => console.error("ERROR:", errorCode),
|
|
167
|
+
onInfo: (info) => console.info("INFO:", info),
|
|
168
|
+
},
|
|
169
|
+
x11: {
|
|
170
|
+
onError: (errorCode) => console.error("ERROR:", errorCode),
|
|
171
|
+
onInfo: (info) => console.info("INFO:", info),
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
console.log(`${colors.green}Starting keyboard listener...${colors.reset}`);
|
|
175
|
+
function displayTable() {
|
|
176
|
+
// Clear screen and move cursor to top
|
|
177
|
+
process.stdout.write("\x1b[2J\x1b[H");
|
|
178
|
+
// Show header
|
|
179
|
+
console.log(`${colors.cyan}${colors.bright}=== keyspy Key Monitor ===${colors.reset}`);
|
|
180
|
+
console.log("Real-time keyboard and mouse event detection");
|
|
181
|
+
console.log(`${colors.gray}Verbose level: ${DEBUG_LEVEL}${colors.reset}`);
|
|
182
|
+
console.log(`${colors.red}Exit: ESC, Ctrl+C, or CMD+Q${colors.reset}`);
|
|
183
|
+
console.log(`${colors.cyan}${"=".repeat(50)}${colors.reset}\n`);
|
|
184
|
+
// Create table with no borders - just for column alignment
|
|
185
|
+
const table = new cli_table3_1.default({
|
|
186
|
+
head: ["#", "Time", "State", "Key Name", "Mods", "Raw Key", "Loc", "vKey"],
|
|
187
|
+
colWidths: [5, 10, 6, 18, 14, 22, 14, 6],
|
|
188
|
+
style: {
|
|
189
|
+
head: ["cyan"],
|
|
190
|
+
border: [],
|
|
191
|
+
compact: true,
|
|
192
|
+
"padding-left": 0,
|
|
193
|
+
"padding-right": 1,
|
|
194
|
+
},
|
|
195
|
+
chars: {
|
|
196
|
+
top: "",
|
|
197
|
+
"top-mid": "",
|
|
198
|
+
"top-left": "",
|
|
199
|
+
"top-right": "",
|
|
200
|
+
bottom: "",
|
|
201
|
+
"bottom-mid": "",
|
|
202
|
+
"bottom-left": "",
|
|
203
|
+
"bottom-right": "",
|
|
204
|
+
left: "",
|
|
205
|
+
"left-mid": "",
|
|
206
|
+
mid: "",
|
|
207
|
+
"mid-mid": "",
|
|
208
|
+
right: "",
|
|
209
|
+
"right-mid": "",
|
|
210
|
+
middle: " ",
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
if (events.length === 0) {
|
|
214
|
+
// Show empty table with placeholder
|
|
215
|
+
table.push(["", "", "", "Waiting for key events...", "", "", "", ""]);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Add recent events (last 20)
|
|
219
|
+
const recentEvents = events.slice(-20);
|
|
220
|
+
for (const event of recentEvents) {
|
|
221
|
+
const stateColor = event.state === "DOWN" ? colors.green : colors.red;
|
|
222
|
+
// Abbreviate state if needed to fit in column
|
|
223
|
+
const stateDisplay = event.state === "DOWN" ? "DN" : "UP";
|
|
224
|
+
table.push([
|
|
225
|
+
`${colors.dim}#${event.count}${colors.reset}`,
|
|
226
|
+
`${colors.gray}${event.time}${colors.reset}`,
|
|
227
|
+
`${stateColor}${stateDisplay}${colors.reset}`,
|
|
228
|
+
event.keyName,
|
|
229
|
+
`${colors.blue}${event.modifiers}${colors.reset}`,
|
|
230
|
+
`${colors.gray}${event.rawKey}${colors.reset}`,
|
|
231
|
+
`${colors.dim}${event.location}${colors.reset}`,
|
|
232
|
+
`${colors.yellow}${event.vKey}${colors.reset}`,
|
|
233
|
+
]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
console.log(table.toString());
|
|
237
|
+
if (events.length > 20) {
|
|
238
|
+
console.log(`${colors.dim}... showing last 20 of ${events.length} events${colors.reset}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
listener
|
|
242
|
+
.addListener((e, down) => {
|
|
243
|
+
var _a;
|
|
244
|
+
eventCount++;
|
|
245
|
+
// Format event information
|
|
246
|
+
const timestamp = new Date().toLocaleTimeString("en-US", { hour12: false });
|
|
247
|
+
const keyName = e.name || "UNKNOWN";
|
|
248
|
+
const rawName = ((_a = e.rawKey) === null || _a === void 0 ? void 0 : _a._nameRaw) || "N/A";
|
|
249
|
+
const location = e.location
|
|
250
|
+
? `${e.location[0].toFixed(1)},${e.location[1].toFixed(1)}`
|
|
251
|
+
: "0.0,0.0";
|
|
252
|
+
const vKey = e.vKey !== undefined ? `0x${e.vKey.toString(16).toUpperCase().padStart(2, "0")}` : "N/A";
|
|
253
|
+
// Show currently pressed modifier keys using standard Unicode symbols
|
|
254
|
+
const modifiers = [];
|
|
255
|
+
if (down["LEFT SHIFT"] || down["RIGHT SHIFT"])
|
|
256
|
+
modifiers.push("⇧");
|
|
257
|
+
if (down["LEFT CTRL"] || down["RIGHT CTRL"])
|
|
258
|
+
modifiers.push("⌃");
|
|
259
|
+
if (down["LEFT ALT"] || down["RIGHT ALT"])
|
|
260
|
+
modifiers.push("⌥");
|
|
261
|
+
if (down["LEFT META"] || down["RIGHT META"])
|
|
262
|
+
modifiers.push("⌘");
|
|
263
|
+
if (down["CAPS LOCK"])
|
|
264
|
+
modifiers.push("⇪");
|
|
265
|
+
if (down.FN)
|
|
266
|
+
modifiers.push("Fn");
|
|
267
|
+
const modText = modifiers.length > 0 ? modifiers.join("+") : "";
|
|
268
|
+
// Store event data
|
|
269
|
+
events.push({
|
|
270
|
+
time: timestamp,
|
|
271
|
+
state: e.state,
|
|
272
|
+
count: eventCount,
|
|
273
|
+
keyName: keyName,
|
|
274
|
+
modifiers: modText,
|
|
275
|
+
rawKey: rawName,
|
|
276
|
+
location: location,
|
|
277
|
+
vKey: vKey,
|
|
278
|
+
});
|
|
279
|
+
// Update display
|
|
280
|
+
displayTable();
|
|
281
|
+
// Only show debug info if explicitly requested
|
|
282
|
+
if (DEBUG_LEVEL >= 1) {
|
|
283
|
+
// Handle UNKNOWN keys - show them clearly with their key codes
|
|
284
|
+
if (keyName === "UNKNOWN") {
|
|
285
|
+
console.log(`${colors.red}❓ UNKNOWN key detected - vKey: ${vKey}, Raw: ${rawName}${colors.reset}`);
|
|
286
|
+
console.log(`${colors.red} This key is not in our lookup table but was captured successfully${colors.reset}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Level 2: Show all events with basic info
|
|
290
|
+
if (DEBUG_LEVEL >= 2) {
|
|
291
|
+
console.log(`${colors.dim}[${timestamp}] ${e.state} ${keyName} (vKey: ${vKey}, scanCode: ${e.scanCode})${colors.reset}`);
|
|
292
|
+
}
|
|
293
|
+
// Level 3: Show detailed event information
|
|
294
|
+
if (DEBUG_LEVEL >= 3) {
|
|
295
|
+
console.log(`${colors.dim}Raw event data:${colors.reset}`);
|
|
296
|
+
console.log(`${colors.dim} _raw: ${e._raw}${colors.reset}`);
|
|
297
|
+
console.log(`${colors.dim} rawKey: ${JSON.stringify(e.rawKey)}${colors.reset}`);
|
|
298
|
+
console.log(`${colors.dim} location: ${JSON.stringify(e.location)}${colors.reset}`);
|
|
299
|
+
console.log(`${colors.dim} down map: ${JSON.stringify(down)}${colors.reset}`);
|
|
300
|
+
}
|
|
301
|
+
// Exit conditions
|
|
302
|
+
if (e.state === "DOWN" && e.name === "ESCAPE") {
|
|
303
|
+
console.log(`\n${colors.red}🔴 ESC pressed - Exiting...${colors.reset}`);
|
|
304
|
+
cleanup();
|
|
305
|
+
}
|
|
306
|
+
if (e.state === "DOWN" && e.name === "Q" && (down["LEFT META"] || down["RIGHT META"])) {
|
|
307
|
+
console.log(`\n${colors.red}🔴 CMD+Q pressed - Exiting...${colors.reset}`);
|
|
308
|
+
cleanup();
|
|
309
|
+
}
|
|
310
|
+
// Additional Ctrl+C detection through keyboard listener
|
|
311
|
+
if (e.state === "DOWN" && e.name === "C" && (down["LEFT CTRL"] || down["RIGHT CTRL"])) {
|
|
312
|
+
console.log(`\n${colors.red}🔴 Ctrl+C detected - Exiting...${colors.reset}`);
|
|
313
|
+
cleanup();
|
|
314
|
+
}
|
|
315
|
+
// Don't block other events
|
|
316
|
+
return false;
|
|
317
|
+
})
|
|
318
|
+
.then(() => {
|
|
319
|
+
// Initial display
|
|
320
|
+
displayTable();
|
|
321
|
+
console.log(`${colors.green}✅ Listener started - Press keys to see events${colors.reset}\n`);
|
|
322
|
+
})
|
|
323
|
+
.catch((e) => {
|
|
324
|
+
console.error("❌ Failed to start keyboard listener:", e);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
});
|
|
327
|
+
// Handle process exit signals (this won't work in raw mode, but keep for safety)
|
|
328
|
+
process.on("SIGINT", () => {
|
|
329
|
+
console.log(`\n${colors.red}🔴 Ctrl+C signal received...${colors.reset}`);
|
|
330
|
+
cleanup();
|
|
331
|
+
});
|
|
332
|
+
process.on("SIGTERM", () => {
|
|
333
|
+
console.log("\n🔴 Termination signal received...");
|
|
334
|
+
cleanup();
|
|
335
|
+
});
|
|
336
|
+
// Handle uncaught exceptions
|
|
337
|
+
process.on("uncaughtException", (error) => {
|
|
338
|
+
console.error("\n❌ Exception:", error.message);
|
|
339
|
+
cleanup();
|
|
340
|
+
});
|
|
341
|
+
process.on("unhandledRejection", (reason) => {
|
|
342
|
+
console.error("\n❌ Rejection:", reason);
|
|
343
|
+
cleanup();
|
|
344
|
+
});
|
|
345
|
+
// Handle terminal close
|
|
346
|
+
process.on("exit", () => {
|
|
347
|
+
var _a, _b;
|
|
348
|
+
// Restore terminal settings on any exit
|
|
349
|
+
(_b = (_a = process.stdin).setRawMode) === null || _b === void 0 ? void 0 : _b.call(_a, false);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
// Check if this module is being run directly (not via bin script)
|
|
353
|
+
// When run via bin/keyspy, the bin script will call run() explicitly
|
|
354
|
+
// When run directly with node dist/cli.js, we should call run()
|
|
355
|
+
const isDirectRun = require.main === module && !((_a = process.argv[1]) === null || _a === void 0 ? void 0 : _a.endsWith('bin/keyspy'));
|
|
356
|
+
if (isDirectRun) {
|
|
357
|
+
run({}, process.argv);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUEwR0Esa0JBd1JDO0FBbFlELG1DQUFpRDtBQUNqRCw0REFBK0I7QUFFL0IscUNBQXFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsS0FBSyxFQUFFLFNBQVM7SUFDaEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxVQUFVO0lBQ2hCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLElBQUksRUFBRSxVQUFVO0lBQ2hCLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLE1BQU0sRUFBRSxVQUFVO0NBQ25CLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxPQUFpQixPQUFPLENBQUMsSUFBSTtJQUM5QyxNQUFNLE9BQU8sR0FBNEMsRUFBRSxDQUFDO0lBRTVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBCLElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hC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
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { IConfig } from "./
|
|
2
|
-
import type { IGlobalKeyListener } from "./
|
|
3
|
-
import type { IGlobalKeyServer } from "./
|
|
4
|
-
export * from "./
|
|
5
|
-
export * from "./
|
|
6
|
-
export * from "./
|
|
7
|
-
export * from "./
|
|
8
|
-
export * from "./
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
1
|
+
import type { IConfig } from "./types/IConfig";
|
|
2
|
+
import type { IGlobalKeyListener } from "./types/IGlobalKeyListener";
|
|
3
|
+
import type { IGlobalKeyServer } from "./types/IGlobalKeyServer";
|
|
4
|
+
export * from "./types/IGlobalKeyListener";
|
|
5
|
+
export * from "./types/IGlobalKeyEvent";
|
|
6
|
+
export * from "./types/IGlobalKey";
|
|
7
|
+
export * from "./types/IGlobalKeyDownMap";
|
|
8
|
+
export * from "./types/IWindowsConfig";
|
|
9
|
+
export * from "./types/IConfig";
|
|
10
|
+
export * from "./types/IGlobalKeyResult";
|
|
11
11
|
/**
|
|
12
12
|
* A cross-platform global keyboard listener. Ideal for setting up global keyboard shortcuts
|
|
13
13
|
* and key-loggers (usually for automation).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AAEzC;;;;;;GAMG;AACH,qBAAa,sBAAsB;IACjC,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,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAK;IAErD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAE3C;;;OAGG;gBACgB,MAAM,GAAE,OAAY;IAyBvC;;;;OAIG;IACU,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;;OAGG;IACI,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAWzD,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;CACH"}
|