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 +136 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +368 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostic.d.ts +2 -0
- package/dist/diagnostic.d.ts.map +1 -0
- package/dist/diagnostic.js +75 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/discovery.d.ts +24 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +188 -0
- package/dist/discovery.js.map +1 -0
- package/dist/drawing.d.ts +49 -0
- package/dist/drawing.d.ts.map +1 -0
- package/dist/drawing.js +167 -0
- package/dist/drawing.js.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +169 -0
- package/dist/server.js.map +1 -0
- package/dist/transfer.d.ts +8 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +86 -0
- package/dist/transfer.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|