Skip to content
This repository was archived by the owner on Apr 29, 2020. It is now read-only.

Commit 0c88649

Browse files
committed
Merge pull request #1 from ipfs/aegir
First working version
2 parents 720bc21 + c15b0fc commit 0c88649

File tree

10 files changed

+29871
-0
lines changed

10 files changed

+29871
-0
lines changed

Diff for: .gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ node_modules
3131

3232
# Optional REPL history
3333
.node_repl_history
34+
35+
lib
36+
dist

Diff for: .npmignore

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
6+
# Runtime data
7+
pids
8+
*.pid
9+
*.seed
10+
11+
# Directory for instrumented libs generated by jscoverage/JSCover
12+
lib-cov
13+
14+
# Coverage directory used by tools like istanbul
15+
coverage
16+
17+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
18+
.grunt
19+
20+
# node-waf configuration
21+
.lock-wscript
22+
23+
# Compiled binary addons (http://nodejs.org/api/addons.html)
24+
build/Release
25+
26+
# Dependency directory
27+
node_modules
28+
29+
# Optional npm cache directory
30+
.npm
31+
32+
# Optional REPL history
33+
.node_repl_history
34+
35+
test

Diff for: .travis.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
sudo: false
2+
language: node_js
3+
node_js:
4+
- 4
5+
- 5
6+
7+
# Make sure we have new NPM.
8+
before_install:
9+
- npm install -g npm
10+
11+
script:
12+
- npm run lint
13+
- npm test
14+
- npm run coverage
15+
16+
addons:
17+
firefox: 'latest'
18+
19+
before_script:
20+
- export DISPLAY=:99.0
21+
- sh -e /etc/init.d/xvfb start
22+
23+
after_success:
24+
- npm run coverage-publish

Diff for: circle.yml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
machine:
2+
node:
3+
version: stable
4+
5+
dependencies:
6+
pre:
7+
- google-chrome --version
8+
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
9+
- sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
10+
- sudo apt-get update
11+
- sudo apt-get --only-upgrade install google-chrome-stable
12+
- google-chrome --version

Diff for: gulpfile.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
'use strict'
2+
3+
const gulp = require('gulp')
4+
const multiaddr = require('multiaddr')
5+
const Node = require('libp2p-ipfs').Node
6+
const Peer = require('peer-info')
7+
const Id = require('peer-id')
8+
9+
let node
10+
const rawPeer = require('./test/peer.json')
11+
const id = new Id(rawPeer.id, rawPeer.privKey, rawPeer.pubKey)
12+
13+
gulp.task('libnode:start', (done) => {
14+
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/websockets')
15+
const peer = new Peer(id)
16+
peer.multiaddr.add(mh)
17+
18+
node = new Node(peer)
19+
node.start(() => {
20+
node.swarm.handle('/echo/1.0.0', (conn) => {
21+
conn.pipe(conn)
22+
})
23+
done()
24+
})
25+
})
26+
27+
gulp.task('libnode:stop', (done) => {
28+
node.swarm.close(done)
29+
})
30+
31+
gulp.task('test:browser:before', ['libnode:start'])
32+
gulp.task('test:node:before', ['libnode:start'])
33+
gulp.task('test:browser:after', ['libnode:stop'])
34+
gulp.task('test:node:after', ['libnode:stop'])
35+
36+
require('aegir/gulp')(gulp)

Diff for: package.json

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"name": "js-libp2p-ipfs-browser",
3+
"version": "1.0.0",
4+
"description": "libp2p build (module) used in js-ipfs when running it on the browser",
5+
"main": "lib/index.js",
6+
"jsnext:main": "src/index.js",
7+
"pre-commit": [
8+
"lint",
9+
"test"
10+
],
11+
"scripts": {
12+
"test": "gulp test",
13+
"lint": "aegir-lint",
14+
"test:node": "gulp test:node",
15+
"test:browser": "gulp test:browser",
16+
"build": "gulp build",
17+
"release": "gulp release",
18+
"coverage": "gulp coverage",
19+
"coverage-publish": "aegir-coverage publish"
20+
},
21+
"repository": {
22+
"type": "git",
23+
"url": "git+https://github.com/ipfs/js-libp2p-ipfs-browser.git"
24+
},
25+
"author": "Friedel Ziegelmayer <dignifiedquire@gmail.com>",
26+
"license": "MIT",
27+
"bugs": {
28+
"url": "https://github.com/ipfs/js-libp2p-ipfs-browser/issues"
29+
},
30+
"homepage": "https://github.com/ipfs/js-libp2p-ipfs-browser#readme",
31+
"devDependencies": {
32+
"aegir": "^2.1.1",
33+
"chai": "^3.5.0",
34+
"gulp": "^3.9.1",
35+
"libp2p-ipfs": "^0.3.1",
36+
"peer-id": "^0.6.6",
37+
"pre-commit": "^1.1.2"
38+
},
39+
"dependencies": {
40+
"babel-runtime": "^6.6.1",
41+
"libp2p-spdy": "^0.3.1",
42+
"libp2p-swarm": "^0.10.5",
43+
"libp2p-websockets": "^0.3.2",
44+
"multiaddr": "^1.4.0",
45+
"peer-info": "^0.6.1"
46+
},
47+
"aegir": {
48+
"webpack": {
49+
"resolve": {
50+
"alias": {
51+
"node-forge": "../vendor/forge.bundle.js"
52+
}
53+
}
54+
}
55+
}
56+
}

