euralink
Version:
🎵 The most advanced, blazing-fast Lavalink client for Node.js with SponsorBlock, real-time lyrics, 60% less RAM usage, and the ultimate music bot experience.
1,101 lines (989 loc) • 31.8 kB
TypeScript
import { EventEmitter } from "tseep";
/** Nullable type helper */
type Nullable<T> = T | null;
/**
* Represents a music track with metadata and utility methods.
*/
export declare class Track {
constructor(data: any, requester: any, node: Node);
public track: string;
public info: {
identifier: string;
seekable: boolean;
author: string;
length: number;
stream: boolean;
sourceName: string;
title: string;
uri: string;
isrc: string | null;
thumbnail: string | null;
requester: any;
pluginInfo?: any;
};
/**
* Attempts to resolve the track using the Euralink instance.
* Emits 'trackError' on failure.
* @throws Error if resolution fails
*/
public resolve(eura: Euralink): Promise<Track>;
/**
* Clears the static thumbnail cache for all tracks.
*/
static clearThumbnailCache(): void;
}
export interface RestOptions {
secure: boolean;
host: string;
port: number;
sessionId: string;
password: string;
restVersion: string;
}
interface RequestOptions {
guildId: string;
data: any;
}
interface RestResponse {}
/**
* REST API manager for Lavalink nodes.
* Emits: 'restError', 'restCacheCleared'
*/
export declare class Rest extends EventEmitter {
constructor(eura: Euralink, options: RestOptions);
public eura: Euralink;
public url: string;
public sessionId: RestOptions["sessionId"];
public password: RestOptions["password"];
public version: RestOptions["restVersion"];
public calls: number;
public setSessionId(sessionId: string): void;
public makeRequest(method: string, endpoint: string, body?: any): Promise<RestResponse | null>;
public getPlayers(): Promise<RestResponse | null>;
public updatePlayer(options: RequestOptions): Promise<void>;
public destroyPlayer(guildId: string): Promise<RestResponse | null>;
public getTracks(identifier: string): Promise<void>;
public decodeTrack(track: string, node?: any): Promise<void>;
public decodeTracks(tracks: any[]): Promise<void>;
public getStats(): Promise<void>;
public getInfo(): Promise<void>;
public getRoutePlannerStatus(): Promise<void>;
public getRoutePlannerAddress(address: string): Promise<void>;
public parseResponse(req: any): Promise<RestResponse | null>;
/**
* Clears all REST-related caches and emits 'restCacheCleared'.
*/
public clearAllCaches(): void;
/**
* Destroys the REST client and cleans up resources
*/
public destroy(): void;
}
// Enhanced Queue interface with all new V0.3.0 methods
export interface Queue<T = Track> extends Array<T> {
/**
* Adds a single track to the queue
*/
add(track: T): void;
/**
* Adds multiple tracks to the queue
*/
addMultiple(tracks: T[]): void;
/**
* Adds a playlist to the queue
*/
addPlaylist(tracks: T[], playlistInfo?: any): void;
/**
* Shuffles the queue in place
*/
shuffle(): this;
/**
* Asynchronously shuffles the queue in chunks, emits 'queueShuffled' or 'queueError'.
*/
shuffleAsync(): Promise<this>;
/**
* Moves a track from one position to another
*/
move(from: number, to: number): this;
/**
* Removes a track at the specified index
*/
remove(index: number): T | null;
/**
* Gets a range of tracks from the queue
*/
getRange(start: number, end: number): T[];
/**
* Finds tracks matching the criteria
*/
findTrack(criteria: string | ((track: T) => boolean)): T[];
/**
* Removes tracks matching the criteria
*/
removeTracks(criteria: string | ((track: T) => boolean)): T[];
/**
* Gets tracks by source (youtube, soundcloud, etc.)
*/
getBySource(source: string): T[];
/**
* Gets tracks by artist name
*/
getByArtist(artist: string): T[];
/**
* Gets tracks by title
*/
getByTitle(title: string): T[];
/**
* Inserts a track at the specified index
*/
insert(index: number, track: T): void;
/**
* Swaps two tracks in the queue
*/
swap(index1: number, index2: number): this;
/**
* Gets a random track from the queue
*/
getRandom(): T | null;
/**
* Gets multiple random tracks from the queue
*/
getRandomMultiple(count: number): T[];
/**
* Gets queue statistics
*/
getStats(): {
totalTracks: number;
totalDuration: number;
uniqueArtists: number;
averageTrackLength: number;
longestTrack: T | null;
shortestTrack: T | null;
};
/**
* Converts queue to array
*/
toArray(): T[];
/**
* Clears the queue and emits 'queueCleared'.
*/
clear(): void;
}
// SponsorBlock types
export interface SponsorBlockSegment {
category: 'sponsor' | 'selfpromo' | 'interaction' | 'intro' | 'outro' | 'preview' | 'music_offtopic' | 'filler';
start: number;
end: number;
}
export interface ChapterInfo {
name: string;
start: number;
end: number;
duration: number;
}
// Lyrics types
export interface LyricsResult {
lyrics?: string;
syncedLyrics?: string;
error?: string;
metadata?: {
id: number;
trackName: string;
artistName: string;
albumName?: string;
duration?: number;
instrumental?: boolean;
};
}
// Enhanced Player interface with all V0.3.0 features
export interface PlayerOptions {
guildId: string;
textChannel?: string;
voiceChannel?: string;
deaf?: boolean;
mute?: boolean;
defaultVolume?: number;
loop?: LoopOption;
region?: string;
historyLimit?: number;
autoResume?: boolean;
sponsorBlock?: {
enabled?: boolean;
categories?: string[];
};
}
export type LoopOption = "none" | "track" | "queue";
export declare class Player extends EventEmitter {
constructor(eura: Euralink, node: Node, options: PlayerOptions);
public eura: Euralink;
public node: Node;
public options: PlayerOptions;
public guildId: string;
public textChannel: string;
public voiceChannel: string;
public connection: Connection;
public deaf: boolean;
public mute: boolean;
public volume: number;
public loop: string;
public filters: Filters;
public data: {};
public queue: Queue;
public position: number;
public current: Track | null;
public previousTracks: Track[];
public historyLimit: number;
public playing: boolean;
public paused: boolean;
public connected: boolean;
public timestamp: number;
public ping: number;
public isAutoplay: boolean;
public autoResumeState: {
enabled: boolean;
lastTrack: Track | null;
lastPosition: number;
lastVolume: number;
lastFilters: any;
lastUpdate: number;
};
public sponsorBlock: {
enabled: boolean;
categories: string[];
segments: SponsorBlockSegment[];
chapters: ChapterInfo[];
};
// Basic playback methods
public play(): Promise<Player>;
public restart(): Promise<Player>;
public autoplay(player: Player): Promise<Player>;
public stop(): Player;
public pause(toggle?: boolean): Player;
public seek(position: number): Player;
public setVolume(volume: number): Player;
public setLoop(mode: LoopOption): string;
// Connection methods
public connect(options?: {
guildId: string;
voiceChannel: string;
textChannel?: string;
deaf?: boolean;
mute?: boolean;
}): Promise<Player>;
public disconnect(): Promise<Player>;
public destroy(disconnect?: boolean): Promise<void>;
// Channel management
public setTextChannel(channel: string): Player;
public setVoiceChannel(channel: string, options?: {
mute?: boolean;
deaf?: boolean;
}): Player;
// Queue management methods
public shuffleQueue(): Promise<Player>;
public moveQueueItem(from: number, to: number): Player;
public removeQueueItem(index: number): Player;
// History and favorites
public get previous(): Track | null;
public getHistory(): Track[];
public getFavorites(): Track[];
public getUniqueArtistsAndSources(): { artists: Set<string>; sources: Set<string> };
// Lyrics methods (NEW in V0.3.0)
public getLyrics(queryOverride?: {
track_name?: string;
artist_name?: string;
album_name?: string;
}): Promise<LyricsResult>;
public getCurrentLyricLine(syncedLyrics: string, currentTimeMs?: number): string;
// SponsorBlock methods (NEW in V0.3.0)
public setSponsorBlockCategories(categories?: string[]): Promise<boolean>;
public getSponsorBlockCategories(): Promise<string[] | null>;
public clearSponsorBlockCategories(): Promise<boolean>;
public getSponsorBlockSegments(): SponsorBlockSegment[];
// Chapter methods (NEW in V0.3.0)
public getChapters(): ChapterInfo[];
public getCurrentChapter(position?: number): ChapterInfo | null;
// Auto-resume methods
public saveAutoResumeState(): void;
public clearAutoResumeState(): void;
// Data management
public set(key: string, value: any): Player;
public get(key: string): any;
public clearData(): Player;
public toJSON(): any;
public static fromJSON(eura: Euralink, node: Node, data: any): Player;
// Utility methods
public formatDuration(ms: number): string;
// Private methods
private handleEvent(payload: any): void;
private trackStart(player: Player, track: Track, payload: any): void;
private trackEnd(player: Player, track: Track, payload: any): void;
private trackError(player: Player, track: Track, payload: any): void;
private trackStuck(player: Player, track: Track, payload: any): void;
private socketClosed(player: Player, payload: any): void;
private send(data: any): void;
private addToPreviousTrack(track: Track): void;
private queueUpdate(updateData: any): void;
private processUpdateQueue(): Promise<void>;
private performUpdate(updateData: any): Promise<void>;
}
// Enhanced filter presets
export type FilterPreset =
| 'gaming' | 'gaming_hardcore'
| 'chill' | 'lofi' | 'ambient'
| 'party' | 'rave'
| 'karaoke_soft' | 'karaoke_strong' | 'vocal_boost'
| '80s' | '90s'
| 'clarity' | 'warmth'
| 'cinematic' | 'podcast';
export type FilterChain = {
type: string;
enabled?: boolean;
options?: any;
}[];
export type FilterOptions = {
volume?: number;
equalizer?: Array<{ band: number; gain: number }>;
karaoke?: {
level: number;
monoLevel: number;
filterBand: number;
filterWidth: number;
} | null;
timescale?: {
speed: number;
pitch: number;
rate: number;
} | null;
tremolo?: {
frequency: number;
depth: number;
} | null;
vibrato?: {
frequency: number;
depth: number;
} | null;
rotation?: {
rotationHz: number;
} | null;
distortion?: {
sinOffset: number;
sinScale: number;
cosOffset: number;
cosScale: number;
tanOffset: number;
tanScale: number;
offset: number;
scale: number;
} | null;
channelMix?: {
leftToLeft: number;
leftToRight: number;
rightToLeft: number;
rightToRight: number;
} | null;
lowPass?: {
smoothing: number;
} | null;
bassboost?: number | null;
slowmode?: number | null;
nightcore?: boolean | null;
vaporwave?: boolean | null;
_8d?: boolean | null;
};
/**
* Audio filter manager for a player.
* Emits: 'filtersCleared', 'filtersError', 'filtersUpdated'
*/
export declare class Filters {
constructor(player: Player, options?: FilterOptions);
public player: Player;
public volume: FilterOptions["volume"];
public equalizer: FilterOptions["equalizer"];
public karaoke: FilterOptions["karaoke"];
public timescale: FilterOptions["timescale"];
public tremolo: FilterOptions["tremolo"];
public vibrato: FilterOptions["vibrato"];
public rotation: FilterOptions["rotation"];
public distortion: FilterOptions["distortion"];
public channelMix: FilterOptions["channelMix"];
public lowPass: FilterOptions["lowPass"];
public bassboost: FilterOptions["bassboost"];
public slowmode: FilterOptions["slowmode"];
public nightcore: FilterOptions["nightcore"];
public vaporwave: FilterOptions["vaporwave"];
public _8d: FilterOptions["_8d"];
// Individual filter methods
public setEqualizer(band: Array<{ band: number; gain: number }>): this;
public setKaraoke(enabled: boolean, options?: {
level?: number;
monoLevel?: number;
filterBand?: number;
filterWidth?: number;
}): this;
public setTimescale(enabled: boolean, options?: {
speed?: number;
pitch?: number;
rate?: number;
}): this;
public setTremolo(enabled: boolean, options?: {
frequency?: number;
depth?: number;
}): this;
public setVibrato(enabled: boolean, options?: {
frequency?: number;
depth?: number;
}): this;
public setRotation(enabled: boolean, options?: {
rotationHz?: number;
}): this;
public setDistortion(enabled: boolean, options?: {
sinOffset?: number;
sinScale?: number;
cosOffset?: number;
cosScale?: number;
tanOffset?: number;
tanScale?: number;
offset?: number;
scale?: number;
}): this;
public setChannelMix(enabled: boolean, options?: {
leftToLeft?: number;
leftToRight?: number;
rightToLeft?: number;
rightToRight?: number;
}): this;
public setLowPass(enabled: boolean, options?: {
smoothing?: number;
}): this;
public setBassboost(enabled: boolean, options?: {
value?: number;
}): this;
public setSlowmode(enabled: boolean, options?: {
rate?: number;
}): this;
public setNightcore(enabled: boolean, options?: {
rate?: number;
}): this;
public setVaporwave(enabled: boolean, options?: {
pitch?: number;
}): this;
public set8D(enabled: boolean, options?: {
rotationHz?: number;
}): this;
// NEW V0.3.0: Advanced filter preset methods
public setPreset(presetName: FilterPreset, options?: any): Promise<this>;
public getAvailablePresets(): FilterPreset[];
public createChain(filters: FilterChain): Promise<this>;
// Core filter methods
public clearFilters(): Promise<this>;
public updateFilters(): Promise<this>;
public getPayload(): FilterOptions;
}
export type SearchPlatform = "ytsearch" | "ytmsearch" | "scsearch" | "spsearch" | "amsearch" | "dzsearch" | "ymsearch" | (string & {});
export type Version = "v3" | "v4";
export type LavalinkTrackLoadException = {
message: string | null,
severity: "common" | "suspicious" | "fault",
cause: string
};
export type nodeResponse = {
tracks: Array<Track>;
loadType: string | null;
playlistInfo: {
name: string;
selectedTrack: number;
} | null;
pluginInfo: object;
exception: LavalinkTrackLoadException | null;
};
// Enhanced Euralink options with V0.3.0 features
export interface EnhancedPerformanceOptions {
enabled?: boolean;
connectionPooling?: boolean;
requestBatching?: boolean;
memoryOptimization?: boolean;
}
export interface EuraSyncOptions {
enabled?: boolean;
template?: string;
}
export interface ActivityStatusOptions {
enabled?: boolean;
template?: string;
}
export interface ResumeOptions {
enabled?: boolean;
key?: string;
timeout?: number;
}
export interface NodeOptions {
dynamicSwitching?: boolean;
autoReconnect?: boolean;
ws?: {
reconnectTries?: number;
reconnectInterval?: number;
};
}
export interface RestConfigOptions {
version?: Version;
retryCount?: number;
timeout?: number;
}
export interface TrackOptions {
historyLimit?: number;
enableVoting?: boolean;
enableFavorites?: boolean;
enableUserNotes?: boolean;
}
export interface LazyLoadOptions {
enabled?: boolean;
timeout?: number;
}
export type EuralinkOptions = {
send: (payload: {
op: number;
d: {
guild_id: string;
channel_id: string | null;
self_deaf: boolean;
self_mute: boolean;
};
}) => void;
defaultSearchPlatform?: SearchPlatform;
// Legacy options (still supported)
restVersion?: Version;
retryCount?: number;
timeout?: number;
dynamicSwitching?: boolean;
autoReconnect?: boolean;
reconnectTries?: number;
reconnectInterval?: number;
autoResume?: boolean;
resumeKey?: string;
resumeTimeout?: number;
eurasync?: EuraSyncOptions;
setActivityStatus?: ActivityStatusOptions;
// NEW V0.3.0: Enhanced structured options
rest?: RestConfigOptions;
plugins?: Array<Plugin>;
euraSync?: EuraSyncOptions;
sync?: EuraSyncOptions; // Alias for euraSync
activityStatus?: ActivityStatusOptions;
resume?: ResumeOptions;
node?: NodeOptions;
enhancedPerformance?: EnhancedPerformanceOptions;
autopauseOnEmpty?: boolean;
lazyLoad?: LazyLoadOptions;
track?: TrackOptions;
debug?: boolean;
bypassChecks?: {
nodeFetchInfo?: boolean;
};
};
// Health monitoring types (NEW in V0.3.0)
export interface NodeHealthStatus {
connected: boolean;
uptime: number;
ping: number;
averagePing: number;
penalties: number;
players: number;
playingPlayers: number;
cpuLoad: number;
memoryUsage: number;
}
export interface SystemHealthReport {
timestamp: number;
overall: 'healthy' | 'degraded' | 'critical';
nodes: Record<string, NodeHealthStatus>;
players: Record<string, string>;
performance: {
activePlayerCount: number;
playingPlayerCount: number;
memoryUsage: NodeJS.MemoryUsage;
cacheSize: number;
};
}
// Enhanced events with V0.3.0 additions
export interface EuralinkEvents {
// Core events
nodeConnect: (node: Node) => void;
nodeReconnect: (node: Node) => void;
nodeDisconnect: (node: Node, reason: string) => void;
nodeCreate: (node: Node) => void;
nodeDestroy: (node: Node) => void;
nodeError: (node: Node, error: Error) => void;
socketClosed: (player: Player, payload: any) => void;
trackStart: (player: Player, track: Track, payload: any) => void;
trackEnd: (player: Player, track: Track, payload: any) => void;
trackError: (player: Player, track: Track, payload: any) => void;
trackStuck: (player: Player, track: Track, payload: any) => void;
playerCreate: (player: Player) => void;
playerDestroy: (player: Player) => void;
playerDisconnect: (player: Player) => void;
playerMove: (player: Player, oldChannel: string, newChannel: string) => void;
playerUpdate: (player: Player, payload: any) => void;
queueEnd: (player: Player, track: Track, payload: any) => void;
debug: (...args: any[]) => void;
// Queue events
queueShuffle: (player: Player) => void;
queueMove: (player: Player, from: number, to: number) => void;
queueRemove: (player: Player, removed: Track, index: number) => void;
queueCleared: (player: Player) => void;
queueShuffled: (player: Player) => void;
queueError: (player: Player, error: Error) => void;
// Filter events
filtersCleared: (player: Player) => void;
filtersError: (player: Player, error: Error) => void;
filtersUpdated: (player: Player) => void;
// REST events
restCacheCleared: () => void;
restError: (error: Error) => void;
// Connection events
connectionError: (connection: Connection, error: Error) => void;
// Plugin events
pluginLoaded: (plugin: Plugin) => void;
pluginUnloaded: (plugin: Plugin) => void;
// NEW V0.3.0: SponsorBlock events
sponsorBlockSegmentsLoaded: (player: Player, segments: SponsorBlockSegment[]) => void;
sponsorBlockSegmentSkipped: (player: Player, segment: SponsorBlockSegment) => void;
// NEW V0.3.0: Chapter events
chaptersLoaded: (player: Player, chapters: ChapterInfo[]) => void;
chapterStarted: (player: Player, chapter: ChapterInfo) => void;
// NEW V0.3.0: Enhanced error recovery events
playerMigrated: (player: Player, oldNode: Node, newNode: Node) => void;
playerMigrationFailed: (player: Player, error: Error) => void;
errorRecovered: (context: string, error: Error) => void;
errorRecoveryFailed: (context: string, originalError: Error, recoveryError: Error) => void;
// NEW V0.3.0: Health monitoring events
healthCheck: (report: SystemHealthReport) => void;
// Cleanup event
destroy: () => void;
}
export declare class Plugin {
/**
* @param name The plugin name (required)
* @throws Error if name is not provided
*/
constructor(name: string);
public name: string;
/**
* Called when the plugin is loaded. Emits 'pluginLoaded' if Euralink is provided.
*/
load(eura: Euralink): void;
/**
* Called when the plugin is unloaded. Emits 'pluginUnloaded' if Euralink is provided.
*/
unload(eura: Euralink): void;
}
// Enhanced Euralink class with V0.3.0 features
export declare class Euralink extends EventEmitter {
public on<K extends keyof EuralinkEvents>(event: K, listener: EuralinkEvents[K]): this;
public once<K extends keyof EuralinkEvents>(event: K, listener: EuralinkEvents[K]): this;
public off<K extends keyof EuralinkEvents>(event: K, listener: EuralinkEvents[K]): this;
public removeAllListeners<K extends keyof EuralinkEvents>(event?: K): this;
public emit<K extends keyof EuralinkEvents>(event: K, ...args: Parameters<EuralinkEvents[K]>): boolean;
constructor(client: any, nodes: LavalinkNode[], options: EuralinkOptions);
public client: any;
public nodes: Array<LavalinkNode>;
public nodeMap: Map<string, Node>;
public players: Map<string, Player>;
public options: EuralinkOptions;
public clientId: string | null;
public initiated: boolean;
public send: EuralinkOptions["send"];
public defaultSearchPlatform: string;
public restVersion: string;
public tracks: Track[];
public loadType: string | null;
public playlistInfo: any;
public pluginInfo: any;
public plugins: Plugin[];
public version: string;
// Performance optimization properties
public regionCache: Map<string, any>;
public nodeHealthCache: Map<string, any>;
public cacheTimeout: number;
public lazyLoad: boolean;
public lazyLoadTimeout: number;
public enhancedPerformance: EnhancedPerformanceOptions;
public euraSync: any;
public setActivityStatus: any;
// Core methods
public init(clientId: string): this;
public validateConfig(): boolean;
public clearAllCaches(): void;
// Node management
public readonly leastUsedNodes: Array<Node>;
public createNode(options: any): Node;
public destroyNode(identifier: string): void;
public getNodeHealth(node: Node): NodeHealthStatus;
public calculateNodeScore(health: NodeHealthStatus): number;
public fetchRegion(region: string): Node[];
public getBestNodeForRegion(region: string): Node | undefined;
// Player management
public createConnection(options: {
guildId: string;
voiceChannel: string;
textChannel: string;
deaf?: boolean;
mute?: boolean;
defaultVolume?: number;
loop?: LoopOption;
region?: string;
}): Player;
public createPlayer(node: Node, options: PlayerOptions): Player;
public destroyPlayer(guildId: string): void;
public removeConnection(guildId: string): void;
public get(guildId: string): Player | undefined;
// Voice state management
public updateVoiceState(packet: any): void;
// Track resolution
public resolve(params: {
query: string;
source?: string;
requester: any;
node?: string | Node;
}): Promise<nodeResponse>;
public search(query: string, requester: any, source?: string): Promise<nodeResponse>;
// NEW V0.3.0: Health monitoring
public getNodesHealth(): Record<string, NodeHealthStatus>;
public getSystemHealth(): SystemHealthReport;
public performHealthCheck(): Promise<SystemHealthReport>;
// NEW V0.3.0: Enhanced error recovery
public recoverFromError(error: Error, context?: string): Promise<boolean>;
public migratePlayer(player: Player): Promise<boolean>;
// NEW V0.3.0: AutoResume system
public savePlayersState(filePath: string): Promise<any>;
public loadPlayersState(filePath: string): Promise<number>;
// Cache management
public clearCaches(): void;
// Version checking
public checkForUpdates(): Promise<void>;
public isNewerVersion(version1: string, version2: string): boolean;
// Cleanup
public destroy(): void;
}
export type LavalinkNode = {
name?: string;
host: string;
port: number;
password: string;
secure?: boolean;
regions?: string[];
restVersion?: Version;
sessionId?: string;
resumeKey?: string;
resumeTimeout?: number;
autoResume?: boolean;
reconnectTimeout?: number;
reconnectTries?: number;
};
type NodeInfo = {
version: NodeInfoSemanticVersionObj;
buildTime: number;
git: {
branch: string;
commit: string;
commitTime: string;
};
jvm: string;
lavaplayer: string;
sourceManagers: string[];
filters: string[];
plugins: Array<{
name: string;
version: string;
}>;
};
type NodeInfoSemanticVersionObj = {
semver: string;
major: number;
minor: number;
patch: number;
};
type LyricPluginWithoutLavaLyrics = "java-lyrics-plugin" | "lyrics";
export type LyricPluginWithoutLavaLyricsResult = {
type: "timed" | "text" | (string & {}),
track: {
title: string;
author: string;
album: string | null;
albumArt: {
url: string;
height: number;
width: number;
}[] | null;
};
source: string;
} | {
type: "text";
text: string;
} | {
type: "timed";
lines: {
line: string;
range: {
start: number;
end: number;
};
}[];
};
export interface NodeLyricsResult {
sourceName: string;
provider: string;
text: Nullable<string>;
lines: Array<NodeLyricsLine>;
plugin: object;
}
interface NodeLyricsLine {
timestamp: number;
duration: number;
line: string;
plugin: object;
}
// Enhanced Node class with V0.3.0 features
export declare class Node extends EventEmitter {
constructor(eura: Euralink, node: LavalinkNode, options: any);
public eura: Euralink;
public name: string;
public host: string;
public port: number;
public password: string;
public secure: boolean;
public restVersion: string;
public sessionId: string | null;
public rest: Rest;
public wsUrl: string;
public restUrl: string;
public ws: any;
public resumeKey: string | null;
public regions: string[] | null;
public resumeTimeout: number;
public autoResume: boolean;
public reconnectTimeout: number;
public reconnectTries: number;
public reconnectAttempt: any;
public reconnectAttempted: number;
public connected: boolean;
public info: NodeInfo | null;
public stats: {
players: number;
playingPlayers: number;
uptime: number;
memory: {
free: number;
used: number;
allocated: number;
reservable: number;
};
cpu: {
cores: number;
systemLoad: number;
lavalinkLoad: number;
};
frameStats: {
sent: number;
nulled: number;
deficit: number;
};
};
public lastStats: number;
public connectionStartTime: number | null;
public lastPing: number;
public pingHistory: number[];
public maxPingHistory: number;
public autoResumePlayers: Map<string, any>;
// Core methods
public constructWsUrl(): string;
public constructRestUrl(): string;
public fetchInfo(options?: { restVersion?: string, includeHeaders?: boolean }): Promise<NodeInfo | null>;
public clearState(): void;
public connect(): Promise<void>;
public open(): Promise<void>;
public error(event: any): void;
public message(msg: any): Promise<void>;
public close(event: any, reason: string): void;
public reconnect(): void;
public disconnect(): void;
public destroy(clean?: boolean): void;
public performAutoResume(): Promise<void>;
// Health monitoring
public readonly penalties: number;
public getHealthStatus(): NodeHealthStatus;
// Lyrics support
public lyrics: {
checkAvailable: (eitherOne?: boolean, ...plugins: string[]) => Promise<boolean>;
get: (trackOrEncodedTrackStr: Track | string, skipTrackSource?: boolean) => Promise<NodeLyricsResult | null>;
getCurrentTrack: <TPlugin extends LyricPluginWithoutLavaLyrics | (string & {})>(guildId: string, skipTrackSource?: boolean, plugin?: TPlugin) => Promise<TPlugin extends LyricPluginWithoutLavaLyrics ? LyricPluginWithoutLavaLyricsResult : NodeLyricsResult | null>;
};
}
export type Voice = {
sessionId: string;
event: null;
endpoint: string;
};
/**
* Manages the voice connection for a player.
* Emits: 'connectionError'
*/
export declare class Connection {
constructor(player: Player);
public player: Player;
public sessionId: string;
public voice: Voice;
public region: string;
public self_deaf: boolean;
public self_mute: boolean;
public voiceChannel: string;
public connectionState: 'disconnected' | 'connecting' | 'connected';
public setServerUpdate(data: { endpoint: string; token: string }): void;
public setStateUpdate(data: {
session_id: string;
channel_id: string;
self_deaf: boolean;
self_mute: boolean;
}): void;
public clearState(): void;
private updatePlayerVoiceData(): void;
}
// EuraSync class for voice channel status updates
export declare class EuraSync {
constructor(client: any, config: EuraSyncOptions);
public client: any;
public config: EuraSyncOptions;
public setVoiceStatus(voiceChannel: string, trackInfo: any, status: string): Promise<void>;
public clearVoiceStatus(voiceChannel: string, reason: string): Promise<void>;
}
// Export all classes and types
export {
Euralink,
Node,
Player,
Track,
Queue,
Filters,
Connection,
Rest,
Plugin,
EuraSync
};
// Export all types
export type {
EuralinkOptions,
EuralinkEvents,
PlayerOptions,
FilterOptions,
FilterPreset,
FilterChain,
LavalinkNode,
SponsorBlockSegment,
ChapterInfo,
LyricsResult,
NodeHealthStatus,
SystemHealthReport,
SearchPlatform,
Version,
LoopOption,
nodeResponse
};