tableflip/js-ipfs

Name: js-ipfs

Owner: TABLEFLIP

Description: IPFS implementation in JavaScript

Forked from: ipfs/js-ipfs

Created: 2017-08-30 10:47:29.0

Updated: 2017-08-30 10:47:31.0

Pushed: 2017-09-08 15:58:01.0

Homepage: https://ipfs.io

Size: 3382

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

IPFS in JavaScript logo

The JavaScript implementation of the IPFS protocol.




Project status

We've come a long way, but this project is still in Alpha, lots of development is happening, API might change, beware of the Dragons ?..

Want to get started? Check our examples folder to learn how to spawn an IPFS node in Node.js and in the Browser.

You can check the development status at the Waffle Board.

Throughput Graph

Important to note: DHT and Relay are not finalized yet, you won't have resource discovery happening by default as you get in go-ipfs, we are working actively on these pieces, please follow:

Table of Contents
Install

This project is available through npm. To install run

m install ipfs --save

Requires npm@3 and node@6 or above, tested on OSX & Linux, expected to work on Windows.

Use in Node.js

To include this project programmatically:

t IPFS = require('ipfs')
t node = new IPFS()
Through command line tool

In order to use js-ipfs as a CLI, you must install it with the global flag. Run the following (even if you have ipfs installed locally):

m install ipfs --global

The CLI is available by using the command jsipfs in your terminal. This is aliased, instead of using ipfs, to make sure it does not conflict with the Go implementation.

Use in the browser

Learn how to bundle with browserify and webpack in the examples folder.

You can also load it using a <script> using the unpkg CDN. Inserting one of the following lines will make a Ipfs object available in the global namespace.

ipt src="https://unpkg.com/ipfs/dist/index.min.js"></script> <!-- loading the minified version -->
ipt src="https://unpkg.com/ipfs/dist/index.js"></script>     <!-- loading the human-readable (not minified) version -->
Usage
CLI

The jsipfs CLI, available when js-ipfs is installed globally, follows(should, it is a WIP) the same interface defined by go-ipfs, you can always use the help command for help menus.

stall js-ipfs globally
m install ipfs --global
ipfs --help
ands:
tswap               A set of commands to manipulate the bitswap agent.
ock                 Manipulate raw IPFS blocks.
otstrap             Show or edit the list of bootstrap peers.
mmands              List all available commands
nfig <key> [value]  Get and set IPFS config values
emon                Start a long-running daemon process
.

js-ipfs uses some different default config values, so that they don't clash directly with a go-ipfs node running in the same machine. These are:

HTTP-API

The HTTP-API exposed by the js-ipfs daemon follows the http-api-spec. You can use any of the IPFS HTTP-API client libraries with it, such as: js-ipfs-api.

IPFS Core (use IPFS as a module)
Create a IPFS node instance

Creating an IPFS instance couldn't be easier, all you have to do is:

reate the IPFS node instance
t node = new IPFS()

