lunibee 0.3.3 → 0.4.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.
Files changed (125) hide show
  1. package/README.md +1 -1
  2. package/dist/builders/commands.d.ts +1 -1
  3. package/dist/builders/components.d.ts +9 -11
  4. package/dist/builders/embed.d.ts +1 -1
  5. package/dist/builders/index.d.ts +1 -1
  6. package/dist/builders/index.js +87 -1298
  7. package/dist/builders/index.js.map +3 -11
  8. package/dist/chunks/index-0wn81eng.js +2492 -0
  9. package/dist/chunks/index-0wn81eng.js.map +17 -0
  10. package/dist/chunks/index-2en489j6.js +40 -0
  11. package/dist/chunks/index-2en489j6.js.map +10 -0
  12. package/dist/chunks/index-3hyps48a.js +203 -0
  13. package/dist/chunks/index-3hyps48a.js.map +11 -0
  14. package/dist/chunks/index-57c5n3ms.js +2274 -0
  15. package/dist/chunks/index-57c5n3ms.js.map +19 -0
  16. package/dist/chunks/index-5yx92e36.js +1170 -0
  17. package/dist/chunks/index-5yx92e36.js.map +14 -0
  18. package/dist/chunks/index-690bp093.js +95 -0
  19. package/dist/chunks/index-690bp093.js.map +10 -0
  20. package/dist/chunks/index-7fp2hvmg.js +2155 -0
  21. package/dist/chunks/index-7fp2hvmg.js.map +24 -0
  22. package/dist/chunks/index-cnmsajvk.js +1119 -0
  23. package/dist/chunks/index-cnmsajvk.js.map +12 -0
  24. package/dist/chunks/index-fdvgk2sw.js +1310 -0
  25. package/dist/chunks/index-fdvgk2sw.js.map +21 -0
  26. package/dist/chunks/index-gyvps8b9.js +214 -0
  27. package/dist/chunks/index-gyvps8b9.js.map +12 -0
  28. package/dist/chunks/index-jzg4bh99.js +1533 -0
  29. package/dist/chunks/index-jzg4bh99.js.map +21 -0
  30. package/dist/chunks/index-mgw2yvrm.js +3547 -0
  31. package/dist/chunks/index-mgw2yvrm.js.map +25 -0
  32. package/dist/chunks/index-yh76b55h.js +3449 -0
  33. package/dist/chunks/index-yh76b55h.js.map +29 -0
  34. package/dist/collection/index.js +9 -1118
  35. package/dist/collection/index.js.map +3 -6
  36. package/dist/core/api.d.ts +3 -3
  37. package/dist/core/channel-create.d.ts +2 -2
  38. package/dist/core/commands.d.ts +3 -3
  39. package/dist/core/events.d.ts +4 -4
  40. package/dist/core/handles.d.ts +4 -4
  41. package/dist/core/index.d.ts +25 -20
  42. package/dist/core/index.js +68 -10130
  43. package/dist/core/index.js.map +3 -65
  44. package/dist/core/permissions.d.ts +1 -1
  45. package/dist/core/redis-cache.d.ts +1 -1
  46. package/dist/formatters/index.js +41 -110
  47. package/dist/formatters/index.js.map +3 -4
  48. package/dist/handlers/index.js +5 -37
  49. package/dist/handlers/index.js.map +3 -4
  50. package/dist/index.d.ts +21 -21
  51. package/dist/index.js +641 -16325
  52. package/dist/index.js.map +3 -92
  53. package/dist/managers/advanced.d.ts +3 -3
  54. package/dist/managers/application.d.ts +2 -2
  55. package/dist/managers/base.d.ts +1 -1
  56. package/dist/managers/emoji.d.ts +2 -2
  57. package/dist/managers/guild-resources.d.ts +6 -6
  58. package/dist/managers/guild.d.ts +3 -3
  59. package/dist/managers/index.d.ts +4 -8
  60. package/dist/managers/index.js +51 -4060
  61. package/dist/managers/index.js.map +3 -29
  62. package/dist/managers/member.d.ts +2 -2
  63. package/dist/managers/message.d.ts +14 -6
  64. package/dist/managers/role.d.ts +2 -2
  65. package/dist/managers/thread.d.ts +3 -3
  66. package/dist/managers/user.d.ts +7 -4
  67. package/dist/rest/index.d.ts +10 -35
  68. package/dist/rest/index.js +57 -2184
  69. package/dist/rest/index.js.map +3 -18
  70. package/dist/rest/limiter.d.ts +9 -1
  71. package/dist/rest/webhook.d.ts +2 -8
  72. package/dist/sharding/bus.d.ts +2 -2
  73. package/dist/sharding/cluster.d.ts +45 -5
  74. package/dist/sharding/context.d.ts +45 -3
  75. package/dist/sharding/gateway-bot.d.ts +2 -1
  76. package/dist/sharding/health.d.ts +1 -1
  77. package/dist/sharding/identify.d.ts +12 -0
  78. package/dist/sharding/index.d.ts +44 -11
  79. package/dist/sharding/index.js +60 -4620
  80. package/dist/sharding/index.js.map +3 -33
  81. package/dist/sharding/supervisor.d.ts +4 -2
  82. package/dist/structures/audit-log.d.ts +1 -1
  83. package/dist/structures/base.d.ts +6 -6
  84. package/dist/structures/channels.d.ts +1 -1
  85. package/dist/structures/embed.d.ts +1 -1
  86. package/dist/structures/index.d.ts +14 -14
  87. package/dist/structures/index.js +109 -2382
  88. package/dist/structures/index.js.map +3 -16
  89. package/dist/structures/interactions.d.ts +13 -9
  90. package/dist/structures/options.d.ts +1 -1
  91. package/dist/structures/permissions.d.ts +2 -2
  92. package/dist/structures/resources.d.ts +10 -10
  93. package/dist/structures/sticker.d.ts +1 -1
  94. package/dist/types/gateway.d.ts +2 -79
  95. package/dist/types/index.d.ts +0 -6
  96. package/dist/types/index.js +41 -272
  97. package/dist/types/index.js.map +3 -6
  98. package/dist/utils/index.js +23 -209
  99. package/dist/utils/index.js.map +3 -5
  100. package/dist/voice/connection.d.ts +200 -0
  101. package/dist/voice/crypto.d.ts +50 -0
  102. package/dist/voice/dave.d.ts +85 -0
  103. package/dist/voice/effects.d.ts +31 -0
  104. package/dist/voice/emitter.d.ts +14 -0
  105. package/dist/voice/gateway.d.ts +59 -0
  106. package/dist/voice/index.d.ts +25 -228
  107. package/dist/voice/index.js +111 -442
  108. package/dist/voice/index.js.map +3 -4
  109. package/dist/voice/libopus.d.ts +88 -0
  110. package/dist/voice/networking.d.ts +80 -0
  111. package/dist/voice/ogg.d.ts +24 -0
  112. package/dist/voice/opus.d.ts +18 -0
  113. package/dist/voice/player.d.ts +79 -0
  114. package/dist/voice/protocol.d.ts +76 -0
  115. package/dist/voice/receiver.d.ts +59 -0
  116. package/dist/voice/resource.d.ts +102 -0
  117. package/dist/voice/udp.d.ts +40 -0
  118. package/dist/ws/close-codes.d.ts +1 -1
  119. package/dist/ws/index.d.ts +25 -4
  120. package/dist/ws/index.js +47 -1336
  121. package/dist/ws/index.js.map +3 -17
  122. package/dist/ws/protocol.d.ts +1 -1
  123. package/dist/ws/send-budget.d.ts +0 -2
  124. package/dist/ws/state.d.ts +0 -10
  125. package/package.json +19 -16
