Sockets – Echtzeit-Kommunikation
Der Collab Server bietet umfangreiche Echtzeit-Features über Sockets.
Verbindung
import { io } from 'socket.io-client';
const socket = io('http://localhost:4000', {
query: {
room: 'artwork:item-001',
artworkId: 'item-001'
}
});Room-Struktur
| Room | Zweck | Clients |
|---|---|---|
studio |
Studio UI | Art.Works! Studio |
artwork:{id} |
Artwork-Instanz | Artwork im Browser |
logs |
Zentrales Logging | Alle Clients |
Room beitreten
socket.emit('join-room', { room: 'artwork:item-001' });Kommunikations-Modi
1. Artwork ↔ Artwork
Direkte Kommunikation zwischen Artworks:
// Senden
socket.emit('artwork:message', {
type: 'custom-event',
payload: { x: 100, y: 200 },
targetRoom: 'artwork:item-002'
});
// Empfangen
socket.on('artwork:message', (data) => {
console.log(data.payload);
});2. Studio ↔ Artwork
Debugging und Parameter-Kontrolle:
// Studio fordert Parameter an
socket.emit('request-parameter-dump', {
targetRoom: 'artwork:item-001'
});
// Artwork sendet Parameter
socket.on('request-parameter-dump', () => {
socket.emit('parameter-dump', {
type: 'parameter-dump',
payload: tweakpane.exportState(),
artworkId: 'item-001'
});
});3. Multi-Screen Entity Transfer
Entities zwischen Screens übertragen:
// Entity verlässt Screen rechts
socket.emit('entity:transfer', {
entity: entityData,
direction: 'right',
sourceScreen: 'screen-1'
});
// Nachbar-Screen empfängt Entity
socket.on('entity:receive', (data) => {
spawnEntity(data.entity, 'left');
});4. Input Broadcast
Gemeinsame Inputs für alle Artworks:
// Maus-Position broadcasten
socket.emit('input:broadcast', {
type: 'mouse',
x: mouseX,
y: mouseY
});
// Alle Artworks empfangen
socket.on('input:broadcast', (data) => {
sharedMouse.x = data.x;
sharedMouse.y = data.y;
});Event-Typen
Control Events
| Event | Richtung | Beschreibung |
|---|---|---|
studio:command |
Studio → Artwork | Befehle (pause, play, reset) |
request-parameter-dump |
Studio → Artwork | Parameter anfordern |
parameter-dump |
Artwork → Studio | Parameter senden |
Data Events
| Event | Richtung | Beschreibung |
|---|---|---|
artwork:message |
Artwork ↔ Artwork | Custom Messages |
input:broadcast |
Any → All | Shared Input |
entity:transfer |
Artwork → Server | Entity Transfer |
entity:receive |
Server → Artwork | Entity empfangen |
System Events
| Event | Beschreibung |
|---|---|
connect |
Verbindung hergestellt |
disconnect |
Verbindung getrennt |
error |
Fehler aufgetreten |
Topology
Für Multi-Screen Installationen:
socket.emit('topology:configure', {
screens: [
{ id: 'screen-1', neighbors: { right: 'screen-2' } },
{ id: 'screen-2', neighbors: { left: 'screen-1', right: 'screen-3' } },
{ id: 'screen-3', neighbors: { left: 'screen-2' } }
]
});Logging
Zentrales Log-System:
// Log senden
socket.emit('log', {
level: 'info',
message: 'Artwork gestartet',
artworkId: 'item-001',
timestamp: Date.now()
});
// Logs empfangen (Studio)
socket.on('log', (data) => {
console.log(`[${data.artworkId}] ${data.message}`);
});Verbindungs-Status
socket.on('connect', () => {
console.log('Connected:', socket.id);
});
socket.on('disconnect', (reason) => {
console.log('Disconnected:', reason);
});
socket.on('connect_error', (error) => {
console.error('Connection error:', error);
});Best Practices
- Room-basiert arbeiten – Nicht global broadcasten
- Payload minimieren – Nur nötige Daten senden
- Throttling – High-Frequency Events throttlen
- Reconnect-Logik – Automatisch neu verbinden
- Error Handling – Fehler abfangen und loggen