@meshwhisper/cli 0.1.0 → 0.2.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/dist/index.d.ts +4 -1
- package/dist/index.js +552 -137
- package/dist/index.js.map +1 -1
- package/package.json +8 -4
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,173 +1,580 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// ============================================================
|
|
3
3
|
// MeshWhisper CLI
|
|
4
|
-
//
|
|
5
|
-
// npx @meshwhisper/cli init
|
|
4
|
+
//
|
|
5
|
+
// npx @meshwhisper/cli init scaffold a project: node deployment + SDK skeleton
|
|
6
|
+
// npx @meshwhisper/cli doctor health-check a MeshWhisper node
|
|
7
|
+
// npx @meshwhisper/cli vapid generate Web Push VAPID keys
|
|
8
|
+
//
|
|
9
|
+
// The init command is the front door described in docs/direction.md:
|
|
10
|
+
// npm install → running node + SDK skeleton in under 30 minutes.
|
|
6
11
|
// ============================================================
|
|
7
12
|
import * as fs from 'node:fs';
|
|
8
13
|
import * as path from 'node:path';
|
|
9
|
-
import * as readline from 'node:readline
|
|
14
|
+
import * as readline from 'node:readline';
|
|
15
|
+
import { generateKeyPairSync } from 'node:crypto';
|
|
10
16
|
import { stdin as input, stdout as output } from 'node:process';
|
|
11
17
|
import pc from 'picocolors';
|
|
18
|
+
const FOUNDATION_RELAY = 'wss://relay.meshwhisper.org';
|
|
19
|
+
const FOUNDATION_FEDERATION_PUBKEY = '34904664a3b5b0b35a8eb41bd3b1d493b79981af2a47069e246db28854d6ce23';
|
|
20
|
+
const DOCS_URL = 'https://github.com/twotwoonethree/meshwhisper/tree/main/docs';
|
|
12
21
|
// ============================================================
|
|
13
|
-
//
|
|
22
|
+
// Prompter
|
|
14
23
|
// ============================================================
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
// Line-queue prompter: unlike readline/promises, this buffers lines that
|
|
25
|
+
// arrive before a question is asked, so piped stdin (CI, tests, heredocs)
|
|
26
|
+
// works the same as an interactive TTY.
|
|
27
|
+
class Prompter {
|
|
28
|
+
queue = [];
|
|
29
|
+
waiters = [];
|
|
30
|
+
closed = false;
|
|
31
|
+
iface;
|
|
32
|
+
constructor() {
|
|
33
|
+
this.iface = readline.createInterface({ input, output, terminal: input.isTTY ?? false });
|
|
34
|
+
this.iface.on('line', (line) => {
|
|
35
|
+
const waiter = this.waiters.shift();
|
|
36
|
+
if (waiter)
|
|
37
|
+
waiter(line);
|
|
38
|
+
else
|
|
39
|
+
this.queue.push(line);
|
|
40
|
+
});
|
|
41
|
+
this.iface.on('close', () => {
|
|
42
|
+
this.closed = true;
|
|
43
|
+
for (const waiter of this.waiters)
|
|
44
|
+
waiter('');
|
|
45
|
+
this.waiters = [];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async question(prompt) {
|
|
49
|
+
output.write(prompt);
|
|
50
|
+
if (this.queue.length > 0) {
|
|
51
|
+
const line = this.queue.shift();
|
|
52
|
+
if (!input.isTTY)
|
|
53
|
+
output.write(line + '\n');
|
|
54
|
+
return line;
|
|
55
|
+
}
|
|
56
|
+
if (this.closed) {
|
|
57
|
+
output.write('\n');
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
return new Promise((resolve) => this.waiters.push(resolve));
|
|
61
|
+
}
|
|
62
|
+
close() {
|
|
63
|
+
if (!this.closed)
|
|
64
|
+
this.iface.close();
|
|
65
|
+
}
|
|
24
66
|
}
|
|
25
|
-
|
|
67
|
+
// ============================================================
|
|
68
|
+
// Output helpers
|
|
69
|
+
// ============================================================
|
|
70
|
+
function banner() {
|
|
26
71
|
console.log('');
|
|
27
72
|
console.log(pc.bold(pc.cyan(' MeshWhisper CLI')));
|
|
28
|
-
console.log(pc.dim('
|
|
73
|
+
console.log(pc.dim(' Self-hostable E2EE messaging — SDK + relay node'));
|
|
29
74
|
console.log('');
|
|
30
75
|
}
|
|
31
|
-
function
|
|
32
|
-
console.log(
|
|
76
|
+
function step(n, text) {
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(pc.bold(pc.green(` ${n}.`)) + ' ' + pc.bold(text));
|
|
33
79
|
}
|
|
34
|
-
function
|
|
80
|
+
function note(text) {
|
|
35
81
|
console.log(pc.dim(` ${text}`));
|
|
36
82
|
}
|
|
83
|
+
function wrote(file) {
|
|
84
|
+
console.log(` ${pc.green('✓')} wrote ${pc.cyan(file)}`);
|
|
85
|
+
}
|
|
86
|
+
function cmd(text) {
|
|
87
|
+
console.log(` ${pc.yellow(text)}`);
|
|
88
|
+
}
|
|
37
89
|
// ============================================================
|
|
38
|
-
//
|
|
90
|
+
// VAPID key generation (Web Push, RFC 8292) — no dependencies.
|
|
91
|
+
// Same output format as `npx web-push generate-vapid-keys`.
|
|
39
92
|
// ============================================================
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
93
|
+
function b64url(buf) {
|
|
94
|
+
return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
95
|
+
}
|
|
96
|
+
export function generateVapidKeys() {
|
|
97
|
+
const { publicKey, privateKey } = generateKeyPairSync('ec', { namedCurve: 'P-256' });
|
|
98
|
+
const pub = publicKey.export({ format: 'jwk' });
|
|
99
|
+
const priv = privateKey.export({ format: 'jwk' });
|
|
100
|
+
const x = Buffer.from(pub.x, 'base64url');
|
|
101
|
+
const y = Buffer.from(pub.y, 'base64url');
|
|
102
|
+
// Uncompressed EC point: 0x04 || X || Y (65 bytes)
|
|
103
|
+
const point = Buffer.concat([Buffer.from([0x04]), x, y]);
|
|
104
|
+
return { publicKey: b64url(point), privateKey: priv.d };
|
|
105
|
+
}
|
|
106
|
+
// ============================================================
|
|
107
|
+
// Generated file templates
|
|
108
|
+
// ============================================================
|
|
109
|
+
function dockerfileNode() {
|
|
110
|
+
return `# MeshWhisper Node — relay, store-and-forward, push forwarding, media
|
|
111
|
+
# storage, encrypted archive, username directory, federation.
|
|
112
|
+
# Installs the published @meshwhisper/node package; no repo checkout needed.
|
|
113
|
+
|
|
114
|
+
FROM node:22-alpine AS builder
|
|
115
|
+
# python3/make/g++ compile better-sqlite3's native bindings
|
|
116
|
+
RUN apk add --no-cache python3 make g++ \\
|
|
117
|
+
&& npm install -g --prefix /opt/meshwhisper @meshwhisper/node
|
|
118
|
+
|
|
119
|
+
FROM node:22-alpine
|
|
120
|
+
ENV NODE_ENV=production
|
|
121
|
+
ENV DB_PATH=/data/meshwhisper.db
|
|
122
|
+
COPY --from=builder /opt/meshwhisper /opt/meshwhisper
|
|
123
|
+
# sqlite CLI enables the documented hot-backup procedure:
|
|
124
|
+
# docker compose exec node sqlite3 /data/meshwhisper.db ".backup /data/backup.db"
|
|
125
|
+
RUN apk add --no-cache sqlite \\
|
|
126
|
+
&& mkdir -p /data \\
|
|
127
|
+
&& addgroup -S meshwhisper && adduser -S meshwhisper -G meshwhisper \\
|
|
128
|
+
&& chown meshwhisper:meshwhisper /data
|
|
129
|
+
USER meshwhisper
|
|
130
|
+
EXPOSE 8080
|
|
131
|
+
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \\
|
|
132
|
+
CMD wget -qO- http://localhost:\${PORT:-8080}/health || exit 1
|
|
133
|
+
CMD ["/opt/meshwhisper/bin/meshwhisper-node"]
|
|
134
|
+
`;
|
|
135
|
+
}
|
|
136
|
+
function dockerfilePush() {
|
|
137
|
+
return `# MeshWhisper push service — Web Push (VAPID) / APNs / FCM wake signals.
|
|
138
|
+
FROM node:22-alpine AS builder
|
|
139
|
+
RUN npm install -g --prefix /opt/meshwhisper @meshwhisper/push-service
|
|
140
|
+
|
|
141
|
+
FROM node:22-alpine
|
|
142
|
+
ENV NODE_ENV=production
|
|
143
|
+
COPY --from=builder /opt/meshwhisper /opt/meshwhisper
|
|
144
|
+
RUN addgroup -S meshwhisper && adduser -S meshwhisper -G meshwhisper
|
|
145
|
+
USER meshwhisper
|
|
146
|
+
EXPOSE 4000
|
|
147
|
+
CMD ["/opt/meshwhisper/bin/meshwhisper-push"]
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
150
|
+
function dockerCompose(opts) {
|
|
151
|
+
const lines = [];
|
|
152
|
+
lines.push('# Generated by `npx @meshwhisper/cli init`.');
|
|
153
|
+
lines.push('# Copy this directory to your server, review .env, then: docker compose up -d');
|
|
154
|
+
lines.push('# Full operator guide: docs/self-hosting.md in the MeshWhisper repo.');
|
|
155
|
+
lines.push('');
|
|
156
|
+
lines.push('services:');
|
|
157
|
+
lines.push(' node:');
|
|
158
|
+
lines.push(' build:');
|
|
159
|
+
lines.push(' context: .');
|
|
160
|
+
lines.push(' dockerfile: Dockerfile.node');
|
|
161
|
+
lines.push(' restart: unless-stopped');
|
|
162
|
+
lines.push(' ports:');
|
|
163
|
+
lines.push(' # Bound to localhost — your reverse proxy (Caddy/nginx) terminates TLS.');
|
|
164
|
+
lines.push(' - "127.0.0.1:8080:8080"');
|
|
165
|
+
lines.push(' environment:');
|
|
166
|
+
lines.push(' PORT: "8080"');
|
|
167
|
+
lines.push(' BASE_URL: "${BASE_URL}"');
|
|
168
|
+
lines.push(' DB_PATH: "/data/meshwhisper.db"');
|
|
169
|
+
lines.push(' BLOB_TTL_HOURS: "720"');
|
|
170
|
+
lines.push(' MEDIA_TTL_HOURS: "168"');
|
|
171
|
+
lines.push(' # Trust X-Forwarded-For from the reverse proxy for rate limiting');
|
|
172
|
+
lines.push(' TRUST_PROXY: "1"');
|
|
173
|
+
if (opts.push) {
|
|
174
|
+
lines.push(' PUSH_WEBHOOK_URL: "http://push:4000/notify"');
|
|
53
175
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
let selfHostedUrl = '';
|
|
59
|
-
if (nodeChoice === 'self-hosted' || nodeChoice === 'self') {
|
|
60
|
-
selfHostedUrl = (await rl.question(pc.bold(' Node WebSocket URL') + pc.dim(' (e.g. wss://msg.myapp.com): '))).trim();
|
|
61
|
-
nodeConfig = selfHostedUrl ? `"${selfHostedUrl}"` : '"mesh"';
|
|
176
|
+
if (opts.federation) {
|
|
177
|
+
lines.push(' # Open federation: forward packets for any relay that completes');
|
|
178
|
+
lines.push(' # the handshake. See docs/federation.md for the threat model.');
|
|
179
|
+
lines.push(' FEDERATION_MODE: "open"');
|
|
62
180
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
printStep(1, 'Generated developer key and salt');
|
|
68
|
-
printNote('Keep these in your environment variables — do not commit them.');
|
|
69
|
-
// Print env block
|
|
70
|
-
console.log('');
|
|
71
|
-
console.log(pc.bgBlack(pc.white(' .env ')));
|
|
72
|
-
console.log('');
|
|
73
|
-
console.log(` MESHWHISPER_DEVELOPER_KEY=${developerKey}`);
|
|
74
|
-
console.log(` MESHWHISPER_SALT=${salt}`);
|
|
75
|
-
if (selfHostedUrl) {
|
|
76
|
-
console.log(` MESHWHISPER_NODE_URL=${selfHostedUrl}`);
|
|
181
|
+
lines.push(' volumes:');
|
|
182
|
+
lines.push(' - node_data:/data');
|
|
183
|
+
if (opts.federation) {
|
|
184
|
+
lines.push(' - ./federation-peers.json:/data/federation-peers.json:ro');
|
|
77
185
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
186
|
+
lines.push(' healthcheck:');
|
|
187
|
+
lines.push(' test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]');
|
|
188
|
+
lines.push(' interval: 30s');
|
|
189
|
+
lines.push(' timeout: 5s');
|
|
190
|
+
lines.push(' retries: 3');
|
|
191
|
+
if (opts.push) {
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push(' push:');
|
|
194
|
+
lines.push(' build:');
|
|
195
|
+
lines.push(' context: .');
|
|
196
|
+
lines.push(' dockerfile: Dockerfile.push');
|
|
197
|
+
lines.push(' restart: unless-stopped');
|
|
198
|
+
lines.push(' environment:');
|
|
199
|
+
lines.push(' PUSH_PORT: "4000"');
|
|
200
|
+
lines.push(' VAPID_PUBLIC_KEY: "${VAPID_PUBLIC_KEY}"');
|
|
201
|
+
lines.push(' VAPID_PRIVATE_KEY: "${VAPID_PRIVATE_KEY}"');
|
|
202
|
+
lines.push(' VAPID_SUBJECT: "${VAPID_SUBJECT}"');
|
|
203
|
+
}
|
|
204
|
+
lines.push('');
|
|
205
|
+
lines.push('volumes:');
|
|
206
|
+
lines.push(' node_data:');
|
|
207
|
+
lines.push('');
|
|
208
|
+
return lines.join('\n');
|
|
209
|
+
}
|
|
210
|
+
function envFile(opts) {
|
|
211
|
+
const lines = [];
|
|
212
|
+
lines.push('# MeshWhisper node environment — do NOT commit this file.');
|
|
213
|
+
lines.push(`BASE_URL=${opts.baseUrl}`);
|
|
214
|
+
if (opts.push && opts.vapid) {
|
|
215
|
+
lines.push('');
|
|
216
|
+
lines.push('# Web Push (generated by `npx @meshwhisper/cli init`; regenerate with `npx @meshwhisper/cli vapid`)');
|
|
217
|
+
lines.push(`VAPID_PUBLIC_KEY=${opts.vapid.publicKey}`);
|
|
218
|
+
lines.push(`VAPID_PRIVATE_KEY=${opts.vapid.privateKey}`);
|
|
219
|
+
lines.push(`VAPID_SUBJECT=mailto:${opts.contactEmail}`);
|
|
220
|
+
}
|
|
221
|
+
lines.push('');
|
|
222
|
+
return lines.join('\n');
|
|
223
|
+
}
|
|
224
|
+
function federationPeersFile() {
|
|
225
|
+
return JSON.stringify({
|
|
226
|
+
peers: [
|
|
227
|
+
{
|
|
228
|
+
pubkey: FOUNDATION_FEDERATION_PUBKEY,
|
|
229
|
+
url: FOUNDATION_RELAY,
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
}, null, 2) + '\n';
|
|
233
|
+
}
|
|
234
|
+
function browserSkeleton(opts) {
|
|
235
|
+
const pushSetup = opts.push
|
|
236
|
+
? `
|
|
237
|
+
// -- Web Push: wakes the app when a message arrives while it's closed --
|
|
238
|
+
// Serve meshwhisper-sw.js from your domain root:
|
|
239
|
+
// cp node_modules/@meshwhisper/service-worker/dist/meshwhisper-sw.js public/
|
|
240
|
+
const registration = await navigator.serviceWorker.register('/meshwhisper-sw.js');
|
|
241
|
+
const subscription = await registration.pushManager.subscribe({
|
|
242
|
+
userVisibleOnly: true,
|
|
243
|
+
applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY),
|
|
244
|
+
});
|
|
245
|
+
`
|
|
246
|
+
: '';
|
|
247
|
+
const pushConfig = opts.push
|
|
248
|
+
? `
|
|
249
|
+
push: {
|
|
250
|
+
platform: 'webpush',
|
|
251
|
+
subscription: subscription.toJSON() as WebPushSubscription,
|
|
252
|
+
},`
|
|
253
|
+
: '';
|
|
254
|
+
const pushImport = opts.push ? `\nimport type { WebPushSubscription } from '@meshwhisper/sdk';` : '';
|
|
255
|
+
const vapidConst = opts.push
|
|
256
|
+
? `\n// Your VAPID *public* key (same value as VAPID_PUBLIC_KEY in the node's .env)\nconst VAPID_PUBLIC_KEY = 'paste_your_vapid_public_key_here';\n
|
|
257
|
+
function urlBase64ToUint8Array(base64String: string): Uint8Array {
|
|
258
|
+
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
|
|
259
|
+
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
|
|
260
|
+
const raw = atob(base64);
|
|
261
|
+
return Uint8Array.from(raw, (c) => c.charCodeAt(0));
|
|
262
|
+
}\n`
|
|
263
|
+
: '';
|
|
264
|
+
return `// Generated by \`npx @meshwhisper/cli init\` — browser/PWA messaging module.
|
|
265
|
+
// Everything is encrypted on-device; the node never holds a decryption key.
|
|
266
|
+
|
|
267
|
+
import { MeshWhisper } from '@meshwhisper/sdk';${pushImport}
|
|
268
|
+
|
|
269
|
+
const NAMESPACE = ${JSON.stringify(opts.namespace)};
|
|
270
|
+
const NODE_URL = ${JSON.stringify(opts.nodeUrl)};
|
|
271
|
+
${vapidConst}
|
|
272
|
+
export async function initMessaging(
|
|
273
|
+
onText: (senderId: string, text: string) => void,
|
|
274
|
+
onStatus?: (messageId: string, status: string) => void,
|
|
275
|
+
) {${pushSetup}
|
|
276
|
+
const mw = await MeshWhisper.init({
|
|
277
|
+
namespace: NAMESPACE,
|
|
278
|
+
node: NODE_URL,${pushConfig}
|
|
279
|
+
onMessage: async (message) => {
|
|
280
|
+
const media = await MeshWhisper.downloadMedia(message);
|
|
281
|
+
if (media) {
|
|
282
|
+
console.log('media from', message.senderId, '-', media.byteLength, 'bytes');
|
|
283
|
+
await MeshWhisper.markRead(message.id, message.senderId);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
onText(message.senderId, new TextDecoder().decode(new Uint8Array(message.payload)));
|
|
287
|
+
await MeshWhisper.markRead(message.id, message.senderId);
|
|
288
|
+
},
|
|
289
|
+
onMessageStatus: (messageId, status) => onStatus?.(messageId, status),
|
|
290
|
+
onConnectionStatus: (status) => console.log('[meshwhisper]', status),
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
return mw;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Your peer ID — share it (or register a username) so contacts can reach you
|
|
297
|
+
export function myId(): string {
|
|
298
|
+
return MeshWhisper.instance.getLocalPeerId();
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export async function send(recipientId: string, text: string): Promise<void> {
|
|
302
|
+
await MeshWhisper.send(recipientId, new TextEncoder().encode(text));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export async function history(peerId: string) {
|
|
306
|
+
return MeshWhisper.getMessages(peerId, { limit: 50 });
|
|
307
|
+
}
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
310
|
+
function nodeSkeleton(opts) {
|
|
311
|
+
return `// Generated by \`npx @meshwhisper/cli init\` — minimal terminal chat.
|
|
312
|
+
//
|
|
313
|
+
// Run two of these (different usernames) and message each other:
|
|
314
|
+
// npx tsx meshwhisper-chat.mts alice
|
|
315
|
+
// npx tsx meshwhisper-chat.mts bob
|
|
316
|
+
// Then in alice's terminal: /add @bob
|
|
317
|
+
// and start typing.
|
|
318
|
+
|
|
319
|
+
import * as readline from 'node:readline/promises';
|
|
320
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
321
|
+
import { MeshWhisper } from '@meshwhisper/sdk';
|
|
322
|
+
import { NodeStorage } from '@meshwhisper/sdk/persistence/node';
|
|
323
|
+
|
|
324
|
+
const NAMESPACE = ${JSON.stringify(opts.namespace)};
|
|
325
|
+
const NODE_URL = ${JSON.stringify(opts.nodeUrl)};
|
|
326
|
+
|
|
327
|
+
const username = process.argv[2];
|
|
328
|
+
if (!username) {
|
|
329
|
+
console.error('usage: npx tsx meshwhisper-chat.mts <username>');
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
85
332
|
|
|
86
333
|
const mw = await MeshWhisper.init({
|
|
87
|
-
namespace:
|
|
88
|
-
node:
|
|
89
|
-
|
|
334
|
+
namespace: NAMESPACE,
|
|
335
|
+
node: NODE_URL,
|
|
336
|
+
username,
|
|
337
|
+
storage: new NodeStorage(\`./.meshwhisper/\${username}\`),
|
|
338
|
+
onMessage: async (message) => {
|
|
339
|
+
const text = new TextDecoder().decode(new Uint8Array(message.payload));
|
|
340
|
+
console.log(\`\\n \${message.senderId.slice(0, 8)}… \${text}\`);
|
|
341
|
+
await MeshWhisper.markRead(message.id, message.senderId);
|
|
342
|
+
},
|
|
343
|
+
onConnectionStatus: (status) => console.log(\` [\${status}]\`),
|
|
90
344
|
});
|
|
91
345
|
|
|
92
|
-
|
|
93
|
-
|
|
346
|
+
console.log(\` you are @\${username} (\${mw.getLocalPeerId().slice(0, 16)}…)\`);
|
|
347
|
+
console.log(' /add @name add a contact by username');
|
|
348
|
+
console.log(' anything else is sent to the last-added contact\\n');
|
|
94
349
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
350
|
+
let currentPeer: string | null = null;
|
|
351
|
+
const rl = readline.createInterface({ input, output });
|
|
352
|
+
|
|
353
|
+
for (;;) {
|
|
354
|
+
const line = (await rl.question('> ')).trim();
|
|
355
|
+
if (!line) continue;
|
|
356
|
+
if (line === '/quit') break;
|
|
357
|
+
if (line.startsWith('/add ')) {
|
|
358
|
+
const target = line.slice(5).trim();
|
|
359
|
+
const peerId = await MeshWhisper.addContactByKey(target);
|
|
360
|
+
if (peerId) {
|
|
361
|
+
currentPeer = peerId;
|
|
362
|
+
console.log(\` added \${target} → \${peerId.slice(0, 16)}…\`);
|
|
363
|
+
} else {
|
|
364
|
+
console.log(\` could not find \${target}\`);
|
|
365
|
+
}
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
if (!currentPeer) {
|
|
369
|
+
console.log(' no contact yet — /add @name first');
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
await MeshWhisper.send(currentPeer, new TextEncoder().encode(line));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
rl.close();
|
|
376
|
+
process.exit(0);
|
|
100
377
|
`;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
console.log(`
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
378
|
+
}
|
|
379
|
+
// ============================================================
|
|
380
|
+
// File-writing helpers
|
|
381
|
+
// ============================================================
|
|
382
|
+
function writeIfAbsent(filePath, content, mode) {
|
|
383
|
+
if (fs.existsSync(filePath)) {
|
|
384
|
+
console.log(` ${pc.yellow('!')} ${pc.cyan(path.relative(process.cwd(), filePath))} already exists — left untouched`);
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
388
|
+
fs.writeFileSync(filePath, content, mode !== undefined ? { mode } : undefined);
|
|
389
|
+
wrote(path.relative(process.cwd(), filePath));
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
function appendGitignore(entries) {
|
|
393
|
+
const gitignorePath = path.join(process.cwd(), '.gitignore');
|
|
394
|
+
const existing = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, 'utf-8') : '';
|
|
395
|
+
const missing = entries.filter((e) => !existing.split('\n').some((l) => l.trim() === e));
|
|
396
|
+
if (missing.length === 0)
|
|
397
|
+
return;
|
|
398
|
+
const block = `${existing.endsWith('\n') || existing === '' ? '' : '\n'}\n# MeshWhisper — secrets and local identity stores\n${missing.join('\n')}\n`;
|
|
399
|
+
fs.appendFileSync(gitignorePath, block);
|
|
400
|
+
wrote('.gitignore (updated)');
|
|
401
|
+
}
|
|
402
|
+
// ============================================================
|
|
403
|
+
// init
|
|
404
|
+
// ============================================================
|
|
405
|
+
async function cmdInit() {
|
|
406
|
+
banner();
|
|
407
|
+
console.log(pc.bold(' Scaffolding a MeshWhisper project\n'));
|
|
408
|
+
const rl = new Prompter();
|
|
409
|
+
// -- Namespace --
|
|
410
|
+
let suggestedNs = 'com.example.myapp';
|
|
411
|
+
try {
|
|
412
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'));
|
|
413
|
+
if (pkg.name)
|
|
414
|
+
suggestedNs = `com.example.${pkg.name.replace(/^@[^/]+\//, '')}`;
|
|
115
415
|
}
|
|
416
|
+
catch { /* no package.json */ }
|
|
417
|
+
const namespace = (await rl.question(pc.bold(' App namespace / bundle ID ') + pc.dim(`(${suggestedNs}): `))).trim() || suggestedNs;
|
|
418
|
+
// -- Node choice --
|
|
116
419
|
console.log('');
|
|
117
|
-
console.log(pc.bold(
|
|
118
|
-
console.log(pc.
|
|
420
|
+
console.log(pc.bold(' Which node should your app connect to?'));
|
|
421
|
+
console.log(` ${pc.cyan('1)')} Foundation relay ${pc.dim('— zero setup, fine for development and small deployments')}`);
|
|
422
|
+
console.log(` ${pc.cyan('2)')} Self-hosted ${pc.dim('— your own node on your own server (recommended for production)')}`);
|
|
423
|
+
const nodeChoice = (await rl.question(pc.bold(' Choice ') + pc.dim('(1): '))).trim() || '1';
|
|
424
|
+
const selfHosted = nodeChoice === '2';
|
|
425
|
+
let nodeUrl = FOUNDATION_RELAY;
|
|
426
|
+
let wantPush = false;
|
|
427
|
+
let wantFederation = false;
|
|
428
|
+
let contactEmail = 'you@example.com';
|
|
429
|
+
if (selfHosted) {
|
|
430
|
+
const urlAnswer = (await rl.question(pc.bold(' Node WebSocket URL ') + pc.dim('(wss://relay.myapp.com): '))).trim();
|
|
431
|
+
nodeUrl = urlAnswer || 'wss://relay.myapp.com';
|
|
432
|
+
if (!/^wss?:\/\//.test(nodeUrl))
|
|
433
|
+
nodeUrl = `wss://${nodeUrl}`;
|
|
434
|
+
const pushAnswer = (await rl.question(pc.bold(' Enable Web Push notifications? ') + pc.dim('[Y/n]: '))).trim().toLowerCase();
|
|
435
|
+
wantPush = pushAnswer === '' || pushAnswer === 'y' || pushAnswer === 'yes';
|
|
436
|
+
if (wantPush) {
|
|
437
|
+
contactEmail = (await rl.question(pc.bold(' Contact email for VAPID ') + pc.dim('(you@example.com): '))).trim() || contactEmail;
|
|
438
|
+
}
|
|
439
|
+
const fedAnswer = (await rl.question(pc.bold(' Join the relay mesh? ') + pc.dim('open federation — your node forwards packets for other relays [Y/n]: '))).trim().toLowerCase();
|
|
440
|
+
wantFederation = fedAnswer === '' || fedAnswer === 'y' || fedAnswer === 'yes';
|
|
441
|
+
}
|
|
442
|
+
// -- App platform --
|
|
119
443
|
console.log('');
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
444
|
+
console.log(pc.bold(' What kind of app are you building?'));
|
|
445
|
+
console.log(` ${pc.cyan('1)')} Browser / PWA`);
|
|
446
|
+
console.log(` ${pc.cyan('2)')} Node.js ${pc.dim('— bot, backend, CLI')}`);
|
|
447
|
+
const platformChoice = (await rl.question(pc.bold(' Choice ') + pc.dim('(1): '))).trim() || '1';
|
|
448
|
+
const isBrowser = platformChoice !== '2';
|
|
449
|
+
rl.close();
|
|
450
|
+
console.log('');
|
|
451
|
+
// -- Write node deployment (self-hosted only) --
|
|
452
|
+
if (selfHosted) {
|
|
453
|
+
const deployDir = path.join(process.cwd(), 'meshwhisper-node');
|
|
454
|
+
const baseUrl = nodeUrl.replace(/^wss:\/\//, 'https://').replace(/^ws:\/\//, 'http://');
|
|
455
|
+
const vapid = wantPush ? generateVapidKeys() : undefined;
|
|
456
|
+
writeIfAbsent(path.join(deployDir, 'docker-compose.yml'), dockerCompose({ push: wantPush, federation: wantFederation }));
|
|
457
|
+
writeIfAbsent(path.join(deployDir, 'Dockerfile.node'), dockerfileNode());
|
|
458
|
+
if (wantPush)
|
|
459
|
+
writeIfAbsent(path.join(deployDir, 'Dockerfile.push'), dockerfilePush());
|
|
460
|
+
writeIfAbsent(path.join(deployDir, '.env'), envFile({ baseUrl, push: wantPush, vapid, contactEmail }), 0o600);
|
|
461
|
+
if (wantFederation)
|
|
462
|
+
writeIfAbsent(path.join(deployDir, 'federation-peers.json'), federationPeersFile());
|
|
463
|
+
}
|
|
464
|
+
// -- Write SDK skeleton --
|
|
465
|
+
const skeletonPath = isBrowser
|
|
466
|
+
? path.join(process.cwd(), 'src', 'meshwhisper.ts')
|
|
467
|
+
: path.join(process.cwd(), 'meshwhisper-chat.mts');
|
|
468
|
+
writeIfAbsent(skeletonPath, isBrowser
|
|
469
|
+
? browserSkeleton({ namespace, nodeUrl, push: selfHosted && wantPush })
|
|
470
|
+
: nodeSkeleton({ namespace, nodeUrl }));
|
|
471
|
+
appendGitignore([
|
|
472
|
+
...(selfHosted ? ['meshwhisper-node/.env'] : []),
|
|
473
|
+
'.meshwhisper/',
|
|
474
|
+
]);
|
|
475
|
+
// -- Health-check the chosen node --
|
|
476
|
+
if (!selfHosted) {
|
|
477
|
+
const healthUrl = nodeUrl.replace(/^wss/, 'https').replace(/^ws(?!s)/, 'http') + '/health';
|
|
478
|
+
try {
|
|
479
|
+
const resp = await fetch(healthUrl, { signal: AbortSignal.timeout(4000) });
|
|
480
|
+
if (resp.ok)
|
|
481
|
+
console.log(` ${pc.green('✓')} node reachable at ${pc.cyan(nodeUrl)}`);
|
|
482
|
+
else
|
|
483
|
+
console.log(` ${pc.yellow('!')} node at ${nodeUrl} returned HTTP ${resp.status}`);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
console.log(` ${pc.yellow('!')} could not reach ${nodeUrl} — check connectivity`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// -- Next steps --
|
|
490
|
+
console.log('');
|
|
491
|
+
console.log(pc.bold(pc.green(' Done. Next steps:')));
|
|
492
|
+
let n = 1;
|
|
493
|
+
step(n++, 'Install the SDK');
|
|
494
|
+
cmd(`npm install @meshwhisper/sdk${isBrowser && selfHosted && wantPush ? ' @meshwhisper/service-worker' : ''}`);
|
|
495
|
+
if (selfHosted) {
|
|
496
|
+
step(n++, 'Deploy your node');
|
|
497
|
+
note('Copy meshwhisper-node/ to your server, put TLS in front of port 8080');
|
|
498
|
+
note('(Caddy: `reverse_proxy localhost:8080` — done), then:');
|
|
499
|
+
cmd('docker compose up -d');
|
|
500
|
+
note(`Verify: npx @meshwhisper/cli doctor ${nodeUrl}`);
|
|
501
|
+
if (wantFederation) {
|
|
502
|
+
note('Your node will auto-generate its federation identity at /data/federation-key.json');
|
|
503
|
+
note('and peer with the Foundation relay. docs/federation.md has the details.');
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (isBrowser) {
|
|
507
|
+
step(n++, 'Wire src/meshwhisper.ts into your app');
|
|
508
|
+
cmd(`import { initMessaging, myId, send } from './meshwhisper';`);
|
|
509
|
+
if (selfHosted && wantPush) {
|
|
510
|
+
note('Paste your VAPID public key (meshwhisper-node/.env) into src/meshwhisper.ts');
|
|
511
|
+
note('and copy the service worker to your public dir:');
|
|
512
|
+
cmd('cp node_modules/@meshwhisper/service-worker/dist/meshwhisper-sw.js public/');
|
|
513
|
+
}
|
|
165
514
|
}
|
|
166
515
|
else {
|
|
167
|
-
|
|
516
|
+
step(n++, 'Try it — two terminals, two identities');
|
|
517
|
+
cmd('npx tsx meshwhisper-chat.mts alice');
|
|
518
|
+
cmd('npx tsx meshwhisper-chat.mts bob');
|
|
519
|
+
note('In alice: /add @bob — then chat. End-to-end encrypted via your node.');
|
|
520
|
+
}
|
|
521
|
+
console.log('');
|
|
522
|
+
console.log(pc.dim(` Docs: ${DOCS_URL}`));
|
|
523
|
+
console.log('');
|
|
524
|
+
}
|
|
525
|
+
// ============================================================
|
|
526
|
+
// doctor
|
|
527
|
+
// ============================================================
|
|
528
|
+
async function cmdDoctor(urlArg) {
|
|
529
|
+
banner();
|
|
530
|
+
const raw = urlArg || FOUNDATION_RELAY;
|
|
531
|
+
const base = raw.replace(/^wss:\/\//, 'https://').replace(/^ws:\/\//, 'http://').replace(/\/+$/, '');
|
|
532
|
+
const healthUrl = base.startsWith('http') ? `${base}/health` : `https://${base}/health`;
|
|
533
|
+
console.log(` checking ${pc.cyan(healthUrl)}\n`);
|
|
534
|
+
let body;
|
|
535
|
+
try {
|
|
536
|
+
const resp = await fetch(healthUrl, { signal: AbortSignal.timeout(5000) });
|
|
537
|
+
if (!resp.ok) {
|
|
538
|
+
console.log(` ${pc.red('✗')} HTTP ${resp.status}`);
|
|
539
|
+
process.exit(1);
|
|
540
|
+
}
|
|
541
|
+
body = (await resp.json());
|
|
542
|
+
}
|
|
543
|
+
catch (err) {
|
|
544
|
+
console.log(` ${pc.red('✗')} unreachable: ${err.message}`);
|
|
545
|
+
process.exit(1);
|
|
546
|
+
}
|
|
547
|
+
const ok = body.status === 'ok';
|
|
548
|
+
console.log(` ${ok ? pc.green('✓') : pc.red('✗')} status: ${String(body.status)}`);
|
|
549
|
+
for (const [key, value] of Object.entries(body)) {
|
|
550
|
+
if (key === 'status')
|
|
551
|
+
continue;
|
|
552
|
+
console.log(` ${pc.dim(key + ':')} ${String(value)}`);
|
|
553
|
+
}
|
|
554
|
+
if ('federationPeersConnected' in body) {
|
|
555
|
+
const connected = Number(body.federationPeersConnected);
|
|
168
556
|
console.log('');
|
|
169
|
-
|
|
557
|
+
if (connected > 0) {
|
|
558
|
+
console.log(` ${pc.green('✓')} federating with ${connected} peer relay(s)`);
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
console.log(pc.dim(' not currently federating — see docs/federation.md to join the mesh'));
|
|
562
|
+
}
|
|
170
563
|
}
|
|
564
|
+
console.log('');
|
|
565
|
+
if (!ok)
|
|
566
|
+
process.exit(1);
|
|
567
|
+
}
|
|
568
|
+
// ============================================================
|
|
569
|
+
// vapid
|
|
570
|
+
// ============================================================
|
|
571
|
+
function cmdVapid() {
|
|
572
|
+
banner();
|
|
573
|
+
const keys = generateVapidKeys();
|
|
574
|
+
console.log(pc.bold(' Web Push VAPID keys') + pc.dim(' — public goes in your app AND node .env; private is server-only\n'));
|
|
575
|
+
console.log(` VAPID_PUBLIC_KEY=${keys.publicKey}`);
|
|
576
|
+
console.log(` VAPID_PRIVATE_KEY=${keys.privateKey}`);
|
|
577
|
+
console.log('');
|
|
171
578
|
}
|
|
172
579
|
// ============================================================
|
|
173
580
|
// Entry point
|
|
@@ -177,18 +584,26 @@ switch (command) {
|
|
|
177
584
|
case 'init':
|
|
178
585
|
await cmdInit();
|
|
179
586
|
break;
|
|
587
|
+
case 'doctor':
|
|
588
|
+
await cmdDoctor(args[0]);
|
|
589
|
+
break;
|
|
590
|
+
case 'vapid':
|
|
591
|
+
cmdVapid();
|
|
592
|
+
break;
|
|
180
593
|
case undefined:
|
|
181
594
|
case '--help':
|
|
182
595
|
case '-h':
|
|
183
|
-
|
|
596
|
+
banner();
|
|
184
597
|
console.log(' Usage:');
|
|
185
598
|
console.log('');
|
|
186
|
-
console.log('
|
|
599
|
+
console.log(` ${pc.cyan('npx @meshwhisper/cli init')} Scaffold a project: node deployment + SDK skeleton`);
|
|
600
|
+
console.log(` ${pc.cyan('npx @meshwhisper/cli doctor [url]')} Health-check a MeshWhisper node`);
|
|
601
|
+
console.log(` ${pc.cyan('npx @meshwhisper/cli vapid')} Generate Web Push VAPID keys`);
|
|
187
602
|
console.log('');
|
|
188
603
|
break;
|
|
189
604
|
default:
|
|
190
605
|
console.error(pc.red(` Unknown command: ${command}`));
|
|
191
|
-
console.error(` Run ${pc.bold('meshwhisper --help')} for usage.`);
|
|
606
|
+
console.error(` Run ${pc.bold('npx @meshwhisper/cli --help')} for usage.`);
|
|
192
607
|
process.exit(1);
|
|
193
608
|
}
|
|
194
609
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meshwhisper/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "MeshWhisper CLI
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MeshWhisper CLI \u2014 developer tooling for MeshWhisper projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"meshwhisper": "dist/index.js"
|
|
8
8
|
},
|
|
9
|
-
"files": [
|
|
10
|
-
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
11
15
|
"scripts": {
|
|
12
16
|
"prepublishOnly": "npm run build",
|
|
13
17
|
"build": "tsc",
|