UNPKG

@y-presence/client

Version:

Easy way to add presence (live cursors/avatars) to your multiplayer application using Yjs

65 lines (64 loc) 1.62 kB
// src/room.ts var a = class { constructor(e, s) { this.listeners = { others: [], users: [], self: [] }; this.awareness = e, this.setPresence(s), this.awareness.on("change", (r, n) => { let i = this.getUsers(); if (this.listeners.users.forEach((t) => { t(i); }), n === "local") { let t = this.getSelf(); this.listeners.self.forEach((c) => { c(t); }); return; } let l = this.getOthers(); this.listeners.others.forEach((t) => { t(l); }); }); } updatePresence(e) { for (let s in e) this.awareness.setLocalStateField(s, e[s]); } setPresence(e) { this.awareness.setLocalState(e); } getSelf() { return { id: this.awareness.clientID, presence: this.awareness.getLocalState() }; } getOthers() { let e = []; return this.awareness.getStates().forEach((s, r) => { r !== this.awareness.clientID && e.push({ id: r, presence: s }); }), e; } getUsers() { let e = []; return this.awareness.getStates().forEach((s, r) => { e.push({ id: r, presence: s }); }), e; } subscribe(e, s) { return e === "users" || e === "others" ? (this.listeners[e].push(s), () => this.unsubscribe(e, s)) : (this.listeners[e].push(s), () => this.unsubscribe(e, s)); } unsubscribe(e, s) { for (let r = 0; r < this.listeners[e].length; r++) s === this.listeners[e][r] && this.listeners[e].splice(r, 1); } destroy() { this.awareness.setLocalState(null), this.awareness.destroy(); } }; export { a as Room };