create symbolic link between hyperdrives
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
test
.gitignore
LICENSE
README.md
index.js
package.json
yarn.lock

README.md

hyperdrive-ln

NPM Version JavaScript Style Guide

create symbolic link between hyperdrives

npm i hyperdrive-ln

Usage

const ln = require('hyperdrive-ln')

var drive = hyperdrive(memdb())
var archive = drive.createArchive()

ln.link(archive, 'linkfile', <ARCHIVE KEY>, [meta], err => {}) // create symlink to another archive
ln.readlink(archive, 'linkfile', (err, link) => {}) // get link data

// assume ln.link(archive, 'path/to/file', <ARCHIVE KEY>)
ln.resolve(archive, 'path/to/file/within/linked/archive', (err, link, restOfThePath)) // returns (err, {link: <ARCHIVE_KEY>, meta: {...}}, 'within/linked/archive')

// resolve through archives
ln.deepResolve(drive, swarmer, archive, path, (err, result) => {})

ln.encode(key, [meta]) // encode a key for linkfile
ln.decode(data) // decode a linkfile content to key

API

ln.link(archive, path, archiveKey, [meta], cb)

Create a symlink at path point to archiveKey.

You can pass a meta object to store it in the symlink.

ln.readlink(archive, path, cb)

Get the link data stored inside a symlink.

ln.resolve(archive, path, cb)

Resolve a path. Returns an archive and a path within that archive with cb(err, linkedArchiveKey, pathWithinLinkedArchive)

  • If there's a symlink encountered in the path. cb(err, link, pathWithinLinkedArchive) will be invoked.
  • If there's no symlink in the path, cb(err, {}, path) will be called.

for example:

ln.link(archive, 'foo/bar', '<LINK_KEY>', (err) => {
    ln.resolve(archive, 'foo/bar/baz', (err, link, path) => {
      // link === {link: '<LINK_KEY>', meta: {...}}
      // path === 'baz'
    })
})

ln.deepResolve(drive, swarmer, archive, path, cb)

Recursively resolve a path through archives. Create swarm connection when necessary.

swarmer is anything let you join swarm . For example: hyperdiscovery.

callback cb(err, result) where result is a recursive structure:

{
  archive: // traversed archive,
  path: // consumed path,
  swarm: // swarm instance,
  next: result // next component if there's one
}

For example: Assume we have an archive1 which /foo/bar linked to archive2.

ln.deepResolve(drive, swarmer, archive1, '/foo/bar/baz/baz.txt', cb)

will get the result:

{
  archive: archive1,
  path: '/foo/bar',
  swarm: // a swarm instance,
  next: {
    archive: archive2,
    path: 'baz/baz.txt',
    swarm: // another swarm instance
  }
}

use deepClose(result) to close all swarm instance in the result.

ln.deepClose(result)

Close all swarm instance in the result.

body = ln.encode(key, [meta])

Encode a key to symlink file body.

ln.decode(body)

Decode a symlink file body to linked archive key.

License

The MIT License