freedome_protocol 1.0.0
freedome_protocol: ^1.0.0 copied to clipboard
Freedome protocol models generated from freedome_contract (pure Dart, no I/O).
example/freedome_protocol_example.dart
// Decoding an API v1 body, a realtime event and a `.dome` manifest with freedome_protocol. NativeMindNONC.
import 'dart:convert';
import 'dart:io';
import 'package:freedome_protocol/freedome_protocol.dart';
void main() {
// A REST body (GET /api/v1/venues/default/players/main).
final player = PlayerState.fromJson(
jsonDecode('{"id":"main","status":"playing","position":12.5,"x-vendor":1}')
as Map<String, Object?>,
);
// Unknown members survive a round-trip.
assert(player.toJson()['x-vendor'] == 1);
// A realtime event (plain WS / socket.io / GraphQL envelope, 02e §7.1).
final event = FreedomeEvent.fromJson({
'type': 'event',
'id': '0192f3a4-5b6c-7d8e-9f01-23456789abcd',
'ts': '2026-10-19T12:00:00.123Z',
'topic': DomeTopics.player('default'),
'data': {
'seq': 1,
'kind': EventKinds.playerState,
'resource': player.toJson(),
},
});
switch (typedEvent(event)) {
case PlaybackChanged(:final state?):
_out('player ${state.id}: ${state.status.value} at ${state.position} s');
default:
_out('other event ${event.kind}');
}
// The operation table: method, path and scope of every operationId.
final op = Operations.play;
_out(
'${op.method} /api/v1${op.expand({'venueId': 'default', 'playerId': 'main'})} needs ${op.scope}',
);
}
void _out(String line) => stdout.writeln(line);