Options
All
  • Public
  • Public/Protected
  • All
Menu

@ndn/repo

This package is part of NDNts, Named Data Networking libraries for the modern web.

This package implements a Data repository. The repo is primarily designed to be embedded into Node and web applications, rather than running as a standalone daemon process. Data ingestion is mainly supported through APIs, not command packets. Data retrieval is on par with other repo implementations.

import { DataStore, RepoProducer, PrefixRegShorter } from "@ndn/repo";

// other imports for examples
import { Name, Interest, Data } from "@ndn/packet";
import { strict as assert } from "assert";
import memdown from "memdown";
(async () => {

DataStore

DataStore is a Data packet storage, based on LevelDB or other abstract-leveldown compatible key-value store. It implements most of DataStore interfaces defined in @ndn/repo-api package, offering APIs to insert and delete Data packets.

// DataStore constructor accepts an abstract-leveldown instance.
// For in-memory storage, use 'memdown'.
// For persistent storage, use 'leveldown' in Node.js or 'level-js' in browsers.
const store = new DataStore(memdown());

// Insert Data packets.
await store.insert(new Data("/A/0"));
// You can totally insert multiple Data packets in one command.
// This is even preferred, because it bundles them into one LevelDB transaction and runs faster.
await store.insert(new Data("/A/1"), new Data("/A/2"));
// You can also pass the result of fetch() function from @ndn/segmented-object package directly to
// insert() function, because it accepts AsyncIterable<Data> and Iterable<Data> types.

// You can set an expiration time during insertion. Packets disappear upon expiration.
await store.insert({ expireTime: Date.now() + 50 }, new Data("/A/3"));
await new Promise((r) => setTimeout(r, 50)); // Poof, it's gone.
// Inserting new Data packet with same name would overwrite previous packet, even if their implicit
// digests differ. You cannot store two packets with same name.

// Delete Data packets.
await store.delete(new Name("/A/0"), new Name("/A/4"));
// It's harmless to delete non-existent packets, such as /A/4 above.

// Now let's retrieve them.
const rA1 = await store.find(new Interest("/A/1"));
assert.equal(`${rA1?.name}`, "/8=A/8=1");
// Prefix name is supported too.
const rA = await store.find(new Interest("/A", Interest.CanBePrefix));
assert(["/8=A/8=1", "/8=A/8=2"].includes(`${rA?.name}`));
// /A/3 has disappeared.
const rA3 = await store.find(new Interest("/A/3"));
assert.equal(rA3, undefined);

RepoProducer

RepoProducer makes packets in a DataStore available for retrieval.

// Construct a RepoProducer.
// The 'reg' option controls what name prefixes should be registered.
// PrefixRegStatic(new Name("/A"), new Name("/B")) registers a fixed set of prefixes.
// PrefixRegShorter(1) registers prefixes that are 1-component shorter than each Data name.
// See test cases for more options.
// These registrations stay with NDNts forwarding plane. Typically you'll want a package such as
// '@ndn/nfdmgmt' to propagate them to the uplink(s).
const p = RepoProducer.create(store, { reg: PrefixRegShorter(1) });

// Close the RepoProducer and the DataStore.
p.close();
await store.close();
})();

Index

References

BulkInsertInitiator

BulkInsertInitiator:

BulkInsertTarget

BulkInsertTarget:

DataStore

Re-exports DataStore

PrefixRegController

Re-exports PrefixRegController

PrefixRegController

Re-exports PrefixRegController

PrefixRegDynamic

Re-exports PrefixRegDynamic

PrefixRegDynamic

Re-exports PrefixRegDynamic

PrefixRegShorter

Re-exports PrefixRegShorter

PrefixRegShorter

Re-exports PrefixRegShorter

PrefixRegStatic

Re-exports PrefixRegStatic

PrefixRegStatic

Re-exports PrefixRegStatic

PrefixRegStrip

Re-exports PrefixRegStrip

PrefixRegStrip

Re-exports PrefixRegStrip

RepoProducer

Renames and re-exports Producer

Transaction

Re-exports Transaction

respondRdr

Re-exports respondRdr

Type aliases

Db

Db: LevelUp<EncodingDown<Name, Record>, AbstractIterator<Name, Record>>

DbChain

DbChain: LevelUpChain<Name, Record>

Diff

Diff: ["insert" | "delete", Name]

Face

Face: Pick<FwFace, "addRoute" | "removeRoute">

InsertOptions

InsertOptions: Pick<Record, "expireTime">

PrefixRegController

PrefixRegController: (store: DataStore, face: Face) => PrefixRegContext

Control prefix registrations of a repo producer.

Type declaration

Functions

PrefixRegDynamic

  • Register prefixes derived from Data names.

    Parameters

    • transform: (name: Name) => Name

      a function that accepts Data name and returns registered prefix name; it must return the same value for the same argument.

      Warning: this may misbehave when expireTime option is being used.

        • (name: Name): Name
        • Parameters

          • name: Name

          Returns Name

    Returns PrefixRegController

PrefixRegShorter

PrefixRegStatic

filterExpired

  • filterExpired(expired: boolean, now?: number): (record: Record) => boolean

isExpired

  • isExpired(expireTime?: undefined | number, now?: number): boolean
  • Parameters

    • Optional expireTime: undefined | number
    • Default value now: number = Date.now()

    Returns boolean

openDb

  • openDb(db: AbstractLevelDOWN): Db

respondRdr

  • Provide a Producer.FallbackHandler that responds RDR metadata describing latest version among stored Data. This should be passed to Producer.create() options.

    Parameters

    • Default value opts: apiRespondRdr.Options = {}

    Returns FallbackHandler

Legend

  • Namespace
  • Object literal
  • Variable
  • Function
  • Function with type parameter
  • Type alias
  • Type alias with type parameter
  • Interface
  • Interface with type parameter
  • Class
  • Class with type parameter
  • Enumeration

Generated using TypeDoc