/
consumer.ts
65 lines (55 loc) · 1.9 KB
/
consumer.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 { Endpoint, RetxPolicy } from "@ndn/endpoint";
import { Interest, Name, NameLike, Verifier } from "@ndn/packet";
import { Decodable, Decoder } from "@ndn/tlv";
import type { AbortSignal } from "abort-controller";
import { Metadata, MetadataKeyword } from "./metadata";
/**
* Make RDR discovery Interest.
* @param prefix prefix of RDR metadata packet; 32=metadata component is optional.
*/
export function makeDiscoveryInterest(prefix: NameLike): Interest {
let name = new Name(prefix);
if (!name.get(-1)?.equals(MetadataKeyword)) {
name = name.append(MetadataKeyword);
}
return new Interest(name, Interest.CanBePrefix, Interest.MustBeFresh);
}
/** Retrieve RDR metadata packet. */
export async function retrieveMetadata(prefix: NameLike, opts?: retrieveMetadata.Options): Promise<Metadata>;
/** Retrieve RDR metadata packet. */
export async function retrieveMetadata<C extends typeof Metadata>(prefix: NameLike, ctor: C, opts?: retrieveMetadata.Options): Promise<InstanceType<C>>;
export async function retrieveMetadata(prefix: NameLike, arg2: any = {}, opts: retrieveMetadata.Options = {}) {
let ctor: Decodable<Metadata>;
if (typeof arg2 === "function") {
ctor = arg2;
} else {
ctor = Metadata;
opts = arg2;
}
const {
endpoint = new Endpoint(),
retx,
signal,
verifier,
} = opts;
const interest = makeDiscoveryInterest(prefix);
const data = await endpoint.consume(interest, {
describe: `RDR-c(${prefix})`,
retx,
signal,
verifier,
});
return new Decoder(data.content).decode(ctor);
}
export namespace retrieveMetadata {
export interface Options {
/** Endpoint for communication. */
endpoint?: Endpoint;
/** Interest retransmission policy. */
retx?: RetxPolicy;
/** Abort signal to cancel retrieval. */
signal?: AbortSignal | globalThis.AbortSignal;
/** Data verifier. Default is no verify. */
verifier?: Verifier;
}
}