Welcome
Awesome Dat
Dat Applications
datproject/dat
datproject/dat-desktop
Community Applications
codeforscience/sciencefair
mafintosh/hyperirc
jondashkyle/soundcloud-archiver
mafintosh/hypervision
joehand/hypertweet
beakerbrowser/dat-photos-app
High-Level APIs
datproject/dat-node
datproject/dat-js
beakerbrowser/pauls-dat-api
beakerbrowser/node-dat-archive
Hosting & Dat Management
mafintosh/hypercore-archiver
datprotocol/hypercloud
beakerbrowser/hashbase
joehand/dat-now
mafintosh/hypercore-archiver-bot
joehand/hypercore-archiver-ws
datproject/dat-registry-api
datproject/dat-registry-client
Managing & Aggregating Dats
datproject/multidat
datproject/multidrive
jayrbolton/dat-pki
beakerbrowser/injestdb
Http Hosting
joehand/hyperdrive-http
beakerbrowser/dathttpd
Dat Link Utilties
datprotocol/dat-dns
joehand/dat-link-resolve
pfrazee/parse-dat-url
juliangruber/dat-encoding
Dat Utilities
joehand/dat-log
mafintosh/dat-ls
karissa/hyperhealth
joehand/hyperdrive-network-speed
File Imports & Exports
juliangruber/hyperdrive-import-files
mafintosh/mirror-folder
pfrazee/hyperdrive-staging-area
pfrazee/hyperdrive-to-zip-stream
Hypercore Tools
mafintosh/hyperpipe
Dat Core Modules
mafintosh/hyperdrive
mafintosh/hypercore
CLI Utilities
joehand/dat-doctor
joehand/dat-ignore
joehand/dat-json
Networking
karissa/hyperdiscovery
mafintosh/discovery-swarm
mafintosh/webrtc-swarm
joehand/dat-swarm-defaults
Lower level networking modules
maxogden/discovery-channel
mafintosh/dns-discovery
mafintosh/multicast-dns
webtorrent/bittorrent-dht
mafintosh/utp-native
mafintosh/signalhub
Storage
datproject/dat-storage
datproject/dat-secret-storage
Random Access
juliangruber/abstract-random-access
mafintosh/multi-random-access
mafintosh/random-access-file
mafintosh/random-access-memory
mafintosh/random-access-page-files
datproject/dat-http
substack/random-access-idb
Other Related Dat Project Modules
mafintosh/peer-network
mafintosh/hyperdht
Dat Project Organization Stuff
datproject/datproject.org
datproject/discussions
datproject/design
datproject/dat-elements
kriesse/dat-colors
kriesse/dat-icons
juliangruber/dat.json
Outdated
juliangruber/dat.haus
poga/hyperfeed
yoshuawuyts/normcore
yoshuawuyts/github-to-hypercore
poga/hyperspark
juliangruber/hypercore-index
juliangruber/hyperdrive-encoding
mafintosh/hyperdrive-http-server
joehand/hyperdrive-http
joehand/dat-push
joehand/dat-backup
joehand/archiver-server
joehand/archiver-api
poga/hyperdrive-ln
substack/hyperdrive-multiwriter
substack/hyperdrive-named-archives
substack/git-dat
CfABrigadePhiladelphia/jawn
maxogden/dat-archiver
juliangruber/hyperdrive-stats
karissa/hypercore-stats-server
mafintosh/hypercore-stats-ui
karissa/zip-to-hyperdrive
joehand/url-dat
joehand/tar-dat
joehand/hyperdrive-duplicate

hyperdrive-staging-area

Staging area for local, uncommited writes that can sync to a hyperdrive. Respects .datignore.

npm install hyperdrive-staging-area

Usage

hyperdrive-staging-area provides an fs-compatible object, plus a few additional methods

var hyperdrive = require('hyperdrive')
var hyperstaging = require('hyperdrive-staging-area')
var archive = hyperdrive('./my-first-hyperdrive-meta') // metadata will be stored in this folder
var staging = hyperstaging(archive, './my-first-hyperdrive') // content will be stored in this folder

