piixishstream 0.0.0-stage → 1.0.2

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.
Files changed (123) hide show
  1. package/README.md +124 -2
  2. package/dist/client/GatewayEvents.d.ts +30 -0
  3. package/dist/client/GatewayEvents.js +2 -0
  4. package/dist/client/GatewayEvents.js.map +1 -0
  5. package/dist/client/GatewayOpCodes.d.ts +40 -0
  6. package/dist/client/GatewayOpCodes.js +42 -0
  7. package/dist/client/GatewayOpCodes.js.map +1 -0
  8. package/dist/client/Streamer.d.ts +30 -0
  9. package/dist/client/Streamer.js +188 -0
  10. package/dist/client/Streamer.js.map +1 -0
  11. package/dist/client/index.d.ts +3 -0
  12. package/dist/client/index.js +4 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/processing/AnnexBBitstreamReaderWriter.d.ts +23 -0
  15. package/dist/client/processing/AnnexBBitstreamReaderWriter.js +149 -0
  16. package/dist/client/processing/AnnexBBitstreamReaderWriter.js.map +1 -0
  17. package/dist/client/processing/AnnexBHelper.d.ts +93 -0
  18. package/dist/client/processing/AnnexBHelper.js +127 -0
  19. package/dist/client/processing/AnnexBHelper.js.map +1 -0
  20. package/dist/client/processing/SPSVUIRewriter.d.ts +1 -0
  21. package/dist/client/processing/SPSVUIRewriter.js +297 -0
  22. package/dist/client/processing/SPSVUIRewriter.js.map +1 -0
  23. package/dist/client/voice/BaseMediaConnection.d.ts +80 -0
  24. package/dist/client/voice/BaseMediaConnection.js +552 -0
  25. package/dist/client/voice/BaseMediaConnection.js.map +1 -0
  26. package/dist/client/voice/CodecPayloadType.d.ts +59 -0
  27. package/dist/client/voice/CodecPayloadType.js +60 -0
  28. package/dist/client/voice/CodecPayloadType.js.map +1 -0
  29. package/dist/client/voice/StreamConnection.d.ts +11 -0
  30. package/dist/client/voice/StreamConnection.js +34 -0
  31. package/dist/client/voice/StreamConnection.js.map +1 -0
  32. package/dist/client/voice/VoiceConnection.d.ts +8 -0
  33. package/dist/client/voice/VoiceConnection.js +15 -0
  34. package/dist/client/voice/VoiceConnection.js.map +1 -0
  35. package/dist/client/voice/VoiceMessageTypes.d.ts +178 -0
  36. package/dist/client/voice/VoiceMessageTypes.js +2 -0
  37. package/dist/client/voice/VoiceMessageTypes.js.map +1 -0
  38. package/dist/client/voice/VoiceOpCodes.d.ts +35 -0
  39. package/dist/client/voice/VoiceOpCodes.js +38 -0
  40. package/dist/client/voice/VoiceOpCodes.js.map +1 -0
  41. package/dist/client/voice/WebRtcWrapper.d.ts +23 -0
  42. package/dist/client/voice/WebRtcWrapper.js +159 -0
  43. package/dist/client/voice/WebRtcWrapper.js.map +1 -0
  44. package/dist/client/voice/index.d.ts +4 -0
  45. package/dist/client/voice/index.js +6 -0
  46. package/dist/client/voice/index.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.js +4 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/media/AudioStream.d.ts +7 -0
  51. package/dist/media/AudioStream.js +12 -0
  52. package/dist/media/AudioStream.js.map +1 -0
  53. package/dist/media/BaseMediaStream.d.ts +31 -0
  54. package/dist/media/BaseMediaStream.js +164 -0
  55. package/dist/media/BaseMediaStream.js.map +1 -0
  56. package/dist/media/LibavCodecId.d.ts +541 -0
  57. package/dist/media/LibavCodecId.js +553 -0
  58. package/dist/media/LibavCodecId.js.map +1 -0
  59. package/dist/media/LibavDecoder.d.ts +5 -0
  60. package/dist/media/LibavDecoder.js +43 -0
  61. package/dist/media/LibavDecoder.js.map +1 -0
  62. package/dist/media/LibavDemuxer.d.ts +44 -0
  63. package/dist/media/LibavDemuxer.js +231 -0
  64. package/dist/media/LibavDemuxer.js.map +1 -0
  65. package/dist/media/VideoStream.d.ts +7 -0
  66. package/dist/media/VideoStream.js +12 -0
  67. package/dist/media/VideoStream.js.map +1 -0
  68. package/dist/media/encoders/index.d.ts +26 -0
  69. package/dist/media/encoders/index.js +12 -0
  70. package/dist/media/encoders/index.js.map +1 -0
  71. package/dist/media/encoders/merge.d.ts +3 -0
  72. package/dist/media/encoders/merge.js +10 -0
  73. package/dist/media/encoders/merge.js.map +1 -0
  74. package/dist/media/encoders/nvenc.d.ts +10 -0
  75. package/dist/media/encoders/nvenc.js +23 -0
  76. package/dist/media/encoders/nvenc.js.map +1 -0
  77. package/dist/media/encoders/software.d.ts +17 -0
  78. package/dist/media/encoders/software.js +31 -0
  79. package/dist/media/encoders/software.js.map +1 -0
  80. package/dist/media/encoders/vaapi.d.ts +6 -0
  81. package/dist/media/encoders/vaapi.js +22 -0
  82. package/dist/media/encoders/vaapi.js.map +1 -0
  83. package/dist/media/index.d.ts +4 -0
  84. package/dist/media/index.js +5 -0
  85. package/dist/media/index.js.map +1 -0
  86. package/dist/media/newApi.d.ts +130 -0
  87. package/dist/media/newApi.js +409 -0
  88. package/dist/media/newApi.js.map +1 -0
  89. package/dist/utils.d.ts +25 -0
  90. package/dist/utils.js +65 -0
  91. package/dist/utils.js.map +1 -0
  92. package/package.json +82 -5
  93. package/src/client/GatewayEvents.ts +48 -0
  94. package/src/client/GatewayOpCodes.ts +40 -0
  95. package/src/client/Streamer.ts +259 -0
  96. package/src/client/index.ts +3 -0
  97. package/src/client/processing/AnnexBBitstreamReaderWriter.ts +148 -0
  98. package/src/client/processing/AnnexBHelper.ts +134 -0
  99. package/src/client/processing/SPSVUIRewriter.ts +332 -0
  100. package/src/client/voice/BaseMediaConnection.ts +639 -0
  101. package/src/client/voice/CodecPayloadType.ts +59 -0
  102. package/src/client/voice/MediaUdp.ts.bak +171 -0
  103. package/src/client/voice/StreamConnection.ts +38 -0
  104. package/src/client/voice/VoiceConnection.ts +19 -0
  105. package/src/client/voice/VoiceMessageTypes.ts +263 -0
  106. package/src/client/voice/VoiceOpCodes.ts +36 -0
  107. package/src/client/voice/WebRtcWrapper.ts +218 -0
  108. package/src/client/voice/index.ts +5 -0
  109. package/src/index.ts +3 -0
  110. package/src/media/AudioStream.ts +18 -0
  111. package/src/media/BaseMediaStream.ts +198 -0
  112. package/src/media/LibavCodecId.ts +564 -0
  113. package/src/media/LibavDecoder.ts +47 -0
  114. package/src/media/LibavDemuxer.ts +293 -0
  115. package/src/media/VideoStream.ts +17 -0
  116. package/src/media/encoders/index.ts +27 -0
  117. package/src/media/encoders/merge.ts +14 -0
  118. package/src/media/encoders/nvenc.ts +38 -0
  119. package/src/media/encoders/software.ts +76 -0
  120. package/src/media/encoders/vaapi.ts +29 -0
  121. package/src/media/index.ts +4 -0
  122. package/src/media/newApi.ts +642 -0
  123. package/src/utils.ts +101 -0
