diff options
Diffstat (limited to 'packages/meshbay-client/src/main.js')
| -rw-r--r-- | packages/meshbay-client/src/main.js | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/packages/meshbay-client/src/main.js b/packages/meshbay-client/src/main.js index f2ec645..45e8462 100644 --- a/packages/meshbay-client/src/main.js +++ b/packages/meshbay-client/src/main.js @@ -351,6 +351,11 @@ function createWindow() { // renderer parses decrypted content from nodes, which is attacker-controlled // input, so it is treated as hostile even though it is our own code. +const CastRelay = require('./cast-relay.js'); +const castRelay = new CastRelay(); +const CastChromecast = require('./cast-chromecast.js'); +const castChromecast = new CastChromecast(); + function registerBridge() { ipcMain.handle('hub:set', async (_e, base) => { const url = String(base || '').trim().replace(/\/+$/, ''); @@ -738,6 +743,60 @@ function registerBridge() { _nodePairingCode = code || null; return true; }); + + // ── LAN cast relay ────────────────────────────────────────────────────── + // + // A local HTTP server that re-serves decrypted fMP4 segments so a + // Chromecast or Smart TV on the same Wi-Fi can stream the video. The + // renderer feeds it segments via IPC; the relay serves them over HTTP. + // Same trust boundary as the MSE player and the download-to-disk path. + + ipcMain.handle('cast:start', async (_e, opts) => { + return castRelay.start({ + codec: opts.codec, + initSegment: opts.initSegment ? Buffer.from(opts.initSegment) : null, + }); + }); + + ipcMain.handle('cast:push', async (_e, data) => { + castRelay.pushSegment(Buffer.from(data)); + return true; + }); + + ipcMain.handle('cast:stop', async () => { + await castRelay.stop(); + return true; + }); + + ipcMain.handle('cast:finish', async () => { + castRelay.finish(); + return true; + }); + + ipcMain.handle('cast:status', async () => ({ + active: castRelay.active, + url: castRelay.url, + chromecast: castChromecast.getStatus(), + })); + + // ── Chromecast discovery + control ────────────────────────────────────── + + ipcMain.handle('cast:discover', async () => { + return castChromecast.discover(); + }); + + ipcMain.handle('cast:chromecast:connect', async (_e, { deviceId, mediaUrl }) => { + return castChromecast.connect(deviceId, mediaUrl); + }); + + ipcMain.handle('cast:chromecast:reload', async (_e, { mediaUrl }) => { + return castChromecast.reload(mediaUrl); + }); + + ipcMain.handle('cast:chromecast:disconnect', async () => { + await castChromecast.disconnect(); + return true; + }); } /** |