UdpTransport: UDP unicast tunnel (IPv4 or IPv6) or UDP multicast group (IPv4 only).
The connect() function of each transport creates a transport.
// UnixTransport.connect() establishes a UNIX socket connection.// It accepts a Unix socket path.try {constunix = awaitUnixTransport.connect("/run/nfd.sock");awaituseInL3Face(unix);} catch (err: unknown) { // NFD is not runningconsole.warn("unix", err);}// TcpTransport.connect() establishes a TCP tunnel.// It accepts either host+port or an options object for net.createConnection().try {consttcp4 = awaitTcpTransport.connect("hobo.cs.arizona.edu", 6363);awaituseInL3Face(tcp4);} catch (err: unknown) { // router unavailableconsole.warn("tcp4", err);}// Select IPv4 with `family: 4` or select IPv6 with `family: 6`. Default is both.try {consttcp6 = awaitTcpTransport.connect({ host:"ndnhub.ipv6.lip6.fr", family:6 });awaituseInL3Face(tcp6);} catch (err: unknown) { // router unavailableconsole.warn("tcp6", err);}// UdpTransport.connect() establishes a UDP tunnel.try {constudp4 = awaitUdpTransport.connect("hobo.cs.arizona.edu");awaituseInL3Face(udp4);} catch (err: unknown) { // router unavailableconsole.warn("udp4", err);}// Select IPv6 with `type: "udp6"`. Default is IPv4 only.try {constudp6 = awaitUdpTransport.connect({ host:"ndnhub.ipv6.lip6.fr", family:6 });awaituseInL3Face(udp6);} catch (err: unknown) { // router unavailableconsole.warn("udp6", err);}
To use UDP multicast, each network interface needs to have a separate transport.
It's easiest to let NDNts automatically create transports on every network interface.
// UdpTransport.multicasts() attempts to create UDP multicast transports on every// network interface, skipping network interfaces where socket creation fails.constmulticasts = awaitUdpTransport.multicasts();for (consttransportofmulticasts) {awaituseInL3Face(transport);}
Transports are normally used to construct L3Face objects (from @ndn/l3face package), which are in turned add to the Forwarder (from @ndn/fw package).
Each transport provides a createFace convenience function to construct a transport and add it to the forwarder.
See @ndn/ws-transport package documentation for a complete example of createFace function.
// UdpTransport.createFace() constructs a UDP unicast transport, and adds it to a forwarder.// First parameters allows setting L3Face attributes and NDNLP service options, or attaching// the face to a non-default Forwarder instance. This argument is required.// Subsequent parameters are same as the corresponding connect() function.// It returns a FwFace instance (from @ndn/fw package).constface = awaitUdpTransport.createFace({}, "ndnhub.ipv6.lip6.fr");face.addRoute(newName("/ndn"));face.close();// TcpTransport.createFace() and UnixTransport.createFace() behave similarly.// UdpTransport.createMulticastFaces() constructs UDP multicast transports on every network// interface and adds them to a forwarder.constfaces = awaitUdpTransport.createMulticastFaces({});for (constfaceoffaces) {face.close();}})();
L3Face allows sending and receiving layer-3 packets on a transport.
L3Face does not provide Interest-Data matching logic, timeout scheduler, etc.
It is more like a forwarder's face.
This section presents the low-level details of how to use a "raw" transport with L3Face class.
asyncfunctionuseInL3Face(transport: Transport) {// Transports are normally used in a network layer face.constface = newL3Face(transport);// We want to know if something goes wrong.face.on("rxerror", (err) =>console.warn(err));face.on("txerror", (err) =>console.warn(err));awaitPromise.all([face.tx({ async*[Symbol.asyncIterator]() {// Send five Interests.letseq = Math.floor(Math.random() * 1e9);for (leti = 0; i < 5; ++i) {awaitnewPromise((r) =>setTimeout(r, 50));constinterest = newInterest(`/ndn/edu/arizona/ping/NDNts/${seq++}`);console.log(`${transport} <I ${interest.name}`);yieldFwPacket.create(interest); }awaitnewPromise((r) =>setTimeout(r, 500)); } }), (async () => {letnData = 0;forawait (const { l3 } offace.rx) {if (!(l3instanceofData)) {continue; }// Print incoming Data name.console.log(`${transport} >D ${l3.name}`);if (++nData >= 5) {return; } } })(), ]);// L3Face and Transport are automatically closed when TX iterable is exhausted.}
@ndn/node-transport
This package is part of NDNts, Named Data Networking libraries for the modern web.
This package implements socket transports for Node.js environment.
Transport Types
There are three transport types:
The
connect()
function of each transport creates a transport.To use UDP multicast, each network interface needs to have a separate transport. It's easiest to let NDNts automatically create transports on every network interface.
How to Use a Transport
Transports are normally used to construct L3Face objects (from
@ndn/l3face
package), which are in turned add to the Forwarder (from@ndn/fw
package). Each transport provides acreateFace
convenience function to construct a transport and add it to the forwarder.See
@ndn/ws-transport
package documentation for a complete example ofcreateFace
function.L3Face Low-Level Details
L3Face allows sending and receiving layer-3 packets on a transport. L3Face does not provide Interest-Data matching logic, timeout scheduler, etc. It is more like a forwarder's face.
This section presents the low-level details of how to use a "raw" transport with
L3Face
class.