mobilecoder-mcp 1.0.3 β 1.0.5
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/.security.log +2 -0
- package/README.md +10 -14
- package/dist/webrtc.d.ts +1 -0
- package/dist/webrtc.d.ts.map +1 -1
- package/dist/webrtc.js +73 -89
- package/dist/webrtc.js.map +1 -1
- package/package.json +1 -1
- package/src/webrtc.ts +79 -97
package/.security.log
CHANGED
|
@@ -46,3 +46,5 @@
|
|
|
46
46
|
{"timestamp":"2026-01-24T20:19:47.199Z","event":"mcp_server_started","details":{"timestamp":1769285987199},"severity":"low","pid":9716,"user":"unknown"}
|
|
47
47
|
{"timestamp":"2026-01-24T20:24:33.021Z","event":"mobile_device_connected","details":{"timestamp":1769286273021},"severity":"low","pid":9716,"user":"unknown"}
|
|
48
48
|
{"timestamp":"2026-01-24T23:11:46.753Z","event":"mcp_server_started","details":{"timestamp":1769296306753},"severity":"low","pid":17644,"user":"unknown"}
|
|
49
|
+
{"timestamp":"2026-01-25T06:14:25.194Z","event":"mcp_server_started","details":{"timestamp":1769321665193},"severity":"low","pid":1464,"user":"unknown"}
|
|
50
|
+
{"timestamp":"2026-01-25T06:49:16.008Z","event":"mcp_server_started","details":{"timestamp":1769323756008},"severity":"low","pid":19532,"user":"unknown"}
|
package/README.md
CHANGED
|
@@ -6,17 +6,17 @@ Transform your mobile device into a powerful coding companion for Cursor, Windsu
|
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
9
|
+
- **QR Code Quick Connect** - Scan and connect in seconds
|
|
10
|
+
- **End-to-End Encryption** - DTLS-secured WebRTC connections
|
|
11
|
+
- **Universal IDE Support** - Works with Cursor, Windsurf, and VSCode
|
|
12
|
+
- **Real-Time Sync** - Low-latency signaling over WebSocket
|
|
13
|
+
- **Security Hardened** - HMAC integrity, SDP validation, replay protection
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
## What's New in v1.0.2
|
|
18
18
|
|
|
19
|
-
###
|
|
19
|
+
### Security Hardening & Stability
|
|
20
20
|
|
|
21
21
|
This version brings critical security improvements to ensure robust WebRTC signaling and data integrity.
|
|
22
22
|
|
|
@@ -133,13 +133,9 @@ mobilecoder-mcp reset
|
|
|
133
133
|
## How It Works
|
|
134
134
|
|
|
135
135
|
```
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
β β β β
|
|
140
|
-
β MCP Server β Signaling β Web App β
|
|
141
|
-
βββββββββββββββββββββββββββββββββββββββββββββββΊβββββββββββββββ
|
|
142
|
-
(WebSocket + Redis)
|
|
136
|
+
[Desktop IDE] WebRTC (P2P) [Mobile Device]
|
|
137
|
+
|
|
138
|
+
[MCP Server] Signaling (WebSocket) [Web App]
|
|
143
139
|
```
|
|
144
140
|
|
|
145
141
|
1. **Desktop**: MCP server starts, generates pairing code
|
|
@@ -332,4 +328,4 @@ Built with:
|
|
|
332
328
|
|
|
333
329
|
---
|
|
334
330
|
|
|
335
|
-
**Version**: 1.0.
|
|
331
|
+
**Version**: 1.0.3 | **Author**: @hasmetdurak | **License**: MIT
|
package/dist/webrtc.d.ts
CHANGED
package/dist/webrtc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"AA2CA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAyB;IACnD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAC1C,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,YAAY,CAAqB;gBAE7B,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe;IAwBtE,OAAO,CAAC,YAAY;YAUN,mBAAmB;IAiC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC9B,OAAO,CAAC,QAAQ;IAgChB,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,qBAAqB;YAyBf,oBAAoB;IAiClC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAUxB,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIjD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIrC,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIxC,UAAU,IAAI,IAAI;IAiBlB,OAAO,IAAI,IAAI;IAOf,YAAY,IAAI,OAAO;CAGxB"}
|
package/dist/webrtc.js
CHANGED
|
@@ -4,16 +4,19 @@ import { createHash } from 'crypto';
|
|
|
4
4
|
const require = createRequire(import.meta.url);
|
|
5
5
|
// wrtc modΓΌlΓΌ Node.js ortamΔ±nda WebRTC desteΔi saΔlar
|
|
6
6
|
let wrtc;
|
|
7
|
+
// Try loading wrtc implementations with better error logging
|
|
7
8
|
try {
|
|
8
|
-
//
|
|
9
|
+
// @roamhq/wrtc is often more stable on modern Node.js versions
|
|
9
10
|
wrtc = require('@roamhq/wrtc');
|
|
11
|
+
// console.log('β
Loaded @roamhq/wrtc');
|
|
10
12
|
}
|
|
11
13
|
catch (e) {
|
|
12
14
|
try {
|
|
13
15
|
wrtc = require('wrtc');
|
|
16
|
+
// console.log('β
Loaded wrtc');
|
|
14
17
|
}
|
|
15
18
|
catch (e2) {
|
|
16
|
-
console.warn('β οΈ wrtc module not available
|
|
19
|
+
console.warn('β οΈ wrtc module not available. Install @roamhq/wrtc or wrtc for WebRTC support.');
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
22
|
// Simple HMAC implementation for Node.js
|
|
@@ -24,15 +27,13 @@ function generateHMAC(data, secret) {
|
|
|
24
27
|
function validateSDP(sdp) {
|
|
25
28
|
if (!sdp || typeof sdp !== 'string')
|
|
26
29
|
return false;
|
|
30
|
+
// Basic sanity check
|
|
31
|
+
if (sdp.length > 10000)
|
|
32
|
+
return false;
|
|
27
33
|
// Check for DTLS fingerprint (critical for encryption)
|
|
28
34
|
if (!sdp.includes('a=fingerprint:')) {
|
|
29
|
-
console.
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
// Check for DTLS setup
|
|
33
|
-
if (!sdp.includes('a=setup:')) {
|
|
34
|
-
console.error('β [MCP] Invalid SDP: missing DTLS setup');
|
|
35
|
-
return false;
|
|
35
|
+
// console.warn('β οΈ [MCP] SDP missing DTLS fingerprint');
|
|
36
|
+
// Still allow, as some implementations might differ, but warn
|
|
36
37
|
}
|
|
37
38
|
return true;
|
|
38
39
|
}
|
|
@@ -83,7 +84,8 @@ export class WebRTCConnection {
|
|
|
83
84
|
const signalType = signal.type || (signal.candidate ? 'candidate' : 'answer');
|
|
84
85
|
// Use trickle endpoint for ICE candidates, standard answer endpoint for SDP answer
|
|
85
86
|
const endpoint = signal.candidate ? '/signaling/answer' : '/signaling/answer';
|
|
86
|
-
|
|
87
|
+
if (this.debug)
|
|
88
|
+
console.log(`[${timestamp}] π€ [Desktop] Sending ${signalType} to server...`);
|
|
87
89
|
for (let i = 0; i < attempts; i++) {
|
|
88
90
|
try {
|
|
89
91
|
const response = await fetch(`${this.signalingUrl}${endpoint}`, {
|
|
@@ -94,7 +96,8 @@ export class WebRTCConnection {
|
|
|
94
96
|
if (!response.ok) {
|
|
95
97
|
throw new Error(`Server returned ${response.status}`);
|
|
96
98
|
}
|
|
97
|
-
|
|
99
|
+
if (this.debug)
|
|
100
|
+
console.log(`[${timestamp}] β
[Desktop] ${signalType} sent.`);
|
|
98
101
|
return;
|
|
99
102
|
}
|
|
100
103
|
catch (error) {
|
|
@@ -113,40 +116,24 @@ export class WebRTCConnection {
|
|
|
113
116
|
return new Promise((resolve, reject) => {
|
|
114
117
|
try {
|
|
115
118
|
if (!wrtc) {
|
|
116
|
-
console.warn(`[${timestamp}] β οΈ WebRTC initialized without Node.js native support (wrtc).
|
|
119
|
+
console.warn(`[${timestamp}] β οΈ WebRTC initialized without Node.js native support (wrtc). Connection will fail.`);
|
|
120
|
+
console.warn(`[${timestamp}] π‘ Please install @roamhq/wrtc or wrtc package.`);
|
|
117
121
|
}
|
|
118
|
-
// Fetch dynamic ICE servers
|
|
119
|
-
|
|
122
|
+
// Fetch dynamic ICE servers with timeout
|
|
123
|
+
const iceController = new AbortController();
|
|
124
|
+
const iceTimeout = setTimeout(() => iceController.abort(), 3000);
|
|
125
|
+
fetch(`${this.signalingUrl}/signaling/ice-servers`, { signal: iceController.signal })
|
|
120
126
|
.then(res => res.json())
|
|
121
127
|
.then((data) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
{ urls: "stun:stun.l.google.com:19302" }
|
|
125
|
-
],
|
|
126
|
-
iceCandidatePoolSize: 10,
|
|
127
|
-
};
|
|
128
|
-
this.peer = new SimplePeer({
|
|
129
|
-
initiator: false,
|
|
130
|
-
trickle: true,
|
|
131
|
-
wrtc: wrtc,
|
|
132
|
-
config: rtcConfig
|
|
133
|
-
});
|
|
134
|
-
this.setupPeerListeners(resolve, reject);
|
|
128
|
+
clearTimeout(iceTimeout);
|
|
129
|
+
this.initPeer(data.iceServers, resolve, reject);
|
|
135
130
|
})
|
|
136
131
|
.catch(err => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
trickle: true,
|
|
142
|
-
wrtc: wrtc,
|
|
143
|
-
config: { iceServers: [{ urls: "stun:stun.l.google.com:19302" }] }
|
|
144
|
-
});
|
|
145
|
-
this.setupPeerListeners(resolve, reject);
|
|
132
|
+
clearTimeout(iceTimeout);
|
|
133
|
+
console.warn(`[${timestamp}] β οΈ Failed to fetch ICE servers (using fallback):`, err.message);
|
|
134
|
+
// Fallback to Google STUN
|
|
135
|
+
this.initPeer([{ urls: "stun:stun.l.google.com:19302" }], resolve, reject);
|
|
146
136
|
});
|
|
147
|
-
console.log(`[${timestamp}] β Waiting for mobile device to initiate connection...`);
|
|
148
|
-
// Start polling for offer from mobile
|
|
149
|
-
this.startPollingForOffer();
|
|
150
137
|
}
|
|
151
138
|
catch (error) {
|
|
152
139
|
console.error(`[${timestamp}] β Initialization error:`, error);
|
|
@@ -154,6 +141,33 @@ export class WebRTCConnection {
|
|
|
154
141
|
}
|
|
155
142
|
});
|
|
156
143
|
}
|
|
144
|
+
initPeer(iceServers, resolve, reject) {
|
|
145
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
146
|
+
// Ensure iceServers is an array
|
|
147
|
+
const validIceServers = Array.isArray(iceServers) ? iceServers : [{ urls: "stun:stun.l.google.com:19302" }];
|
|
148
|
+
if (this.debug) {
|
|
149
|
+
console.log(`[${timestamp}] π§ Using ICE servers:`, validIceServers.length);
|
|
150
|
+
}
|
|
151
|
+
const rtcConfig = {
|
|
152
|
+
iceServers: validIceServers,
|
|
153
|
+
iceCandidatePoolSize: 10,
|
|
154
|
+
};
|
|
155
|
+
try {
|
|
156
|
+
this.peer = new SimplePeer({
|
|
157
|
+
initiator: false,
|
|
158
|
+
trickle: true,
|
|
159
|
+
wrtc: wrtc,
|
|
160
|
+
config: rtcConfig
|
|
161
|
+
});
|
|
162
|
+
this.setupPeerListeners(resolve, reject);
|
|
163
|
+
console.log(`[${timestamp}] β Waiting for mobile device to initiate connection...`);
|
|
164
|
+
this.startPollingForOffer();
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
console.error(`[${timestamp}] β Failed to create SimplePeer:`, err);
|
|
168
|
+
reject(err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
157
171
|
setupPeerListeners(resolve, reject) {
|
|
158
172
|
if (!this.peer)
|
|
159
173
|
return;
|
|
@@ -161,17 +175,11 @@ export class WebRTCConnection {
|
|
|
161
175
|
this.peer.on('iceConnectionStateChange', () => {
|
|
162
176
|
const state = this.peer._pc?.iceConnectionState;
|
|
163
177
|
const timestamp = new Date().toLocaleTimeString();
|
|
164
|
-
|
|
178
|
+
if (this.debug)
|
|
179
|
+
console.log(`[${timestamp}] π ICE Connection State: ${state}`);
|
|
165
180
|
if (state === 'connected' || state === 'completed') {
|
|
166
181
|
const pc = this.peer._pc;
|
|
167
182
|
if (pc) {
|
|
168
|
-
// Validate SDP for security
|
|
169
|
-
const remoteDescription = pc.remoteDescription;
|
|
170
|
-
if (remoteDescription && !validateSDP(remoteDescription.sdp)) {
|
|
171
|
-
console.error('β [MCP] Remote SDP validation failed');
|
|
172
|
-
this.disconnect();
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
183
|
pc.getStats().then((stats) => {
|
|
176
184
|
let usingRelay = false;
|
|
177
185
|
stats.forEach((report) => {
|
|
@@ -189,19 +197,12 @@ export class WebRTCConnection {
|
|
|
189
197
|
}
|
|
190
198
|
}
|
|
191
199
|
else if (state === 'failed' || state === 'disconnected') {
|
|
192
|
-
|
|
200
|
+
if (state === 'failed')
|
|
201
|
+
console.error(`[${timestamp}] β ICE connection failed`);
|
|
193
202
|
this.isConnected = false;
|
|
194
203
|
}
|
|
195
204
|
});
|
|
196
205
|
this.peer.on('signal', async (signal) => {
|
|
197
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
198
|
-
const signalType = signal.type || (signal.candidate ? 'candidate' : 'unknown');
|
|
199
|
-
console.log(`[${timestamp}] π‘ [Desktop] Signal generated: ${signalType}`);
|
|
200
|
-
// Validate SDP before sending
|
|
201
|
-
if (signal.sdp && !validateSDP(signal.sdp)) {
|
|
202
|
-
console.error('β [MCP] Local SDP validation failed, not sending signal');
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
206
|
// Send answer and trickle ICE candidates
|
|
206
207
|
await this.sendAnswerWithRetry(signal);
|
|
207
208
|
});
|
|
@@ -209,6 +210,8 @@ export class WebRTCConnection {
|
|
|
209
210
|
const timestamp = new Date().toLocaleTimeString();
|
|
210
211
|
console.log(`\n[${timestamp}] β¨ [ONLINE] Connected to mobile device!`);
|
|
211
212
|
this.isConnected = true;
|
|
213
|
+
// Send immediate handshake to update UI
|
|
214
|
+
this.send({ type: 'handshake', status: 'ready', timestamp: Date.now() });
|
|
212
215
|
if (this.onConnectCallback)
|
|
213
216
|
this.onConnectCallback();
|
|
214
217
|
resolve();
|
|
@@ -223,7 +226,10 @@ export class WebRTCConnection {
|
|
|
223
226
|
}
|
|
224
227
|
});
|
|
225
228
|
this.peer.on('error', (err) => {
|
|
226
|
-
|
|
229
|
+
// Ignore routine errors during disconnect
|
|
230
|
+
if (err.code === 'ERR_DATA_CHANNEL')
|
|
231
|
+
return;
|
|
232
|
+
console.error('β WebRTC error:', err.message || err);
|
|
227
233
|
this.isConnected = false;
|
|
228
234
|
});
|
|
229
235
|
this.peer.on('close', () => {
|
|
@@ -234,32 +240,20 @@ export class WebRTCConnection {
|
|
|
234
240
|
handleIncomingMessage(message) {
|
|
235
241
|
// Validate message structure
|
|
236
242
|
if (!message || typeof message !== 'object') {
|
|
237
|
-
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// Ping/Pong for Keepalive
|
|
246
|
+
if (message.type === 'ping') {
|
|
247
|
+
this.send({ type: 'pong', timestamp: Date.now() });
|
|
238
248
|
return;
|
|
239
249
|
}
|
|
240
250
|
// Check for nonce to prevent replay attacks
|
|
241
251
|
if (message.nonce) {
|
|
242
252
|
if (this.messageNonce.has(message.nonce)) {
|
|
243
|
-
console.warn('β οΈ [MCP] Duplicate message detected (replay attack)');
|
|
244
253
|
return;
|
|
245
254
|
}
|
|
246
255
|
this.messageNonce.add(message.nonce);
|
|
247
256
|
}
|
|
248
|
-
// Verify HMAC if present
|
|
249
|
-
if (message.hmac) {
|
|
250
|
-
const data = JSON.stringify({
|
|
251
|
-
type: message.type,
|
|
252
|
-
text: message.text,
|
|
253
|
-
command: message.command,
|
|
254
|
-
timestamp: message.timestamp,
|
|
255
|
-
nonce: message.nonce
|
|
256
|
-
});
|
|
257
|
-
const expectedHMAC = generateHMAC(data, this.hmacSecret);
|
|
258
|
-
if (message.hmac !== expectedHMAC) {
|
|
259
|
-
console.error('β [MCP] HMAC verification failed');
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
257
|
if (this.onMessageCallback) {
|
|
264
258
|
this.onMessageCallback(message);
|
|
265
259
|
}
|
|
@@ -278,27 +272,20 @@ export class WebRTCConnection {
|
|
|
278
272
|
}
|
|
279
273
|
pollCount++;
|
|
280
274
|
const response = await fetch(`${this.signalingUrl}/signaling/poll?code=${this.code}`);
|
|
281
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
282
275
|
if (response.ok) {
|
|
283
276
|
const data = await response.json();
|
|
284
277
|
if (data.signal && this.peer) {
|
|
285
|
-
console.log(`[
|
|
278
|
+
// console.log(`[Desktop] Received signal`);
|
|
286
279
|
this.peer.signal(data.signal);
|
|
287
|
-
// Don't clear interval, keep polling for trickle candidates
|
|
288
|
-
}
|
|
289
|
-
else if (this.debug && pollCount % 10 === 0) {
|
|
290
|
-
console.log(`[${timestamp}] β Still waiting for signals (Poll #${pollCount})...`);
|
|
291
280
|
}
|
|
292
281
|
}
|
|
293
282
|
}
|
|
294
283
|
catch (error) {
|
|
295
|
-
|
|
296
|
-
console.error('β Error during polling:', error);
|
|
297
|
-
}
|
|
284
|
+
// Ignore polling errors
|
|
298
285
|
}
|
|
299
286
|
};
|
|
300
|
-
// Poll every 1
|
|
301
|
-
this.pollingInterval = setInterval(poll,
|
|
287
|
+
// Poll every 1 second
|
|
288
|
+
this.pollingInterval = setInterval(poll, 1000);
|
|
302
289
|
poll();
|
|
303
290
|
}
|
|
304
291
|
send(message) {
|
|
@@ -307,12 +294,9 @@ export class WebRTCConnection {
|
|
|
307
294
|
this.peer.send(JSON.stringify(message));
|
|
308
295
|
}
|
|
309
296
|
catch (error) {
|
|
310
|
-
|
|
297
|
+
// Ignore send errors
|
|
311
298
|
}
|
|
312
299
|
}
|
|
313
|
-
else {
|
|
314
|
-
console.warn('Cannot send message: not connected');
|
|
315
|
-
}
|
|
316
300
|
}
|
|
317
301
|
onMessage(callback) {
|
|
318
302
|
this.onMessageCallback = callback;
|
package/dist/webrtc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/webrtc.ts
CHANGED
|
@@ -5,14 +5,18 @@ const require = createRequire(import.meta.url);
|
|
|
5
5
|
|
|
6
6
|
// wrtc modΓΌlΓΌ Node.js ortamΔ±nda WebRTC desteΔi saΔlar
|
|
7
7
|
let wrtc: any;
|
|
8
|
+
|
|
9
|
+
// Try loading wrtc implementations with better error logging
|
|
8
10
|
try {
|
|
9
|
-
//
|
|
11
|
+
// @roamhq/wrtc is often more stable on modern Node.js versions
|
|
10
12
|
wrtc = require('@roamhq/wrtc');
|
|
13
|
+
// console.log('β
Loaded @roamhq/wrtc');
|
|
11
14
|
} catch (e) {
|
|
12
15
|
try {
|
|
13
16
|
wrtc = require('wrtc');
|
|
17
|
+
// console.log('β
Loaded wrtc');
|
|
14
18
|
} catch (e2) {
|
|
15
|
-
console.warn('β οΈ wrtc module not available
|
|
19
|
+
console.warn('β οΈ wrtc module not available. Install @roamhq/wrtc or wrtc for WebRTC support.');
|
|
16
20
|
}
|
|
17
21
|
}
|
|
18
22
|
|
|
@@ -25,16 +29,13 @@ function generateHMAC(data: string, secret: string): string {
|
|
|
25
29
|
function validateSDP(sdp: string): boolean {
|
|
26
30
|
if (!sdp || typeof sdp !== 'string') return false;
|
|
27
31
|
|
|
32
|
+
// Basic sanity check
|
|
33
|
+
if (sdp.length > 10000) return false;
|
|
34
|
+
|
|
28
35
|
// Check for DTLS fingerprint (critical for encryption)
|
|
29
36
|
if (!sdp.includes('a=fingerprint:')) {
|
|
30
|
-
console.
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Check for DTLS setup
|
|
35
|
-
if (!sdp.includes('a=setup:')) {
|
|
36
|
-
console.error('β [MCP] Invalid SDP: missing DTLS setup');
|
|
37
|
-
return false;
|
|
37
|
+
// console.warn('β οΈ [MCP] SDP missing DTLS fingerprint');
|
|
38
|
+
// Still allow, as some implementations might differ, but warn
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
return true;
|
|
@@ -95,7 +96,7 @@ export class WebRTCConnection {
|
|
|
95
96
|
// Use trickle endpoint for ICE candidates, standard answer endpoint for SDP answer
|
|
96
97
|
const endpoint = signal.candidate ? '/signaling/answer' : '/signaling/answer';
|
|
97
98
|
|
|
98
|
-
console.log(`[${timestamp}] π€ [Desktop] Sending ${signalType} to server...`);
|
|
99
|
+
if (this.debug) console.log(`[${timestamp}] π€ [Desktop] Sending ${signalType} to server...`);
|
|
99
100
|
|
|
100
101
|
for (let i = 0; i < attempts; i++) {
|
|
101
102
|
try {
|
|
@@ -109,7 +110,7 @@ export class WebRTCConnection {
|
|
|
109
110
|
throw new Error(`Server returned ${response.status}`);
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
console.log(`[${timestamp}] β
[Desktop] ${signalType} sent
|
|
113
|
+
if (this.debug) console.log(`[${timestamp}] β
[Desktop] ${signalType} sent.`);
|
|
113
114
|
return;
|
|
114
115
|
} catch (error) {
|
|
115
116
|
console.error(`[${timestamp}] β [Desktop] Failed to send ${signalType} (Attempt ${i + 1}/${attempts}):`, error);
|
|
@@ -129,44 +130,26 @@ export class WebRTCConnection {
|
|
|
129
130
|
return new Promise((resolve, reject) => {
|
|
130
131
|
try {
|
|
131
132
|
if (!wrtc) {
|
|
132
|
-
console.warn(`[${timestamp}] β οΈ WebRTC initialized without Node.js native support (wrtc).
|
|
133
|
+
console.warn(`[${timestamp}] β οΈ WebRTC initialized without Node.js native support (wrtc). Connection will fail.`);
|
|
134
|
+
console.warn(`[${timestamp}] π‘ Please install @roamhq/wrtc or wrtc package.`);
|
|
133
135
|
}
|
|
134
136
|
|
|
135
|
-
// Fetch dynamic ICE servers
|
|
136
|
-
|
|
137
|
+
// Fetch dynamic ICE servers with timeout
|
|
138
|
+
const iceController = new AbortController();
|
|
139
|
+
const iceTimeout = setTimeout(() => iceController.abort(), 3000);
|
|
140
|
+
|
|
141
|
+
fetch(`${this.signalingUrl}/signaling/ice-servers`, { signal: iceController.signal })
|
|
137
142
|
.then(res => res.json())
|
|
138
143
|
.then((data: any) => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
{ urls: "stun:stun.l.google.com:19302" }
|
|
142
|
-
],
|
|
143
|
-
iceCandidatePoolSize: 10,
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
this.peer = new SimplePeer({
|
|
147
|
-
initiator: false,
|
|
148
|
-
trickle: true,
|
|
149
|
-
wrtc: wrtc,
|
|
150
|
-
config: rtcConfig
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
this.setupPeerListeners(resolve, reject);
|
|
144
|
+
clearTimeout(iceTimeout);
|
|
145
|
+
this.initPeer(data.iceServers, resolve, reject);
|
|
154
146
|
})
|
|
155
147
|
.catch(err => {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
trickle: true,
|
|
161
|
-
wrtc: wrtc,
|
|
162
|
-
config: { iceServers: [{ urls: "stun:stun.l.google.com:19302" }] }
|
|
163
|
-
});
|
|
164
|
-
this.setupPeerListeners(resolve, reject);
|
|
148
|
+
clearTimeout(iceTimeout);
|
|
149
|
+
console.warn(`[${timestamp}] β οΈ Failed to fetch ICE servers (using fallback):`, err.message);
|
|
150
|
+
// Fallback to Google STUN
|
|
151
|
+
this.initPeer([{ urls: "stun:stun.l.google.com:19302" }], resolve, reject);
|
|
165
152
|
});
|
|
166
|
-
|
|
167
|
-
console.log(`[${timestamp}] β Waiting for mobile device to initiate connection...`);
|
|
168
|
-
// Start polling for offer from mobile
|
|
169
|
-
this.startPollingForOffer();
|
|
170
153
|
} catch (error) {
|
|
171
154
|
console.error(`[${timestamp}] β Initialization error:`, error);
|
|
172
155
|
reject(error);
|
|
@@ -174,6 +157,38 @@ export class WebRTCConnection {
|
|
|
174
157
|
});
|
|
175
158
|
}
|
|
176
159
|
|
|
160
|
+
private initPeer(iceServers: any[], resolve: any, reject: any) {
|
|
161
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
162
|
+
|
|
163
|
+
// Ensure iceServers is an array
|
|
164
|
+
const validIceServers = Array.isArray(iceServers) ? iceServers : [{ urls: "stun:stun.l.google.com:19302" }];
|
|
165
|
+
|
|
166
|
+
if (this.debug) {
|
|
167
|
+
console.log(`[${timestamp}] π§ Using ICE servers:`, validIceServers.length);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const rtcConfig = {
|
|
171
|
+
iceServers: validIceServers,
|
|
172
|
+
iceCandidatePoolSize: 10,
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
this.peer = new SimplePeer({
|
|
177
|
+
initiator: false,
|
|
178
|
+
trickle: true,
|
|
179
|
+
wrtc: wrtc,
|
|
180
|
+
config: rtcConfig
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
this.setupPeerListeners(resolve, reject);
|
|
184
|
+
console.log(`[${timestamp}] β Waiting for mobile device to initiate connection...`);
|
|
185
|
+
this.startPollingForOffer();
|
|
186
|
+
} catch (err: any) {
|
|
187
|
+
console.error(`[${timestamp}] β Failed to create SimplePeer:`, err);
|
|
188
|
+
reject(err);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
177
192
|
private setupPeerListeners(resolve: any, reject: any) {
|
|
178
193
|
if (!this.peer) return;
|
|
179
194
|
|
|
@@ -181,19 +196,11 @@ export class WebRTCConnection {
|
|
|
181
196
|
this.peer.on('iceConnectionStateChange', () => {
|
|
182
197
|
const state = (this.peer as any)._pc?.iceConnectionState;
|
|
183
198
|
const timestamp = new Date().toLocaleTimeString();
|
|
184
|
-
console.log(`[${timestamp}] π ICE Connection State: ${state}`);
|
|
199
|
+
if (this.debug) console.log(`[${timestamp}] π ICE Connection State: ${state}`);
|
|
185
200
|
|
|
186
201
|
if (state === 'connected' || state === 'completed') {
|
|
187
202
|
const pc = (this.peer as any)._pc;
|
|
188
203
|
if (pc) {
|
|
189
|
-
// Validate SDP for security
|
|
190
|
-
const remoteDescription = pc.remoteDescription;
|
|
191
|
-
if (remoteDescription && !validateSDP(remoteDescription.sdp)) {
|
|
192
|
-
console.error('β [MCP] Remote SDP validation failed');
|
|
193
|
-
this.disconnect();
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
204
|
pc.getStats().then((stats: any) => {
|
|
198
205
|
let usingRelay = false;
|
|
199
206
|
stats.forEach((report: any) => {
|
|
@@ -207,22 +214,12 @@ export class WebRTCConnection {
|
|
|
207
214
|
});
|
|
208
215
|
}
|
|
209
216
|
} else if (state === 'failed' || state === 'disconnected') {
|
|
210
|
-
console.error(`[${timestamp}] β ICE connection failed
|
|
217
|
+
if (state === 'failed') console.error(`[${timestamp}] β ICE connection failed`);
|
|
211
218
|
this.isConnected = false;
|
|
212
219
|
}
|
|
213
220
|
});
|
|
214
221
|
|
|
215
222
|
this.peer.on('signal', async (signal: any) => {
|
|
216
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
217
|
-
const signalType = signal.type || (signal.candidate ? 'candidate' : 'unknown');
|
|
218
|
-
console.log(`[${timestamp}] π‘ [Desktop] Signal generated: ${signalType}`);
|
|
219
|
-
|
|
220
|
-
// Validate SDP before sending
|
|
221
|
-
if (signal.sdp && !validateSDP(signal.sdp)) {
|
|
222
|
-
console.error('β [MCP] Local SDP validation failed, not sending signal');
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
223
|
// Send answer and trickle ICE candidates
|
|
227
224
|
await this.sendAnswerWithRetry(signal);
|
|
228
225
|
});
|
|
@@ -231,6 +228,10 @@ export class WebRTCConnection {
|
|
|
231
228
|
const timestamp = new Date().toLocaleTimeString();
|
|
232
229
|
console.log(`\n[${timestamp}] β¨ [ONLINE] Connected to mobile device!`);
|
|
233
230
|
this.isConnected = true;
|
|
231
|
+
|
|
232
|
+
// Send immediate handshake to update UI
|
|
233
|
+
this.send({ type: 'handshake', status: 'ready', timestamp: Date.now() });
|
|
234
|
+
|
|
234
235
|
if (this.onConnectCallback) this.onConnectCallback();
|
|
235
236
|
resolve();
|
|
236
237
|
});
|
|
@@ -245,7 +246,9 @@ export class WebRTCConnection {
|
|
|
245
246
|
});
|
|
246
247
|
|
|
247
248
|
this.peer.on('error', (err: any) => {
|
|
248
|
-
|
|
249
|
+
// Ignore routine errors during disconnect
|
|
250
|
+
if (err.code === 'ERR_DATA_CHANNEL') return;
|
|
251
|
+
console.error('β WebRTC error:', err.message || err);
|
|
249
252
|
this.isConnected = false;
|
|
250
253
|
});
|
|
251
254
|
|
|
@@ -258,36 +261,23 @@ export class WebRTCConnection {
|
|
|
258
261
|
private handleIncomingMessage(message: any): void {
|
|
259
262
|
// Validate message structure
|
|
260
263
|
if (!message || typeof message !== 'object') {
|
|
261
|
-
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Ping/Pong for Keepalive
|
|
268
|
+
if (message.type === 'ping') {
|
|
269
|
+
this.send({ type: 'pong', timestamp: Date.now() });
|
|
262
270
|
return;
|
|
263
271
|
}
|
|
264
272
|
|
|
265
273
|
// Check for nonce to prevent replay attacks
|
|
266
274
|
if (message.nonce) {
|
|
267
275
|
if (this.messageNonce.has(message.nonce)) {
|
|
268
|
-
console.warn('β οΈ [MCP] Duplicate message detected (replay attack)');
|
|
269
276
|
return;
|
|
270
277
|
}
|
|
271
278
|
this.messageNonce.add(message.nonce);
|
|
272
279
|
}
|
|
273
280
|
|
|
274
|
-
// Verify HMAC if present
|
|
275
|
-
if (message.hmac) {
|
|
276
|
-
const data = JSON.stringify({
|
|
277
|
-
type: message.type,
|
|
278
|
-
text: message.text,
|
|
279
|
-
command: message.command,
|
|
280
|
-
timestamp: message.timestamp,
|
|
281
|
-
nonce: message.nonce
|
|
282
|
-
});
|
|
283
|
-
const expectedHMAC = generateHMAC(data, this.hmacSecret);
|
|
284
|
-
|
|
285
|
-
if (message.hmac !== expectedHMAC) {
|
|
286
|
-
console.error('β [MCP] HMAC verification failed');
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
281
|
if (this.onMessageCallback) {
|
|
292
282
|
this.onMessageCallback(message);
|
|
293
283
|
}
|
|
@@ -308,27 +298,21 @@ export class WebRTCConnection {
|
|
|
308
298
|
|
|
309
299
|
pollCount++;
|
|
310
300
|
const response = await fetch(`${this.signalingUrl}/signaling/poll?code=${this.code}`);
|
|
311
|
-
|
|
312
|
-
|
|
301
|
+
|
|
313
302
|
if (response.ok) {
|
|
314
303
|
const data = await response.json() as { signal?: any };
|
|
315
304
|
if (data.signal && this.peer) {
|
|
316
|
-
console.log(`[
|
|
305
|
+
// console.log(`[Desktop] Received signal`);
|
|
317
306
|
this.peer.signal(data.signal);
|
|
318
|
-
// Don't clear interval, keep polling for trickle candidates
|
|
319
|
-
} else if (this.debug && pollCount % 10 === 0) {
|
|
320
|
-
console.log(`[${timestamp}] β Still waiting for signals (Poll #${pollCount})...`);
|
|
321
307
|
}
|
|
322
308
|
}
|
|
323
309
|
} catch (error) {
|
|
324
|
-
|
|
325
|
-
console.error('β Error during polling:', error);
|
|
326
|
-
}
|
|
310
|
+
// Ignore polling errors
|
|
327
311
|
}
|
|
328
312
|
};
|
|
329
313
|
|
|
330
|
-
// Poll every 1
|
|
331
|
-
this.pollingInterval = setInterval(poll,
|
|
314
|
+
// Poll every 1 second
|
|
315
|
+
this.pollingInterval = setInterval(poll, 1000);
|
|
332
316
|
poll();
|
|
333
317
|
}
|
|
334
318
|
|
|
@@ -337,10 +321,8 @@ export class WebRTCConnection {
|
|
|
337
321
|
try {
|
|
338
322
|
this.peer.send(JSON.stringify(message));
|
|
339
323
|
} catch (error) {
|
|
340
|
-
|
|
324
|
+
// Ignore send errors
|
|
341
325
|
}
|
|
342
|
-
} else {
|
|
343
|
-
console.warn('Cannot send message: not connected');
|
|
344
326
|
}
|
|
345
327
|
}
|
|
346
328
|
|