package/README.md CHANGED
@@ -1,3 +1,125 @@
1
- # Temporary Holding Version
1
+ # Piixish Stream (v1.0.0)
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [!CAUTION]
4
+ Using any kind of automation programs on your account can result in your account getting permanently banned by Discord. **Use at your own risk.**
5
+
6
+ ---
7
+
8
+ ## ⚡ FIXES (Community Patch by Piixish)
9
+
10
+ This version introduces critical performance and stability patches to handle Discord's recent WebRTC DAVE (End-to-End Encryption) updates:
11
+
12
+ - **Unlocked FPS Locking:** Removed the hardcoded minimum of 60 FPS in `BaseMediaConnection`. The library now supports any requested framerate (30, 25, 24, etc.) without forcibly upscaling, which drastically reduces CPU usage and "Sync Lag".
13
+ - **DAVE Encryption Stability:** Disabled the `PacingHandler` synchronous thread-blocking which previously caused `700% frametime` spikes during AES-GCM encryption.
14
+ - **Network Flood Prevention:** Disabled aggressive `SyncStream` catch-up logic to prevent UDP socket overflows and sudden voice disconnects.
15
+
16
+ ---
17
+
18
+ ## About this Fork
19
+
20
+ This package is a community-driven, performance-focused fork of the fantastic `@dank074/discord-video-stream` module.
21
+
22
+ A massive thank you to `dank074` and all the original contributors for laying down the incredible foundation that makes self-bot video streaming possible on Discord! This fork was created purely for fun and to provide a highly stable alternative for the self-bot community, specifically tailored for extreme high-framerate environments.
23
+
24
+ ### Why this fork?
25
+ With Discord's recent WebRTC DAVE (End-to-End Encryption) protocol updates, heavy computations (like native AES-GCM encryption) were introduced to the pipeline. While the original module is brilliant, a few of its native safety mechanisms inadvertently caused heavy event-loop execution limits in Node.js when processing high-bitrate (e.g. 1080p/60FPS) feeds, resulting in `700% frametime` lag and sudden voice disconnects.
26
+
27
+ We gently refactored a few structural limits to let your hardware breathe!
28
+
29
+ ### What's been modified? (by Piixish)
30
+ 1. **Disabled SyncStream Catchup Logic:** The video stream operates flawlessly on its native hardware-driven timestamp clock (`FRC / PTS`). It no longer drops frame-pacing boundaries to unnaturally chase audio loops. This completely solves the WebRTC socket network flood crashes (the infamous "5-second stream drop"). A/V sync remains pixel-perfect thanks to FFmpeg's `.nut` multiplexing.
31
+ 2. **Removed Node.js Thread-lock Sleep Timers:** Disabled the `PacingHandler` network wrapper to prevent the host CPU from forcefully sleeping mid-tick. This eliminates the massive DAVE encryption lag spikes, enabling raw hardware-accelerated WebRTC routing directly into Discord.
32
+
33
+ ---
34
+
35
+ ## Features
36
+ - Playing video & audio in a voice channel (**Go Live** or **Webcam** video)
37
+ - Support for **H.264** and **H.265** codecs
38
+ - RTP and **RTCP** support
39
+ - Full **End-to-End Encryption (DAVE)** compatibility
40
+ - Optimized for high-bitrate performance on self-bots
41
+
42
+ ## Requirements
43
+ For full functionality, this library requires an **FFmpeg** build with `libzmq` enabled.
44
+ - **Windows & Linux:** [BtbN's FFmpeg Builds](https://github.com/BtbN/FFmpeg-Builds/releases)
45
+
46
+ ---
47
+
48
+ ## Installation
49
+ Install the package alongside its peer-dependency `discord.js-selfbot-v13`:
50
+
51
+ ```sh
52
+ npm install piixishstream@latest
53
+ npm install discord.js-selfbot-v13@latest
54
+ ```
55
+
56
+ > [!IMPORTANT]
57
+ > This library makes use of native dependencies (`node-av` and `node-datachannel`). If you use package managers that don't run install scripts by default (pnpm, bun, etc.), you'll need to manually allow them.
58
+
59
+ ---
60
+
61
+ ## Usage Guide
62
+
63
+ ### 1. Initialize Streamer
64
+ ```javascript
65
+ import { Client } from "discord.js-selfbot-v13";
66
+ import { Streamer } from 'piixishstream';
67
+
68
+ const streamer = new Streamer(new Client());
69
+ await streamer.client.login('YOUR_TOKEN');
70
+ ```
71
+
72
+ ### 2. Join a Voice Channel
73
+ ```javascript
74
+ await streamer.joinVoice("GUILD_ID", "CHANNEL_ID");
75
+ ```
76
+
77
+ ### 3. Start Sending Media
78
+ ```javascript
79
+ import { prepareStream, playStream, Utils, Encoders } from "piixishstream"
80
+
81
+ try {
82
+ // NVENC (Hardware Acceleration) is supported!
83
+ let encoder = Encoders.nvenc({
84
+ preset: "p1",
85
+ rc: "cbr"
86
+ });
87
+
88
+ const { command, output } = prepareStream("VIDEO_URL_OR_FILE", {
89
+ encoder,
90
+ height: 1080,
91
+ frameRate: 30, // Now truly respects values below 60!
92
+ bitrateVideo: 5000,
93
+ videoCodec: Utils.normalizeVideoCodec("H264"),
94
+ });
95
+
96
+ await playStream(output, streamer, {
97
+ type: "go-live" // Use "camera" for webcam mode
98
+ });
99
+
100
+ } catch (e) {
101
+ console.error(e);
102
+ }
103
+ ```
104
+
105
+ ---
106
+
107
+ ## Documentation & API
108
+
109
+ ### `prepareStream` Options
110
+ | Option | Description |
111
+ | :--- | :--- |
112
+ | `width` / `height` | Output resolution |
113
+ | `frameRate` | Target FPS (Supports 1-60) |
114
+ | `bitrateVideo` | Average bitrate in kbps |
115
+ | `hardwareAcceleratedDecoding` | Enable GPU decoding |
116
+ | `videoCodec` | Supports H264, H265, VP8 |
117
+
118
+ ### Performance Tips
119
+ - Use `NVENC` if you have an NVIDIA GPU to offload encryption.
120
+ - Keep `frameRate` at 30 for the best performance/quality ratio on Discord.
121
+ - Ensure your source resolution matches the output to avoid extra scaling.
122
+
123
+ ---
124
+
125
+ A massive thank you to **dank074** for the original foundation! This fork is maintained for fun and for the community. ❤️
@@ -0,0 +1,30 @@
1
+ type GatewayEventGeneric<Type extends string = string, Data = unknown> = {
2
+ t: Type;
3
+ d: Data;
4
+ };
5
+ export declare namespace GatewayEvent {
6
+ type VoiceStateUpdate = GatewayEventGeneric<"VOICE_STATE_UPDATE", {
7
+ user_id: string;
8
+ session_id: string;
9
+ }>;
10
+ type VoiceServerUpdate = GatewayEventGeneric<"VOICE_SERVER_UPDATE", {
11
+ guild_id: string;
12
+ channel_id?: string;
13
+ endpoint: string;
14
+ token: string;
15
+ }>;
16
+ type StreamCreate = GatewayEventGeneric<"STREAM_CREATE", {
17
+ stream_key: string;
18
+ rtc_server_id: string;
19
+ }>;
20
+ type StreamServerUpdate = GatewayEventGeneric<"STREAM_SERVER_UPDATE", {
21
+ stream_key: string;
22
+ endpoint: string;
23
+ token: string;
24
+ }>;
25
+ }
26
+ export type GatewayEvent = GatewayEvent.VoiceStateUpdate | GatewayEvent.VoiceServerUpdate | GatewayEvent.StreamCreate | GatewayEvent.StreamServerUpdate;
27
+ export type GatewayEventMap = {
28
+ [E in GatewayEvent as E["t"]]: [E["d"]];
29
+ };
30
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GatewayEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayEvents.js","sourceRoot":"","sources":["../../src/client/GatewayEvents.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ export declare enum GatewayOpCodes {
2
+ DISPATCH = 0,
3
+ HEARTBEAT = 1,
4
+ IDENTIFY = 2,
5
+ PRESENCE_UPDATE = 3,
6
+ VOICE_STATE_UPDATE = 4,
7
+ VOICE_SERVER_PING = 5,
8
+ RESUME = 6,
9
+ RECONNECT = 7,
10
+ REQUEST_GUILD_MEMBERS = 8,
11
+ INVALID_SESSION = 9,
12
+ HELLO = 10,
13
+ HEARTBEAT_ACK = 11,
14
+ CALL_CONNECT = 13,
15
+ GUILD_SUBSCRIPTIONS = 14,
16
+ LOBBY_CONNECT = 15,
17
+ LOBBY_DISCONNECT = 16,
18
+ LOBBY_VOICE_STATES_UPDATE = 17,
19
+ STREAM_CREATE = 18,
20
+ STREAM_DELETE = 19,
21
+ STREAM_WATCH = 20,
22
+ STREAM_PING = 21,
23
+ STREAM_SET_PAUSED = 22,
24
+ REQUEST_GUILD_APPLICATION_COMMANDS = 24,
25
+ EMBEDDED_ACTIVITY_LAUNCH = 25,
26
+ EMBEDDED_ACTIVITY_CLOSE = 26,
27
+ EMBEDDED_ACTIVITY_UPDATE = 27,
28
+ REQUEST_FORUM_UNREADS = 28,
29
+ REMOTE_COMMAND = 29,
30
+ GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH = 30,
31
+ REQUEST_SOUNDBOARD_SOUNDS = 31,
32
+ SPEED_TEST_CREATE = 32,
33
+ SPEED_TEST_DELETE = 33,
34
+ REQUEST_LAST_MESSAGES = 34,
35
+ SEARCH_RECENT_MEMBERS = 35,
36
+ REQUEST_CHANNEL_STATUSES = 36,
37
+ GUILD_SUBSCRIPTIONS_BULK = 37,
38
+ GUILD_CHANNELS_RESYNC = 38,
39
+ REQUEST_CHANNEL_MEMBER_COUNT = 39
40
+ }
@@ -0,0 +1,42 @@
1
+ export var GatewayOpCodes;
2
+ (function (GatewayOpCodes) {
3
+ GatewayOpCodes[GatewayOpCodes["DISPATCH"] = 0] = "DISPATCH";
4
+ GatewayOpCodes[GatewayOpCodes["HEARTBEAT"] = 1] = "HEARTBEAT";
5
+ GatewayOpCodes[GatewayOpCodes["IDENTIFY"] = 2] = "IDENTIFY";
6
+ GatewayOpCodes[GatewayOpCodes["PRESENCE_UPDATE"] = 3] = "PRESENCE_UPDATE";
7
+ GatewayOpCodes[GatewayOpCodes["VOICE_STATE_UPDATE"] = 4] = "VOICE_STATE_UPDATE";
8
+ GatewayOpCodes[GatewayOpCodes["VOICE_SERVER_PING"] = 5] = "VOICE_SERVER_PING";
9
+ GatewayOpCodes[GatewayOpCodes["RESUME"] = 6] = "RESUME";
10
+ GatewayOpCodes[GatewayOpCodes["RECONNECT"] = 7] = "RECONNECT";
11
+ GatewayOpCodes[GatewayOpCodes["REQUEST_GUILD_MEMBERS"] = 8] = "REQUEST_GUILD_MEMBERS";
12
+ GatewayOpCodes[GatewayOpCodes["INVALID_SESSION"] = 9] = "INVALID_SESSION";
13
+ GatewayOpCodes[GatewayOpCodes["HELLO"] = 10] = "HELLO";
14
+ GatewayOpCodes[GatewayOpCodes["HEARTBEAT_ACK"] = 11] = "HEARTBEAT_ACK";
15
+ GatewayOpCodes[GatewayOpCodes["CALL_CONNECT"] = 13] = "CALL_CONNECT";
16
+ GatewayOpCodes[GatewayOpCodes["GUILD_SUBSCRIPTIONS"] = 14] = "GUILD_SUBSCRIPTIONS";
17
+ GatewayOpCodes[GatewayOpCodes["LOBBY_CONNECT"] = 15] = "LOBBY_CONNECT";
18
+ GatewayOpCodes[GatewayOpCodes["LOBBY_DISCONNECT"] = 16] = "LOBBY_DISCONNECT";
19
+ GatewayOpCodes[GatewayOpCodes["LOBBY_VOICE_STATES_UPDATE"] = 17] = "LOBBY_VOICE_STATES_UPDATE";
20
+ GatewayOpCodes[GatewayOpCodes["STREAM_CREATE"] = 18] = "STREAM_CREATE";
21
+ GatewayOpCodes[GatewayOpCodes["STREAM_DELETE"] = 19] = "STREAM_DELETE";
22
+ GatewayOpCodes[GatewayOpCodes["STREAM_WATCH"] = 20] = "STREAM_WATCH";
23
+ GatewayOpCodes[GatewayOpCodes["STREAM_PING"] = 21] = "STREAM_PING";
24
+ GatewayOpCodes[GatewayOpCodes["STREAM_SET_PAUSED"] = 22] = "STREAM_SET_PAUSED";
25
+ GatewayOpCodes[GatewayOpCodes["REQUEST_GUILD_APPLICATION_COMMANDS"] = 24] = "REQUEST_GUILD_APPLICATION_COMMANDS";
26
+ GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_LAUNCH"] = 25] = "EMBEDDED_ACTIVITY_LAUNCH";
27
+ GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_CLOSE"] = 26] = "EMBEDDED_ACTIVITY_CLOSE";
28
+ GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_UPDATE"] = 27] = "EMBEDDED_ACTIVITY_UPDATE";
29
+ GatewayOpCodes[GatewayOpCodes["REQUEST_FORUM_UNREADS"] = 28] = "REQUEST_FORUM_UNREADS";
30
+ GatewayOpCodes[GatewayOpCodes["REMOTE_COMMAND"] = 29] = "REMOTE_COMMAND";
31
+ GatewayOpCodes[GatewayOpCodes["GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH"] = 30] = "GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH";
32
+ GatewayOpCodes[GatewayOpCodes["REQUEST_SOUNDBOARD_SOUNDS"] = 31] = "REQUEST_SOUNDBOARD_SOUNDS";
33
+ GatewayOpCodes[GatewayOpCodes["SPEED_TEST_CREATE"] = 32] = "SPEED_TEST_CREATE";
34
+ GatewayOpCodes[GatewayOpCodes["SPEED_TEST_DELETE"] = 33] = "SPEED_TEST_DELETE";
35
+ GatewayOpCodes[GatewayOpCodes["REQUEST_LAST_MESSAGES"] = 34] = "REQUEST_LAST_MESSAGES";
36
+ GatewayOpCodes[GatewayOpCodes["SEARCH_RECENT_MEMBERS"] = 35] = "SEARCH_RECENT_MEMBERS";
37
+ GatewayOpCodes[GatewayOpCodes["REQUEST_CHANNEL_STATUSES"] = 36] = "REQUEST_CHANNEL_STATUSES";
38
+ GatewayOpCodes[GatewayOpCodes["GUILD_SUBSCRIPTIONS_BULK"] = 37] = "GUILD_SUBSCRIPTIONS_BULK";
39
+ GatewayOpCodes[GatewayOpCodes["GUILD_CHANNELS_RESYNC"] = 38] = "GUILD_CHANNELS_RESYNC";
40
+ GatewayOpCodes[GatewayOpCodes["REQUEST_CHANNEL_MEMBER_COUNT"] = 39] = "REQUEST_CHANNEL_MEMBER_COUNT";
41
+ })(GatewayOpCodes || (GatewayOpCodes = {}));
42
+ //# sourceMappingURL=GatewayOpCodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayOpCodes.js","sourceRoot":"","sources":["../../src/client/GatewayOpCodes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAuCX;AAvCD,WAAY,cAAc;IACxB,2DAAY,CAAA;IACZ,6DAAa,CAAA;IACb,2DAAY,CAAA;IACZ,yEAAmB,CAAA;IACnB,+EAAsB,CAAA;IACtB,6EAAqB,CAAA;IACrB,uDAAU,CAAA;IACV,6DAAa,CAAA;IACb,qFAAyB,CAAA;IACzB,yEAAmB,CAAA;IACnB,sDAAU,CAAA;IACV,sEAAkB,CAAA;IAClB,oEAAiB,CAAA;IACjB,kFAAwB,CAAA;IACxB,sEAAkB,CAAA;IAClB,4EAAqB,CAAA;IACrB,8FAA8B,CAAA;IAC9B,sEAAkB,CAAA;IAClB,sEAAkB,CAAA;IAClB,oEAAiB,CAAA;IACjB,kEAAgB,CAAA;IAChB,8EAAsB,CAAA;IACtB,gHAAuC,CAAA;IACvC,4FAA6B,CAAA;IAC7B,0FAA4B,CAAA;IAC5B,4FAA6B,CAAA;IAC7B,sFAA0B,CAAA;IAC1B,wEAAmB,CAAA;IACnB,4HAA6C,CAAA;IAC7C,8FAA8B,CAAA;IAC9B,8EAAsB,CAAA;IACtB,8EAAsB,CAAA;IACtB,sFAA0B,CAAA;IAC1B,sFAA0B,CAAA;IAC1B,4FAA6B,CAAA;IAC7B,4FAA6B,CAAA;IAC7B,sFAA0B,CAAA;IAC1B,oGAAiC,CAAA;AACnC,CAAC,EAvCW,cAAc,KAAd,cAAc,QAuCzB"}
@@ -0,0 +1,30 @@
1
+ import { VoiceConnection } from "./voice/VoiceConnection.js";
2
+ import type { Client, DMChannel, GroupDMChannel, VoiceBasedChannel } from "discord.js-selfbot-v13";
3
+ import type { WebRtcConnWrapper } from "./voice/WebRtcWrapper.js";
4
+ export declare class Streamer {
5
+ private _voiceConnection?;
6
+ private _client;
7
+ private _gatewayEmitter;
8
+ constructor(client: Client);
9
+ get client(): Client;
10
+ get opts(): {};
11
+ get voiceConnection(): VoiceConnection | undefined;
12
+ sendOpcode(code: number, data: unknown): void;
13
+ joinVoiceChannel(channel: DMChannel | GroupDMChannel | VoiceBasedChannel): Promise<WebRtcConnWrapper>;
14
+ /**
15
+ * Joins a voice channel and returns a WebRtcConnWrapper object.
16
+ * @param guild_id the guild id of the voice channel. If null, it will join a DM voice channel.
17
+ * @param channel_id the channel id of the voice channel
18
+ * @returns the WebRtcConnWrapper object
19
+ * @throws Error if the client is not logged in
20
+ */
21
+ joinVoice(guild_id: string | null, channel_id: string): Promise<WebRtcConnWrapper>;
22
+ createStream(): Promise<WebRtcConnWrapper>;
23
+ setStreamPreview(image: Buffer): Promise<void>;
24
+ stopStream(): void;
25
+ leaveVoice(): void;
26
+ signalVideo(video_enabled: boolean): void;
27
+ signalStream(): void;
28
+ signalStopStream(): void;
29
+ signalLeaveVoice(): void;
30
+ }
@@ -0,0 +1,188 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { VoiceConnection } from "./voice/VoiceConnection.js";
3
+ import { StreamConnection } from "./voice/StreamConnection.js";
4
+ import { GatewayOpCodes } from "./GatewayOpCodes.js";
5
+ import { generateStreamKey, parseStreamKey } from "../utils.js";
6
+ export class Streamer {
7
+ _voiceConnection;
8
+ _client;
9
+ _gatewayEmitter = new EventEmitter();
10
+ constructor(client) {
11
+ this._client = client;
12
+ //listen for messages
13
+ this.client.on("raw", (packet) => {
14
+ // @ts-expect-error I don't know how to make this work with TypeScript, so whatever
15
+ this._gatewayEmitter.emit(packet.t, packet.d);
16
+ });
17
+ }
18
+ get client() {
19
+ return this._client;
20
+ }
21
+ get opts() {
22
+ return {};
23
+ }
24
+ get voiceConnection() {
25
+ return this._voiceConnection;
26
+ }
27
+ sendOpcode(code, data) {
28
+ this.client.ws.broadcast({
29
+ op: code,
30
+ d: data,
31
+ });
32
+ }
33
+ joinVoiceChannel(channel) {
34
+ let guildId = null;
35
+ if (channel.type === "GUILD_STAGE_VOICE" ||
36
+ channel.type === "GUILD_VOICE") {
37
+ guildId = channel.guildId;
38
+ }
39
+ return this.joinVoice(guildId, channel.id);
40
+ }
41
+ /**
42
+ * Joins a voice channel and returns a WebRtcConnWrapper object.
43
+ * @param guild_id the guild id of the voice channel. If null, it will join a DM voice channel.
44
+ * @param channel_id the channel id of the voice channel
45
+ * @returns the WebRtcConnWrapper object
46
+ * @throws Error if the client is not logged in
47
+ */
48
+ joinVoice(guild_id, channel_id) {
49
+ return new Promise((resolve, reject) => {
50
+ if (!this.client.user) {
51
+ reject("Client not logged in");
52
+ return;
53
+ }
54
+ const user_id = this.client.user.id;
55
+ const voiceConn = new VoiceConnection(this, guild_id, user_id, channel_id, (conn) => {
56
+ resolve(conn);
57
+ });
58
+ this._voiceConnection = voiceConn;
59
+ this._gatewayEmitter.on("VOICE_STATE_UPDATE", (d) => {
60
+ if (user_id !== d.user_id)
61
+ return;
62
+ voiceConn.setSession(d.session_id);
63
+ });
64
+ this._gatewayEmitter.on("VOICE_SERVER_UPDATE", (d) => {
65
+ if (guild_id !== d.guild_id)
66
+ return;
67
+ // channel_id is not set for guild voice calls
68
+ if (d.channel_id && channel_id !== d.channel_id)
69
+ return;
70
+ voiceConn.setTokens(d.endpoint, d.token);
71
+ });
72
+ this.signalVideo(false);
73
+ });
74
+ }
75
+ createStream() {
76
+ return new Promise((resolve, reject) => {
77
+ if (!this.client.user) {
78
+ reject("Client not logged in");
79
+ return;
80
+ }
81
+ if (!this.voiceConnection) {
82
+ reject("cannot start stream without first joining voice channel");
83
+ return;
84
+ }
85
+ this.signalStream();
86
+ const { guildId: clientGuildId, channelId: clientChannelId, session_id, } = this.voiceConnection;
87
+ const { id: clientUserId } = this.client.user;
88
+ if (!session_id)
89
+ throw new Error("Session doesn't exist yet");
90
+ const streamConn = new StreamConnection(this, clientGuildId, clientUserId, clientChannelId, (conn) => {
91
+ resolve(conn);
92
+ });
93
+ this.voiceConnection.streamConnection = streamConn;
94
+ this._gatewayEmitter.on("STREAM_CREATE", (d) => {
95
+ const { channelId, guildId, userId } = parseStreamKey(d.stream_key);
96
+ if (clientGuildId !== guildId ||
97
+ clientChannelId !== channelId ||
98
+ clientUserId !== userId)
99
+ return;
100
+ streamConn.serverId = d.rtc_server_id;
101
+ streamConn.streamKey = d.stream_key;
102
+ streamConn.setSession(session_id);
103
+ });
104
+ this._gatewayEmitter.on("STREAM_SERVER_UPDATE", (d) => {
105
+ const { channelId, guildId, userId } = parseStreamKey(d.stream_key);
106
+ if (clientGuildId !== guildId ||
107
+ clientChannelId !== channelId ||
108
+ clientUserId !== userId)
109
+ return;
110
+ streamConn.setTokens(d.endpoint, d.token);
111
+ });
112
+ });
113
+ }
114
+ async setStreamPreview(image) {
115
+ if (!this.client.token)
116
+ throw new Error("Please login :)");
117
+ if (!this.voiceConnection?.streamConnection?.guildId)
118
+ return;
119
+ const data = `data:image/jpeg;base64,${image.toString("base64")}`;
120
+ const { guildId } = this.voiceConnection.streamConnection;
121
+ const server = await this.client.guilds.fetch(guildId);
122
+ await server.members.me?.voice.postPreview(data);
123
+ }
124
+ stopStream() {
125
+ const stream = this.voiceConnection?.streamConnection;
126
+ if (!stream)
127
+ return;
128
+ stream.stop();
129
+ this.signalStopStream();
130
+ this.voiceConnection.streamConnection = undefined;
131
+ this._gatewayEmitter.removeAllListeners("STREAM_CREATE");
132
+ this._gatewayEmitter.removeAllListeners("STREAM_SERVER_UPDATE");
133
+ }
134
+ leaveVoice() {
135
+ this.voiceConnection?.stop();
136
+ this.signalLeaveVoice();
137
+ this._voiceConnection = undefined;
138
+ this._gatewayEmitter.removeAllListeners("VOICE_STATE_UPDATE");
139
+ this._gatewayEmitter.removeAllListeners("VOICE_SERVER_UPDATE");
140
+ }
141
+ signalVideo(video_enabled) {
142
+ if (!this.voiceConnection)
143
+ return;
144
+ const { guildId: guild_id, channelId: channel_id } = this.voiceConnection;
145
+ this.sendOpcode(GatewayOpCodes.VOICE_STATE_UPDATE, {
146
+ guild_id: guild_id,
147
+ channel_id,
148
+ self_mute: false,
149
+ self_deaf: true,
150
+ self_video: video_enabled,
151
+ });
152
+ }
153
+ signalStream() {
154
+ if (!this.voiceConnection)
155
+ return;
156
+ const { type, guildId: guild_id, channelId: channel_id, botId: user_id, } = this.voiceConnection;
157
+ const streamKey = generateStreamKey(type, guild_id, channel_id, user_id);
158
+ this.sendOpcode(GatewayOpCodes.STREAM_CREATE, {
159
+ type,
160
+ guild_id,
161
+ channel_id,
162
+ preferred_region: null,
163
+ });
164
+ this.sendOpcode(GatewayOpCodes.STREAM_SET_PAUSED, {
165
+ stream_key: streamKey,
166
+ paused: false,
167
+ });
168
+ }
169
+ signalStopStream() {
170
+ if (!this.voiceConnection)
171
+ return;
172
+ const { type, guildId: guild_id, channelId: channel_id, botId: user_id, } = this.voiceConnection;
173
+ const streamKey = generateStreamKey(type, guild_id, channel_id, user_id);
174
+ this.sendOpcode(GatewayOpCodes.STREAM_DELETE, {
175
+ stream_key: streamKey,
176
+ });
177
+ }
178
+ signalLeaveVoice() {
179
+ this.sendOpcode(GatewayOpCodes.VOICE_STATE_UPDATE, {
180
+ guild_id: null,
181
+ channel_id: null,
182
+ self_mute: true,
183
+ self_deaf: false,
184
+ self_video: false,
185
+ });
186
+ }
187
+ }
188
+ //# sourceMappingURL=Streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Streamer.js","sourceRoot":"","sources":["../../src/client/Streamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./voice/index.js";
2
+ export * from "./GatewayOpCodes.js";
3
+ export * from "./Streamer.js";
@@ -0,0 +1,4 @@
1
+ export * from "./voice/index.js";
2
+ export * from "./GatewayOpCodes.js";
3
+ export * from "./Streamer.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare class AnnexBBitstreamReader {
2
+ private _buffer;
3
+ private _byteOffset;
4
+ private _bitOffset;
5
+ constructor(buffer: Buffer);
6
+ readBits(count: number): number;
7
+ readUnsigned(bits: number): number;
8
+ readSigned(bits: number): number;
9
+ readUnsignedExpGolomb(): number;
10
+ readSignedExpGolomb(): number;
11
+ }
12
+ export declare class AnnexBBitstreamWriter {
13
+ private _arr;
14
+ private _pendingByte;
15
+ private _bitOffset;
16
+ toBuffer(): Buffer<ArrayBuffer>;
17
+ flush(): void;
18
+ writeBits(bits: number, count: number): void;
19
+ writeUnsigned(num: number, count: number): void;
20
+ writeSigned(num: number, count: number): void;
21
+ writeUnsignedExpGolomb(num: number): void;
22
+ writeSignedExpGolomb(num: number): void;
23
+ }