export function createPacketReader({
packetStartMarker,
packetEndMarker,
}: {
packetStartMarker: string;
packetEndMarker: string;
}) {
packetStartMarker += "\n";
return function readPacket(input: string) {
input = input.trim();
let offset = input.indexOf(packetStartMarker);
if (offset === -1) throw TypeError("error: invalid packet");
offset += packetStartMarker.length;
const contentOffset = offset;
offset = input.indexOf(packetEndMarker, offset);
if (offset === -1) throw TypeError("error: invalid packet");
const contentLength = offset - contentOffset;
return input.substring(contentOffset, contentOffset + contentLength);
};
}
export function createSignedPacketReader({
packetStartMarker,
signatureStartMarker,
packetEndMarker,
}: {
packetStartMarker: string;
signatureStartMarker: string;
packetEndMarker: string;
}) {
packetStartMarker += "\n";
signatureStartMarker += "\n";
return function readSignedPacket(input: string) {
input = input.trim();
let offset = input.indexOf(packetStartMarker);
if (offset === -1) throw TypeError("error: invalid packet");
offset += packetStartMarker.length;
const contentOffset = offset;
offset = input.indexOf(signatureStartMarker, offset);
if (offset === -1) throw TypeError("error: invalid packet");
const contentLength = offset - contentOffset;
offset += signatureStartMarker.length;
const signatureOffset = offset;
offset = input.indexOf(packetEndMarker, offset);
if (offset === -1) throw TypeError("error: invalid packet");
const signatureLength = offset - signatureOffset;
const content = input.substring(contentOffset, contentOffset + contentLength);
const signature = input.substring(signatureOffset, signatureOffset + signatureLength);
return { content, signature };
};
}