nyashare 0.0.1

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 ADDED
@@ -0,0 +1,136 @@
1
+ # NyaShare
2
+
3
+ A CLI tool to share files over your local network. No internet required - just connect to the same WiFi router!
4
+
5
+ ## Features
6
+
7
+ โœจ **Zero Configuration** - Automatically discovers devices on your network
8
+ ๐Ÿ“ **File & Folder Sharing** - Send individual files or entire directories
9
+ ๐ŸŒ **Web UI** - Access through any browser at `http://IP:PORT/share`
10
+ ๐Ÿ”’ **Local Only** - Files never leave your local network
11
+ ๐Ÿ“ฑ **Cross-Platform** - Works on macOS, Linux, and Windows
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install
17
+ npm run build
18
+ npm link # Makes 'nyashare' command available globally
19
+ ```
20
+
21
+ Or run locally:
22
+ ```bash
23
+ npm install
24
+ npm run build
25
+ node dist/cli.js
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ### Interactive Mode (Recommended)
31
+
32
+ Simply run:
33
+ ```bash
34
+ nyashare
35
+ ```
36
+
37
+ This starts the server and opens an interactive CLI where you can:
38
+ - Send files to discovered devices
39
+ - List available devices on the network
40
+ - Open the web UI in your browser
41
+
42
+ ### Send Files via CLI
43
+
44
+ ```bash
45
+ # Send a file
46
+ nyashare send /path/to/file.pdf
47
+
48
+ # Send a folder
49
+ nyashare send /path/to/folder
50
+ ```
51
+
52
+ ### Web Interface
53
+
54
+ Access the web UI from any device on your network:
55
+ ```
56
+ http://<YOUR_IP>:3000/share
57
+ ```
58
+
59
+ The CLI will display the exact URL when it starts.
60
+
61
+ ## How It Works
62
+
63
+ 1. **Discovery**: Uses UDP broadcast to find other devices running NyaShare on the same network
64
+ 2. **Server**: Each device runs an Express server to handle file uploads/downloads
65
+ 3. **Transfer**: Files are sent directly from device to device over HTTP
66
+ 4. **Storage**: Received files are saved to `~/Downloads/nyashare/uploads/`
67
+
68
+ ## Commands
69
+
70
+ | Command | Description |
71
+ |---------|-------------|
72
+ | `nyashare` | Start interactive mode |
73
+ | `nyashare start` | Start the server and CLI (same as above) |
74
+ | `nyashare send <path>` | Send a file or folder to another device |
75
+ | `nyashare --help` | Show help information |
76
+ | `nyashare --version` | Show version number |
77
+
78
+ ## Network Requirements
79
+
80
+ - All devices must be connected to the **same local network** (same router)
81
+ - No internet connection required
82
+ - Firewall must allow traffic on port 3000 (auto-configured) and UDP port 41234
83
+
84
+ ## Project Structure
85
+
86
+ ```
87
+ nyashare/
88
+ โ”œโ”€โ”€ src/
89
+ โ”‚ โ”œโ”€โ”€ cli.ts # CLI interface & commands
90
+ โ”‚ โ”œโ”€โ”€ server.ts # Express server & file handling
91
+ โ”‚ โ”œโ”€โ”€ discovery.ts # UDP device discovery
92
+ โ”‚ โ”œโ”€โ”€ transfer.ts # File transfer logic
93
+ โ”‚ โ””โ”€โ”€ types.ts # TypeScript interfaces
94
+ โ”œโ”€โ”€ public/
95
+ โ”‚ โ”œโ”€โ”€ index.html # Landing page
96
+ โ”‚ โ””โ”€โ”€ share.html # File sharing web UI
97
+ โ”œโ”€โ”€ dist/ # Compiled JavaScript
98
+ โ””โ”€โ”€ package.json
99
+ ```
100
+
101
+ ## Development
102
+
103
+ ```bash
104
+ # Run in development mode
105
+ npm run dev
106
+
107
+ # Build TypeScript
108
+ npm run build
109
+
110
+ # Run type checking
111
+ npm run typecheck
112
+
113
+ # Run linting
114
+ npm run lint
115
+ ```
116
+
117
+ ## Troubleshooting
118
+
119
+ **No devices found?**
120
+ - Make sure all devices are on the same WiFi network
121
+ - Check that firewall isn't blocking UDP port 41234
122
+ - Try restarting the CLI on all devices
123
+
124
+ **Can't access web UI?**
125
+ - Verify the IP address shown in the CLI
126
+ - Check if port 3000 is available or if another service is using it
127
+ - The CLI automatically finds an available port if 3000 is taken
128
+
129
+ **File transfers failing?**
130
+ - Ensure both devices are still running nyashare
131
+ - Check disk space on the receiving device
132
+ - For large files, ensure stable network connection
133
+
134
+ ## License
135
+
136
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,368 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const inquirer_1 = __importDefault(require("inquirer"));
43
+ const path_1 = __importDefault(require("path"));
44
+ const fs_extra_1 = __importDefault(require("fs-extra"));
45
+ const os_1 = __importDefault(require("os"));
46
+ const ora_1 = __importDefault(require("ora"));
47
+ const server_1 = require("./server");
48
+ const discovery_1 = require("./discovery");
49
+ const transfer_1 = require("./transfer");
50
+ const program = new commander_1.Command();
51
+ function getDeviceName() {
52
+ return os_1.default.hostname();
53
+ }
54
+ function getDownloadDir() {
55
+ return path_1.default.join(os_1.default.homedir(), 'Downloads', 'nyashare');
56
+ }
57
+ function expandPath(inputPath) {
58
+ if (inputPath.startsWith('~/')) {
59
+ return path_1.default.join(os_1.default.homedir(), inputPath.slice(2));
60
+ }
61
+ if (inputPath === '~') {
62
+ return os_1.default.homedir();
63
+ }
64
+ return inputPath;
65
+ }
66
+ async function getAllFiles(dirPath) {
67
+ const files = [];
68
+ const stat = await fs_extra_1.default.stat(dirPath);
69
+ if (stat.isDirectory()) {
70
+ const entries = await fs_extra_1.default.readdir(dirPath, { withFileTypes: true });
71
+ for (const entry of entries) {
72
+ const fullPath = path_1.default.join(dirPath, entry.name);
73
+ if (entry.isDirectory()) {
74
+ const subFiles = await getAllFiles(fullPath);
75
+ files.push(...subFiles);
76
+ }
77
+ else {
78
+ files.push(fullPath);
79
+ }
80
+ }
81
+ }
82
+ else {
83
+ files.push(dirPath);
84
+ }
85
+ return files;
86
+ }
87
+ async function startServer() {
88
+ const config = {
89
+ port: 3000,
90
+ deviceName: getDeviceName(),
91
+ downloadDir: getDownloadDir()
92
+ };
93
+ const net = await Promise.resolve().then(() => __importStar(require('net')));
94
+ const findAvailablePort = (startPort) => {
95
+ return new Promise((resolve) => {
96
+ const server = net.createServer();
97
+ server.listen(startPort, () => {
98
+ const port = server.address().port;
99
+ server.close(() => resolve(port));
100
+ });
101
+ server.on('error', () => {
102
+ findAvailablePort(startPort + 1).then(resolve);
103
+ });
104
+ });
105
+ };
106
+ config.port = await findAvailablePort(config.port);
107
+ const server = new server_1.ShareServer(config);
108
+ await server.start();
109
+ const discovery = new discovery_1.DeviceDiscovery(config.deviceName, config.port);
110
+ await discovery.start();
111
+ return { server, discovery };
112
+ }
113
+ program
114
+ .name('nyashare')
115
+ .description('CLI tool to quick share files over local network')
116
+ .version('0.0.1');
117
+ program
118
+ .command('start')
119
+ .description('start the nyashare server and CLI')
120
+ .action(async () => {
121
+ const ear = chalk_1.default.blue.dim;
122
+ const body = chalk_1.default.blue;
123
+ console.log(`${ear("โ—ค")} ${ear("โ—ฅ")}
124
+ ${body("โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ")} ${body("nyashare")}
125
+ ${body("โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ–ˆโ–ˆ")} ${ear("v0.0.1")}
126
+ ${body("โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ")}
127
+ ${body("โ–ˆโ–ˆโ–ˆ โ–ˆ")}
128
+ ${body("โ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆ")}
129
+ `);
130
+ const spinner = (0, ora_1.default)(chalk_1.default.yellow('initializing server...')).start();
131
+ const { server, discovery } = await startServer();
132
+ spinner.succeed(chalk_1.default.green('server started'));
133
+ const localIp = discovery.getLocalAddress();
134
+ const port = 3000;
135
+ console.log(chalk_1.default.green('running'), chalk_1.default.blue('nyashare'), chalk_1.default.green(`on ${chalk_1.default.blue.underline(getDeviceName())}`));
136
+ console.log(chalk_1.default.gray(`share files through CLI or go to ${chalk_1.default.underline(`http://${localIp}:${port}/share\n`)}`));
137
+ const showPrompt = async () => {
138
+ const { action } = await inquirer_1.default.prompt([{
139
+ type: 'list',
140
+ name: 'action',
141
+ message: 'select an action',
142
+ choices: [
143
+ { name: '๐Ÿ“ค send files/folders', value: 'send' },
144
+ { name: '๐Ÿ‘ฅ list active devices on network', value: 'devices' },
145
+ { name: '๐ŸŒ open web UI for sharing', value: 'web' },
146
+ { name: 'โŒ exit', value: 'exit' }
147
+ ]
148
+ }]);
149
+ if (action === 'exit') {
150
+ console.log(chalk_1.default.yellow('\nclosing'), chalk_1.default.blue('nyashare'));
151
+ discovery.stop();
152
+ server.stop();
153
+ process.exit(0);
154
+ }
155
+ else if (action === 'web') {
156
+ const open = await Promise.resolve().then(() => __importStar(require('open')));
157
+ await open.default(`http://${localIp}:${port}/share`);
158
+ console.log(chalk_1.default.blue(`\n๐ŸŒ opening http://${localIp}:${port}/share in your browser.\n`));
159
+ showPrompt();
160
+ }
161
+ else if (action === 'devices') {
162
+ const devices = discovery.getDevices();
163
+ if (devices.length === 0) {
164
+ console.log(chalk_1.default.yellow('\nโš ๏ธ no devices found on the network.\n'));
165
+ }
166
+ else {
167
+ console.log(chalk_1.default.blue('\n๐Ÿ“ฑ available devices:'));
168
+ devices.forEach((device, i) => {
169
+ console.log(` ${i + 1}. ${chalk_1.default.bold(device.name)} (${device.ip}:${device.port})`);
170
+ });
171
+ console.log('');
172
+ }
173
+ showPrompt();
174
+ }
175
+ else if (action === 'send') {
176
+ const { filePath } = await inquirer_1.default.prompt([{
177
+ type: 'input',
178
+ name: 'filePath',
179
+ message: 'enter file or folder path to send:',
180
+ validate: async (input) => {
181
+ const expanded = expandPath(input);
182
+ const resolved = path_1.default.resolve(expanded);
183
+ try {
184
+ await fs_extra_1.default.access(resolved);
185
+ return true;
186
+ }
187
+ catch {
188
+ return 'path does not exist. please enter a valid path.';
189
+ }
190
+ }
191
+ }]);
192
+ const expandedPath = expandPath(filePath);
193
+ const resolvedPath = path_1.default.resolve(expandedPath);
194
+ const files = await getAllFiles(resolvedPath);
195
+ if (files.length === 0) {
196
+ console.log(chalk_1.default.yellow('\nโš ๏ธ no files found to send.\n'));
197
+ showPrompt();
198
+ return;
199
+ }
200
+ console.log(chalk_1.default.cyan(`\n๐Ÿ“ found ${files.length} file(s) to send\n`));
201
+ // Wait a moment for discovery to find devices
202
+ await new Promise(resolve => setTimeout(resolve, 2000));
203
+ let devices = discovery.getDevices();
204
+ let targetDevice = null;
205
+ if (devices.length === 0) {
206
+ console.log(chalk_1.default.yellow('โš ๏ธ no devices found on the network.\n'));
207
+ const { manualEntry } = await inquirer_1.default.prompt([{
208
+ type: 'confirm',
209
+ name: 'manualEntry',
210
+ message: 'would you like to manually enter device IP? (useful for android/termux)',
211
+ default: true
212
+ }]);
213
+ if (manualEntry) {
214
+ const { ip, port } = await inquirer_1.default.prompt([{
215
+ type: 'input',
216
+ name: 'ip',
217
+ message: 'enter device IP address:',
218
+ validate: (input) => {
219
+ if (/^(\d{1,3}\.){3}\d{1,3}$/.test(input))
220
+ return true;
221
+ return 'please enter a valid IP address (e.g., 192.168.2.100)';
222
+ }
223
+ }, {
224
+ type: 'input',
225
+ name: 'port',
226
+ message: 'enter device port (usually 3000):',
227
+ default: '3000',
228
+ validate: (input) => {
229
+ const port = parseInt(input);
230
+ if (port > 0 && port < 65536)
231
+ return true;
232
+ return 'please enter a valid port number';
233
+ }
234
+ }]);
235
+ targetDevice = {
236
+ id: `${ip}:${port}`,
237
+ name: 'manual device',
238
+ ip: ip,
239
+ port: parseInt(port),
240
+ lastSeen: new Date()
241
+ };
242
+ }
243
+ else {
244
+ console.log(chalk_1.default.yellow('waiting 5 seconds for discovery...\n'));
245
+ await new Promise(resolve => setTimeout(resolve, 5000));
246
+ devices = discovery.getDevices();
247
+ if (devices.length === 0) {
248
+ console.log(chalk_1.default.red('โŒ still no devices found. make sure other devices are running nyashare.\n'));
249
+ showPrompt();
250
+ return;
251
+ }
252
+ }
253
+ }
254
+ if (!targetDevice) {
255
+ const currentDevices = discovery.getDevices();
256
+ const choices = currentDevices.map((device, _index) => ({
257
+ name: `${device.name} (${device.ip})`,
258
+ value: device
259
+ }));
260
+ const result = await inquirer_1.default.prompt([{
261
+ type: 'list',
262
+ name: 'targetDevice',
263
+ message: 'choose a device to send files to:',
264
+ choices
265
+ }]);
266
+ targetDevice = result.targetDevice;
267
+ }
268
+ if (!targetDevice) {
269
+ console.log(chalk_1.default.red('โŒ no device selected.\n'));
270
+ showPrompt();
271
+ return;
272
+ }
273
+ console.log(chalk_1.default.cyan(`\n๐Ÿ“ค sending ${files.length} file(s) to ${chalk_1.default.bold(targetDevice.name)} (${targetDevice.ip})...\n`));
274
+ const transferService = new transfer_1.FileTransferService();
275
+ let completed = 0;
276
+ try {
277
+ await transferService.sendFiles(files, targetDevice, (transfer) => {
278
+ if (transfer.status === 'completed') {
279
+ completed++;
280
+ process.stdout.write(`\r${chalk_1.default.green('โต')} Progress: ${completed}/${files.length} files completed`);
281
+ }
282
+ });
283
+ console.log(chalk_1.default.green(`\n\nโœ… successfully sent ${files.length} file(s) to ${targetDevice.name}!\n`));
284
+ }
285
+ catch (error) {
286
+ console.error(chalk_1.default.red(`\n\nโŒ failed to send files: ${error}\n`));
287
+ }
288
+ showPrompt();
289
+ }
290
+ };
291
+ showPrompt();
292
+ });
293
+ /**
294
+ program
295
+ .command('send <path>')
296
+ .description('send a file or folder to a device')
297
+ .action(async (filePath: string) => {
298
+ const expandedPath = expandPath(filePath);
299
+ const resolvedPath = path.resolve(expandedPath);
300
+
301
+ try {
302
+ await fs.access(resolvedPath);
303
+ } catch {
304
+ console.error(chalk.red(`โŒ path does not exist: ${filePath}`));
305
+ process.exit(1);
306
+ }
307
+
308
+ const spinner = ora('starting server...').start();
309
+ const { server, discovery } = await startServer();
310
+ spinner.succeed('server started');
311
+
312
+ const files = await getAllFiles(resolvedPath);
313
+ console.log(chalk.cyan(`๐Ÿ“ found ${files.length} file(s) to send`));
314
+
315
+ await new Promise(resolve => setTimeout(resolve, 3000));
316
+
317
+ const devices = discovery.getDevices();
318
+
319
+ if (devices.length === 0) {
320
+ console.log(chalk.yellow('\nโš ๏ธ no devices found. waiting 10 seconds...'));
321
+ await new Promise(resolve => setTimeout(resolve, 10000));
322
+
323
+ const updatedDevices = discovery.getDevices();
324
+ if (updatedDevices.length === 0) {
325
+ console.error(chalk.red('\nโŒ no devices found. make sure other devices are running nyashare.'));
326
+ discovery.stop();
327
+ server.stop();
328
+ process.exit(1);
329
+ }
330
+ }
331
+
332
+ const currentDevices = discovery.getDevices();
333
+ const choices = currentDevices.map(device => ({
334
+ name: `${device.name} (${device.ip})`,
335
+ value: device
336
+ }));
337
+
338
+ const { targetDevice } = await inquirer.prompt([{
339
+ type: 'list',
340
+ name: 'targetDevice',
341
+ message: 'choose a device to send to:',
342
+ choices
343
+ }]);
344
+
345
+ console.log(chalk.cyan(`\n๐Ÿ“ค sending to ${targetDevice.name}...`));
346
+
347
+ const transferService = new FileTransferService();
348
+ const transfers = await transferService.sendFiles(files, targetDevice, (transfer) => {
349
+ if (transfer.progress % 10 === 0) {
350
+ process.stdout.write(`\r${transfer.filename}: ${transfer.progress}%`);
351
+ }
352
+ });
353
+
354
+ console.log(chalk.green(`\nโœ… sent ${transfers.length} file(s) successfully!`));
355
+
356
+ discovery.stop();
357
+ server.stop();
358
+ process.exit(0);
359
+ });
360
+
361
+ */
362
+ if (process.argv.length === 2) {
363
+ program.parse(['node', 'cli', 'start']);
364
+ }
365
+ else {
366
+ program.parse();
367
+ }
368
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const dgram_1 = require("dgram");
4
+ const os_1 = require("os");
5
+ const DISCOVERY_PORT = 41234;
6
+ const TEST_MESSAGE = 'NYASHARE_TEST';
7
+ console.log('๐Ÿ” NyaShare Discovery Diagnostic\n');
8
+ // List all network interfaces
9
+ console.log('๐Ÿ“ก Network Interfaces:');
10
+ const nets = (0, os_1.networkInterfaces)();
11
+ const ipv4Interfaces = [];
12
+ for (const name of Object.keys(nets)) {
13
+ for (const net of nets[name] || []) {
14
+ if (net.family === 'IPv4') {
15
+ console.log(` ${name}: ${net.address} ${net.internal ? '(internal)' : '(external)'}`);
16
+ if (!net.internal) {
17
+ ipv4Interfaces.push({ name, address: net.address, internal: net.internal });
18
+ }
19
+ }
20
+ }
21
+ }
22
+ console.log('\n๐ŸŽฏ External IPv4 interfaces found:', ipv4Interfaces.length);
23
+ // Test UDP broadcast
24
+ console.log('\n๐Ÿงช Testing UDP broadcast...');
25
+ const socket = (0, dgram_1.createSocket)({ type: 'udp4', reuseAddr: true });
26
+ socket.on('message', (msg, rinfo) => {
27
+ console.log(`\nโœ… Received message from ${rinfo.address}:${rinfo.port}: ${msg.toString()}`);
28
+ });
29
+ socket.on('error', (err) => {
30
+ console.error(`\nโŒ Socket error: ${err.message}`);
31
+ });
32
+ socket.bind(DISCOVERY_PORT, () => {
33
+ console.log(`โœ… Socket bound to port ${DISCOVERY_PORT}`);
34
+ try {
35
+ socket.setBroadcast(true);
36
+ console.log('โœ… Broadcast mode enabled');
37
+ // Send test broadcast
38
+ const message = `${TEST_MESSAGE}|TestDevice|3000`;
39
+ socket.send(message, DISCOVERY_PORT, '255.255.255.255', (err) => {
40
+ if (err) {
41
+ console.error('โŒ Failed to send broadcast:', err.message);
42
+ }
43
+ else {
44
+ console.log('๐Ÿ“ค Test broadcast sent to 255.255.255.255');
45
+ console.log(' (If you run this on another device, you should see the message above)');
46
+ }
47
+ });
48
+ // Also try broadcasting on specific interface
49
+ if (ipv4Interfaces.length > 0) {
50
+ const mainInterface = ipv4Interfaces.find(i => !i.name.startsWith('br-') && !i.name.startsWith('docker')) || ipv4Interfaces[0];
51
+ console.log(`\n๐Ÿ“ค Also sending on interface ${mainInterface.name} (${mainInterface.address})`);
52
+ const broadcastAddr = mainInterface.address.replace(/\.\d+$/, '.255');
53
+ socket.send(message, DISCOVERY_PORT, broadcastAddr, (err) => {
54
+ if (err) {
55
+ console.error('โŒ Failed to send subnet broadcast:', err.message);
56
+ }
57
+ else {
58
+ console.log(`โœ… Subnet broadcast sent to ${broadcastAddr}`);
59
+ }
60
+ });
61
+ }
62
+ console.log('\nโณ Listening for messages for 10 seconds...');
63
+ console.log(' (Run this script on another device to test discovery)\n');
64
+ }
65
+ catch (err) {
66
+ console.error('โŒ Error:', err.message);
67
+ }
68
+ });
69
+ // Keep alive for 10 seconds
70
+ setTimeout(() => {
71
+ console.log('\n๐Ÿ›‘ Closing socket...');
72
+ socket.close();
73
+ process.exit(0);
74
+ }, 10000);
75
+ //# sourceMappingURL=diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Device } from './types';
2
+ import { EventEmitter } from 'events';
3
+ export declare class DeviceDiscovery extends EventEmitter {
4
+ private socket;
5
+ private devices;
6
+ private broadcastInterval;
7
+ private deviceName;
8
+ private port;
9
+ private localIp;
10
+ private debug;
11
+ private boundPort;
12
+ constructor(deviceName: string, port: number);
13
+ private log;
14
+ private getLocalIp;
15
+ private getBroadcastAddress;
16
+ start(): Promise<void>;
17
+ private tryBind;
18
+ private startBroadcasting;
19
+ private sendDiscoveryResponse;
20
+ getLocalAddress(): string;
21
+ getDevices(): Device[];
22
+ stop(): void;
23
+ }
24
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,SAAS,CAA0B;gBAE/B,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAO5C,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,mBAAmB;IASrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqE5B,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,qBAAqB;IAK7B,eAAe,IAAI,MAAM;IAIzB,UAAU,IAAI,MAAM,EAAE;IAUtB,IAAI,IAAI,IAAI;CAMb"}