(headers: Record<string, string>, payload: Buffer)
| 54 | * payload buffer. |
| 55 | */ |
| 56 | export function encodeEventStreamFrame(headers: Record<string, string>, payload: Buffer): Buffer { |
| 57 | const headersBuffer = encodeHeaders(headers); |
| 58 | const headersLength = headersBuffer.length; |
| 59 | |
| 60 | // prelude (8) + prelude_crc (4) + headers + payload + message_crc (4) |
| 61 | const totalLength = 4 + 4 + 4 + headersLength + payload.length + 4; |
| 62 | |
| 63 | const frame = Buffer.alloc(totalLength); |
| 64 | let offset = 0; |
| 65 | |
| 66 | // Prelude |
| 67 | frame.writeUInt32BE(totalLength, offset); |
| 68 | offset += 4; |
| 69 | frame.writeUInt32BE(headersLength, offset); |
| 70 | offset += 4; |
| 71 | |
| 72 | // Prelude CRC32 (covers first 8 bytes) |
| 73 | const preludeCrc = crc32(frame.subarray(0, 8)); |
| 74 | frame.writeUInt32BE(preludeCrc >>> 0, offset); |
| 75 | offset += 4; |
| 76 | |
| 77 | // Headers |
| 78 | headersBuffer.copy(frame, offset); |
| 79 | offset += headersLength; |
| 80 | |
| 81 | // Payload |
| 82 | payload.copy(frame, offset); |
| 83 | offset += payload.length; |
| 84 | |
| 85 | // Message CRC32 (covers entire frame minus last 4 bytes) |
| 86 | const messageCrc = crc32(frame.subarray(0, totalLength - 4)); |
| 87 | frame.writeUInt32BE(messageCrc >>> 0, offset); |
| 88 | |
| 89 | return frame; |
| 90 | } |
| 91 | |
| 92 | // ─── Convenience wrappers ─────────────────────────────────────────────────── |
| 93 |
no test coverage detected
searching dependent graphs…