Bestanden, presence en broadcast
Bestanden
Section titled “Bestanden”const file = await db.$files.upload(blob, { path: "avatars/me.png" });const bytes = await db.$files.download("avatars/me.png");const all = await db.$files.list({ prefix: "avatars/" });await db.$files.delete("avatars/me.png");De bytes van bestanden staan in de FILES R2-bucket, met een limiet van 25 MB en leesrechten voor members, schrijfrechten voor editors. De index wordt via het transactielog geschreven, dus een restore behoudt hem.
Presence
Section titled “Presence”Presence is efemeer en rijdt mee op de workspace-socket:
const room = db.$presence("board:" + boardId);room.set({ name, color });room.cursor({ x, y });const stop = room.subscribe((peers) => render(peers));
// Bij het verlaten van de room:room.leave();Een presence-room heeft ook drag() en clearDrag() voor drag-state.
Broadcast
Section titled “Broadcast”Broadcast is een fire-and-forget-bericht tussen de clients van een workspace, op dezelfde socket:
const board = db.$broadcast<{ kind: "ping"; at: number }>("board:" + boardId);const stop = board.subscribe((message, from) => flash(from.userId, message));board.send({ kind: "ping", at: Date.now() }); // false (vervallen) terwijl je offline bentEen geweigerde topic-subscription meldt zich via de optionele onError-callback van subscribe. Een bericht bereikt elke andere client die op het topic luistert, met het client-id en user-id van de afzender; je eigen berichten worden niet teruggekaatst. Niets wordt opgeslagen of opnieuw afgespeeld, en een send terwijl de socket down is, vervalt in plaats van later te worden bezorgd. Luisterende clients voegen zich na een reconnect weer bij hun topics.
Standaard mag elk lid van de workspace luisteren en sturen. Bepaal dit per topic op de Worker:
import { defineTapeDB, WORKSPACE_ROLE_LEVELS } from "tapedb/worker";import schema from "./tapedb.schema";
defineTapeDB({ schema, topics: { authorize: ({ auth, topic, action }) => !topic.startsWith("admin:") || auth.role >= WORKSPACE_ROLE_LEVELS.ADMIN, },});React-bindings: usePresence en useBroadcast in React.