callskit
Version:
A toolkit for building call experience using Cloudflare Realtime
197 lines (194 loc) • 5.95 kB
JavaScript
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.waiting_user_ids = /* @__PURE__ */ new Set();
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.waiting_user_ids.add(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.waiting_user_ids.delete(connection.id);
this.broadcastToUsers(
{ 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 });
this.waiting_user_ids.delete(sender.id);
sender.send(
createEvent({
event: "room/init",
participants: [...this.users.values()],
started_at: this.started_at.toISOString(),
chatMessages: this.chat
})
);
this.users.set(sender.id, user2);
this.broadcastToUsers(
{
event: "participant/joined",
participant: payload.self
},
[sender.id]
);
break;
}
case "leave": {
if (user) {
this.users.delete(sender.id);
this.broadcastToUsers(
{
event: "participant/left",
participantId: user.id
},
[sender.id]
);
}
break;
}
case "self/mic-update": {
if (user) {
Object.assign(user, payload.updates);
this.broadcastToUsers(
{
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.broadcastToUsers(
{
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.broadcastToUsers(
{
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.broadcastToUsers({ event: "chat/new-message", message: message2 });
}
break;
}
}
}
broadcastToUsers(event, without = []) {
this.room.broadcast(JSON.stringify(event), [
...this.waiting_user_ids,
...without
]);
}
};
export {
PartyKitServer,
routePartyTracksRequest as routeApiRequest
};