| import { |
| MediaElement, |
| PlayerState, |
| Playlist, |
| RoomState, |
| UserState, |
| ChatMessage, |
| } from "./types" |
| import io, { Socket } from "socket.io-client" |
|
|
| |
| export interface ServerToClientEvents { |
| |
| playlistUpdate: (playlist: Playlist) => void |
| userUpdates: (users: UserState[]) => void |
|
|
| |
| update: (room: RoomState) => void |
|
|
| |
| chatNew: (msg: ChatMessage) => void |
| chatHistory: (msgs: ChatMessage[]) => void |
| } |
|
|
| |
| export interface ClientToServerEvents { |
| |
| playItemFromPlaylist: (index: number) => void |
| updatePlaylist: (playlist: Playlist) => void |
| updatePlayer: (player: PlayerState) => void |
| updatePlaying: (playing: MediaElement) => void |
| updateUser: (user: UserState) => void |
|
|
| |
| setPaused: (paused: boolean) => void |
| setLoop: (loop: boolean) => void |
| setProgress: (progress: number) => void |
| setPlaybackRate: (playbackRate: number) => void |
| seek: (progress: number) => void |
|
|
| |
| playUrl: (src: string) => void |
| addToPlaylist: (url: string) => void |
| playAgain: () => void |
| playEnded: () => void |
| fetch: () => void |
| error: () => void |
|
|
| |
| chatMessage: (text: string) => void |
| } |
|
|
| export type TypedSocket = Socket<ServerToClientEvents, ClientToServerEvents> |
|
|
| export function playItemFromPlaylist( |
| socket: TypedSocket, |
| playlist: Playlist, |
| index: number |
| ) { |
| if (!playlist || !Array.isArray(playlist.items) || !playlist.items[index]) { |
| console.error("Impossible to play", index, "from", playlist) |
| return |
| } |
| socket.emit("playItemFromPlaylist", index) |
| } |
|
|
| export function createClientSocket(roomId: string): TypedSocket { |
| console.log("Trying to join room", roomId) |
| const socket: TypedSocket = io({ |
| query: { roomId }, |
| transports: ["websocket"], |
| path: "/api/socketio", |
| }) |
|
|
| socket.on("connect", () => { |
| console.log("Established ws connection to io server", socket.id) |
| }) |
|
|
| socket.on("disconnect", (reason) => { |
| if (!["io client disconnect", "io server disconnect"].includes(reason)) { |
| console.error( |
| "Socket connection closed due to:", |
| reason, |
| "socket:", |
| socket |
| ) |
| } |
| }) |
|
|
| return socket |
| } |
|
|
| |
| export function playNow(socket: TypedSocket, url: string) { |
| socket.emit("playUrl", url) |
| } |
|
|
| export function queueUrl(socket: TypedSocket, url: string) { |
| socket.emit("addToPlaylist", url) |
| } |