atproto relay implementation in zig zlay.waow.tech

error frames: drop t field from header per event-stream spec

spec says t should not be present when op is -1. removes t: "#info"
from both buildErrorFrame and encodeInfoFrame headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+6 -7
+6 -7
src/broadcaster.zig
··· 77 77 // --- ConsumerTooSlow error frame --- 78 78 79 79 /// build the ConsumerTooSlow CBOR error frame using the SDK encoder. 80 - /// header: {op: -1, t: "#info"}, payload: {error: "ConsumerTooSlow", message: "..."} 80 + /// header: {op: -1}, payload: {error: "ConsumerTooSlow", message: "..."} 81 81 fn buildErrorFrame(allocator: Allocator) ?[]const u8 { 82 82 const cbor = zat.cbor; 83 83 84 - // header: {op: -1, t: "#info"} 84 + // header: {op: -1} — spec says no `t` field on error frames 85 85 const header: cbor.Value = .{ .map = &.{ 86 86 .{ .key = "op", .value = .{ .negative = -1 } }, 87 - .{ .key = "t", .value = .{ .text = "#info" } }, 88 87 } }; 89 88 90 89 // payload: {error: "ConsumerTooSlow", message: "consumer buffer full"} ··· 113 112 return frame; 114 113 } 115 114 116 - /// encode a #info error frame into caller-provided buffer. 115 + /// encode an error frame into caller-provided buffer. 117 116 /// used for InvalidCursor / OutdatedCursor info frames. 118 - /// header: {op: -1, t: "#info"}, payload: {error: <name>, message: <msg>} 117 + /// header: {op: -1}, payload: {error: <name>, message: <msg>} 119 118 fn encodeInfoFrame(error_name: []const u8, message: []const u8, out: []u8) ?[]const u8 { 120 119 const cbor = zat.cbor; 121 120 const alloc = std.heap.c_allocator; 122 121 123 122 const header: cbor.Value = .{ .map = &.{ 124 123 .{ .key = "op", .value = .{ .negative = -1 } }, 125 - .{ .key = "t", .value = .{ .text = "#info" } }, 126 124 } }; 127 125 const payload: cbor.Value = .{ .map = &.{ 128 126 .{ .key = "error", .value = .{ .text = error_name } }, ··· 968 966 const h_result = try cbor.decode(alloc, frame); 969 967 const h = h_result.value; 970 968 try std.testing.expectEqual(@as(i64, -1), h.getInt("op").?); 971 - try std.testing.expectEqualStrings("#info", h.getString("t").?); 969 + // spec: error frames have {op: -1} only, no `t` field 970 + try std.testing.expect(h.getString("t") == null); 972 971 973 972 // decode payload 974 973 const p = try cbor.decodeAll(alloc, frame[h_result.consumed..]);