/
probe-request.ts
75 lines (64 loc) · 2.19 KB
/
probe-request.ts
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { Interest } from "@ndn/packet";
import { Encoder, EvDecoder } from "@ndn/tlv";
import { C } from "./an";
import type { CaProfile } from "./ca-profile";
import * as decode_common from "./decode-common";
import * as parameter_kv from "./parameter-kv";
const EVD = new EvDecoder<ProbeRequest.Fields>("ProbeRequest");
parameter_kv.parseEvDecoder(EVD, 1);
/** PROBE request packet. */
export class ProbeRequest {
/** Decode PROBE request from Interest packet. */
public static fromInterest(
interest: Interest,
{ profile }: ProbeRequest.Context,
): Promise<ProbeRequest> {
decode_common.checkName(interest, profile, C.PROBE, undefined);
return decode_common.fromInterest(interest, EVD, (f) => {
checkKeys(profile, f);
return new ProbeRequest(interest);
});
}
private constructor(public readonly interest: Interest) {}
}
export interface ProbeRequest extends Readonly<ProbeRequest.Fields> {}
function checkKeys({ probeKeys }: CaProfile, { parameters }: ProbeRequest.Fields): void {
const keys = new Set(probeKeys);
for (const key of Object.keys(parameters)) {
if (!keys.delete(key)) {
throw new Error(`unknown probe key ${key}`);
}
}
if (keys.size > 0) {
throw new Error(`missing probe ${keys.size > 1 ? "keys" : "key"} ${Array.from(keys).join(",")}`);
}
}
export namespace ProbeRequest {
/** Contextual information to decode and verify PROBE request packet. */
export interface Context {
/** CA profile packet. */
profile: CaProfile;
}
/** Fields of PROBE request packet. */
export interface Fields {
parameters: parameter_kv.ParameterKV;
}
/** Options to construct PROBE request packet. */
export interface Options extends Context, Fields {
}
/** Construct PROBE request packet. */
export async function build({
profile,
parameters,
}: Options) {
const payload = Encoder.encode([
...parameter_kv.encode(parameters),
]);
const interest = new Interest();
interest.name = profile.prefix.append(C.CA, C.PROBE);
interest.mustBeFresh = true;
interest.appParameters = payload;
await interest.updateParamsDigest();
return ProbeRequest.fromInterest(interest, { profile });
}
}