@@ -1,446 +1,115 @@
1
1
  // @bun
2
- // packages/voice/src/index.ts
3
- var VoiceConnectionState;
4
- ((VoiceConnectionState) => {
5
- VoiceConnectionState["Disconnected"] = "disconnected";
6
- VoiceConnectionState["Connecting"] = "connecting";
7
- VoiceConnectionState["Connected"] = "connected";
8
- VoiceConnectionState["Destroyed"] = "destroyed";
9
- })(VoiceConnectionState ||= {});
10
-
11
- class VoiceError extends Error {
12
- constructor(message, options) {
13
- super(message, options);
14
- this.name = "VoiceError";
15
- }
16
- }
17
- var SpeakingFlags = {
18
- Microphone: 1,
19
- Soundshare: 2,
20
- Priority: 4
21
- };
22
- function listenerSet(sets, event) {
23
- return sets[event] ??= new Set;
24
- }
25
-
26
- class VoiceConnection {
27
- state = "disconnected" /* Disconnected */;
28
- guildId;
29
- channelId;
30
- selfMute;
31
- selfDeaf;
32
- gateway;
33
- udp;
34
- #listeners = {};
35
- receiver;
36
- constructor(options) {
37
- const resolved = typeof options === "string" ? { guildId: options } : options;
38
- if (!resolved.guildId?.trim()) {
39
- throw new TypeError("A guild ID is required for a voice connection.");
40
- }
41
- this.guildId = resolved.guildId;
42
- this.channelId = resolved.channelId;
43
- this.selfMute = resolved.selfMute ?? false;
44
- this.selfDeaf = resolved.selfDeaf ?? false;
45
- this.receiver = new VoiceReceiver(this);
46
- }
47
- on(event, listener) {
48
- if (typeof listener !== "function")
49
- throw new TypeError("Voice listener must be a function.");
50
- listenerSet(this.#listeners, event).add(listener);
51
- return this;
52
- }
53
- off(event, listener) {
54
- this.#listeners[event]?.delete(listener);
55
- return this;
56
- }
57
- #listening = new WeakSet;
58
- attachTransports(gateway, udp) {
59
- this.assertUsable();
60
- if (!gateway || !udp)
61
- throw new TypeError("Both voice gateway and UDP transports are required.");
62
- if (this.gateway === gateway && this.udp === udp)
63
- return this;
64
- if (this.gateway || this.udp)
65
- this.#closeTransports();
66
- this.gateway = gateway;
67
- this.udp = udp;
68
- const attachedUdp = udp;
69
- if (attachedUdp.onMessage && !this.#listening.has(attachedUdp)) {
70
- this.#listening.add(attachedUdp);
71
- attachedUdp.onMessage((packet) => {
72
- if (this.udp === attachedUdp)
73
- this.receiver.onPacket(packet);
74
- });
75
- }
76
- return this;
77
- }
78
- connect() {
79
- this.assertUsable();
80
- if (this.state === "connected" /* Connected */)
81
- return;
82
- this.#transition("connecting" /* Connecting */);
83
- if (this.state !== "connecting" /* Connecting */)
84
- return;
85
- this.#transition("connected" /* Connected */);
86
- }
87
- disconnect() {
88
- if (this.state === "destroyed" /* Destroyed */)
89
- return;
90
- this.#closeTransports();
91
- this.receiver.close();
92
- this.#transition("disconnected" /* Disconnected */);
93
- }
94
- destroy() {
95
- if (this.state === "destroyed" /* Destroyed */)
96
- return;
97
- this.#closeTransports();
98
- this.receiver.close();
99
- this.channelId = undefined;
100
- this.#transition("destroyed" /* Destroyed */);
101
- this.#listeners = {};
102
- }
103
- setChannel(channelId) {
104
- this.assertUsable();
105
- if (!channelId?.trim())
106
- throw new TypeError("A voice channel ID is required.");
107
- this.channelId = channelId;
108
- }
109
- setSuppression(options) {
110
- this.assertUsable();
111
- if (options.selfMute !== undefined)
112
- this.selfMute = options.selfMute;
113
- if (options.selfDeaf !== undefined)
114
- this.selfDeaf = options.selfDeaf;
115
- }
116
- setSpeaking(flags = SpeakingFlags.Microphone, ssrc = 0) {
117
- this.assertUsable();
118
- if (!this.gateway) {
119
- throw new VoiceError("A voice gateway transport is required to change speaking state.");
120
- }
121
- this.gateway.send({ op: 5, d: { speaking: flags, delay: 0, ssrc } });
122
- this.#emit("speaking", flags, ssrc);
123
- }
124
- #assertUsable() {
125
- if (this.state === "destroyed" /* Destroyed */) {
126
- throw new VoiceError("Voice connection has been destroyed.");
127
- }
128
- }
129
- #closeTransports() {
130
- try {
131
- this.gateway?.close(1000, "Voice connection replaced or closed");
132
- } catch (error) {
133
- this.#emit("error", error instanceof VoiceError ? error : new VoiceError("Voice gateway cleanup failed.", {
134
- cause: error
135
- }));
136
- }
137
- try {
138
- this.udp?.close();
139
- } catch (error) {
140
- this.#emit("error", error instanceof VoiceError ? error : new VoiceError("Voice UDP cleanup failed.", {
141
- cause: error
142
- }));
143
- }
144
- this.gateway = undefined;
145
- this.udp = undefined;
146
- }
147
- #transition(next) {
148
- const previous = this.state;
149
- this.state = next;
150
- if (previous === next)
151
- return;
152
- for (const listener of this.#listeners.stateChange ?? []) {
153
- try {
154
- listener(next, previous);
155
- } catch (error) {
156
- this.#emit("error", error instanceof VoiceError ? error : new VoiceError("Voice event listener failed.", {
157
- cause: error
158
- }));
159
- }
160
- if (this.state !== next && next !== "destroyed" /* Destroyed */)
161
- return;
162
- }
163
- }
164
- #emit(event, ...args) {
165
- for (const listener of this.#listeners[event] ?? []) {
166
- try {
167
- listener(...args);
168
- } catch {}
169
- }
170
- }
171
- assertUsable() {
172
- this.#assertUsable();
173
- }
174
- }
175
-
176
- class AudioStream {
177
- stream;
178
- title;
179
- duration;
180
- constructor(stream, metadata) {
181
- this.stream = stream;
182
- this.title = metadata?.title;
183
- this.duration = metadata?.duration;
184
- }
185
- }
186
-
187
- class AudioPlayer {
188
- #state = "idle";
189
- #stream;
190
- #reader;
191
- #resumeSignal;
192
- #generation = 0;
193
- #ticket = 0;
194
- #playerListeners = {};
195
- get state() {
196
- return this.#state;
197
- }
198
- get current() {
199
- return this.#stream;
200
- }
201
- async play(audioStream) {
202
- const ticket = ++this.#ticket;
203
- if (this.#state === "playing" || this.#state === "paused")
204
- await this.stop();
205
- if (ticket !== this.#ticket) {
206
- audioStream.stream.cancel().catch(() => {
207
- return;
208
- });
209
- return;
210
- }
211
- const generation = ++this.#generation;
212
- this.#stream = audioStream;
213
- this.#reader = audioStream.stream.getReader();
214
- this.#transition("playing");
215
- this.#pump(generation).catch((err) => this.#emitError(err));
216
- }
217
- pause() {
218
- if (this.#state !== "playing")
219
- return;
220
- this.#transition("paused");
221
- }
222
- resume() {
223
- if (this.#state !== "paused")
224
- return;
225
- this.#transition("playing");
226
- const signal = this.#resumeSignal;
227
- this.#resumeSignal = undefined;
228
- signal?.();
229
- }
230
- async stop() {
231
- if (this.#state === "idle" || this.#state === "stopped")
232
- return;
233
- this.#generation++;
234
- const reader = this.#reader;
235
- this.#reader = undefined;
236
- this.#stream = undefined;
237
- this.#transition("stopped");
238
- const signal = this.#resumeSignal;
239
- this.#resumeSignal = undefined;
240
- signal?.();
241
- if (reader) {
242
- try {
243
- await reader.cancel();
244
- } catch {}
245
- }
246
- }
247
- on(event, listener) {
248
- listenerSet(this.#playerListeners, event).add(listener);
249
- return this;
250
- }
251
- off(event, listener) {
252
- this.#playerListeners[event]?.delete(listener);
253
- return this;
254
- }
255
- onChunk(chunk) {}
256
- async#pump(generation) {
257
- const reader = this.#reader;
258
- if (!reader)
259
- return;
260
- while (true) {
261
- if (this.#state === "paused") {
262
- await new Promise((resolve) => {
263
- this.#resumeSignal = resolve;
264
- });
265
- }
266
- if (generation !== this.#generation || this.#state !== "playing")
267
- return;
268
- const { done, value } = await reader.read();
269
- if (generation !== this.#generation)
270
- return;
271
- if (done) {
272
- if (this.#state === "playing" || this.#state === "paused") {
273
- this.#transition("idle");
274
- this.#stream = undefined;
275
- this.#reader = undefined;
276
- this.#emit("finish");
277
- }
278
- return;
279
- }
280
- if (this.#state !== "playing" && this.#state !== "paused")
281
- return;
282
- this.onChunk(value);
283
- }
284
- }
285
- #transition(next) {
286
- if (this.#state === next)
287
- return;
288
- const from = this.#state;
289
- this.#state = next;
290
- this.#emit("stateChange", from, next);
291
- }
292
- #emitError(err) {
293
- this.#emit("error", err instanceof Error ? err : new VoiceError(String(err)));
294
- }
295
- #emit(event, ...args) {
296
- for (const listener of this.#playerListeners[event] ?? []) {
297
- try {
298
- listener(...args);
299
- } catch {}
300
- }
301
- }
302
- }
303
-
304
- class VoiceReceiver {
305
- connection;
306
- #ssrcMap = new Map;
307
- #streams = new Map;
308
- constructor(connection) {
309
- this.connection = connection;
310
- }
311
- mapSsrc(ssrc, userId) {
312
- this.#ssrcMap.set(ssrc, userId);
313
- }
314
- subscribe(userId) {
315
- if (this.connection.state === "destroyed" /* Destroyed */)
316
- throw new VoiceError("Voice connection has been destroyed.");
317
- let controllerRef;
318
- const stream = new ReadableStream({
319
- start: (controller) => {
320
- controllerRef = controller;
321
- let set = this.#streams.get(userId);
322
- if (!set)
323
- this.#streams.set(userId, set = new Set);
324
- set.add(controller);
325
- },
326
- cancel: () => {
327
- const set = this.#streams.get(userId);
328
- if (set) {
329
- set.delete(controllerRef);
330
- if (set.size === 0)
331
- this.#streams.delete(userId);
332
- }
333
- }
334
- }, { highWaterMark: 50 });
335
- return new AudioStream(stream, { title: `User ${userId} Audio` });
336
- }
337
- close() {
338
- for (const controllers of this.#streams.values())
339
- for (const controller of controllers) {
340
- try {
341
- controller.close();
342
- } catch {}
343
- }
344
- this.#streams.clear();
345
- this.#ssrcMap.clear();
346
- }
347
- onPacket(packet) {
348
- if (packet.length < 12)
349
- return;
350
- const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
351
- if ((packet[0] & 192) !== 128)
352
- return;
353
- const ssrc = view.getUint32(8, false);
354
- const userId = this.#ssrcMap.get(ssrc);
355
- if (!userId)
356
- return;
357
- const controllers = this.#streams.get(userId);
358
- if (!controllers || controllers.size === 0)
359
- return;
360
- const first = view.getUint8(0);
361
- const csrcCount = first & 15;
362
- let offset = 12 + csrcCount * 4;
363
- const hasExtension = (first & 16) !== 0;
364
- if (hasExtension) {
365
- if (packet.length < offset + 4)
366
- return;
367
- const extWords = view.getUint16(offset + 2, false);
368
- offset += 4 + extWords * 4;
369
- }
370
- if (packet.length < offset)
371
- return;
372
- const payload = packet.slice(offset);
373
- for (const controller of controllers) {
374
- try {
375
- if ((controller.desiredSize ?? 1) <= 0)
376
- continue;
377
- controller.enqueue(payload);
378
- } catch {}
379
- }
380
- }
381
- }
382
- var voiceConnections = new Map;
383
- function joinVoiceChannel(options) {
384
- if (typeof options.channelId !== "string" || !options.channelId.trim())
385
- throw new TypeError("A voice channel ID is required.");
386
- let connection = voiceConnections.get(options.guildId);
387
- if (!connection) {
388
- connection = new VoiceConnection(options);
389
- const created = connection;
390
- created.on("stateChange", (next) => {
391
- if (next === "destroyed" /* Destroyed */ && voiceConnections.get(created.guildId) === created)
392
- voiceConnections.delete(created.guildId);
393
- });
394
- voiceConnections.set(options.guildId, connection);
395
- }
396
- connection.setChannel(options.channelId);
397
- connection.setSuppression(options);
398
- connection.connect();
399
- return connection;
400
- }
401
- function getVoiceConnection(guildId) {
402
- return voiceConnections.get(guildId);
403
- }
404
- function createAudioPlayer() {
405
- return new AudioPlayer;
406
- }
407
- function createAudioResource(stream, metadata) {
408
- return new AudioStream(stream, metadata);
409
- }
410
- function entersState(target, status, timeoutMs) {
411
- if (target.state === status)
412
- return Promise.resolve(target);
413
- const emitter = target;
414
- const isConnection = target instanceof VoiceConnection;
415
- return new Promise((resolve, reject) => {
416
- const onChange = (first, second) => {
417
- if ((isConnection ? first : second) !== status)
418
- return;
419
- clearTimeout(timer);
420
- emitter.off("stateChange", onChange);
421
- resolve(target);
422
- };
423
- const timer = setTimeout(() => {
424
- emitter.off("stateChange", onChange);
425
- reject(new VoiceError(`Did not enter state "${String(status)}" within ${timeoutMs}ms.`));
426
- }, Math.min(timeoutMs, 2147483647));
427
- emitter.on("stateChange", onChange);
428
- });
429
- }
2
+ import {
3
+ VOICE_GATEWAY_VERSION2,
4
+ VoiceOpcodes2,
5
+ VoiceCloseCodes2,
6
+ canResumeVoice2,
7
+ RTP_OPUS_PAYLOAD_TYPE2,
8
+ FRAME_DURATION_MS2,
9
+ FRAME_SAMPLES2,
10
+ PCM_FRAME_BYTES2,
11
+ SILENCE_FRAME2,
12
+ SpeakingFlags2,
13
+ VoiceError2,
14
+ SUPPORTED_ENCRYPTION_MODES2,
15
+ chooseEncryptionMode2,
16
+ rtpHeader2,
17
+ parseRtpHeader2,
18
+ PacketCipher2,
19
+ loadDave2,
20
+ maxDaveProtocolVersion2,
21
+ DaveSession2,
22
+ HEARTBEAT_TIMEOUT_CLOSE2,
23
+ voiceGatewayURL2,
24
+ VoiceGateway2,
25
+ bunUdpSocket2,
26
+ discoveryRequest2,
27
+ parseDiscoveryResponse2,
28
+ VoiceUdp2,
29
+ VoiceNetworking2,
30
+ demuxOggOpus2,
31
+ OggOpusWriter2,
32
+ VoiceReceiver2,
33
+ VoiceConnectionStatus2,
34
+ VoiceConnection2,
35
+ joinVoiceChannel2,
36
+ getVoiceConnection2,
37
+ VoiceManager2,
38
+ OpusApplication2,
39
+ loadLibopus2,
40
+ hasLibopus2,
41
+ libopusVersion2,
42
+ Opus2,
43
+ createOpusCodec2,
44
+ pitchShift2,
45
+ robot2,
46
+ echo2,
47
+ gain2,
48
+ VolumeControl2,
49
+ AudioResource2,
50
+ createAudioResource2,
51
+ AudioPlayerStatus2,
52
+ AudioPlayer2,
53
+ createAudioPlayer2,
54
+ entersState2,
55
+ generateDependencyReport2
56
+ } from "../chunks/index-yh76b55h.js";
57
+ import"../chunks/index-fdvgk2sw.js";
58
+ import"../chunks/index-gyvps8b9.js";
430
59
  export {
431
- AudioPlayer,
432
- AudioStream,
433
- SpeakingFlags,
434
- VoiceConnection,
435
- VoiceConnectionState,
436
- VoiceConnectionState as VoiceConnectionStatus,
437
- VoiceError,
438
- VoiceReceiver,
439
- createAudioPlayer,
440
- createAudioResource,
441
- entersState,
442
- getVoiceConnection,
443
- joinVoiceChannel
60
+ AudioPlayer2 as AudioPlayer,
61
+ AudioPlayerStatus2 as AudioPlayerStatus,
62
+ AudioResource2 as AudioResource,
63
+ DaveSession2 as DaveSession,
64
+ FRAME_DURATION_MS2 as FRAME_DURATION_MS,
65
+ FRAME_SAMPLES2 as FRAME_SAMPLES,
66
+ HEARTBEAT_TIMEOUT_CLOSE2 as HEARTBEAT_TIMEOUT_CLOSE,
67
+ OggOpusWriter2 as OggOpusWriter,
68
+ Opus2 as Opus,
69
+ OpusApplication2 as OpusApplication,
70
+ PCM_FRAME_BYTES2 as PCM_FRAME_BYTES,
71
+ PacketCipher2 as PacketCipher,
72
+ RTP_OPUS_PAYLOAD_TYPE2 as RTP_OPUS_PAYLOAD_TYPE,
73
+ SILENCE_FRAME2 as SILENCE_FRAME,
74
+ SUPPORTED_ENCRYPTION_MODES2 as SUPPORTED_ENCRYPTION_MODES,
75
+ SpeakingFlags2 as SpeakingFlags,
76
+ VOICE_GATEWAY_VERSION2 as VOICE_GATEWAY_VERSION,
77
+ VoiceCloseCodes2 as VoiceCloseCodes,
78
+ VoiceConnection2 as VoiceConnection,
79
+ VoiceConnectionStatus2 as VoiceConnectionStatus,
80
+ VoiceError2 as VoiceError,
81
+ VoiceGateway2 as VoiceGateway,
82
+ VoiceManager2 as VoiceManager,
83
+ VoiceNetworking2 as VoiceNetworking,
84
+ VoiceOpcodes2 as VoiceOpcodes,
85
+ VoiceReceiver2 as VoiceReceiver,
86
+ VoiceUdp2 as VoiceUdp,
87
+ VolumeControl2 as VolumeControl,
88
+ bunUdpSocket2 as bunUdpSocket,
89
+ canResumeVoice2 as canResumeVoice,
90
+ chooseEncryptionMode2 as chooseEncryptionMode,
91
+ createAudioPlayer2 as createAudioPlayer,
92
+ createAudioResource2 as createAudioResource,
93
+ createOpusCodec2 as createOpusCodec,
94
+ demuxOggOpus2 as demuxOggOpus,
95
+ discoveryRequest2 as discoveryRequest,
96
+ echo2 as echo,
97
+ entersState2 as entersState,
98
+ gain2 as gain,
99
+ generateDependencyReport2 as generateDependencyReport,
100
+ getVoiceConnection2 as getVoiceConnection,
101
+ hasLibopus2 as hasLibopus,
102
+ joinVoiceChannel2 as joinVoiceChannel,
103
+ libopusVersion2 as libopusVersion,
104
+ loadDave2 as loadDave,
105
+ loadLibopus2 as loadLibopus,
106
+ maxDaveProtocolVersion2 as maxDaveProtocolVersion,
107
+ parseDiscoveryResponse2 as parseDiscoveryResponse,
108
+ parseRtpHeader2 as parseRtpHeader,
109
+ pitchShift2 as pitchShift,
110
+ robot2 as robot,
111
+ rtpHeader2 as rtpHeader,
112
+ voiceGatewayURL2 as voiceGatewayURL
444
113
  };
445
114
 
446
- //# debugId=0DF7DB68FBFCF1FC64756E2164756E21
115
+ //# debugId=E69D3542BBC51E8264756E2164756E21
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../packages/voice/src/index.ts"],
3
+ "sources": [],
4
4
  "sourcesContent": [
5
- "/** Voice session lifecycle states. */\nexport enum VoiceConnectionState {\n Disconnected = \"disconnected\",\n Connecting = \"connecting\",\n Connected = \"connected\",\n Destroyed = \"destroyed\",\n}\n\n/** Voice protocol transport errors. */\nexport class VoiceError extends Error {\n /** Creates a voice error. @param message Error message. @param options Optional native error options. */\n public constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"VoiceError\";\n }\n}\n\n/** Options used to establish a voice session. */\nexport interface VoiceConnectionOptions {\n /** Guild containing the voice channel. */\n guildId: string;\n /** Voice channel to join. */\n channelId?: string;\n /** Whether the self user should be muted. */\n selfMute?: boolean;\n /** Whether the self user should be deafened. */\n selfDeaf?: boolean;\n}\n\n/** UDP transport supplied by the runtime-specific voice implementation. */\nexport interface VoiceUdpTransport {\n /** Sends an RTP/RTCP packet. @param packet Packet bytes. @param host Destination host. @param port Destination port. @returns Optional completion promise. */\n send(packet: Uint8Array, host: string, port: number): Promise<void> | void;\n /** Closes the UDP socket. @returns Nothing. */\n close(): void;\n /** Optional listener for incoming UDP packets. */\n onMessage?(listener: (packet: Uint8Array) => void): void;\n}\n\n/** A JSON frame for the voice gateway, e.g. `{ op: 5, d: { speaking, delay, ssrc } }`. */\nexport interface VoiceGatewayPayload {\n op: number;\n d: Record<string, string | number | boolean | null>;\n}\n\n/** Voice Gateway transport abstraction. */\nexport interface VoiceGatewayTransport {\n /** Opens the voice gateway. @param endpoint Voice gateway endpoint. @param sessionId Voice session identifier. @returns Promise fulfilled when connected. */\n connect(endpoint: string, sessionId: string): Promise<void>;\n /** Sends a voice gateway payload. @param payload Gateway payload. @returns Nothing. */\n send(payload: VoiceGatewayPayload): void;\n /** Closes the voice gateway. @param code Optional close code. @param reason Optional close reason. @returns Nothing. */\n close(code?: number, reason?: string): void;\n}\n\n/** Speaking flags used by the voice gateway. */\nexport const SpeakingFlags = {\n Microphone: 1,\n Soundshare: 2,\n Priority: 4,\n} as const;\n\n/** Voice session event payloads. */\nexport interface VoiceEvents {\n /** State transition event. */\n stateChange: [VoiceConnectionState, VoiceConnectionState];\n /** Speaking flag event. */\n speaking: [number, number];\n /** Voice transport error event. */\n error: [VoiceError];\n}\n\ntype ListenerSets<E extends Record<keyof E, unknown[]>> = {\n [K in keyof E]?: Set<(...args: E[K]) => unknown>;\n};\n\n/** Returns the listener set for `event`, creating it on first use. */\nfunction listenerSet<E extends Record<keyof E, unknown[]>, K extends keyof E>(\n sets: ListenerSets<E>,\n event: K,\n): Set<(...args: E[K]) => unknown> {\n return (sets[event] ??= new Set());\n}\n\n/** Tracks a Discord voice session and exposes transport-independent lifecycle controls. */\nexport class VoiceConnection {\n /** Current voice connection state. */\n public state: VoiceConnectionState = VoiceConnectionState.Disconnected;\n /** Guild associated with this voice session. */\n public readonly guildId: string;\n /** Voice channel associated with this session. */\n public channelId?: string;\n /** Whether the client is self-muted. */\n public selfMute: boolean;\n /** Whether the client is self-deafened. */\n public selfDeaf: boolean;\n /** Active voice gateway transport, when attached. */\n public gateway?: VoiceGatewayTransport;\n /** Active UDP transport, when attached. */\n public udp?: VoiceUdpTransport;\n /** Registered lifecycle listeners. */\n #listeners: ListenerSets<VoiceEvents> = {};\n /** Receives incoming audio. */\n public readonly receiver: VoiceReceiver;\n\n /** Creates a voice connection state manager. @param options Guild ID or connection options. @throws {TypeError} If the guild ID is empty. */\n public constructor(options: string | VoiceConnectionOptions) {\n const resolved =\n typeof options === \"string\" ? { guildId: options } : options;\n if (!resolved.guildId?.trim()) {\n throw new TypeError(\n \"A guild ID is required for a voice connection.\",\n );\n }\n this.guildId = resolved.guildId;\n this.channelId = resolved.channelId;\n this.selfMute = resolved.selfMute ?? false;\n this.selfDeaf = resolved.selfDeaf ?? false;\n this.receiver = new VoiceReceiver(this);\n }\n\n /** Registers a voice lifecycle listener. @param event Event name. @param listener Listener callback. @returns This connection. @throws {TypeError} If listener is not callable. */\n public on<K extends keyof VoiceEvents>(\n event: K,\n listener: (...args: VoiceEvents[K]) => unknown,\n ): this {\n if (typeof listener !== \"function\")\n throw new TypeError(\"Voice listener must be a function.\");\n listenerSet(this.#listeners, event).add(listener);\n return this;\n }\n\n /** Removes a voice lifecycle listener. @param event Event name. @param listener Listener callback. @returns This connection. */\n public off<K extends keyof VoiceEvents>(\n event: K,\n listener: (...args: VoiceEvents[K]) => unknown,\n ): this {\n this.#listeners[event]?.delete(listener);\n return this;\n }\n\n readonly #listening = new WeakSet<VoiceUdpTransport>();\n\n /** Attaches protocol transports, replacing and cleaning up the old pair when present. @param gateway Voice gateway transport. @param udp UDP transport. @returns This connection. @throws {VoiceError} If the connection is destroyed. @throws {TypeError} If a transport is missing. */\n public attachTransports(\n gateway: VoiceGatewayTransport,\n udp: VoiceUdpTransport,\n ): this {\n this.assertUsable();\n if (!gateway || !udp)\n throw new TypeError(\n \"Both voice gateway and UDP transports are required.\",\n );\n // The same pair again is a no-op: closing it first would end the\n // transports just attached.\n if (this.gateway === gateway && this.udp === udp) return this;\n if (this.gateway || this.udp) this.#closeTransports();\n this.gateway = gateway;\n this.udp = udp;\n // Capture the transport this listener belongs to so that packets from a\n // later-replaced transport (whose listener cannot be unregistered — the\n // VoiceUdpTransport interface exposes no removal API) are ignored.\n const attachedUdp = udp;\n // A transport that comes back must not get a second listener (it\n // cannot be removed), or every datagram would be delivered twice.\n if (attachedUdp.onMessage && !this.#listening.has(attachedUdp)) {\n this.#listening.add(attachedUdp);\n attachedUdp.onMessage((packet) => {\n if (this.udp === attachedUdp) this.receiver.onPacket(packet);\n });\n }\n return this;\n }\n\n /** Begins the connection lifecycle. @returns Nothing. @throws {VoiceError} If the connection is destroyed. */\n public connect(): void {\n this.assertUsable();\n if (this.state === VoiceConnectionState.Connected) return;\n this.#transition(VoiceConnectionState.Connecting);\n if (this.state !== VoiceConnectionState.Connecting) return;\n this.#transition(VoiceConnectionState.Connected);\n }\n\n /** Disconnects the current voice session. @returns Nothing. */\n public disconnect(): void {\n if (this.state === VoiceConnectionState.Destroyed) return;\n this.#closeTransports();\n this.receiver.close();\n this.#transition(VoiceConnectionState.Disconnected);\n }\n\n /** Permanently destroys this voice connection. @returns Nothing. */\n public destroy(): void {\n if (this.state === VoiceConnectionState.Destroyed) return;\n this.#closeTransports();\n this.receiver.close();\n this.channelId = undefined;\n this.#transition(VoiceConnectionState.Destroyed);\n this.#listeners = {};\n }\n\n /** Updates the voice channel and connection state. @param channelId Voice channel identifier. @returns Nothing. @throws {VoiceError} If the connection is destroyed. @throws {TypeError} If channelId is empty. */\n public setChannel(channelId: string): void {\n this.assertUsable();\n if (!channelId?.trim())\n throw new TypeError(\"A voice channel ID is required.\");\n this.channelId = channelId;\n }\n\n /** Updates self mute/deaf state. @param options Suppression flags. @returns Nothing. @throws {VoiceError} If the connection is destroyed. */\n public setSuppression(options: {\n selfMute?: boolean;\n selfDeaf?: boolean;\n }): void {\n this.assertUsable();\n if (options.selfMute !== undefined) this.selfMute = options.selfMute;\n if (options.selfDeaf !== undefined) this.selfDeaf = options.selfDeaf;\n }\n\n /** Publishes a speaking state through the attached voice gateway. @param flags Speaking flags. @returns Nothing. @throws {VoiceError} If the connection is destroyed or has no gateway transport. */\n /**\n * Sends a speaking update (voice op 5). Pass the `ssrc` your voice gateway\n * assigned in READY; Discord uses it to match the audio to this user.\n */\n public setSpeaking(\n flags: number = SpeakingFlags.Microphone,\n ssrc = 0,\n ): void {\n this.assertUsable();\n if (!this.gateway) {\n throw new VoiceError(\n \"A voice gateway transport is required to change speaking state.\",\n );\n }\n this.gateway.send({ op: 5, d: { speaking: flags, delay: 0, ssrc } });\n this.#emit(\"speaking\", flags, ssrc);\n }\n\n /** Ensures the connection is still usable. @returns Nothing. @throws {VoiceError} If destroyed. */\n #assertUsable(): void {\n if (this.state === VoiceConnectionState.Destroyed) {\n throw new VoiceError(\"Voice connection has been destroyed.\");\n }\n }\n\n /** Closes both active transports while isolating cleanup failures. @returns Nothing. */\n #closeTransports(): void {\n try {\n this.gateway?.close(1000, \"Voice connection replaced or closed\");\n } catch (error) {\n this.#emit(\n \"error\",\n error instanceof VoiceError\n ? error\n : new VoiceError(\"Voice gateway cleanup failed.\", {\n cause: error,\n }),\n );\n }\n try {\n this.udp?.close();\n } catch (error) {\n this.#emit(\n \"error\",\n error instanceof VoiceError\n ? error\n : new VoiceError(\"Voice UDP cleanup failed.\", {\n cause: error,\n }),\n );\n }\n this.gateway = undefined;\n this.udp = undefined;\n }\n\n /** Transitions to a new lifecycle state and emits the transition event. @param next Next state. @returns Nothing. */\n #transition(next: VoiceConnectionState): void {\n const previous = this.state;\n this.state = next;\n if (previous === next) return;\n for (const listener of this.#listeners.stateChange ?? []) {\n try {\n void listener(next, previous);\n } catch (error) {\n this.#emit(\n \"error\",\n error instanceof VoiceError\n ? error\n : new VoiceError(\"Voice event listener failed.\", {\n cause: error,\n }),\n );\n }\n if (this.state !== next && next !== VoiceConnectionState.Destroyed)\n return;\n }\n }\n\n /** Emits a voice event while isolating consumer failures. @param event Event name. @param args Event arguments. @returns Nothing. */\n #emit<K extends keyof VoiceEvents>(\n event: K,\n ...args: VoiceEvents[K]\n ): void {\n for (const listener of this.#listeners[event] ?? []) {\n try {\n void listener(...args);\n } catch {\n /* Consumer failures are isolated. */\n }\n }\n }\n\n /** Ensures the connection is still usable. @returns Nothing. @throws {VoiceError} If destroyed. */\n private assertUsable(): void {\n this.#assertUsable();\n }\n}\n\n// ─── Audio Pipeline ───────────────────────────────────────────────────────────\n\n/** Audio player lifecycle states. */\nexport type AudioPlayerState = \"idle\" | \"playing\" | \"paused\" | \"stopped\";\n\n/** An audio stream — wraps a `ReadableStream<Uint8Array>` with optional metadata. */\nexport class AudioStream {\n /** Underlying binary stream. */\n public readonly stream: ReadableStream<Uint8Array>;\n /** Optional human-readable title for the stream. */\n public readonly title?: string;\n /** Optional duration hint in seconds. */\n public readonly duration?: number;\n\n /** Creates an audio stream.\n * @param stream Binary audio data stream.\n * @param metadata Optional metadata: title and duration in seconds.\n */\n public constructor(\n stream: ReadableStream<Uint8Array>,\n metadata?: { title?: string; duration?: number },\n ) {\n this.stream = stream;\n this.title = metadata?.title;\n this.duration = metadata?.duration;\n }\n}\n\ntype AudioPlayerListener<K extends keyof AudioPlayerEvents> = (\n ...args: AudioPlayerEvents[K]\n) => unknown;\n\ninterface AudioPlayerEvents {\n stateChange: [from: AudioPlayerState, to: AudioPlayerState];\n error: [error: Error];\n finish: [];\n}\n\n/**\n * Lightweight audio player with a simple state machine.\n *\n * States:\n * - `idle` — no stream loaded.\n * - `playing` — actively feeding audio data.\n * - `paused` — temporarily suspended; can be resumed.\n * - `stopped` — stream was stopped and discarded; load a new stream to play again.\n *\n * Events: `stateChange(from, to)`, `error(err)`, `finish()`.\n */\nexport class AudioPlayer {\n #state: AudioPlayerState = \"idle\";\n #stream?: AudioStream;\n #reader?: ReadableStreamDefaultReader<Uint8Array>;\n /** Resolves the pump's pause await when the player is resumed or stopped. */\n #resumeSignal?: () => void;\n /** Identifies the pump loop that owns the player; a stop or a new `play()` retires the old loop. */\n #generation = 0;\n /** The latest `play()` call; an earlier call still waiting for `stop()` gives way to it. */\n #ticket = 0;\n readonly #playerListeners: ListenerSets<AudioPlayerEvents> = {};\n\n /** Current player state. */\n public get state(): AudioPlayerState {\n return this.#state;\n }\n\n /** The audio stream currently loaded, if any. */\n public get current(): AudioStream | undefined {\n return this.#stream;\n }\n\n /**\n * Begins playing an audio stream.\n * If a stream is already playing, it is stopped first; the previous\n * stream's reader cancellation is awaited before the new stream starts so\n * the old and new pump loops cannot run concurrently.\n * @param audioStream Stream to play.\n */\n public async play(audioStream: AudioStream): Promise<void> {\n const ticket = ++this.#ticket;\n if (this.#state === \"playing\" || this.#state === \"paused\")\n await this.stop();\n if (ticket !== this.#ticket) {\n // A newer play() arrived while this one waited for stop(): it wins,\n // and this stream is never read, so release it.\n audioStream.stream.cancel().catch(() => undefined);\n return;\n }\n const generation = ++this.#generation;\n this.#stream = audioStream;\n this.#reader = audioStream.stream.getReader();\n this.#transition(\"playing\");\n this.#pump(generation).catch((err) => this.#emitError(err));\n }\n\n /** Pauses a currently-playing stream. No-op if not playing. */\n public pause(): void {\n if (this.#state !== \"playing\") return;\n this.#transition(\"paused\");\n }\n\n /** Resumes a paused stream. No-op if not paused. */\n public resume(): void {\n if (this.#state !== \"paused\") return;\n this.#transition(\"playing\");\n // Wake the existing pump loop rather than starting a second one.\n const signal = this.#resumeSignal;\n this.#resumeSignal = undefined;\n signal?.();\n }\n\n /**\n * Stops and discards the current stream. The returned promise resolves once\n * the underlying reader's cancellation has settled, so a subsequent `play`\n * never overlaps with the previous pump loop.\n */\n public async stop(): Promise<void> {\n if (this.#state === \"idle\" || this.#state === \"stopped\") return;\n // The loop reading the old stream must not outlive this call, whatever\n // state a following play() puts the player in.\n this.#generation++;\n const reader = this.#reader;\n this.#reader = undefined;\n this.#stream = undefined;\n this.#transition(\"stopped\");\n // Release a pump loop that is currently awaiting a resume.\n const signal = this.#resumeSignal;\n this.#resumeSignal = undefined;\n signal?.();\n if (reader) {\n try {\n await reader.cancel();\n } catch {\n /* Cancellation failures are non-fatal. */\n }\n }\n }\n\n /** Registers an event listener. @returns `this` for chaining. */\n public on<K extends keyof AudioPlayerEvents>(\n event: K,\n listener: AudioPlayerListener<K>,\n ): this {\n listenerSet(this.#playerListeners, event).add(listener);\n return this;\n }\n\n /** Removes an event listener. @returns `this` for chaining. */\n public off<K extends keyof AudioPlayerEvents>(\n event: K,\n listener: AudioPlayerListener<K>,\n ): this {\n this.#playerListeners[event]?.delete(listener);\n return this;\n }\n\n /**\n * Handles a decoded audio chunk. The base implementation is a no-op;\n * subclasses override this to pipe audio to a UDP socket or other sink.\n * @param chunk A chunk of audio bytes read from the current stream.\n */\n protected onChunk(chunk: Uint8Array): void {\n void chunk;\n }\n\n /** Reads chunks from the reader while the player is in a playing state. */\n async #pump(generation: number): Promise<void> {\n const reader = this.#reader;\n if (!reader) return;\n while (true) {\n // Suspend without polling: park until resume()/stop() signals us.\n if (this.#state === \"paused\") {\n await new Promise<void>((resolve) => {\n this.#resumeSignal = resolve;\n });\n }\n // Abort if stopped/idle (e.g. resolved by stop()) or replaced.\n if (generation !== this.#generation || this.#state !== \"playing\")\n return;\n const { done, value } = await reader.read();\n // A stop() or a newer play() retired this loop during the read:\n // drop what it read and leave the new stream's state alone.\n if (generation !== this.#generation) return;\n if (done) {\n if (this.#state === \"playing\" || this.#state === \"paused\") {\n this.#transition(\"idle\");\n this.#stream = undefined;\n this.#reader = undefined;\n this.#emit(\"finish\");\n }\n return;\n }\n // A stop() during the read wins — drop the chunk and exit.\n if (this.#state !== \"playing\" && this.#state !== \"paused\") return;\n // Deliver the chunk to the sink hook; loop back to honour pause state.\n this.onChunk(value);\n }\n }\n\n #transition(next: AudioPlayerState): void {\n if (this.#state === next) return;\n const from = this.#state;\n this.#state = next;\n this.#emit(\"stateChange\", from, next);\n }\n\n #emitError(err: unknown): void {\n this.#emit(\n \"error\",\n err instanceof Error ? err : new VoiceError(String(err)),\n );\n }\n\n #emit<K extends keyof AudioPlayerEvents>(\n event: K,\n ...args: AudioPlayerEvents[K]\n ): void {\n for (const listener of this.#playerListeners[event] ?? []) {\n try {\n void listener(...args);\n } catch {\n /* Listener failures are isolated. */\n }\n }\n }\n}\n\n// ─── Audio Receive Pipeline ───────────────────────────────────────────────────\n\n/** Tracks incoming audio and maps SSRCs to readable streams per user. */\nexport class VoiceReceiver {\n /** The connection this receiver is attached to. */\n public readonly connection: VoiceConnection;\n readonly #ssrcMap = new Map<number, string>();\n /** Active stream controllers per user; a Set so multiple subscribers to the\n * same user all receive audio instead of the last one overwriting earlier ones. */\n readonly #streams = new Map<\n string,\n Set<ReadableStreamDefaultController<Uint8Array>>\n >();\n\n /** Creates a VoiceReceiver. @param connection Voice connection. */\n public constructor(connection: VoiceConnection) {\n this.connection = connection;\n }\n\n /** Maps an SSRC to a User ID (usually from gateway speaking events). */\n public mapSsrc(ssrc: number, userId: string): void {\n this.#ssrcMap.set(ssrc, userId);\n }\n\n /** Subscribes to incoming audio from a specific user. @param userId User identifier. @returns A binary readable stream of the audio. */\n public subscribe(userId: string): AudioStream {\n // A destroyed connection never closes its receiver again, so a late\n // subscriber would wait forever.\n if (this.connection.state === VoiceConnectionState.Destroyed)\n throw new VoiceError(\"Voice connection has been destroyed.\");\n let controllerRef: ReadableStreamDefaultController<Uint8Array>;\n const stream = new ReadableStream<Uint8Array>(\n {\n start: (controller) => {\n controllerRef = controller;\n let set = this.#streams.get(userId);\n if (!set) this.#streams.set(userId, (set = new Set()));\n set.add(controller);\n },\n cancel: () => {\n const set = this.#streams.get(userId);\n if (set) {\n set.delete(controllerRef);\n if (set.size === 0) this.#streams.delete(userId);\n }\n },\n },\n // About a second of 20 ms packets; a reader that falls further\n // behind loses the newest packets instead of growing the heap.\n { highWaterMark: 50 },\n );\n return new AudioStream(stream, { title: `User ${userId} Audio` });\n }\n\n /** Ends every subscriber stream and forgets SSRC mappings. Called when the\n * connection disconnects or is destroyed, so readers do not wait forever. */\n public close(): void {\n for (const controllers of this.#streams.values())\n for (const controller of controllers) {\n try {\n controller.close();\n } catch {\n // Already closed or errored by the consumer.\n }\n }\n this.#streams.clear();\n this.#ssrcMap.clear();\n }\n\n /** Processes an incoming UDP packet, extracting SSRC and routing the audio\n * payload (RTP header stripped) to every subscriber for the mapped user. */\n public onPacket(packet: Uint8Array): void {\n if (packet.length < 12) return;\n\n const view = new DataView(\n packet.buffer,\n packet.byteOffset,\n packet.byteLength,\n );\n // RTP version 2 only: anything else is not audio for this stream.\n if ((packet[0]! & 0xc0) !== 0x80) return;\n const ssrc = view.getUint32(8, false);\n\n const userId = this.#ssrcMap.get(ssrc);\n if (!userId) return;\n const controllers = this.#streams.get(userId);\n if (!controllers || controllers.size === 0) return;\n\n // Compute the RTP payload offset: 12-byte fixed header + CSRC list, plus\n // the extension header when the X bit is set.\n const first = view.getUint8(0);\n const csrcCount = first & 0x0f;\n let offset = 12 + csrcCount * 4;\n const hasExtension = (first & 0x10) !== 0;\n if (hasExtension) {\n if (packet.length < offset + 4) return;\n const extWords = view.getUint16(offset + 2, false);\n offset += 4 + extWords * 4;\n }\n if (packet.length < offset) return;\n const payload = packet.slice(offset);\n\n for (const controller of controllers) {\n try {\n if ((controller.desiredSize ?? 1) <= 0) continue;\n controller.enqueue(payload);\n } catch {\n // Ignore errors on closed streams.\n }\n }\n }\n}\n\n// ─── Discord.js-familiar helpers (@discordjs/voice) ───────────────────────────\n\n/** Discord.js-familiar alias for {@link VoiceConnectionState}. Member values are Lunibee's. */\nexport { VoiceConnectionState as VoiceConnectionStatus };\n\n/** Active connections by guild, as tracked by {@link joinVoiceChannel}. */\nconst voiceConnections = new Map<string, VoiceConnection>();\n\n/**\n * Joins (or moves to) a voice channel, reusing the guild's tracked connection.\n * Mirrors `@discordjs/voice`'s `joinVoiceChannel`; transports are still attached\n * with {@link VoiceConnection.attachTransports}.\n * The connection stays tracked after `disconnect()` (a later join reuses it) and\n * leaves the registry only on `destroy()`.\n * @param options Guild, channel and self mute/deaf flags.\n * @returns The guild's voice connection.\n * @throws {TypeError} If the guild or channel ID is empty.\n */\nexport function joinVoiceChannel(\n options: VoiceConnectionOptions & { channelId: string },\n): VoiceConnection {\n // Checked before anything is registered, so a bad call leaves no entry behind.\n if (typeof options.channelId !== \"string\" || !options.channelId.trim())\n throw new TypeError(\"A voice channel ID is required.\");\n let connection = voiceConnections.get(options.guildId);\n if (!connection) {\n connection = new VoiceConnection(options);\n const created = connection;\n // VoiceConnection emits stateChange as (next, previous).\n created.on(\"stateChange\", (next) => {\n if (\n next === VoiceConnectionState.Destroyed &&\n voiceConnections.get(created.guildId) === created\n )\n voiceConnections.delete(created.guildId);\n });\n voiceConnections.set(options.guildId, connection);\n }\n connection.setChannel(options.channelId);\n connection.setSuppression(options);\n connection.connect();\n return connection;\n}\n\n/** Returns the connection tracked by {@link joinVoiceChannel} for a guild, if any. */\nexport function getVoiceConnection(\n guildId: string,\n): VoiceConnection | undefined {\n return voiceConnections.get(guildId);\n}\n\n/** Creates an {@link AudioPlayer}. Mirrors `@discordjs/voice`'s `createAudioPlayer`. */\nexport function createAudioPlayer(): AudioPlayer {\n return new AudioPlayer();\n}\n\n/** Creates an {@link AudioStream}. Mirrors `@discordjs/voice`'s `createAudioResource`. */\nexport function createAudioResource(\n stream: ReadableStream<Uint8Array>,\n metadata?: { title?: string; duration?: number },\n): AudioStream {\n return new AudioStream(stream, metadata);\n}\n\n/**\n * Resolves once a connection or player reaches `status`, or rejects after `timeoutMs`.\n * Mirrors `@discordjs/voice`'s `entersState`.\n * @returns The same target, for chaining.\n * @throws {VoiceError} If the state is not reached in time.\n */\nexport function entersState<T extends VoiceConnection | AudioPlayer>(\n target: T,\n status: T extends VoiceConnection ? VoiceConnectionState : AudioPlayerState,\n timeoutMs: number,\n): Promise<T> {\n if (target.state === status) return Promise.resolve(target);\n const emitter = target as unknown as {\n on(\n event: \"stateChange\",\n fn: (from: unknown, to: unknown) => void,\n ): unknown;\n off(\n event: \"stateChange\",\n fn: (from: unknown, to: unknown) => void,\n ): unknown;\n };\n // VoiceConnection emits (next, previous); AudioPlayer emits (from, to).\n const isConnection = target instanceof VoiceConnection;\n return new Promise<T>((resolve, reject) => {\n const onChange = (first: unknown, second: unknown): void => {\n if ((isConnection ? first : second) !== status) return;\n clearTimeout(timer);\n emitter.off(\"stateChange\", onChange);\n resolve(target);\n };\n const timer = setTimeout(\n () => {\n emitter.off(\"stateChange\", onChange);\n reject(\n new VoiceError(\n `Did not enter state \"${String(status)}\" within ${timeoutMs}ms.`,\n ),\n );\n },\n Math.min(timeoutMs, 2_147_483_647),\n );\n emitter.on(\"stateChange\", onChange);\n });\n}\n"
6
5
  ],
7
- "mappings": "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",
8
- "debugId": "0DF7DB68FBFCF1FC64756E2164756E21",
6
+ "mappings": "",
7
+ "debugId": "E69D3542BBC51E8264756E2164756E21",
9
8
  "names": []
10
9
  }