@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
JavaScript
// 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
};