staging.writeFile('/hello.txt', 'world', function (err) {
  if (err) throw err

  staging.readdir('/', function (err, list) {
    if (err) throw err
    console.log(list) // prints ['hello.txt']

    staging.readFile('/hello.txt', 'utf-8', function (err, data) {
      if (err) throw err
      console.log(data) // prints 'world'
    })
  })
})

At this point, the archive is still unchanged.

archive.readFile('/hello.txt', 'utf-8', function (err) {
  console.log(err) // => NotFound
})

To be applied to the archive, the changes must be committed:

staging.diff(function (err, changes) {
  if (err) throw err
  console.log(changes) // prints [{change: 'add', type: 'file', path: '/hello.txt'}]

  staging.commit(function (err) {
    if (err) throw err

    staging.diff(function (err, changes) {
      if (err) throw err
      console.log(changes) // prints []

      archive.readFile('/hello.txt', 'utf-8', function (err, data) {
        if (err) throw err
        console.log(data) // prints 'world'
      })
    })
  })
})

Changes can also be reverted after writing them to staging.

staging.writeFile('/hello.txt', 'universe!', function (err) {
  if (err) throw err

  staging.diff(function (err, changes) {
    if (err) throw err
    console.log(changes) // prints [{change: 'mod', type: 'file', path: '/hello.txt'}]

    staging.revert(function (err) {
      if (err) throw err

      staging.readFile('/hello.txt', 'utf-8', function (err, data) {
        if (err) throw err
        console.log(data) // prints 'world'
      })
    })
  })
})

API

var staging = HyperdriveStagingArea(archive, stagingPath[, baseOpts])

Create a staging area for archive at the given stagingPath.

You can specify baseOpts to be passed as the defaults to diff, commit, and revert. Options include:

{
  skipDatIgnore: false // dont use the .datignore rules
  ignore: ['.dat', '.git'] // base ignore rules (used in addition to .datignore)
  filter: false // a predicate of (path) => bool, where writes are skipped if == true. Takes precedence over .datignore
  shallow: false // dont recurse into folders that need to be added or removed
}

staging.path

Path to staging folder.

staging.isStaging

True

staging.key

Archive key.

staging.writable

Is the archive writable?

staging.diff(opts, cb)

List the changes currently in staging. Output looks like:

[
  {
    change: 'add' | 'mod' | 'del'
    type: 'dir' | 'file'
    path: String (path of the file)
  },
  ...
]

Options include:

{
  skipDatIgnore: false // dont use the .datignore rules
  ignore: ['.dat', '.git'] // base ignore rules (used in addition to .datignore)
  filter: false // a predicate of (path) => bool, where writes are skipped if == true. Takes precedence over .datignore
  shallow: false // dont recurse into folders that need to be added or removed
  compareContent: false // diff by content? (this removes false positives)
}

staging.commit(opts, cb)

Write all changes to the archive.

Options include:

{
  skipDatIgnore: false // dont use the .datignore rules
  ignore: ['.dat', '.git'] // base ignore rules (used in addition to .datignore)
  filter: false // a predicate of (path) => bool, where writes are skipped if == true. Takes precedence over .datignore
  shallow: false // dont recurse into folders that need to be added or removed
  compareContent: false // diff by content? (this removes false positives)
}

staging.revert(opts, cb)

Undo all changes so that staging is reverted to the archive stage.

Options include:

{
  skipDatIgnore: false // dont use the .datignore rules
  ignore: ['.dat', '.git'] // base ignore rules (used in addition to .datignore)
  filter: false // a predicate of (path) => bool, where writes are skipped if == true. Takes precedence over .datignore
  shallow: false // dont recurse into folders that need to be added or removed
  compareContent: false // diff by content? (this removes false positives)
}

staging.readIgnore(opts, cb)

Read the .datignore and provide a filter(path)=>bool function. The callback does not provide an error, so its signature is cb(filterFn).

Options include:

{
  skipDatIgnore: false // dont use the .datignore rules
  ignore: ['.dat', '.git'] // base ignore rules (used in addition to .datignore)
}

staging.startAutoSync()

Listens for updates to the archive and automatically reverts the staging area when a new entry is appended. Useful for syncing the staging for downloaded archives.

staging.stopAutoSync()

Stop syncing the staging area.

HyperdriveStagingArea.parseIgnoreRules(str)

Parses the list of rules in a .datignore and outputs an array that can be used by anymatch.