Diff for: src/index.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'use strict'
2+
3+
const Swarm = require('libp2p-swarm')
4+
const Peer = require('peer-info')
5+
const WS = require('libp2p-websockets')
6+
const spdy = require('libp2p-spdy')
7+
8+
exports = module.exports
9+
10+
exports.Node = function Node (peerInfo) {
11+
if (!(this instanceof Node)) {
12+
return new Node(peerInfo)
13+
}
14+
if (!peerInfo) {
15+
peerInfo = new Peer()
16+
}
17+
18+
this.peerInfo = peerInfo
19+
20+
// Swarm
21+
this.swarm = new Swarm(peerInfo)
22+
this.swarm.transport.add('ws', new WS())
23+
this.swarm.connection.addStreamMuxer(spdy)
24+
this.swarm.connection.reuse()
25+
26+
this.start = (callback) => {
27+
// Yeah empty function, we can't actually do anything here, yet.
28+
callback()
29+
}
30+
31+
this.routing = null
32+
this.records = null
33+
34+
this.dial = () => {
35+
throw new Error('THIS WILL BE EQUIVALENT TO THE ROUTED HOST FEATURE, IT WILL FIGURE OUT EVERYTHING :D')
36+
}
37+
}

Diff for: test/index.spec.js

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/* eslint-env mocha */
2+
'use strict'
3+
4+
const expect = require('chai').expect
5+
const multiaddr = require('multiaddr')
6+
const Peer = require('peer-info')
7+
const Id = require('peer-id')
8+
9+
const Node = require('../src').Node
10+
const rawPeer = require('./peer.json')
11+
const id = new Id(rawPeer.id, rawPeer.privKey, rawPeer.pubKey)
12+
13+
describe('libp2p-ipfs-browser', function () {
14+
this.timeout(10000)
15+
let node
16+
17+
it('start', (done) => {
18+
node = new Node()
19+
node.start(done)
20+
})
21+
22+
it('echo', (done) => {
23+
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/websockets')
24+
const peer = new Peer(id)
25+
peer.multiaddr.add(mh)
26+
27+
const message = 'Hello World!'
28+
node.swarm.dial(peer, '/echo/1.0.0', (err, conn) => {
29+
expect(err).to.not.exist
30+
31+
conn.write(message)
32+
conn.on('data', (data) => {
33+
expect(data.toString()).to.equal(message)
34+
35+
conn.end()
36+
done()
37+
})
38+
})
39+
})
40+
41+
describe('stress', () => {
42+
it('one big write', (done) => {
43+
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/websockets')
44+
const peer = new Peer(id)
45+
peer.multiaddr.add(mh)
46+
47+
const message = new Buffer(1000000).fill('a').toString('hex')
48+
node.swarm.dial(peer, '/echo/1.0.0', (err, conn) => {
49+
expect(err).to.not.exist
50+
51+
conn.write(message)
52+
conn.write('STOP')
53+
54+
let result = ''
55+
conn.on('data', (data) => {
56+
if (data.toString() === 'STOP') {
57+
conn.end()
58+
return
59+
}
60+
result += data.toString()
61+
})
62+
63+
conn.on('end', () => {
64+
expect(result).to.equal(message)
65+
done()
66+
})
67+
})
68+
})
69+
70+
it('many writes in 2 batches', (done) => {
71+
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/websockets')
72+
const peer = new Peer(id)
73+
peer.multiaddr.add(mh)
74+
75+
let expected = ''
76+
let counter = 0
77+
78+
node.swarm.dial(peer, '/echo/1.0.0', (err, conn) => {
79+
expect(err).to.not.exist
80+
81+
while (++counter < 10000) {
82+
conn.write(`${counter} `)
83+
expected += `${counter} `
84+
}
85+
86+
setTimeout(() => {
87+
while (++counter < 20000) {
88+
conn.write(`${counter} `)
89+
expected += `${counter} `
90+
}
91+
92+
conn.write('STOP')
93+
}, 1000)
94+
95+
let result = ''
96+
conn.on('data', (data) => {
97+
if (data.toString() === 'STOP') {
98+
conn.end()
99+
return
100+
}
101+
result += data.toString()
102+
})
103+
104+
conn.on('end', () => {
105+
expect(result).to.equal(expected)
106+
done()
107+
})
108+
})
109+
})
110+
})
111+
})