.on('ready', () => {
 Your node is now ready to use \o/

 stopping a node
de.stop(() => {
// node is now 'offline'


Advanced options when creating an IPFS node.

When starting a node, you can:

PFS will need a repo, it can create one for you or you can pass
t a repo instance of the type IPFS Repo
ttps://github.com/ipfs/js-ipfs-repo
t repo = <IPFS Repo instance or repo path>

t node = new IPFS({
po: repo,
it: true, // default
 init: false,
 init: {
   bits: 1024 // size of the RSA key generated
 },
art: true,
 start: false,
PERIMENTAL: { // enable experimental features
pubsub: true,
sharding: true, // enable dir sharding
dht: true // enable KadDHT, currently not interopable with go-ipfs

nfig: { // overload the default IPFS node config
Addresses: {
  Swarm: [
    '/ip4/127.0.0.1/tcp/1337'
  ]
}

bp2p: { // add custom modules to the libp2p stack of your node
modules: {}



vents

.on('ready', () => {})    // Node is ready to use when you first create it
.on('error', (err) => {}) // Node has hit some error while initing/starting

.on('init', () => {})     // Node has successfully finished initing the repo
.on('start', () => {})    // Node has started
.on('stop', () => {})     // Node has stopped
Tutorials and Examples

You can find some examples and tutorials in the examples folder, these exist to help you get started using js-ipfs.

API

A complete API definition is in the works. Meanwhile, you can learn how to you use js-ipfs through the standard interface at .

files dag pubsub libp2p

Every IPFS instance also exposes the libp2p API at ipfs.libp2p. The formal interface for this API hasn't been defined by you can find documentation at its implementations:

miscellaneous operations bitswap block config bootstrap repo swarm object

Consider using the dag API API instead.

Domain data types

A set of data types are exposed directly from the IPFS instance under ipfs.types. That way you're not required to import/require the following.

dht (not implemented, yet!) pin (not implemented, yet!)
FAQ
Is there WebRTC support for js-ipfs with Node.js?

Yes, however, bare in mind that there isn't a 100% stable solution to use WebRTC in Node.js, use it at your own risk. The most tested options are:

To add WebRTC support in a IPFS node instance, do:

t wrtc = require('wrtc') // or require('electron-webrtc')()
t WStar = require('libp2p-webrtc-star')
t wstar = new WStar({ wrtc: wrtc })

t node = new IPFS({
po: 'your-repo-path',
 start: false,
nfig: {
Addresses: {
  Swarm: [
    "/ip4/0.0.0.0/tcp/4002",
    "/ip4/127.0.0.1/tcp/4003/ws",
    "/dns4/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star"
  ]
}

bp2p: {
modules: {
  transport: [wstar],
  discovery: [wstar.discovery]
}



.on('ready', () => {
 your instance with WebRTC is ready

To add WebRTC support to the IPFS daemon, you only need to install one of the WebRTC modules globally:

install wrtc --global

install electron-webrtc --global

Then, update your IPFS Daemon config to include the multiaddr for this new transport on the Addresses.Swarm array. Add: "/dns4/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star"

Packages

| Package | Version | Deps | DevDeps | Build | |———|———|————–|—————–|———–| | API Specs | | interface-ipfs-core | npm | Dep Status | devDep Status | Build Status | | http-api-spec | | cli spec | | Repo | | ipfs-repo | npm | Dep Status | devDep Status | Build Status | | DAG | | ipld-resolver | npm | Dep Status | devDep Status | Build Status | | ipld-dag-pb | npm | Dep Status | devDep Status | Build Status | | ipld-dag-cbor | npm | Dep Status | devDep Status | Build Status | | Files | | ipfs-unixfs-engine | npm | Dep Status | devDep Status | Build Status | | Exchange | | ipfs-block-service | npm | Dep Status | devDep Status | Build Status | | Swarm/libp2p | | js-libp2p | npm | Dep Status | devDep Status | Build Status | | Data Types | | ipfs-block | npm | Dep Status | devDep Status | Build Status | | ipfs-unixfs | npm | Dep Status | devDep Status | Build Status | | peer-id | npm | Dep Status | devDep Status | Build Status | | peer-info | npm | Dep Status | devDep Status | Build Status | | multiaddr | npm | Dep Status | devDep Status | Build Status | | multihashes | npm | Dep Status | devDep Status | Build Status | | Generics/Utils | | ipfs-api | npm | Dep Status | devDep Status | Build Status | | ipfs-multipart | npm | Dep Status | devDep Status | Build Status | | multihashing | npm | Dep Status | devDep Status | Build Status | | mafmt | npm | Dep Status | devDep Status | Build Status |

Development
Clone and install dependencies
t clone https://github.com/ipfs/js-ipfs.git
 js-ipfs
m install
Run unit tests
n all the unit tsts
m test

n just IPFS tests in Node.js
m run test:unit:node:core

n just IPFS core tests
m run test:unit:node:core

n just IPFS HTTP-API tests
m run test:unit:node:http

n just IPFS CLI tests
m run test:unit:node:cli

n just IPFS core tests in the Browser (Chrome)
m run test:unit:browser
Run interop tests
n all the interop tsts
m run test:interop

n just IPFS interop tests in Node.js using one go-ipfs daemon and one js-ipfs daemon
m run test:interop:node

n just IPFS interop testsin the Browser (Chrome) using one instance in the browser and one go-ipfs daemon
m run test:interop:browser
Run benchmark tests
n all the benchmark tests
m run test:benchmark

n just IPFS benchmarks in Node.js
m run test:benchmark:node

n just IPFS benchmarks in Node.js for an IPFS instance
m run test:benchmark:node:core

n just IPFS benchmarks in Node.js for an IPFS daemon
m run test:benchmark:node:http

n just IPFS benchmarks in the browser (Chrome)
m run test:benchmark:browser
Lint

Conforming to linting rules is a prerequisite to commit to js-ipfs.

m run lint
Build a dist version
m run build
Runtime Support
Code Architecture and folder Structure

Source code
ee src -L 2
                # Main source code folder
cli             # Implementation of the IPFS CLI
??? ...
http-api        # The HTTP-API implementation of IPFS as defined by http-api-spec
core            # IPFS implementation, the core (what gets loaded in browser)
??? components  # Each of IPFS subcomponent
??? ...
...
Monitoring

The HTTP API exposed with js-ipfs can also be used for exposing metrics about the running js-ipfs node and other nodejs metrics.

To enable it, you need to set the environment variable IPFS_MONITORING (any value)

Once environment variable is set and the js-ipfs daemon is running, you can get the metrics (in prometheus format) by making a GET request to the following endpoint:

://localhost:5002/debug/metrics/prometheus
IPFS Core Architecture

What does this image explain?

Contribute

IPFS implementation in JavaScript is a work in progress. As such, there's a few things you can do right now to help out:

Want to hack on IPFS?

License

FOSSA Status


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.