|
|
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) |
|
|
} |