Zum Hauptinhalt springen

Streaming API

Die integrierte Streaming API liefert Timelines, Benachrichtigungen und Updates erfasster Notes per WebSocket. MisskeyClient.streaming wird verzögert erstellt und verwendet URL, Token-Provider, Logger und Log-Einstellung des Clients gemeinsam.

Konfigurieren und verbinden

final client = MisskeyClient(
config: MisskeyClientConfig(
baseUrl: Uri.parse('https://misskey.example.com'),
),
tokenProvider: () => 'YOUR_ACCESS_TOKEN',
streamingConfig: MisskeyStreamingConfig(
connectTimeout: const Duration(seconds: 15),
subscriptionTimeout: const Duration(seconds: 10),
enableAutoReconnect: true,
maxReconnectAttempts: 5,
),
);
await client.streaming.connect();

Der Token-Provider wird bei jeder neuen Verbindung einschließlich Wiederverbindungen ausgewertet. state enthält den aktuellen Zustand, stateChanges spätere Änderungen und errors asynchrone Transport-, Protokoll- und Subscription-Fehler. connect(), disconnect() und reconnect() steuern die wiederverwendbare Verbindung; dispose() beendet sie endgültig.

Offiziellen Channel abonnieren

final home = await client.streaming.subscribe(
const MisskeyStreamingChannel.homeTimeline(
withRenotes: true,
withFiles: false,
),
);

Während einer Verbindung wird subscribe() nach der connected-Bestätigung des Servers abgeschlossen. Subscriptions werden nach einer automatischen Wiederverbindung erneut gesendet. Typisierte Definitionen gibt es für den Haupt-Channel, Timelines, Benutzerlisten, Hashtags, Rollen, Antennen, Channels, Drive, Statistiken, Administration, Reversi und Chat.

Event-Ansicht auswählen

StreamInhalt
messagesNormalisierte MisskeyStreamingMessage mit Raw-Envelope
eventsTypisierte MisskeyStreamingEvent
notesAus Note-Events extrahierte MisskeyNote
notificationsAus Events extrahierte MisskeyNotification
final noteListener = home.notes.listen((note) => print(note.text));
final eventListener = home.events.listen((event) {
switch (event) {
case MisskeyNoteReactedEvent(:final noteId, :final reaction):
print('$noteId: $reaction');
case MisskeyUnknownEvent(:final type, :final decodeError):
print('Nicht unterstütztes Event $type: $decodeError');
default:
break;
}
});

MisskeyUnknownEvent bewahrt type, body, die ursprüngliche raw-Nachricht und den optionalen decodeError. Der globale Stream client.streaming.messages bewahrt die äußere Wire-Envelope; Subscription-messages sind auf das innere Event normalisiert.

Note-Updates erfassen

home.captureNote(noteId);
// events empfängt reacted, unreacted, deleted und pollVoted.
home.uncaptureNote(noteId);

Captures werden über Subscriptions hinweg referenzgezählt und nach Wiederverbindungen wiederhergestellt. Wiederholte Aufrufe auf demselben Handle sind idempotent.

Fork-spezifische Channels und Cleanup

final forkChannel = await client.streaming.subscribeRaw(
channel: 'forkSpecificChannel',
params: const <String, Object?>{'option': true},
id: 'optional-caller-id',
);
final listener = forkChannel.messages.listen(print);

await listener.cancel();
await forkChannel.unsubscribe();
await noteListener.cancel();
await eventListener.cancel();
await home.unsubscribe();
await client.dispose();

unsubscribe() und MisskeyClient.dispose() können sicher wiederholt oder gleichzeitig aufgerufen werden. Es sind höchstens 32 aktive Subscriptions möglich.

Zur Migration siehe Migration von misskey_streaming.