Neverending Puppy Marathon
    Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org »

    stenopublic

    steno

    Simple file writer with atomic writing and race condition prevention.

    Can be used as a drop-in replacement to fs.writeFile().

    Built on graceful-fs and used in lowdb.

    Install

    npm install steno --save
    

    Usage

    const steno = require('steno')
     
    steno.writeFile('file.json', data, err => {
      if (err) throw err
    })

    The problem it solves

    Without steno

    Let's say you have a server and want to save data to disk:

    var data = { counter: 0 }
     
    server.post('/', (req, res) => {
      // Increment counter
      ++data.counter
     
      // Save data asynchronously
      fs.writeFile('data.json', JSON.stringify(data), err => {
        if (err) throw err
        res.end()
      })
    })

    Now if you have many requests, for example 1000, there's a risk that you end up with:

    // In your server
    data.counter === 1000
     
    // In data.json
    data.counter === 865 // ... or any other value

    Why? Because, fs.write doesn't guarantee that the call order will be kept. Also, if the server is killed while data.json is being written, the file can get corrupted.

    With steno

    server.post('/increment', (req, res) => {
      ++data.counter
     
      steno.writeFile('data.json', JSON.stringify(data), err => {
        if (err) throw err
        res.end()
      })
    })

    With steno you'll always have the same data in your server and file. And in case of a crash, file integrity will be preserved.

    if needed, you can also use steno.writeFileSync() which offers atomic writing too.

    Important: works only in a single instance of Node.

    License

    MIT - Typicode

    install

    npm i steno

    Downloadsweekly downloads

    79,895

    version

    0.4.4

    license

    MIT

    repository

    githubgithub

    last publish

    collaborators

    • avatar