Fase M2 (oppgave 22.2): Portvokteren sender nå full raddata i WebSocket-events (ikke bare ID), slik at frontend kan oppdatere stores direkte uten ekstra API-kall. Endringer: - ws.rs: Berik node/edge/access-events med full PG-data etter NOTIFY - ws.rs: Ny mixer_channel_changed event-type + initial_sync inkluderer mixer - ws.rs: Resync ved lag (broadcast overflow) - mixer.rs: Nye HTTP-endepunkter som erstatter STDB-reducers (create_mixer_channel, set_gain, set_mute, toggle_effect, set_mixer_role) - 019_mixer_channels.sql: PG-tabell + NOTIFY-trigger for mixer-tilstand
56 lines
1.8 KiB
PL/PgSQL
56 lines
1.8 KiB
PL/PgSQL
-- 019_mixer_channels.sql
|
|
-- Mixer-kanaler for delt lydmixer-tilstand mellom deltakere i LiveKit-rom.
|
|
--
|
|
-- Migrert fra SpacetimeDB til PostgreSQL som del av Fase M2 (oppgave 22.2).
|
|
-- Portvokteren sender endringer via WebSocket til tilkoblede klienter.
|
|
|
|
BEGIN;
|
|
|
|
-- =============================================================================
|
|
-- mixer_channels: Delt mixer-tilstand per deltaker per rom.
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS mixer_channels (
|
|
room_id TEXT NOT NULL,
|
|
target_user_id TEXT NOT NULL,
|
|
gain DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
is_muted BOOLEAN NOT NULL DEFAULT false,
|
|
active_effects TEXT NOT NULL DEFAULT '{}', -- JSON-streng med effekttilstand
|
|
role TEXT NOT NULL DEFAULT 'editor',
|
|
updated_by TEXT NOT NULL DEFAULT '',
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (room_id, target_user_id)
|
|
);
|
|
|
|
-- =============================================================================
|
|
-- notify_mixer_channel_change: NOTIFY ved endringer i mixer_channels.
|
|
-- =============================================================================
|
|
|
|
CREATE OR REPLACE FUNCTION notify_mixer_channel_change()
|
|
RETURNS trigger AS $$
|
|
DECLARE
|
|
payload json;
|
|
target_row mixer_channels%ROWTYPE;
|
|
BEGIN
|
|
IF TG_OP = 'DELETE' THEN
|
|
target_row := OLD;
|
|
ELSE
|
|
target_row := NEW;
|
|
END IF;
|
|
|
|
payload := json_build_object(
|
|
'op', TG_OP,
|
|
'room_id', target_row.room_id,
|
|
'target_user_id', target_row.target_user_id
|
|
);
|
|
|
|
PERFORM pg_notify('mixer_channel_changed', payload::text);
|
|
RETURN target_row;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER mixer_channels_notify
|
|
AFTER INSERT OR UPDATE OR DELETE ON mixer_channels
|
|
FOR EACH ROW EXECUTE FUNCTION notify_mixer_channel_change();
|
|
|
|
COMMIT;
|