
Security News
GitHub Actions Pricing Whiplash: Self-Hosted Actions Billing Change Postponed
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.
ipfs-repo
Advanced tools
Implementation of the IPFS repo spec (https://github.com/ipfs/specs/blob/master/REPO.md) in JavaScript
This is the implementation of the IPFS repo spec in JavaScript.
Promise repo.put (key, value:Buffer)Promise<Buffer> repo.get (key)Promise<Boolean> repo.isInitialized ()Promise repo.blocks.put (block:Block)Promise repo.blocks.putMany (blocks)Promise<Buffer> repo.blocks.get (cid)Promise repo.blocks.delete (cid:CID)Promise repo.blocks.deleteMany (cids)repo.datastoreHere is the architectural reasoning for this repo:
┌────────────────────────────────────────┐
│ IPFSRepo │
└────────────────────────────────────────┘
┌─────────────────┐
│ / │
├─────────────────┤
│ Datastore │
└─────────────────┘
┌───────────┴───────────┐
┌─────────────────┐ ┌─────────────────┐
│ /blocks │ │ /datastore │
├─────────────────┤ ├─────────────────┤
│ Datastore │ │ LevelDatastore │
└─────────────────┘ └─────────────────┘
┌────────────────────────────────────────┐ ┌────────────────────────────────────────┐
│ IPFSRepo - Default Node.js │ │ IPFSRepo - Default Browser │
└────────────────────────────────────────┘ └────────────────────────────────────────┘
┌─────────────────┐ ┌─────────────────┐
│ / │ │ / │
├─────────────────┤ ├─────────────────┤
│ FsDatastore │ │ IdbDatastore │
└─────────────────┘ └─────────────────┘
┌───────────┴───────────┐ ┌───────────┴───────────┐
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ /blocks │ │ /datastore │ │ /blocks │ │ /datastore │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ FlatfsDatastore │ │LevelDBDatastore │ │ IdbDatastore │ │ IdbDatastore │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
This provides a well defined interface for creating and interacting with an IPFS repo.
> npm install ipfs-repo
var IPFSRepo = require('ipfs-repo')
var IPFSRepo = require('ipfs-repo')
Loading this module through a script tag will make the IpfsRepo obj available in the global namespace.
<script src="https://unpkg.com/ipfs-repo/dist/index.min.js"></script>
<!-- OR -->
<script src="https://unpkg.com/ipfs-repo/dist/index.js"></script>
Example:
const Repo = require('ipfs-repo')
const repo = new Repo('/tmp/ipfs-repo')
await repo.init({ cool: 'config' })
await repo.open()
console.log('repo is ready')
This now has created the following structure, either on disk or as an in memory representation:
├── blocks
│ ├── SHARDING
│ └── _README
├── config
├── datastore
├── keys
└── version
new Repo(path[, options])Creates an IPFS Repo.
Arguments:
path (string, mandatory): the path for this repooptions (object, optional): may contain the following values
autoMigrate (bool, defaults to true): controls automatic migrations of repository.lock (Lock or string Deprecated): what type of lock to use. Lock has to be acquired when opening. string can be "fs" or "memory".storageBackends (object, optional): may contain the following values, which should each be a class implementing the datastore interface:
root (defaults to datastore-fs in Node.js and datastore-level in the browser). Defines the back-end type used for gets and puts of values at the root (repo.set(), repo.get())blocks (defaults to datastore-fs in Node.js and datastore-level in the browser). Defines the back-end type used for gets and puts of values at repo.blocks.keys (defaults to datastore-fs in Node.js and datastore-level in the browser). Defines the back-end type used for gets and puts of encrypted keys at repo.keysdatastore (defaults to datastore-level). Defines the back-end type used as the key-value store used for gets and puts of values at repo.datastore.const repo = new Repo('path/to/repo')
Promise repo.init ()Creates the necessary folder structure inside the repo.
Promise repo.open ()Locks the repo to prevent conflicts arising from simultaneous access.
Promise repo.close ()Unlocks the repo.
Promise<boolean> repo.exists ()Tells whether this repo exists or not. Returned promise resolves to a boolean.
Root repo:
Promise repo.put (key, value:Buffer)Put a value at the root of the repo.
key can be a buffer, a string or a Key.Promise<Buffer> repo.get (key)Get a value at the root of the repo.
key can be a buffer, a string or a Key.Promise<Boolean> repo.isInitialized ()The returned promise resolves to false if the repo has not been initialized and true if it has.
Promise repo.blocks.put (block:Block)block should be of type Block.Promise repo.blocks.putMany (blocks)Put many blocks.
block should be an Iterable or AsyncIterable that yields entries of type Block.Promise<Buffer> repo.blocks.get (cid)Get block.
cid is the content id of type CID.Promise repo.blocks.delete (cid:CID)cid should be of the type CID.Delete a block
Promise repo.blocks.deleteMany (cids)cids should be an Iterable or AsyncIterable that yields entries of the type CID.Delete many blocks
Datastore:
repo.datastoreThis contains a full implementation of the interface-datastore API.
Instead of using repo.set('config') this exposes an API that allows you to set and get a decoded config object, as well as, in a safe manner, change any of the config values individually.
Promise repo.config.set(key:string, value)Set a config value. value can be any object that is serializable to JSON.
key is a string specifying the object path. Example:await repo.config.set('a.b.c', 'c value')
const config = await repo.config.get()
assert.equal(config.a.b.c, 'c value')
Promise repo.config.replace(value)Set the whole config value. value can be any object that is serializable to JSON.
Promise<?> repo.config.get(key:string)Get a config value. Returned promise resolves to the same type that was set before.
key is a string specifying the object path. Example:const value = await repo.config.get('a.b.c')
console.log('config.a.b.c = ', value)
Promise<Object> repo.config.getAll()Get the entire config value.
Promise<boolean> repo.config.exists()Whether the config sub-repo exists.
Promise<Number> repo.version.get ()Gets the repo version (an integer).
Promise repo.version.set (version:Number)Sets the repo version
Promise<String> repo.apiAddr.get ()Gets the API address.
Promise repo.apiAddr.set (value)Sets the API address.
value should be a Multiaddr or a String representing a valid one.Promise<Object> repo.stat ()Gets the repo status.
Returned promise resolves to an Object with the following keys:
numObjectsrepoPathrepoSizeversionstorageMaxIPFS Repo comes with two built in locks: memory and fs. These can be imported via the following:
const fsLock = require('ipfs-repo/src/lock') // Default in Node.js
const memoryLock = require('ipfs-repo/src/lock-memory') // Default in browser
You can also provide your own custom Lock. It must be an object with the following interface:
Promise lock.lock (dir)Sets the lock if one does not already exist. If a lock already exists, should throw an error.
dir is a string to the directory the lock should be created at. The repo typically creates the lock at its root.
Returns closer, where closer has a close method for removing the lock.
Promise closer.close ()Closes the lock created by lock.open
If no error was thrown, the lock was successfully removed.
Promise<boolean> lock.locked (dir)Checks the existence of the lock.
dir is the path to the directory to check for the lock. The repo typically checks for the lock at its root.
Returned promise resolves to a boolean indicating the existence of the lock.
When there is a new repo migration and the version of repo is increased, don't
forget to propagate the changes into the test repo (test/test-repo).
For tools that run mainly in the browser environment, be aware that disabling automatic migrations leaves the user with no way to run the migrations because there is no CLI in the browser. In such a case, you should provide a way to trigger migrations manually.
There are some ways you can make this module better:
This repository falls under the IPFS Code of Conduct.
FAQs
IPFS Repo implementation
The npm package ipfs-repo receives a total of 1,493 weekly downloads. As such, ipfs-repo popularity was classified as popular.
We found that ipfs-repo demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.

Research
Destructive malware is rising across open source registries, using delays and kill switches to wipe code, break builds, and disrupt CI/CD.

Security News
Socket CTO Ahmad Nassri shares practical AI coding techniques, tools, and team workflows, plus what still feels noisy and why shipping remains human-led.