UNPKG

callskit

Version:

A toolkit for building call experience using Cloudflare Realtime

199 lines (196 loc) 6.11 kB
var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/server/helpers.ts function createEvent(event) { return JSON.stringify(event); } function parseAction(action) { return JSON.parse(action); } // src/server/index.ts import { routePartyTracksRequest } from "partytracks/server"; var PartyKitServer = class { constructor(room) { this.room = room; this.connectionIds = []; this.users = /* @__PURE__ */ new Map(); this.chat = []; } onStart() { return __async(this, null, function* () { var _a, _b; this.started_at = /* @__PURE__ */ new Date(); const storedUsers = (_a = yield this.room.storage.get("users")) != null ? _a : []; this.users = new Map(storedUsers.map((user) => [user.connectionId, user])); this.chat = (_b = yield this.room.storage.get("chat")) != null ? _b : []; }); } onConnect(conn, ctx) { console.log( `Connected: id: ${conn.id} room: ${this.room.id} url: ${new URL(ctx.request.url).pathname}` ); this.connectionIds.push(conn.id); conn.send(createEvent({ event: "connected" })); } onClose(connection) { return __async(this, null, function* () { const user = this.users.get(connection.id); if (user) { this.users.delete(connection.id); this.connectionIds = this.connectionIds.filter( (id) => id !== connection.id ); this.room.broadcast( createEvent({ event: "participant/left", participantId: user.id }), [connection.id] ); } if (this.users.size === 0) { yield this.room.storage.deleteAll(); } }); } onMessage(message, sender) { const payload = parseAction(message); const user = this.users.get(sender.id); console.log(`received message from ${sender.id}: ${payload}`); switch (payload.action) { case "join": { const user2 = __spreadProps(__spreadValues({}, payload.self), { connectionId: sender.id }); const without = [...this.users.keys(), ...this.connectionIds]; this.room.broadcast( createEvent({ event: "room/init", participants: [...this.users.values()], started_at: this.started_at.toISOString(), chatMessages: this.chat }), without.filter((id) => id !== sender.id) ); this.connectionIds = this.connectionIds.filter( (id) => id !== sender.id ); this.users.set(sender.id, user2); this.room.broadcast( createEvent({ event: "participant/joined", participant: payload.self }), [sender.id] ); break; } case "leave": { if (user) { this.users.delete(sender.id); this.room.broadcast( createEvent({ event: "participant/left", participantId: user.id }), [sender.id] ); } break; } case "self/mic-update": { if (user) { Object.assign(user, payload.updates); this.room.broadcast( createEvent({ event: "participant/mic-update", data: __spreadProps(__spreadValues({}, payload.updates), { participantId: user.id }) }), [sender.id] ); } break; } case "self/camera-update": { if (user) { Object.assign(user, payload.updates); this.room.broadcast( createEvent({ event: "participant/camera-update", data: __spreadProps(__spreadValues({}, payload.updates), { participantId: user.id }) }), [sender.id] ); } break; } case "self/screenshare-update": { if (user) { Object.assign(user, payload.updates); this.room.broadcast( createEvent({ event: "participant/screenshare-update", data: __spreadProps(__spreadValues({}, payload.updates), { participantId: user.id }) }), [sender.id] ); } break; } case "chat/message": { if (user) { const message2 = __spreadProps(__spreadValues({}, payload.message), { id: crypto.randomUUID(), display_name: user.name, user_id: user.id, created_at: /* @__PURE__ */ new Date() }); this.chat.push(message2); this.room.broadcast( createEvent({ event: "chat/new-message", message: message2 }) ); } break; } } } }; export { PartyKitServer, routePartyTracksRequest as routeApiRequest };