@jubbio/voice 1.0.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.
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudioResource = void 0;
4
+ exports.createAudioResource = createAudioResource;
5
+ exports.createAudioResourceFromUrl = createAudioResourceFromUrl;
6
+ exports.probeAudioInfo = probeAudioInfo;
7
+ const child_process_1 = require("child_process");
8
+ const enums_1 = require("./enums");
9
+ /**
10
+ * Represents an audio resource that can be played
11
+ */
12
+ class AudioResource {
13
+ /** Metadata attached to this resource */
14
+ metadata;
15
+ /** Whether playback has started */
16
+ started = false;
17
+ /** Whether playback has ended */
18
+ ended = false;
19
+ /** The input source (URL or file path) */
20
+ inputSource;
21
+ /** Stream type */
22
+ streamType;
23
+ /** Volume (0-1) */
24
+ volume = 1;
25
+ constructor(input, options = {}) {
26
+ this.metadata = options.metadata;
27
+ this.streamType = options.inputType || enums_1.StreamType.Arbitrary;
28
+ if (typeof input === 'string') {
29
+ this.inputSource = input;
30
+ }
31
+ else {
32
+ // For streams, we'd need to handle differently
33
+ // For now, throw an error
34
+ throw new Error('Stream input not yet supported. Use URL or file path.');
35
+ }
36
+ }
37
+ /**
38
+ * Get the input source for FFmpeg
39
+ * @internal
40
+ */
41
+ getInputSource() {
42
+ return this.inputSource;
43
+ }
44
+ /**
45
+ * Set the volume (0-1)
46
+ */
47
+ setVolume(volume) {
48
+ this.volume = Math.max(0, Math.min(1, volume));
49
+ }
50
+ /**
51
+ * Get the current volume
52
+ */
53
+ getVolume() {
54
+ return this.volume;
55
+ }
56
+ }
57
+ exports.AudioResource = AudioResource;
58
+ /**
59
+ * Create an audio resource from various inputs
60
+ */
61
+ function createAudioResource(input, options) {
62
+ return new AudioResource(input, options);
63
+ }
64
+ /**
65
+ * Create an audio resource from a YouTube/streaming URL
66
+ * Stores the original URL - extraction happens at playback time
67
+ */
68
+ function createAudioResourceFromUrl(url, options = {}) {
69
+ // Don't extract stream URL here - just store the original URL
70
+ // The AudioPlayer will use yt-dlp at playback time
71
+ return new AudioResource(url, options);
72
+ }
73
+ /**
74
+ * Check if URL is a streaming service URL
75
+ */
76
+ function isStreamingUrl(url) {
77
+ const streamingDomains = [
78
+ 'youtube.com',
79
+ 'youtu.be',
80
+ 'soundcloud.com',
81
+ 'spotify.com',
82
+ 'twitch.tv',
83
+ 'vimeo.com'
84
+ ];
85
+ return streamingDomains.some(domain => url.includes(domain));
86
+ }
87
+ /**
88
+ * Check if input is a valid URL
89
+ */
90
+ function isValidUrl(input) {
91
+ try {
92
+ new URL(input);
93
+ return true;
94
+ }
95
+ catch {
96
+ return input.startsWith('http://') || input.startsWith('https://');
97
+ }
98
+ }
99
+ /**
100
+ * Probe audio info from a URL or search query
101
+ * If input is not a URL, it will search YouTube
102
+ */
103
+ async function probeAudioInfo(input, ytDlpPath = '~/.local/bin/yt-dlp') {
104
+ return new Promise((resolve, reject) => {
105
+ // If not a valid URL, treat as YouTube search
106
+ let searchQuery = input;
107
+ if (!isValidUrl(input)) {
108
+ searchQuery = `ytsearch1:${input}`;
109
+ }
110
+ const ytdlp = (0, child_process_1.spawn)('bash', [
111
+ '-c',
112
+ `${ytDlpPath} --no-playlist --no-warnings -j "${searchQuery}"`
113
+ ]);
114
+ let stdout = '';
115
+ let stderr = '';
116
+ ytdlp.stdout.on('data', (data) => {
117
+ stdout += data.toString();
118
+ });
119
+ ytdlp.stderr.on('data', (data) => {
120
+ stderr += data.toString();
121
+ });
122
+ ytdlp.on('close', (code) => {
123
+ if (code !== 0) {
124
+ reject(new Error(`Failed to probe audio info: ${stderr || 'Unknown error'}`));
125
+ return;
126
+ }
127
+ try {
128
+ const info = JSON.parse(stdout);
129
+ resolve({
130
+ title: info.title || 'Unknown',
131
+ duration: info.duration || 0,
132
+ thumbnail: info.thumbnail,
133
+ url: info.webpage_url || info.url || input
134
+ });
135
+ }
136
+ catch (e) {
137
+ reject(new Error(`Failed to parse audio info: ${e.message}`));
138
+ }
139
+ });
140
+ ytdlp.on('error', (err) => {
141
+ reject(new Error(`Failed to probe audio info: ${err.message}`));
142
+ });
143
+ // Timeout after 30 seconds
144
+ setTimeout(() => {
145
+ ytdlp.kill();
146
+ reject(new Error('Timeout waiting for audio info'));
147
+ }, 30000);
148
+ });
149
+ }
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVkaW9SZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9BdWRpb1Jlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStFQSxrREFLQztBQU1ELGdFQU9DO0FBa0NELHdDQTBEQztBQTVMRCxpREFBc0M7QUFDdEMsbUNBQXFDO0FBR3JDOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCLHlDQUF5QztJQUN6QixRQUFRLENBQUk7SUFFNUIsbUNBQW1DO0lBQzVCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFdkIsaUNBQWlDO0lBQzFCLEtBQUssR0FBRyxLQUFLLENBQUM7SUFFckIsMENBQTBDO0lBQ2xDLFdBQVcsQ0FBUztJQUU1QixrQkFBa0I7SUFDVixVQUFVLENBQWE7SUFFL0IsbUJBQW1CO0lBQ1gsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVuQixZQUNFLEtBQXlCLEVBQ3pCLFVBQXlDLEVBQUU7UUFFM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBYSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxrQkFBVSxDQUFDLFNBQVMsQ0FBQztRQUU1RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sK0NBQStDO1lBQy9DLDBCQUEwQjtZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxD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QkFDaEMsT0FBTyxDQUFDO29CQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVM7b0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUM7b0JBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLO2lCQUMzQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQWdDLENBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0UsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQStCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xyXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgeyBTdHJlYW1UeXBlIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IENyZWF0ZUF1ZGlvUmVzb3VyY2VPcHRpb25zLCBBdWRpb1Jlc291cmNlSW5wdXQgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGF1ZGlvIHJlc291cmNlIHRoYXQgY2FuIGJlIHBsYXllZFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEF1ZGlvUmVzb3VyY2U8VCA9IHVua25vd24+IHtcclxuICAvKiogTWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyByZXNvdXJjZSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogVDtcclxuICBcclxuICAvKiogV2hldGhlciBwbGF5YmFjayBoYXMgc3RhcnRlZCAqL1xyXG4gIHB1YmxpYyBzdGFydGVkID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqIFdoZXRoZXIgcGxheWJhY2sgaGFzIGVuZGVkICovXHJcbiAgcHVibGljIGVuZGVkID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqIFRoZSBpbnB1dCBzb3VyY2UgKFVSTCBvciBmaWxlIHBhdGgpICovXHJcbiAgcHJpdmF0ZSBpbnB1dFNvdXJjZTogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBTdHJlYW0gdHlwZSAqL1xyXG4gIHByaXZhdGUgc3RyZWFtVHlwZTogU3RyZWFtVHlwZTtcclxuICBcclxuICAvKiogVm9sdW1lICgwLTEpICovXHJcbiAgcHJpdmF0ZSB2b2x1bWUgPSAxO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGlucHV0OiBBdWRpb1Jlc291cmNlSW5wdXQsXHJcbiAgICBvcHRpb25zOiBDcmVhdGVBdWRpb1Jlc291cmNlT3B0aW9uczxUPiA9IHt9XHJcbiAgKSB7XHJcbiAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YSBhcyBUO1xyXG4gICAgdGhpcy5zdHJlYW1UeXBlID0gb3B0aW9ucy5pbnB1dFR5cGUgfHwgU3RyZWFtVHlwZS5BcmJpdHJhcnk7XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRTb3VyY2UgPSBpbnB1dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEZvciBzdHJlYW1zLCB3ZSdkIG5lZWQgdG8gaGFuZGxlIGRpZmZlcmVudGx5XHJcbiAgICAgIC8vIEZvciBub3csIHRocm93IGFuIGVycm9yXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3RyZWFtIGlucHV0IG5vdCB5ZXQgc3VwcG9ydGVkLiBVc2UgVVJMIG9yIGZpbGUgcGF0aC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgaW5wdXQgc291cmNlIGZvciBGRm1wZWdcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBnZXRJbnB1dFNvdXJjZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5wdXRTb3VyY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZvbHVtZSAoMC0xKVxyXG4gICAqL1xyXG4gIHNldFZvbHVtZSh2b2x1bWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy52b2x1bWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2b2x1bWUpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCB2b2x1bWVcclxuICAgKi9cclxuICBnZXRWb2x1bWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnZvbHVtZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhdWRpbyByZXNvdXJjZSBmcm9tIFVSTFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBdWRpb1Jlc291cmNlRnJvbVVybE9wdGlvbnM8VCA9IHVua25vd24+IGV4dGVuZHMgQ3JlYXRlQXVkaW9SZXNvdXJjZU9wdGlvbnM8VD4ge1xyXG4gIC8qKiBVc2UgeXQtZGxwIHRvIGV4dHJhY3QgYXVkaW8gVVJMICovXHJcbiAgdXNlWXREbHA/OiBib29sZWFuO1xyXG4gIC8qKiBQYXRoIHRvIHl0LWRscCBiaW5hcnkgKi9cclxuICB5dERscFBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gYXVkaW8gcmVzb3VyY2UgZnJvbSB2YXJpb3VzIGlucHV0c1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1ZGlvUmVzb3VyY2U8VCA9IHVua25vd24+KFxyXG4gIGlucHV0OiBBdWRpb1Jlc291cmNlSW5wdXQsXHJcbiAgb3B0aW9ucz86IENyZWF0ZUF1ZGlvUmVzb3VyY2VPcHRpb25zPFQ+XHJcbik6IEF1ZGlvUmVzb3VyY2U8VD4ge1xyXG4gIHJldHVybiBuZXcgQXVkaW9SZXNvdXJjZShpbnB1dCwgb3B0aW9ucyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gYXVkaW8gcmVzb3VyY2UgZnJvbSBhIFlvdVR1YmUvc3RyZWFtaW5nIFVSTFxyXG4gKiBTdG9yZXMgdGhlIG9yaWdpbmFsIFVSTCAtIGV4dHJhY3Rpb24gaGFwcGVucyBhdCBwbGF5YmFjayB0aW1lXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXVkaW9SZXNvdXJjZUZyb21Vcmw8VCA9IHVua25vd24+KFxyXG4gIHVybDogc3RyaW5nLFxyXG4gIG9wdGlvbnM6IENyZWF0ZUF1ZGlvUmVzb3VyY2VGcm9tVXJsT3B0aW9uczxUPiA9IHt9XHJcbik6IEF1ZGlvUmVzb3VyY2U8VD4ge1xyXG4gIC8vIERvbid0IGV4dHJhY3Qgc3RyZWFtIFVSTCBoZXJlIC0ganVzdCBzdG9yZSB0aGUgb3JpZ2luYWwgVVJMXHJcbiAgLy8gVGhlIEF1ZGlvUGxheWVyIHdpbGwgdXNlIHl0LWRscCBhdCBwbGF5YmFjayB0aW1lXHJcbiAgcmV0dXJuIG5ldyBBdWRpb1Jlc291cmNlKHVybCwgb3B0aW9ucyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBVUkwgaXMgYSBzdHJlYW1pbmcgc2VydmljZSBVUkxcclxuICovXHJcbmZ1bmN0aW9uIGlzU3RyZWFtaW5nVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgY29uc3Qgc3RyZWFtaW5nRG9tYWlucyA9IFtcclxuICAgICd5b3V0dWJlLmNvbScsXHJcbiAgICAneW91dHUuYmUnLFxyXG4gICAgJ3NvdW5kY2xvdWQuY29tJyxcclxuICAgICdzcG90aWZ5LmNvbScsXHJcbiAgICAndHdpdGNoLnR2JyxcclxuICAgICd2aW1lby5jb20nXHJcbiAgXTtcclxuICBcclxuICByZXR1cm4gc3RyZWFtaW5nRG9tYWlucy5zb21lKGRvbWFpbiA9PiB1cmwuaW5jbHVkZXMoZG9tYWluKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBpbnB1dCBpcyBhIHZhbGlkIFVSTFxyXG4gKi9cclxuZnVuY3Rpb24gaXNWYWxpZFVybChpbnB1dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgdHJ5IHtcclxuICAgIG5ldyBVUkwoaW5wdXQpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfSBjYXRjaCB7XHJcbiAgICByZXR1cm4gaW5wdXQuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGlucHV0LnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUHJvYmUgYXVkaW8gaW5mbyBmcm9tIGEgVVJMIG9yIHNlYXJjaCBxdWVyeVxyXG4gKiBJZiBpbnB1dCBpcyBub3QgYSBVUkwsIGl0IHdpbGwgc2VhcmNoIFlvdVR1YmVcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9iZUF1ZGlvSW5mbyhpbnB1dDogc3RyaW5nLCB5dERscFBhdGggPSAnfi8ubG9jYWwvYmluL3l0LWRscCcpOiBQcm9taXNlPHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIGR1cmF0aW9uOiBudW1iZXI7XHJcbiAgdGh1bWJuYWlsPzogc3RyaW5nO1xyXG4gIHVybDogc3RyaW5nO1xyXG59PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIC8vIElmIG5vdCBhIHZhbGlkIFVSTCwgdHJlYXQgYXMgWW91VHViZSBzZWFyY2hcclxuICAgIGxldCBzZWFyY2hRdWVyeSA9IGlucHV0O1xyXG4gICAgaWYgKCFpc1ZhbGlkVXJsKGlucHV0KSkge1xyXG4gICAgICBzZWFyY2hRdWVyeSA9IGB5dHNlYXJjaDE6JHtpbnB1dH1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCB5dGRscCA9IHNwYXduKCdiYXNoJywgW1xyXG4gICAgICAnLWMnLFxyXG4gICAgICBgJHt5dERscFBhdGh9IC0tbm8tcGxheWxpc3QgLS1uby13YXJuaW5ncyAtaiBcIiR7c2VhcmNoUXVlcnl9XCJgXHJcbiAgICBdKTtcclxuICAgIFxyXG4gICAgbGV0IHN0ZG91dCA9ICcnO1xyXG4gICAgbGV0IHN0ZGVyciA9ICcnO1xyXG4gICAgXHJcbiAgICB5dGRscC5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xyXG4gICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIHl0ZGxwLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgeXRkbHAub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcclxuICAgICAgaWYgKGNvZGUgIT09IDApIHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcHJvYmUgYXVkaW8gaW5mbzogJHtzdGRlcnIgfHwgJ1Vua25vd24gZXJyb3InfWApKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcclxuICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgIHRpdGxlOiBpbmZvLnRpdGxlIHx8ICdVbmtub3duJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiBpbmZvLmR1cmF0aW9uIHx8IDAsXHJcbiAgICAgICAgICB0aHVtYm5haWw6IGluZm8udGh1bWJuYWlsLFxyXG4gICAgICAgICAgdXJsOiBpbmZvLndlYnBhZ2VfdXJsIHx8IGluZm8udXJsIHx8IGlucHV0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYXVkaW8gaW5mbzogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB5dGRscC5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBwcm9iZSBhdWRpbyBpbmZvOiAke2Vyci5tZXNzYWdlfWApKTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBUaW1lb3V0IGFmdGVyIDMwIHNlY29uZHNcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB5dGRscC5raWxsKCk7XHJcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgd2FpdGluZyBmb3IgYXVkaW8gaW5mbycpKTtcclxuICAgIH0sIDMwMDAwKTtcclxuICB9KTtcclxufVxyXG4iXX0=
@@ -0,0 +1,66 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Room } from '@livekit/rtc-node';
3
+ import { JoinVoiceChannelOptions, VoiceConnectionState } from './types';
4
+ import { AudioPlayer } from './AudioPlayer';
5
+ /**
6
+ * Represents a voice connection to a channel
7
+ */
8
+ export declare class VoiceConnection extends EventEmitter {
9
+ /** Current connection state */
10
+ state: VoiceConnectionState;
11
+ /** The channel ID this connection is for */
12
+ readonly channelId: string;
13
+ /** The guild ID this connection is for */
14
+ readonly guildId: string;
15
+ /** LiveKit room instance */
16
+ private room;
17
+ /** LiveKit connection info */
18
+ private livekitEndpoint;
19
+ private livekitToken;
20
+ private livekitRoomName;
21
+ /** Subscribed audio player */
22
+ private subscribedPlayer;
23
+ /** Gateway adapter methods */
24
+ private adapterMethods;
25
+ /** Adapter implementer (for sending payloads) */
26
+ private adapter;
27
+ constructor(options: JoinVoiceChannelOptions);
28
+ /**
29
+ * Subscribe an audio player to this connection
30
+ */
31
+ subscribe(player: AudioPlayer): void;
32
+ /**
33
+ * Unsubscribe the current audio player
34
+ */
35
+ unsubscribe(): void;
36
+ /**
37
+ * Get the LiveKit room (for audio player to publish tracks)
38
+ */
39
+ getRoom(): Room | null;
40
+ /**
41
+ * Disconnect from the voice channel
42
+ */
43
+ disconnect(): boolean;
44
+ /**
45
+ * Destroy the connection completely
46
+ */
47
+ destroy(): void;
48
+ /**
49
+ * Rejoin the voice channel (after disconnect)
50
+ */
51
+ rejoin(): boolean;
52
+ private sendVoiceStateUpdate;
53
+ private handleVoiceServerUpdate;
54
+ private handleVoiceStateUpdate;
55
+ private connectToLiveKit;
56
+ private disconnectFromLiveKit;
57
+ private setState;
58
+ }
59
+ /**
60
+ * Join a voice channel - main entry point
61
+ */
62
+ export declare function joinVoiceChannel(options: JoinVoiceChannelOptions): VoiceConnection;
63
+ /**
64
+ * Get an existing voice connection
65
+ */
66
+ export declare function getVoiceConnection(guildId: string): VoiceConnection | undefined;
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VoiceConnection = void 0;
4
+ exports.joinVoiceChannel = joinVoiceChannel;
5
+ exports.getVoiceConnection = getVoiceConnection;
6
+ const events_1 = require("events");
7
+ const rtc_node_1 = require("@livekit/rtc-node");
8
+ const enums_1 = require("./enums");
9
+ /**
10
+ * Represents a voice connection to a channel
11
+ */
12
+ class VoiceConnection extends events_1.EventEmitter {
13
+ /** Current connection state */
14
+ state = { status: enums_1.VoiceConnectionStatus.Connecting };
15
+ /** The channel ID this connection is for */
16
+ channelId;
17
+ /** The guild ID this connection is for */
18
+ guildId;
19
+ /** LiveKit room instance */
20
+ room = null;
21
+ /** LiveKit connection info */
22
+ livekitEndpoint = null;
23
+ livekitToken = null;
24
+ livekitRoomName = null;
25
+ /** Subscribed audio player */
26
+ subscribedPlayer = null;
27
+ /** Gateway adapter methods */
28
+ adapterMethods;
29
+ /** Adapter implementer (for sending payloads) */
30
+ adapter = null;
31
+ constructor(options) {
32
+ super();
33
+ this.channelId = options.channelId;
34
+ this.guildId = options.guildId;
35
+ // Create adapter methods that will receive gateway events
36
+ this.adapterMethods = {
37
+ onVoiceServerUpdate: (data) => this.handleVoiceServerUpdate(data),
38
+ onVoiceStateUpdate: (data) => this.handleVoiceStateUpdate(data),
39
+ destroy: () => this.destroy()
40
+ };
41
+ // Get adapter from creator
42
+ this.adapter = options.adapterCreator(this.adapterMethods);
43
+ // Send voice state update to join channel
44
+ this.sendVoiceStateUpdate(options.channelId, options.selfMute, options.selfDeaf);
45
+ }
46
+ /**
47
+ * Subscribe an audio player to this connection
48
+ */
49
+ subscribe(player) {
50
+ if (this.subscribedPlayer) {
51
+ this.subscribedPlayer.unsubscribe(this);
52
+ }
53
+ this.subscribedPlayer = player;
54
+ player.subscribe(this);
55
+ }
56
+ /**
57
+ * Unsubscribe the current audio player
58
+ */
59
+ unsubscribe() {
60
+ if (this.subscribedPlayer) {
61
+ this.subscribedPlayer.unsubscribe(this);
62
+ this.subscribedPlayer = null;
63
+ }
64
+ }
65
+ /**
66
+ * Get the LiveKit room (for audio player to publish tracks)
67
+ */
68
+ getRoom() {
69
+ return this.room;
70
+ }
71
+ /**
72
+ * Disconnect from the voice channel
73
+ */
74
+ disconnect() {
75
+ this.sendVoiceStateUpdate(null);
76
+ return true;
77
+ }
78
+ /**
79
+ * Destroy the connection completely
80
+ */
81
+ destroy() {
82
+ this.unsubscribe();
83
+ this.disconnectFromLiveKit();
84
+ this.adapter?.destroy();
85
+ this.setState({ status: enums_1.VoiceConnectionStatus.Destroyed });
86
+ }
87
+ /**
88
+ * Rejoin the voice channel (after disconnect)
89
+ */
90
+ rejoin() {
91
+ this.sendVoiceStateUpdate(this.channelId);
92
+ return true;
93
+ }
94
+ sendVoiceStateUpdate(channelId, selfMute = false, selfDeaf = false) {
95
+ if (!this.adapter)
96
+ return;
97
+ this.adapter.sendPayload({
98
+ op: 4, // VOICE_STATE_UPDATE
99
+ d: {
100
+ guild_id: this.guildId,
101
+ channel_id: channelId,
102
+ self_mute: selfMute,
103
+ self_deaf: selfDeaf
104
+ }
105
+ });
106
+ }
107
+ handleVoiceServerUpdate(data) {
108
+ this.livekitEndpoint = data.endpoint;
109
+ this.livekitToken = data.token;
110
+ this.livekitRoomName = data.room;
111
+ this.setState({ status: enums_1.VoiceConnectionStatus.Signalling });
112
+ this.connectToLiveKit();
113
+ }
114
+ handleVoiceStateUpdate(data) {
115
+ if (data.channel_id === null) {
116
+ // Disconnected
117
+ this.disconnectFromLiveKit();
118
+ this.setState({ status: enums_1.VoiceConnectionStatus.Disconnected });
119
+ }
120
+ }
121
+ async connectToLiveKit() {
122
+ if (!this.livekitEndpoint || !this.livekitToken) {
123
+ this.emit('error', new Error('Missing LiveKit connection info'));
124
+ return;
125
+ }
126
+ try {
127
+ // Disconnect existing room if any
128
+ await this.disconnectFromLiveKit();
129
+ this.room = new rtc_node_1.Room();
130
+ this.room.on(rtc_node_1.RoomEvent.Disconnected, () => {
131
+ this.setState({ status: enums_1.VoiceConnectionStatus.Disconnected });
132
+ });
133
+ await this.room.connect(this.livekitEndpoint, this.livekitToken);
134
+ this.setState({ status: enums_1.VoiceConnectionStatus.Ready });
135
+ // Notify subscribed player that connection is ready
136
+ if (this.subscribedPlayer) {
137
+ this.subscribedPlayer.onConnectionReady(this);
138
+ }
139
+ }
140
+ catch (error) {
141
+ this.emit('error', error);
142
+ this.setState({ status: enums_1.VoiceConnectionStatus.Disconnected });
143
+ }
144
+ }
145
+ async disconnectFromLiveKit() {
146
+ if (this.room) {
147
+ try {
148
+ await this.room.disconnect();
149
+ }
150
+ catch (e) {
151
+ // Ignore disconnect errors
152
+ }
153
+ this.room = null;
154
+ }
155
+ }
156
+ setState(newState) {
157
+ const oldState = this.state;
158
+ this.state = newState;
159
+ this.emit('stateChange', oldState, newState);
160
+ }
161
+ }
162
+ exports.VoiceConnection = VoiceConnection;
163
+ // Store active connections
164
+ const connections = new Map();
165
+ /**
166
+ * Join a voice channel - main entry point
167
+ */
168
+ function joinVoiceChannel(options) {
169
+ const key = `${options.guildId}:${options.channelId}`;
170
+ // Destroy existing connection if any
171
+ const existing = connections.get(key);
172
+ if (existing) {
173
+ existing.destroy();
174
+ connections.delete(key);
175
+ }
176
+ const connection = new VoiceConnection(options);
177
+ connections.set(key, connection);
178
+ return connection;
179
+ }
180
+ /**
181
+ * Get an existing voice connection
182
+ */
183
+ function getVoiceConnection(guildId) {
184
+ for (const [key, connection] of connections) {
185
+ if (key.startsWith(`${guildId}:`)) {
186
+ return connection;
187
+ }
188
+ }
189
+ return undefined;
190
+ }
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9pY2VDb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1ZvaWNlQ29ubmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1TUEsNENBY0M7QUFLRCxnREFPQztBQWpPRCxtQ0FBc0M7QUFDdEMsZ0RBQW9EO0FBQ3BELG1DQUFnRDtBQVNoRDs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxxQkFBWTtJQUMvQywrQkFBK0I7SUFDeEIsS0FBSyxHQUF5QixFQUFFLE1BQU0sRUFBRSw2QkFBcUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUVsRiw0Q0FBNEM7SUFDNUIsU0FBUyxDQUFTO0lBRWxDLDBDQUEwQztJQUMxQixPQUFPLENBQVM7SUFFaEMsNEJBQTRCO0lBQ3BCLElBQUksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLDhCQUE4QjtJQUN0QixlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxlQUFlLEdBQWtCLElBQUksQ0FBQztJQUU5Qyw4QkFBOEI7SUFDdEIsZ0JBQWdCLEdBQXVCLElBQUksQ0FBQztJQUVwRCw4QkFBOEI7SUFDdEIsY0FBYyxDQUErQjtJQUVyRCxpREFBaUQ7SUFDekMsT0FBTyxHQUEyRSxJQUFJLENBQUM7SUFFL0YsWUFBWSxPQUFnQztRQUMxQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFFL0IsMERBQTBEO1FBQzFELElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsbUJBQW1CLEVBQUUsQ0FBQyxJQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO1lBQ3BGLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JB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QUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFakMsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsT0FBZTtJQUNoRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCB7IFJvb20sIFJvb21FdmVudCB9IGZyb20gJ0BsaXZla2l0L3J0Yy1ub2RlJztcclxuaW1wb3J0IHsgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IFxyXG4gIEpvaW5Wb2ljZUNoYW5uZWxPcHRpb25zLCBcclxuICBWb2ljZUNvbm5lY3Rpb25TdGF0ZSxcclxuICBHYXRld2F5QWRhcHRlckxpYnJhcnlNZXRob2RzLFxyXG4gIFZvaWNlU2VydmVyVXBkYXRlXHJcbn0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7IEF1ZGlvUGxheWVyIH0gZnJvbSAnLi9BdWRpb1BsYXllcic7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHZvaWNlIGNvbm5lY3Rpb24gdG8gYSBjaGFubmVsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVm9pY2VDb25uZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAvKiogQ3VycmVudCBjb25uZWN0aW9uIHN0YXRlICovXHJcbiAgcHVibGljIHN0YXRlOiBWb2ljZUNvbm5lY3Rpb25TdGF0ZSA9IHsgc3RhdHVzOiBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyB9O1xyXG4gIFxyXG4gIC8qKiBUaGUgY2hhbm5lbCBJRCB0aGlzIGNvbm5lY3Rpb24gaXMgZm9yICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJZDogc3RyaW5nO1xyXG4gIFxyXG4gIC8qKiBUaGUgZ3VpbGQgSUQgdGhpcyBjb25uZWN0aW9uIGlzIGZvciAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBndWlsZElkOiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIExpdmVLaXQgcm9vbSBpbnN0YW5jZSAqL1xyXG4gIHByaXZhdGUgcm9vbTogUm9vbSB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8qKiBMaXZlS2l0IGNvbm5lY3Rpb24gaW5mbyAqL1xyXG4gIHByaXZhdGUgbGl2ZWtpdEVuZHBvaW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxpdmVraXRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsaXZla2l0Um9vbU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8qKiBTdWJzY3JpYmVkIGF1ZGlvIHBsYXllciAqL1xyXG4gIHByaXZhdGUgc3Vic2NyaWJlZFBsYXllcjogQXVkaW9QbGF5ZXIgfCBudWxsID0gbnVsbDtcclxuICBcclxuICAvKiogR2F0ZXdheSBhZGFwdGVyIG1ldGhvZHMgKi9cclxuICBwcml2YXRlIGFkYXB0ZXJNZXRob2RzOiBHYXRld2F5QWRhcHRlckxpYnJhcnlNZXRob2RzO1xyXG4gIFxyXG4gIC8qKiBBZGFwdGVyIGltcGxlbWVudGVyIChmb3Igc2VuZGluZyBwYXlsb2FkcykgKi9cclxuICBwcml2YXRlIGFkYXB0ZXI6IHsgc2VuZFBheWxvYWQ6IChwYXlsb2FkOiBhbnkpID0+IGJvb2xlYW47IGRlc3Ryb3k6ICgpID0+IHZvaWQgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBKb2luVm9pY2VDaGFubmVsT3B0aW9ucykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuY2hhbm5lbElkID0gb3B0aW9ucy5jaGFubmVsSWQ7XHJcbiAgICB0aGlzLmd1aWxkSWQgPSBvcHRpb25zLmd1aWxkSWQ7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBhZGFwdGVyIG1ldGhvZHMgdGhhdCB3aWxsIHJlY2VpdmUgZ2F0ZXdheSBldmVudHNcclxuICAgIHRoaXMuYWRhcHRlck1ldGhvZHMgPSB7XHJcbiAgICAgIG9uVm9pY2VTZXJ2ZXJVcGRhdGU6IChkYXRhOiBWb2ljZVNlcnZlclVwZGF0ZSkgPT4gdGhpcy5oYW5kbGVWb2ljZVNlcnZlclVwZGF0ZShkYXRhKSxcclxuICAgICAgb25Wb2ljZVN0YXRlVXBkYXRlOiAoZGF0YSkgPT4gdGhpcy5oYW5kbGVWb2ljZVN0YXRlVXBkYXRlKGRhdGEpLFxyXG4gICAgICBkZXN0cm95OiAoKSA9PiB0aGlzLmRlc3Ryb3koKVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gR2V0IGFkYXB0ZXIgZnJvbSBjcmVhdG9yXHJcbiAgICB0aGlzLmFkYXB0ZXIgPSBvcHRpb25zLmFkYXB0ZXJDcmVhdG9yKHRoaXMuYWRhcHRlck1ldGhvZHMpO1xyXG4gICAgXHJcbiAgICAvLyBTZW5kIHZvaWNlIHN0YXRlIHVwZGF0ZSB0byBqb2luIGNoYW5uZWxcclxuICAgIHRoaXMuc2VuZFZvaWNlU3RhdGVVcGRhdGUob3B0aW9ucy5jaGFubmVsSWQsIG9wdGlvbnMuc2VsZk11dGUsIG9wdGlvbnMuc2VsZkRlYWYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaWJlIGFuIGF1ZGlvIHBsYXllciB0byB0aGlzIGNvbm5lY3Rpb25cclxuICAgKi9cclxuICBzdWJzY3JpYmUocGxheWVyOiBBdWRpb1BsYXllcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaWJlZFBsYXllcikge1xyXG4gICAgICB0aGlzLnN1YnNjcmliZWRQbGF5ZXIudW5zdWJzY3JpYmUodGhpcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN1YnNjcmliZWRQbGF5ZXIgPSBwbGF5ZXI7XHJcbiAgICBwbGF5ZXIuc3Vic2NyaWJlKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5zdWJzY3JpYmUgdGhlIGN1cnJlbnQgYXVkaW8gcGxheWVyXHJcbiAgICovXHJcbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpYmVkUGxheWVyKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlZFBsYXllci51bnN1YnNjcmliZSh0aGlzKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVkUGxheWVyID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgTGl2ZUtpdCByb29tIChmb3IgYXVkaW8gcGxheWVyIHRvIHB1Ymxpc2ggdHJhY2tzKVxyXG4gICAqL1xyXG4gIGdldFJvb20oKTogUm9vbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMucm9vbTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgdm9pY2UgY2hhbm5lbFxyXG4gICAqL1xyXG4gIGRpc2Nvbm5lY3QoKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnNlbmRWb2ljZVN0YXRlVXBkYXRlKG51bGwpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXN0cm95IHRoZSBjb25uZWN0aW9uIGNvbXBsZXRlbHlcclxuICAgKi9cclxuICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5kaXNjb25uZWN0RnJvbUxpdmVLaXQoKTtcclxuICAgIHRoaXMuYWRhcHRlcj8uZGVzdHJveSgpO1xyXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXR1czogVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlam9pbiB0aGUgdm9pY2UgY2hhbm5lbCAoYWZ0ZXIgZGlzY29ubmVjdClcclxuICAgKi9cclxuICByZWpvaW4oKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnNlbmRWb2ljZVN0YXRlVXBkYXRlKHRoaXMuY2hhbm5lbElkKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kVm9pY2VTdGF0ZVVwZGF0ZShjaGFubmVsSWQ6IHN0cmluZyB8IG51bGwsIHNlbGZNdXRlID0gZmFsc2UsIHNlbGZEZWFmID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hZGFwdGVyKSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuYWRhcHRlci5zZW5kUGF5bG9hZCh7XHJcbiAgICAgIG9wOiA0LCAvLyBWT0lDRV9TVEFURV9VUERBVEVcclxuICAgICAgZDoge1xyXG4gICAgICAgIGd1aWxkX2lkOiB0aGlzLmd1aWxkSWQsXHJcbiAgICAgICAgY2hhbm5lbF9pZDogY2hhbm5lbElkLFxyXG4gICAgICAgIHNlbGZfbXV0ZTogc2VsZk11dGUsXHJcbiAgICAgICAgc2VsZl9kZWFmOiBzZWxmRGVhZlxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlVm9pY2VTZXJ2ZXJVcGRhdGUoZGF0YTogVm9pY2VTZXJ2ZXJVcGRhdGUpOiB2b2lkIHtcclxuICAgIHRoaXMubGl2ZWtpdEVuZHBvaW50ID0gZGF0YS5lbmRwb2ludDtcclxuICAgIHRoaXMubGl2ZWtpdFRva2VuID0gZGF0YS50b2tlbjtcclxuICAgIHRoaXMubGl2ZWtpdFJvb21OYW1lID0gZGF0YS5yb29tO1xyXG4gICAgXHJcbiAgICB0aGlzLnNldFN0YXRlKHsgc3RhdHVzOiBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZyB9KTtcclxuICAgIHRoaXMuY29ubmVjdFRvTGl2ZUtpdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVWb2ljZVN0YXRlVXBkYXRlKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGRhdGEuY2hhbm5lbF9pZCA9PT0gbnVsbCkge1xyXG4gICAgICAvLyBEaXNjb25uZWN0ZWRcclxuICAgICAgdGhpcy5kaXNjb25uZWN0RnJvbUxpdmVLaXQoKTtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXR1czogVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvTGl2ZUtpdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5saXZla2l0RW5kcG9pbnQgfHwgIXRoaXMubGl2ZWtpdFRva2VuKSB7XHJcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ01pc3NpbmcgTGl2ZUtpdCBjb25uZWN0aW9uIGluZm8nKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBEaXNjb25uZWN0IGV4aXN0aW5nIHJvb20gaWYgYW55XHJcbiAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdEZyb21MaXZlS2l0KCk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnJvb20gPSBuZXcgUm9vbSgpO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5yb29tLm9uKFJvb21FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc3RhdHVzOiBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMucm9vbS5jb25uZWN0KHRoaXMubGl2ZWtpdEVuZHBvaW50LCB0aGlzLmxpdmVraXRUb2tlbik7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3RhdHVzOiBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkgfSk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBOb3RpZnkgc3Vic2NyaWJlZCBwbGF5ZXIgdGhhdCBjb25uZWN0aW9uIGlzIHJlYWR5XHJcbiAgICAgIGlmICh0aGlzLnN1YnNjcmliZWRQbGF5ZXIpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZWRQbGF5ZXIub25Db25uZWN0aW9uUmVhZHkodGhpcyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcik7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdGF0dXM6IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRpc2Nvbm5lY3RGcm9tTGl2ZUtpdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnJvb20pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJvb20uZGlzY29ubmVjdCgpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gSWdub3JlIGRpc2Nvbm5lY3QgZXJyb3JzXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yb29tID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3RhdGUobmV3U3RhdGU6IFZvaWNlQ29ubmVjdGlvblN0YXRlKTogdm9pZCB7XHJcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHRoaXMuc3RhdGU7XHJcbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XHJcbiAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlJywgb2xkU3RhdGUsIG5ld1N0YXRlKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIFN0b3JlIGFjdGl2ZSBjb25uZWN0aW9uc1xyXG5jb25zdCBjb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBWb2ljZUNvbm5lY3Rpb24+KCk7XHJcblxyXG4vKipcclxuICogSm9pbiBhIHZvaWNlIGNoYW5uZWwgLSBtYWluIGVudHJ5IHBvaW50XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gam9pblZvaWNlQ2hhbm5lbChvcHRpb25zOiBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyk6IFZvaWNlQ29ubmVjdGlvbiB7XHJcbiAgY29uc3Qga2V5ID0gYCR7b3B0aW9ucy5ndWlsZElkfToke29wdGlvbnMuY2hhbm5lbElkfWA7XHJcbiAgXHJcbiAgLy8gRGVzdHJveSBleGlzdGluZyBjb25uZWN0aW9uIGlmIGFueVxyXG4gIGNvbnN0IGV4aXN0aW5nID0gY29ubmVjdGlvbnMuZ2V0KGtleSk7XHJcbiAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICBleGlzdGluZy5kZXN0cm95KCk7XHJcbiAgICBjb25uZWN0aW9ucy5kZWxldGUoa2V5KTtcclxuICB9XHJcbiAgXHJcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWb2ljZUNvbm5lY3Rpb24ob3B0aW9ucyk7XHJcbiAgY29ubmVjdGlvbnMuc2V0KGtleSwgY29ubmVjdGlvbik7XHJcbiAgXHJcbiAgcmV0dXJuIGNvbm5lY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgYW4gZXhpc3Rpbmcgdm9pY2UgY29ubmVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZElkOiBzdHJpbmcpOiBWb2ljZUNvbm5lY3Rpb24gfCB1bmRlZmluZWQge1xyXG4gIGZvciAoY29uc3QgW2tleSwgY29ubmVjdGlvbl0gb2YgY29ubmVjdGlvbnMpIHtcclxuICAgIGlmIChrZXkuc3RhcnRzV2l0aChgJHtndWlsZElkfTpgKSkge1xyXG4gICAgICByZXR1cm4gY29ubmVjdGlvbjtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHVuZGVmaW5lZDtcclxufVxyXG4iXX0=
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Voice connection status
3
+ */
4
+ export declare enum VoiceConnectionStatus {
5
+ /** Connection is being established */
6
+ Connecting = "connecting",
7
+ /** Connection is ready to use */
8
+ Ready = "ready",
9
+ /** Connection is disconnected */
10
+ Disconnected = "disconnected",
11
+ /** Connection is destroyed */
12
+ Destroyed = "destroyed",
13
+ /** Connection is signalling (exchanging info with server) */
14
+ Signalling = "signalling"
15
+ }
16
+ /**
17
+ * Audio player status
18
+ */
19
+ export declare enum AudioPlayerStatus {
20
+ /** Player is idle (not playing anything) */
21
+ Idle = "idle",
22
+ /** Player is buffering audio */
23
+ Buffering = "buffering",
24
+ /** Player is playing audio */
25
+ Playing = "playing",
26
+ /** Player is paused */
27
+ Paused = "paused",
28
+ /** Player is auto-paused (no subscribers) */
29
+ AutoPaused = "autopaused"
30
+ }
31
+ /**
32
+ * Audio resource type
33
+ */
34
+ export declare enum StreamType {
35
+ /** Arbitrary audio stream */
36
+ Arbitrary = "arbitrary",
37
+ /** Raw PCM audio */
38
+ Raw = "raw",
39
+ /** Opus encoded audio */
40
+ Opus = "opus",
41
+ /** OGG/Opus container */
42
+ OggOpus = "ogg/opus",
43
+ /** WebM/Opus container */
44
+ WebmOpus = "webm/opus"
45
+ }
package/dist/enums.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StreamType = exports.AudioPlayerStatus = exports.VoiceConnectionStatus = void 0;
4
+ /**
5
+ * Voice connection status
6
+ */
7
+ var VoiceConnectionStatus;
8
+ (function (VoiceConnectionStatus) {
9
+ /** Connection is being established */
10
+ VoiceConnectionStatus["Connecting"] = "connecting";
11
+ /** Connection is ready to use */
12
+ VoiceConnectionStatus["Ready"] = "ready";
13
+ /** Connection is disconnected */
14
+ VoiceConnectionStatus["Disconnected"] = "disconnected";
15
+ /** Connection is destroyed */
16
+ VoiceConnectionStatus["Destroyed"] = "destroyed";
17
+ /** Connection is signalling (exchanging info with server) */
18
+ VoiceConnectionStatus["Signalling"] = "signalling";
19
+ })(VoiceConnectionStatus || (exports.VoiceConnectionStatus = VoiceConnectionStatus = {}));
20
+ /**
21
+ * Audio player status
22
+ */
23
+ var AudioPlayerStatus;
24
+ (function (AudioPlayerStatus) {
25
+ /** Player is idle (not playing anything) */
26
+ AudioPlayerStatus["Idle"] = "idle";
27
+ /** Player is buffering audio */
28
+ AudioPlayerStatus["Buffering"] = "buffering";
29
+ /** Player is playing audio */
30
+ AudioPlayerStatus["Playing"] = "playing";
31
+ /** Player is paused */
32
+ AudioPlayerStatus["Paused"] = "paused";
33
+ /** Player is auto-paused (no subscribers) */
34
+ AudioPlayerStatus["AutoPaused"] = "autopaused";
35
+ })(AudioPlayerStatus || (exports.AudioPlayerStatus = AudioPlayerStatus = {}));
36
+ /**
37
+ * Audio resource type
38
+ */
39
+ var StreamType;
40
+ (function (StreamType) {
41
+ /** Arbitrary audio stream */
42
+ StreamType["Arbitrary"] = "arbitrary";
43
+ /** Raw PCM audio */
44
+ StreamType["Raw"] = "raw";
45
+ /** Opus encoded audio */
46
+ StreamType["Opus"] = "opus";
47
+ /** OGG/Opus container */
48
+ StreamType["OggOpus"] = "ogg/opus";
49
+ /** WebM/Opus container */
50
+ StreamType["WebmOpus"] = "webm/opus";
51
+ })(StreamType || (exports.StreamType = StreamType = {}));
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW51bXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLHFCQVdYO0FBWEQsV0FBWSxxQkFBcUI7SUFDL0Isc0NBQXNDO0lBQ3RDLGtEQUF5QixDQUFBO0lBQ3pCLGlDQUFpQztJQUNqQyx3Q0FBZSxDQUFBO0lBQ2YsaUNBQWlDO0lBQ2pDLHNEQUE2QixDQUFBO0lBQzdCLDhCQUE4QjtJQUM5QixnREFBdUIsQ0FBQTtJQUN2Qiw2REFBNkQ7SUFDN0Qsa0RBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQVhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBV2hDO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGlCQVdYO0FBWEQsV0FBWSxpQkFBaUI7SUFDM0IsNENBQTRDO0lBQzVDLGtDQUFhLENBQUE7SUFDYixnQ0FBZ0M7SUFDaEMsNENBQXVCLENBQUE7SUFDdkIsOEJBQThCO0lBQzlCLHdDQUFtQixDQUFBO0lBQ25CLHVCQUF1QjtJQUN2QixzQ0FBaUIsQ0FBQTtJQUNqQiw2Q0FBNkM7SUFDN0MsOENBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQVhXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBVzVCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBV1g7QUFYRCxXQUFZLFVBQVU7SUFDcEIsNkJBQTZCO0lBQzdCLHFDQUF1QixDQUFBO0lBQ3ZCLG9CQUFvQjtJQUNwQix5QkFBVyxDQUFBO0lBQ1gseUJBQXlCO0lBQ3pCLDJCQUFhLENBQUE7SUFDYix5QkFBeUI7SUFDekIsa0NBQW9CLENBQUE7SUFDcEIsMEJBQTBCO0lBQzFCLG9DQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFYVyxVQUFVLDBCQUFWLFVBQVUsUUFXckIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVm9pY2UgY29ubmVjdGlvbiBzdGF0dXNcclxuICovXHJcbmV4cG9ydCBlbnVtIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB7XHJcbiAgLyoqIENvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQgKi9cclxuICBDb25uZWN0aW5nID0gJ2Nvbm5lY3RpbmcnLFxyXG4gIC8qKiBDb25uZWN0aW9uIGlzIHJlYWR5IHRvIHVzZSAqL1xyXG4gIFJlYWR5ID0gJ3JlYWR5JyxcclxuICAvKiogQ29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQgKi9cclxuICBEaXNjb25uZWN0ZWQgPSAnZGlzY29ubmVjdGVkJyxcclxuICAvKiogQ29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgKi9cclxuICBEZXN0cm95ZWQgPSAnZGVzdHJveWVkJyxcclxuICAvKiogQ29ubmVjdGlvbiBpcyBzaWduYWxsaW5nIChleGNoYW5naW5nIGluZm8gd2l0aCBzZXJ2ZXIpICovXHJcbiAgU2lnbmFsbGluZyA9ICdzaWduYWxsaW5nJ1xyXG59XHJcblxyXG4vKipcclxuICogQXVkaW8gcGxheWVyIHN0YXR1c1xyXG4gKi9cclxuZXhwb3J0IGVudW0gQXVkaW9QbGF5ZXJTdGF0dXMge1xyXG4gIC8qKiBQbGF5ZXIgaXMgaWRsZSAobm90IHBsYXlpbmcgYW55dGhpbmcpICovXHJcbiAgSWRsZSA9ICdpZGxlJyxcclxuICAvKiogUGxheWVyIGlzIGJ1ZmZlcmluZyBhdWRpbyAqL1xyXG4gIEJ1ZmZlcmluZyA9ICdidWZmZXJpbmcnLFxyXG4gIC8qKiBQbGF5ZXIgaXMgcGxheWluZyBhdWRpbyAqL1xyXG4gIFBsYXlpbmcgPSAncGxheWluZycsXHJcbiAgLyoqIFBsYXllciBpcyBwYXVzZWQgKi9cclxuICBQYXVzZWQgPSAncGF1c2VkJyxcclxuICAvKiogUGxheWVyIGlzIGF1dG8tcGF1c2VkIChubyBzdWJzY3JpYmVycykgKi9cclxuICBBdXRvUGF1c2VkID0gJ2F1dG9wYXVzZWQnXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBdWRpbyByZXNvdXJjZSB0eXBlXHJcbiAqL1xyXG5leHBvcnQgZW51bSBTdHJlYW1UeXBlIHtcclxuICAvKiogQXJiaXRyYXJ5IGF1ZGlvIHN0cmVhbSAqL1xyXG4gIEFyYml0cmFyeSA9ICdhcmJpdHJhcnknLFxyXG4gIC8qKiBSYXcgUENNIGF1ZGlvICovXHJcbiAgUmF3ID0gJ3JhdycsXHJcbiAgLyoqIE9wdXMgZW5jb2RlZCBhdWRpbyAqL1xyXG4gIE9wdXMgPSAnb3B1cycsXHJcbiAgLyoqIE9HRy9PcHVzIGNvbnRhaW5lciAqL1xyXG4gIE9nZ09wdXMgPSAnb2dnL29wdXMnLFxyXG4gIC8qKiBXZWJNL09wdXMgY29udGFpbmVyICovXHJcbiAgV2VibU9wdXMgPSAnd2VibS9vcHVzJ1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @jubbio/voice - Voice library for Jubbio bots
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { joinVoiceChannel, createAudioPlayer, createAudioResource } from '@jubbio/voice';
7
+ *
8
+ * const connection = joinVoiceChannel({
9
+ * channelId: '123456789',
10
+ * guildId: '987654321',
11
+ * adapterCreator: client.guilds.cache.get('987654321')!.voiceAdapterCreator
12
+ * });
13
+ *
14
+ * const player = createAudioPlayer();
15
+ * const resource = createAudioResource('https://example.com/audio.mp3');
16
+ *
17
+ * player.play(resource);
18
+ * connection.subscribe(player);
19
+ * ```
20
+ */
21
+ export * from './VoiceConnection';
22
+ export * from './AudioPlayer';
23
+ export * from './AudioResource';
24
+ export * from './types';
25
+ export * from './enums';
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * @jubbio/voice - Voice library for Jubbio bots
4
+ *
5
+ * Usage:
6
+ * ```typescript
7
+ * import { joinVoiceChannel, createAudioPlayer, createAudioResource } from '@jubbio/voice';
8
+ *
9
+ * const connection = joinVoiceChannel({
10
+ * channelId: '123456789',
11
+ * guildId: '987654321',
12
+ * adapterCreator: client.guilds.cache.get('987654321')!.voiceAdapterCreator
13
+ * });
14
+ *
15
+ * const player = createAudioPlayer();
16
+ * const resource = createAudioResource('https://example.com/audio.mp3');
17
+ *
18
+ * player.play(resource);
19
+ * connection.subscribe(player);
20
+ * ```
21
+ */
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
34
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ __exportStar(require("./VoiceConnection"), exports);
38
+ __exportStar(require("./AudioPlayer"), exports);
39
+ __exportStar(require("./AudioResource"), exports);
40
+ __exportStar(require("./types"), exports);
41
+ __exportStar(require("./enums"), exports);
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsb0RBQWtDO0FBQ2xDLGdEQUE4QjtBQUM5QixrREFBZ0M7QUFDaEMsMENBQXdCO0FBQ3hCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAanViYmlvL3ZvaWNlIC0gVm9pY2UgbGlicmFyeSBmb3IgSnViYmlvIGJvdHNcclxuICogXHJcbiAqIFVzYWdlOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IGpvaW5Wb2ljZUNoYW5uZWwsIGNyZWF0ZUF1ZGlvUGxheWVyLCBjcmVhdGVBdWRpb1Jlc291cmNlIH0gZnJvbSAnQGp1YmJpby92b2ljZSc7XHJcbiAqIFxyXG4gKiBjb25zdCBjb25uZWN0aW9uID0gam9pblZvaWNlQ2hhbm5lbCh7XHJcbiAqICAgY2hhbm5lbElkOiAnMTIzNDU2Nzg5JyxcclxuICogICBndWlsZElkOiAnOTg3NjU0MzIxJyxcclxuICogICBhZGFwdGVyQ3JlYXRvcjogY2xpZW50Lmd1aWxkcy5jYWNoZS5nZXQoJzk4NzY1NDMyMScpIS52b2ljZUFkYXB0ZXJDcmVhdG9yXHJcbiAqIH0pO1xyXG4gKiBcclxuICogY29uc3QgcGxheWVyID0gY3JlYXRlQXVkaW9QbGF5ZXIoKTtcclxuICogY29uc3QgcmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKCdodHRwczovL2V4YW1wbGUuY29tL2F1ZGlvLm1wMycpO1xyXG4gKiBcclxuICogcGxheWVyLnBsYXkocmVzb3VyY2UpO1xyXG4gKiBjb25uZWN0aW9uLnN1YnNjcmliZShwbGF5ZXIpO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlQ29ubmVjdGlvbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vQXVkaW9QbGF5ZXInO1xyXG5leHBvcnQgKiBmcm9tICcuL0F1ZGlvUmVzb3VyY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcclxuZXhwb3J0ICogZnJvbSAnLi9lbnVtcyc7XHJcbiJdfQ==