encodeFrame function

Uint8List encodeFrame(
  1. RemoteFrame frame
)

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();
}