1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// SPDX-License-Identifier: 0BSD
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 };
};
}