encodeFrame function
Encodes a frame into wire bytes ready for the transport.
Implementation
Uint8List encodeFrame(RemoteFrame frame) {
final (type, payload) = switch (frame) {
InitFrame f => (FrameType.init, utf8.encode(_encodeInit(f))),
InputFrame f => (FrameType.input, f.bytes),
ResizeFrame f => (
FrameType.resize,
utf8.encode('cols=${f.size.cols},rows=${f.size.rows}'),
),
OutputFrame f => (FrameType.output, f.bytes),
PlanFrame f => (FrameType.plan, encodeRemotePlan(f.plan)),
SemanticsFrame f => (FrameType.semantics, f.json),
InputEventFrame f => (FrameType.inputEvent, encodeInputEvent(f.event)),
SemanticActionFrame f => (
FrameType.semanticAction,
encodeSemanticAction(
f.id,
f.action,
value: f.value,
targetToken: f.targetToken,
),
),
SemanticActionResultFrame f => (
FrameType.semanticActionResult,
encodeSemanticActionResult(f.id, f.action, f.status),
),
InlineImageFrame f => (FrameType.inlineImage, _encodeInlineImage(f)),
ClipboardWriteFrame f => (
FrameType.clipboardWrite,
_encodeClipboardWrite(f),
),
ClipboardResultFrame f => (
FrameType.clipboardResult,
_encodeClipboardResult(f),
),
CaretFrame f => (FrameType.caret, _encodeCaret(f)),
DebugRequestFrame f => (FrameType.debugRequest, _encodeDebugRequest(f)),
DebugResponseFrame f => (FrameType.debugResponse, _encodeDebugResponse(f)),
ByeFrame() => (FrameType.bye, const <int>[]),
};
final limit = remoteFramePayloadLimit(type);
if (payload.length > limit) {
throw RemoteProtocolException(
'${type.name} frame payload length ${payload.length} exceeds limit '
'$limit; frame was not encoded.',
);
}
final out = BytesBuilder(copy: false);
out.addByte(type.code);
final header = ByteData(4)..setUint32(0, payload.length);
out.add(header.buffer.asUint8List());
out.add(payload);
return out.toBytes();
}