Diff for: test/peer.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "QmZpyYZHbDXhghpm2D5LqWF2otYrr1HhkScAjWCMSc157i",
3+
"privKey": "080012a709308204a3020100028201010095404e93fabdd36406d2e9ab6efe8be152f7682d4889b686717dba73eb9453bbdef6ef4a02ecc4dd4a413ac01b5abbb62f362a7c56a4f52fa60c903aa58967442f97fc2d4e1d9566df842d24f0297a889a12d15de11e95b9e826e0c720f531ff6465583b71061dc6b017579e24e139976c3a100b49ed152db23eadac5db16df48288381a621fee64b25fd620458290494bd188941e27840250019d4b08443ce32054be6fd8bd7e3af23dcc49de6899c385f4aa29073f23a2f96ede5400aa7b986812d1d79f81c1d0d0b78765b9c7c56fa585181a6beb78accfc630afe02d8602786540cb26fe5c0e85ffa5b6d121bd607eab98aa7e6e49b39e00b912e5e7d3b9020301000102820100438be3041dcaa34cf5b9a67f2bb08fe5de0292674c18e73e5946a987a4ea702aea719f4243a89c3ffa47232ba6359e1689af5df2ffd390138c76cb1f7fa37bd4e42548bfc846a342f78d7e50e55020608a3a51fec6cf6cbbc251361168dd0f4fa2442b765b64853d529c7dced8aa05c27dfc991e42cac576f4e061014d35eba8b59fdc15e49d569aa5ce8c5678fae1b2cfa1233cdd608019dcdcf1fef3a2cf3f00b296795d74ea4543655f86b2d2b510f2cf4809860243329bc9b2ebf47e3bda4d8c1ea09607b114b78c2e253055cf3c05bac2bba1c7b75c1cdffe137e2065595d7b088b73af4a4f31a6ff795ac41bc9a892357735015e9a088a72e5331274c102818100e798357f07a44e2cc107d8f136025bcea47dbe9bb21e840029c4f40ce4b096b1ded08d405b4a3c1010b8994b673611807812bfcc2a57b40af665160806f41cf32073e652e2a5ac9c1e80a2eb3a5a7ee91af1f86ce617a8ed1bf83c28079b935b76d0c2efc49d67fe2b1b43fcd7016a4d076c4e34f85c38b015a27a25b8e6328d02818100a4fab2b3a719837e81ec266e930ffa1558d19b3dc6d2b6ef155d5da27ce947a5fbef8074552cc2f5c4880a1dc258681f5b5a8deef412689cc02079e960d1899fc73cc3d7f88ce41bbabbf8632c17d4ae9db63b35333732b2a668763e7abbb1510ccc0f0bc92b5a9d751ca5aaf95aa62959efddddf0786f719ac3fea50972f0dd02818054ca3b3bc8d674f099b37fcfc01059006ce4c4b6481e3801bf492678d9f97512a61b00bc01304a912f2e06a1bea5e2fe7ff78d54f863a7bd23bc9ab651a56a3bf133bdadb6e12532fb4fe955e9c55c158811f2fc1bb9a9d5359a4a9bf53d16543449f634c66d42b7a19c97e5a7ea12bb24ee982b788a7b0eacbd11af61e495b902818001c1d1c96c0c2f845769e676e3061689c7aa63d6e29937ed8ff2b09e9c69f7a362ed8816b51986f20b27cfc3c5601fabc5d34f13ae71cbbf6fa468e7fd69fde73fbdfbeffeebb13a4260e2225c43dcb60763fb79739430ec0a2daea4b7b5ec0b8af1596facb2d3823dcf124ca1df3f49cd756a8d849423cbb7f442700b8bb7d90281810085e74f432629b16a9467090fab232c7e40d5d949029539db4e35c91a2dbad7275648f638c3630ef5fea40dd9d930e5dca5851eb4f24c3f93d414717539707353f19be404dc7b180a52980bf76b8b13ad411eb58a88b67b6885485240454e93dea69ab36eec754454ac9843b1adba43eaf9cfe751bf47170ec90d9b71afbf49b9",
4+
"pubKey": "080012a60230820122300d06092a864886f70d01010105000382010f003082010a028201010095404e93fabdd36406d2e9ab6efe8be152f7682d4889b686717dba73eb9453bbdef6ef4a02ecc4dd4a413ac01b5abbb62f362a7c56a4f52fa60c903aa58967442f97fc2d4e1d9566df842d24f0297a889a12d15de11e95b9e826e0c720f531ff6465583b71061dc6b017579e24e139976c3a100b49ed152db23eadac5db16df48288381a621fee64b25fd620458290494bd188941e27840250019d4b08443ce32054be6fd8bd7e3af23dcc49de6899c385f4aa29073f23a2f96ede5400aa7b986812d1d79f81c1d0d0b78765b9c7c56fa585181a6beb78accfc630afe02d8602786540cb26fe5c0e85ffa5b6d121bd607eab98aa7e6e49b39e00b912e5e7d3b90203010001"
5+
}

0 commit comments

Comments
 (0)