5
0
Fork 0
dart-eventsource/lib/src/encoder.dart

57 lines
1.4 KiB
Dart

library eventsource.src.encoder;
import "dart:convert";
import "dart:io";
import "event.dart";
import "proxy_sink.dart";
class EventSourceEncoder extends Converter<Event, List<int>> {
final bool compressed;
const EventSourceEncoder({bool this.compressed: false});
static Map<String, Function> _fields = {
"id: ": (e) => e.id,
"event: ": (e) => e.event,
"data: ": (e) => e.data,
};
@override
List<int> convert(Event event) {
String payload = convertToString(event);
List<int> bytes = utf8.encode(payload);
if (compressed) {
bytes = GZIP.encode(bytes);
}
return bytes;
}
String convertToString(Event event) {
String payload = "";
for (String prefix in _fields.keys) {
String value = _fields[prefix](event);
if (value == null || value.isEmpty) {
continue;
}
// multi-line values need the field prefix on every line
value = value.replaceAll("\n", "\n$prefix");
payload += prefix + value + "\n";
}
payload += "\n";
return payload;
}
@override
Sink<Event> startChunkedConversion(Sink<List<int>> sink) {
Sink inputSink = sink;
if (compressed) {
inputSink = GZIP.encoder.startChunkedConversion(inputSink);
}
inputSink = utf8.encoder.startChunkedConversion(inputSink);
return new ProxySink(
onAdd: (Event event) => inputSink.add(convertToString(event)),
onClose: () => inputSink.close());
}
}