npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

safe-file-writer

v0.0.1

Published

Safely write small file to filesystem and can recover from last failure state

Downloads

5

Readme

Why this package

Due to nodejs's async natural, when saving configs to filesystem, another uncaught exception will quit the program immediately and result in a broken config file. This module handle this problem.

Usage

SafeFileWriter = require("safe-file-writer")
writer = new SafeFileWriter("./config.json")
config = {
           key:"newValue"
}
newConfigString = JSON.stringify(config)

# you can access writer state via SafeFileWriter.state

# echo uninitialized
console.log writer.state

# restore from previous state if has any, or recover the broken file if any 
writer.restore (err,value)->
	# echo saved
	console.log writer.state 
               
        # save the config
	writer.save newConfigString,(err)->
            if err
               # echo caching
               console.log writer.state
               return

            # echo saved
            console.log writer.state
            # echo {"key":""value}
            # writer.content can be Buffer or String depends on what you save
            console.log writer.content
        # echo saving
	console.log writer.state

# Note1: only each file can only associated with 1 writer
#        or no good thing will happen.
# Note2: don't save before restore finished

Behind the scene

Suppose we are going to save {"value":"newValue"}to a file named "config.json" and there already exists a "config.json" with content {"value":"oldValue"}. Here is what happend: s1. rename config.json to ##config.json.old s2. write {"value":"newValue"} to config.json s3. unlink ##config.json.old

Here is what happened when wo do the restore r1. check if there is a ##config.json.old, any failure in s1~s3 will lead to this behavior. yes: let's unlink config.json if exists and rename ##config.json.old to config.json and restore from that file. no: goto r2 r2. check if there is an config.json yes: read file and result in a "saved" state no: result in a "saved" state

So any failure at s1,s2,s3 will result in a rollback to the last config state.

Corner case bhavior

Continuously save several times at the same process tick (no setTimeout or process.nextTick between save) will ignore the action before last save and callback with a string "overwrite". In this case physical disk will be only write once ().

handler = (err)->console.err or "success"

writer.save "content1",handler
writer.save "content2",handler
writer.save "content3",handler

States

  • uninitialized this is the state when the writer is created but has never been saved/set content/restored.
  • saving We are writing files to filesystem as described in s1~s3, but not finished.
  • saved Everything is safe, your file are already flush to the filesystem and no ## file are exists.
  • cache writer are holding your content but not doing saving action. It's likely to be the result of the failure of the last save.

Methods

void save(content,callback) content can be buffer or string, callback recieve an error if has any.

void restore(callback) callback(error,content), content can be buffer or string, callback recieve an error if has any.