-
Notifications
You must be signed in to change notification settings - Fork 8
/
fwhint.ts
65 lines (52 loc) · 1.8 KB
/
fwhint.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
import { Decoder, Encoder, EvDecoder, NNI, toHex } from "@ndn/tlv";
import { TT } from "./an";
import { Name, NameLike } from "./name/mod";
const EVD = new EvDecoder<FwHint.Delegation>("Delegation", TT.Delegation)
.add(TT.Preference, (t, { nni }) => t.preference = nni)
.add(TT.Name, (t, { decoder }) => t.name = decoder.decode(Name));
/** ForwardingHint in Interest. */
export class FwHint {
public static decodeValue(value: Uint8Array): FwHint {
const dels = [] as FwHint.Delegation[];
for (const decoder = new Decoder(value); !decoder.eof;) {
dels.push(decoder.decode(FwHint.Delegation));
}
return new FwHint(dels);
}
constructor(copy?: FwHint);
constructor(delegations: readonly FwHint.Delegation[]);
constructor(arg?: FwHint|readonly FwHint.Delegation[]) {
if (Array.isArray(arg)) {
for (const del of arg) {
this.m.set(toHex(del.name.value), del);
}
} else if (arg instanceof FwHint) {
this.m = new Map(arg.m);
}
}
public get delegations(): readonly FwHint.Delegation[] {
return Array.from(this.m.values()).sort((a, b) => a.preference - b.preference);
}
private readonly m = new Map<string, FwHint.Delegation>();
public encodeTo(encoder: Encoder) {
encoder.prependTlv(TT.ForwardingHint, Encoder.OmitEmpty, ...this.delegations);
}
}
export namespace FwHint {
/** Delegation in ForwardingHint. */
export class Delegation {
public static decodeFrom(decoder: Decoder): Delegation {
return EVD.decode(new Delegation(), decoder);
}
constructor(name: NameLike = "", public preference = 0) {
this.name = new Name(name);
}
public name: Name;
public encodeTo(encoder: Encoder) {
encoder.prependTlv(TT.Delegation,
[TT.Preference, NNI(this.preference)],
this.name,
);
}
}
}