import { EventEmitter } from 'events'; import { AuthData, AuthToken, CustomizationElements, FolderContent, OngoingConvert, PublicConfig, QueuedVideoInfo, SanitizedMessage, SanitizedPlayerChannel, SanitizedPoll, SanitizedRoom, SanitizedSession, SanitizedUser, VideoInfo, VideoStreamInfo } from '../server/index.js'; export type SkyChatOptions = { autoMessageAck?: boolean; }; export type SkyChatClientState = { websocketReadyState: number; user: SanitizedUser; config: PublicConfig | null; stickers: Record; custom: CustomizationElements; token: AuthToken | null; connectedList: Array; messageIdToLastSeenUsers: { [id: number]: Array; }; roomConnectedUsers: { [roomId: number]: Array; }; playerChannelUsers: { [roomId: number]: Array; }; rooms: SanitizedRoom[]; currentRoomId: number | null; currentRoom: SanitizedRoom | null; lastMention: { roomId: number; identifier: string; messageId: number; } | null; typingList: SanitizedUser[]; polls: { [id: number]: SanitizedPoll; }; cursors: { [identifier: string]: { date: Date; cursor: { x: number; y: number; user: SanitizedUser; }; }; }; roll: { state: boolean; }; op: boolean; files: string[]; file: { filePath: string; content: string; } | null; gallery: FolderContent | null; videoStreamInfo: VideoStreamInfo | null; ongoingConverts: OngoingConvert[]; playerChannels: SanitizedPlayerChannel[]; currentPlayerChannelId: number | null; currentPlayerChannel: SanitizedPlayerChannel | null; playerApiSearchResult: { type: string; items: Array; } | null; player: { current: QueuedVideoInfo | null; queue: QueuedVideoInfo[]; cursor: number; }; playerLastUpdate: Date | null; }; export declare interface SkyChatClient { on(event: 'connection-accepted', listener: () => unknown): this; on(event: 'config', listener: (config: PublicConfig) => any): this; on(event: 'sticker-list', listener: (stickers: Record) => any): this; on(event: 'custom', listener: (custom: CustomizationElements) => any): this; on(event: 'set-user', listener: (user: SanitizedUser) => any): this; on(event: 'auth-token', listener: (token: AuthToken | null) => any): this; on(event: 'connected-list', listener: (sessions: Array) => any): this; on(event: 'connected-list-patch', listener: (sessions: Array) => any): this; on(event: 'room-list', listener: (rooms: Array) => any): this; on(event: 'join-room', listener: (roomId: number) => any): this; on(event: 'typing-list', listener: (users: Array) => any): this; on(event: 'message', listener: (message: SanitizedMessage) => any): this; on(event: 'messages', listener: (messages: Array) => any): this; on(event: 'message-edit', listener: (message: SanitizedMessage) => any): this; on(event: 'message-seen', listener: (data: { user: number; data: any; }) => any): this; on(event: 'mention', listener: (mention: { roomId: number; identifier: string; messageId: number; }) => any): this; on(event: 'poll', listener: (poll: SanitizedPoll) => any): this; on(event: 'cursor', listener: (cursor: { x: number; y: number; user: SanitizedUser; }) => any): this; on(event: 'roll', listener: (roll: { state: boolean; }) => any): this; on(event: 'error', listener: (message: string) => any): this; on(event: 'info', listener: (message: string) => any): this; on(event: 'set-op', listener: (op: boolean) => any): this; on(event: 'gallery', listener: (data: FolderContent) => any): this; on(event: 'convert-info', listener: (data: VideoStreamInfo) => any): this; on(event: 'convert-list', listener: (data: Array) => any): this; on(event: 'player-channels', listener: (playerChannels: Array) => any): this; on(event: 'player-channel', listener: (channelId: number | null) => any): this; on(event: 'player-search', listener: (data: { type: string; items: Array; }) => any): this; on(event: 'player-sync', listener: (data: { current: QueuedVideoInfo | null; queue: QueuedVideoInfo[]; cursor: number; }) => any): this; on(event: 'update', listener: (state: SkyChatClientState) => any): this; } export declare class SkyChatClient extends EventEmitter { readonly url: string; static readonly CURSOR_DECAY_DELAY: number; static readonly LOCAL_STORAGE_TOKEN_KEY = "skychat-token"; static readonly LOCAL_STORAGE_ROOM_ID = "skychat-room-id"; private _websocket; private _user; private _config; private _stickers; private _custom; private _token; private _connectedList; private _messageIdToLastSeenUsers; private _roomConnectedUsers; private _playerChannelUsers; private _rooms; private _currentRoomId; private _lastMention; private _typingList; private _polls; private _cursors; private _roll; private _op; private _files; private _file; private _gallery; private _videoStreamInfo; private _ongoingConverts; private _playerChannels; private _currentPlayerChannelId; private _currentPlayerChannel; private _playerApiSearchResult; private _player; private _playerLastUpdate; private autoMessageAck; constructor(url: string, options?: SkyChatOptions); private _onConfig; private _onStickerList; private _onCustom; private _onUser; private _onToken; private _onConnectedList; private _onConnectedListPatch; /** * Update link from message ids to users whose last seen message is this message */ private _generateMessageIdToLastSeenUsers; /** * Update list of connected users / rooms and player channels */ private _generateRoomConnectedUsersAndPlayerChannelUsers; private _updateConnectedListMeta; private _onMessage; private _onRoomList; private _onCurrentRoomId; private _onTypingList; private _onMessageSeen; private _onMention; private _onPoll; private _onCursor; private _onRoll; private _onSetOP; private _onGallery; private _onConvertInfo; private _onConvertList; private _onPlayerChannels; private _onPlayerChannel; private _onPlayerApiSearchResults; private _onPlayerSync; private _onInfo; private _onError; /** * Get the client current state. Sums up all that is relevant for the client. * Messages are not accumulated here. It is up to the client to decide what to do with them. */ get state(): SkyChatClientState; /** * Connect to the server */ connect(): void; /** * Set whether the client should be considered focused or not */ setAutoMessageAck(autoMessageAck: boolean): void; /** * Send a last message seen notification * @param messageId */ notifySeenMessage(messageId: number): void; /** * Send a message to the server * @param message */ sendMessage(message: string): void; /** * Whether the user has access to a given room */ hasAccessToRoom(roomId: number): boolean; /** * Whether the user has unread messages in a given room (or any, if not specified) */ hasUnreadMessages(roomId?: number): boolean; /** * Send anything (blob, binary) */ _sendRaw(data: any): void; /** * Send an audio file * @param blob */ sendAudio(blob: Blob): void; /** * Send current cursor position * @param x * @param y */ sendCursorPosition(x: number, y: number): void; /** * Join a specific room */ join(roomId: number): void; /** * Login */ login(username: string, password: string): Promise; logout(): void; register(username: string, password: string): Promise; authAsGuest(): Promise; authenticate(authData: AuthData): Promise; /** * Emit an event to the server */ private _sendEvent; /** * Get preferred room ID from local storage */ private getPreferredRoomId; /** * When the connection is made with the websocket server */ private _onWebSocketConnect; /** * When a message is received on the websocket * @param message */ private _onWebSocketMessage; /** * */ private _onWebSocketClose; }