86 lines
3.8 KiB
Markdown
86 lines
3.8 KiB
Markdown
# Internal Streamer Replacement Design
|
|
|
|
## Summary
|
|
Replace the external `@dank074/discord-video-stream` dependency with an internal streaming module that uses `discord.js-selfbot-v13` private APIs to deliver the same screen share behavior (video + audio) with identical UI/API surface.
|
|
|
|
## Goals
|
|
- Maintain feature parity for screen share (video + audio, 720p @ 30fps, bitrate 2500/4000, H264, audio on).
|
|
- Keep existing UI and API contracts unchanged (`/api/media/queue` with `mode: "screen"`).
|
|
- Remove `@dank074/discord-video-stream` from dependencies and delete `vendor/Discord-video-stream`.
|
|
- Ensure clean lifecycle handling (start/stop, cleanup, error reporting).
|
|
|
|
## Non-Goals
|
|
- Rewriting WebRTC/RTP stack from scratch.
|
|
- Changing media queue behavior or UI layout.
|
|
- Adding new screen share modes or settings.
|
|
|
|
## Architecture Overview
|
|
Introduce a new internal module under `src/streaming/` that encapsulates:
|
|
- Voice/session management using private `discord.js-selfbot-v13` APIs.
|
|
- FFmpeg preparation for H264 + Opus (AnnexB video + Opus audio).
|
|
- Stream playback into the internal dispatcher.
|
|
|
|
`screenShareController` will depend on this module instead of `@dank074/discord-video-stream`.
|
|
|
|
## Components
|
|
|
|
### 1) Streaming Session Module (`src/streaming/`)
|
|
Proposed exports:
|
|
- `createStreamSession(client)`
|
|
- Joins or reuses voice connection for video streaming.
|
|
- Exposes a `session` object with `startVideo()`, `stopVideo()`, and `sendStream(stream)` hooks.
|
|
- `prepareFfmpegStream(source, opts)`
|
|
- Spawns ffmpeg with the same parameters used today.
|
|
- Returns `{ command, output }` (output is a Readable stream).
|
|
- `playPreparedStream(output, session)`
|
|
- Pipes the prepared stream into the internal dispatcher.
|
|
- Returns a promise that resolves when playback completes.
|
|
|
|
### 2) Screen Share Controller (`src/media/screenShareController.ts`)
|
|
- Replace Streamer/prepareStream/playStream with internal module usage.
|
|
- Keep the public API identical (`start(source)` returning `ScreenSharePlayback`).
|
|
|
|
### 3) Web Server Wiring (`src/webserver.ts`)
|
|
- Remove `Streamer` instantiation and dependencies.
|
|
- Pass only `getVoiceStatus` and new streaming module dependencies into `createScreenShareController`.
|
|
|
|
## Data Flow
|
|
1. User queues screen share via `/api/media/queue` with `mode: "screen"`.
|
|
2. `MediaController` calls `screenShareController.start(source)`.
|
|
3. `screenShareController` resolves URL, calls `prepareFfmpegStream`.
|
|
4. `createStreamSession` ensures voice connection and dispatcher ready.
|
|
5. `playPreparedStream` sends output to Discord.
|
|
6. On completion or stop, cleanup runs and state updates propagate.
|
|
|
|
## Error Handling
|
|
- Voice not connected: throw `VOICE_NOT_CONNECTED`.
|
|
- FFmpeg spawn/exit failure: throw `SCREEN_STREAM_FAILED`.
|
|
- Dispatcher error: stop stream, cleanup, log error, set state idle.
|
|
|
|
## Lifecycle Rules
|
|
- `start()` always stops any active stream first.
|
|
- `stop()` kills ffmpeg, stops dispatcher, and resets internal state.
|
|
- Completion resolves `done` promise and triggers cleanup.
|
|
|
|
## Testing Strategy
|
|
- Unit tests for `screenShareController`:
|
|
- Calls to `prepareFfmpegStream` and `playPreparedStream` on `start()`.
|
|
- Ensures `stop()` kills ffmpeg and ends session.
|
|
- Unit tests for `streaming` module:
|
|
- Session initialization and cleanup logic with mocked private APIs.
|
|
|
|
## Migration Steps
|
|
1. Implement `src/streaming/` module.
|
|
2. Update `screenShareController` to use internal module.
|
|
3. Remove `@dank074/discord-video-stream` imports and wiring.
|
|
4. Delete `vendor/Discord-video-stream` directory.
|
|
5. Update `package.json` dependencies.
|
|
6. Update tests.
|
|
|
|
## Risks
|
|
- Private `discord.js-selfbot-v13` APIs may change.
|
|
- Harder debugging if internal dispatcher behavior differs.
|
|
|
|
## Rollback Plan
|
|
- Revert to previous commit that restores `@dank074/discord-video-stream` and the vendor directory.
|