pal-explorer-cli 0.4.12 → 0.4.14
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 +149 -149
- package/bin/pal.js +77 -4
- package/extensions/@palexplorer/analytics/extension.json +20 -1
- package/extensions/@palexplorer/analytics/index.js +19 -9
- package/extensions/@palexplorer/audit/extension.json +14 -0
- package/extensions/@palexplorer/auth-email/extension.json +15 -0
- package/extensions/@palexplorer/auth-oauth/extension.json +15 -0
- package/extensions/@palexplorer/chat/extension.json +14 -0
- package/extensions/@palexplorer/discovery/extension.json +17 -0
- package/extensions/@palexplorer/discovery/index.js +1 -1
- package/extensions/@palexplorer/email-notifications/extension.json +23 -0
- package/extensions/@palexplorer/groups/extension.json +15 -0
- package/extensions/@palexplorer/share-links/extension.json +15 -0
- package/extensions/@palexplorer/sync/extension.json +16 -0
- package/extensions/@palexplorer/user-mgmt/extension.json +15 -0
- package/lib/capabilities.js +24 -24
- package/lib/commands/analytics.js +175 -175
- package/lib/commands/api-keys.js +131 -131
- package/lib/commands/audit.js +235 -235
- package/lib/commands/auth.js +137 -137
- package/lib/commands/backup.js +76 -76
- package/lib/commands/billing.js +148 -148
- package/lib/commands/chat.js +217 -217
- package/lib/commands/cloud-backup.js +231 -231
- package/lib/commands/comment.js +99 -99
- package/lib/commands/completion.js +265 -203
- package/lib/commands/compliance.js +218 -218
- package/lib/commands/config.js +136 -136
- package/lib/commands/connect.js +44 -44
- package/lib/commands/dept.js +294 -294
- package/lib/commands/device.js +146 -146
- package/lib/commands/download.js +240 -226
- package/lib/commands/explorer.js +178 -178
- package/lib/commands/extension.js +1060 -970
- package/lib/commands/favorite.js +90 -90
- package/lib/commands/federation.js +270 -270
- package/lib/commands/file.js +533 -533
- package/lib/commands/group.js +271 -271
- package/lib/commands/gui-share.js +29 -29
- package/lib/commands/init.js +61 -61
- package/lib/commands/invite.js +59 -59
- package/lib/commands/list.js +58 -58
- package/lib/commands/log.js +116 -116
- package/lib/commands/nearby.js +108 -108
- package/lib/commands/network.js +251 -251
- package/lib/commands/notify.js +198 -198
- package/lib/commands/org.js +273 -273
- package/lib/commands/pal.js +403 -180
- package/lib/commands/permissions.js +216 -216
- package/lib/commands/pin.js +97 -97
- package/lib/commands/protocol.js +357 -357
- package/lib/commands/rbac.js +147 -147
- package/lib/commands/recover.js +36 -36
- package/lib/commands/register.js +171 -171
- package/lib/commands/relay.js +131 -131
- package/lib/commands/remote.js +368 -368
- package/lib/commands/revoke.js +50 -50
- package/lib/commands/scanner.js +280 -280
- package/lib/commands/schedule.js +344 -344
- package/lib/commands/scim.js +203 -203
- package/lib/commands/search.js +181 -181
- package/lib/commands/serve.js +438 -438
- package/lib/commands/server.js +350 -350
- package/lib/commands/share-link.js +199 -199
- package/lib/commands/share.js +336 -323
- package/lib/commands/sso.js +200 -200
- package/lib/commands/status.js +145 -145
- package/lib/commands/stream.js +562 -562
- package/lib/commands/su.js +187 -187
- package/lib/commands/sync.js +979 -979
- package/lib/commands/transfers.js +152 -152
- package/lib/commands/uninstall.js +188 -188
- package/lib/commands/update.js +204 -204
- package/lib/commands/user.js +276 -276
- package/lib/commands/vfs.js +84 -84
- package/lib/commands/web-login.js +79 -79
- package/lib/commands/web.js +52 -52
- package/lib/commands/webhook.js +180 -180
- package/lib/commands/whoami.js +59 -59
- package/lib/commands/workspace.js +121 -121
- package/lib/core/billing.js +16 -5
- package/lib/core/dhtDiscovery.js +9 -2
- package/lib/core/discoveryClient.js +13 -7
- package/lib/core/extensions.js +142 -1
- package/lib/core/identity.js +33 -2
- package/lib/core/imageProcessor.js +109 -0
- package/lib/core/imageTorrent.js +167 -0
- package/lib/core/permissions.js +1 -1
- package/lib/core/pro.js +11 -4
- package/lib/core/serverList.js +4 -1
- package/lib/core/shares.js +12 -1
- package/lib/core/signalingServer.js +14 -2
- package/lib/core/su.js +1 -1
- package/lib/core/users.js +1 -1
- package/lib/protocol/messages.js +12 -3
- package/lib/utils/explorer.js +1 -1
- package/lib/utils/fuzzy.js +47 -0
- package/lib/utils/help.js +357 -357
- package/lib/utils/torrent.js +1 -0
- package/package.json +4 -3
package/lib/commands/nearby.js
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { Bonjour } from 'bonjour-service';
|
|
5
|
-
import { getIdentity } from '../core/identity.js';
|
|
6
|
-
import { getFriends, saveFriends } from '../core/users.js';
|
|
7
|
-
import config from '../utils/config.js';
|
|
8
|
-
|
|
9
|
-
export default function nearbyCommand(program) {
|
|
10
|
-
program
|
|
11
|
-
.command('nearby')
|
|
12
|
-
.description('discover nearby Palexplorer users on the LAN via mDNS')
|
|
13
|
-
.option('--add', 'Auto-add found peers as pals')
|
|
14
|
-
.option('--time <seconds>', 'How long to scan (default: 10)', '10')
|
|
15
|
-
.addHelpText('after', `
|
|
16
|
-
Examples:
|
|
17
|
-
$
|
|
18
|
-
$
|
|
19
|
-
$
|
|
20
|
-
`)
|
|
21
|
-
.action(async (opts) => {
|
|
22
|
-
const identity = await getIdentity();
|
|
23
|
-
if (!identity) {
|
|
24
|
-
console.log(chalk.red('No identity found. Run `
|
|
25
|
-
process.exitCode = 1;
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const scanTime = parseInt(opts.time, 10) || 10;
|
|
30
|
-
const bonjour = new Bonjour();
|
|
31
|
-
const found = [];
|
|
32
|
-
|
|
33
|
-
console.log(chalk.cyan(`Scanning for nearby pals (${scanTime}s)...`));
|
|
34
|
-
const pkShort = identity.publicKey.slice(0, 8) + '...';
|
|
35
|
-
const handleStr = identity.handle ? ` (@${identity.handle})` : '';
|
|
36
|
-
console.log(chalk.gray(`Advertising as: ${identity.name}${handleStr} [pk: ${pkShort}]`));
|
|
37
|
-
console.log('');
|
|
38
|
-
|
|
39
|
-
// Skip mDNS publish if daemon is already running (avoids "Service name already in use")
|
|
40
|
-
let service = null;
|
|
41
|
-
const pidPath = path.join(path.dirname(config.path), 'serve.pid');
|
|
42
|
-
const daemonRunning = fs.existsSync(pidPath);
|
|
43
|
-
if (!daemonRunning) {
|
|
44
|
-
try {
|
|
45
|
-
service = bonjour.publish({
|
|
46
|
-
name: `palexplorer-${identity.handle || identity.publicKey.slice(0, 8)}`,
|
|
47
|
-
type: 'palexplorer',
|
|
48
|
-
port: 7474,
|
|
49
|
-
txt: {
|
|
50
|
-
pk: identity.publicKey,
|
|
51
|
-
h: identity.handle || '',
|
|
52
|
-
n: identity.name || ''
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
service.on('error', () => { service = null; });
|
|
56
|
-
} catch {
|
|
57
|
-
// Publish failed — scan-only mode
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const browser = bonjour.find({ type: 'palexplorer' }, (svc) => {
|
|
62
|
-
const txt = svc.txt || {};
|
|
63
|
-
const pk = txt.pk;
|
|
64
|
-
if (!pk || pk === identity.publicKey) return;
|
|
65
|
-
|
|
66
|
-
if (found.find(f => f.pk === pk)) return;
|
|
67
|
-
|
|
68
|
-
const name = txt.n || 'Unknown';
|
|
69
|
-
const handle = txt.h || null;
|
|
70
|
-
const ip = (svc.addresses && svc.addresses[0]) || svc.host || 'unknown';
|
|
71
|
-
|
|
72
|
-
found.push({ pk, name, handle, ip });
|
|
73
|
-
|
|
74
|
-
const handleDisplay = handle ? ` (@${handle})` : '';
|
|
75
|
-
console.log(chalk.green(`Found: ${name}${handleDisplay} - ${ip}`));
|
|
76
|
-
|
|
77
|
-
const invitePayload = 'pal://' + Buffer.from(JSON.stringify({ pk, h: handle || null, n: name })).toString('base64url');
|
|
78
|
-
console.log(chalk.gray(` →
|
|
79
|
-
|
|
80
|
-
if (opts.add) {
|
|
81
|
-
if (!/^[0-9a-f]{64}$/i.test(pk)) {
|
|
82
|
-
console.log(chalk.yellow(` (skipped: invalid public key from mDNS)`));
|
|
83
|
-
} else {
|
|
84
|
-
const friends = getFriends();
|
|
85
|
-
const already = friends.find(f => f.id === pk);
|
|
86
|
-
if (already) {
|
|
87
|
-
console.log(chalk.yellow(` (already in your pal list as '${already.name}')`));
|
|
88
|
-
} else {
|
|
89
|
-
const palName = name || handle || 'Nearby Pal';
|
|
90
|
-
friends.push({ id: pk, name: palName, handle: handle || null, addedAt: new Date().toISOString() });
|
|
91
|
-
saveFriends(friends);
|
|
92
|
-
console.log(chalk.green(` ✔ Auto-added: ${palName}${handle ? ` (@${handle})` : ''}`));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
await new Promise(resolve => setTimeout(resolve, scanTime * 1000));
|
|
99
|
-
|
|
100
|
-
browser.stop();
|
|
101
|
-
if (service) service.stop();
|
|
102
|
-
bonjour.destroy();
|
|
103
|
-
|
|
104
|
-
if (found.length === 0) {
|
|
105
|
-
console.log(chalk.gray('No nearby pals found.'));
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { Bonjour } from 'bonjour-service';
|
|
5
|
+
import { getIdentity } from '../core/identity.js';
|
|
6
|
+
import { getFriends, saveFriends } from '../core/users.js';
|
|
7
|
+
import config from '../utils/config.js';
|
|
8
|
+
|
|
9
|
+
export default function nearbyCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command('nearby')
|
|
12
|
+
.description('discover nearby Palexplorer users on the LAN via mDNS')
|
|
13
|
+
.option('--add', 'Auto-add found peers as pals')
|
|
14
|
+
.option('--time <seconds>', 'How long to scan (default: 10)', '10')
|
|
15
|
+
.addHelpText('after', `
|
|
16
|
+
Examples:
|
|
17
|
+
$ pal nearby Discover pals on local network
|
|
18
|
+
$ pal nearby --add Auto-add discovered pals
|
|
19
|
+
$ pal nearby --time 30 Scan for 30 seconds
|
|
20
|
+
`)
|
|
21
|
+
.action(async (opts) => {
|
|
22
|
+
const identity = await getIdentity();
|
|
23
|
+
if (!identity) {
|
|
24
|
+
console.log(chalk.red('No identity found. Run `pal init <name>` first.'));
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const scanTime = parseInt(opts.time, 10) || 10;
|
|
30
|
+
const bonjour = new Bonjour();
|
|
31
|
+
const found = [];
|
|
32
|
+
|
|
33
|
+
console.log(chalk.cyan(`Scanning for nearby pals (${scanTime}s)...`));
|
|
34
|
+
const pkShort = identity.publicKey.slice(0, 8) + '...';
|
|
35
|
+
const handleStr = identity.handle ? ` (@${identity.handle})` : '';
|
|
36
|
+
console.log(chalk.gray(`Advertising as: ${identity.name}${handleStr} [pk: ${pkShort}]`));
|
|
37
|
+
console.log('');
|
|
38
|
+
|
|
39
|
+
// Skip mDNS publish if daemon is already running (avoids "Service name already in use")
|
|
40
|
+
let service = null;
|
|
41
|
+
const pidPath = path.join(path.dirname(config.path), 'serve.pid');
|
|
42
|
+
const daemonRunning = fs.existsSync(pidPath);
|
|
43
|
+
if (!daemonRunning) {
|
|
44
|
+
try {
|
|
45
|
+
service = bonjour.publish({
|
|
46
|
+
name: `palexplorer-${identity.handle || identity.publicKey.slice(0, 8)}`,
|
|
47
|
+
type: 'palexplorer',
|
|
48
|
+
port: 7474,
|
|
49
|
+
txt: {
|
|
50
|
+
pk: identity.publicKey,
|
|
51
|
+
h: identity.handle || '',
|
|
52
|
+
n: identity.name || ''
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
service.on('error', () => { service = null; });
|
|
56
|
+
} catch {
|
|
57
|
+
// Publish failed — scan-only mode
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const browser = bonjour.find({ type: 'palexplorer' }, (svc) => {
|
|
62
|
+
const txt = svc.txt || {};
|
|
63
|
+
const pk = txt.pk;
|
|
64
|
+
if (!pk || pk === identity.publicKey) return;
|
|
65
|
+
|
|
66
|
+
if (found.find(f => f.pk === pk)) return;
|
|
67
|
+
|
|
68
|
+
const name = txt.n || 'Unknown';
|
|
69
|
+
const handle = txt.h || null;
|
|
70
|
+
const ip = (svc.addresses && svc.addresses[0]) || svc.host || 'unknown';
|
|
71
|
+
|
|
72
|
+
found.push({ pk, name, handle, ip });
|
|
73
|
+
|
|
74
|
+
const handleDisplay = handle ? ` (@${handle})` : '';
|
|
75
|
+
console.log(chalk.green(`Found: ${name}${handleDisplay} - ${ip}`));
|
|
76
|
+
|
|
77
|
+
const invitePayload = 'pal://' + Buffer.from(JSON.stringify({ pk, h: handle || null, n: name })).toString('base64url');
|
|
78
|
+
console.log(chalk.gray(` → pal pal add ${invitePayload}`));
|
|
79
|
+
|
|
80
|
+
if (opts.add) {
|
|
81
|
+
if (!/^[0-9a-f]{64}$/i.test(pk)) {
|
|
82
|
+
console.log(chalk.yellow(` (skipped: invalid public key from mDNS)`));
|
|
83
|
+
} else {
|
|
84
|
+
const friends = getFriends();
|
|
85
|
+
const already = friends.find(f => f.id === pk);
|
|
86
|
+
if (already) {
|
|
87
|
+
console.log(chalk.yellow(` (already in your pal list as '${already.name}')`));
|
|
88
|
+
} else {
|
|
89
|
+
const palName = name || handle || 'Nearby Pal';
|
|
90
|
+
friends.push({ id: pk, name: palName, handle: handle || null, addedAt: new Date().toISOString() });
|
|
91
|
+
saveFriends(friends);
|
|
92
|
+
console.log(chalk.green(` ✔ Auto-added: ${palName}${handle ? ` (@${handle})` : ''}`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
await new Promise(resolve => setTimeout(resolve, scanTime * 1000));
|
|
99
|
+
|
|
100
|
+
browser.stop();
|
|
101
|
+
if (service) service.stop();
|
|
102
|
+
bonjour.destroy();
|
|
103
|
+
|
|
104
|
+
if (found.length === 0) {
|
|
105
|
+
console.log(chalk.gray('No nearby pals found.'));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|