Compare commits

...

47 Commits

Author SHA1 Message Date
6442bb4b59 Release v0.5.3. 2016-03-05 21:56:53 +00:00
33ff2aa608 Merge pull request #8 from diasdavid/update/git-repo
add git repo and fix codestyle issues
2016-03-05 21:56:36 +00:00
bbeb6fc0f6 add git repo and fix codestyle issues 2016-03-05 21:54:18 +00:00
f518ced776 add git repo to the package.json 2016-03-05 21:49:26 +00:00
73b42ff2aa dist file 2016-03-03 14:19:10 -08:00
b3e3dbe3c0 Release v0.5.1. 2016-03-03 17:45:53 +00:00
b2b90bfbb5 remove jshintrc and jshintignore 2016-03-03 17:43:30 +00:00
d9113d55e0 Merge pull request #6 from diasdavid/cleanup
came to fix a square bracket, ended up touch a bunch of other things :)
2016-03-03 17:39:14 +00:00
59b89039b6 came to fix a square bracket, ended up touch a bunch of other things :) 2016-03-03 17:31:33 +00:00
1cdbf19857 Release v0.5.0. 2016-02-14 07:37:10 +00:00
845bd088fe add coverage, fix codestyle 2016-02-14 07:32:09 +00:00
1f72aaf7b7 Merge pull request #4 from nginnever/master
public key derivation from private key stored in go-ipfs config file
2016-02-14 07:24:06 +00:00
effa21b892 removed node forge bundle comment 2016-02-13 13:46:33 -08:00
91bc56eb05 small grammar changes 2016-02-13 07:49:51 -08:00
3cc3cb31f0 removed uneeded dev deps 2016-02-12 20:09:42 -08:00
de572bd15f Merge branch 'master' of https://github.com/nginnever/js-peer-id 2016-02-12 19:56:37 -08:00
1a336f9289 cleanup changes 2016-02-12 19:55:44 -08:00
77790571aa Delete id-test.js 2016-02-12 19:50:55 -08:00
d9b9ca8812 Delete crypto.proto 2016-02-12 19:45:50 -08:00
67c26ec546 travis addons 2016-02-12 16:38:29 -08:00
58fe038e07 time out increased 2016-02-12 16:13:09 -08:00
61c0c663d6 new timeout set 2016-02-12 16:06:40 -08:00
8adbdd0d6e Merge https://github.com/diasdavid/js-peer-id 2016-02-12 15:29:26 -08:00
7ae9be8f71 new tests 2016-02-12 14:55:05 -08:00
16c77433f9 getting ready to rewrite tests 2016-02-10 13:55:59 -08:00
6ce01ab434 keys now generated and derived match with go client 2016-02-04 12:02:18 -08:00
5cb511c646 added create id from private key 2016-02-04 12:01:58 -08:00
370e5c55b1 Release v0.4.0. 2015-11-05 18:51:53 +00:00
e3cc273a14 Merge pull request #3 from diasdavid/update
tests, browser tests, move to RSA based key (instead of ECDH), conform with go-ipfs
2015-11-05 18:51:21 +00:00
2c1874a689 merge latest master 2015-11-05 18:48:13 +00:00
3c0c9a3b19 tests and browser tests setup 2015-11-05 18:46:02 +00:00
d7ab4bd8fb complement readme 2015-11-05 17:47:44 +00:00
9aee5bf670 abandon ECD for RSA, in order to conform with go impl 2015-11-05 17:35:23 +00:00
5e9bf9837d Release v0.3.4. 2015-10-28 22:06:37 +00:00
f82d0d6ac5 Merge pull request #1 from diasdavid/rn
update README and package.json
2015-10-28 22:05:12 +00:00
0b30a0964c update README and package.json 2015-10-28 22:04:55 +00:00
9b2cb012e9 Release v0.3.3. 2015-09-15 17:18:08 +01:00
35102b4ad5 Release v0.3.2. 2015-09-15 17:17:59 +01:00
192c65f09a update readme 2015-09-15 17:17:50 +01:00
dda0204ec0 merge package.json conflict 2015-09-15 17:16:09 +01:00
1096d15a16 Rename 2015-09-15 17:14:48 +01:00
615a966d6a Release v0.3.2. 2015-09-14 11:58:41 +01:00
171a561537 to v4! 2015-09-14 11:58:33 +01:00
fa62838777 Release v0.3.1. 2015-08-25 10:39:44 +01:00
bb2f23633d replace precommit 2015-08-25 10:39:15 +01:00
d472664924 add badges and travis 2015-08-25 10:38:32 +01:00
2cc1a8ac59 Release v0.3.0. 2015-07-19 14:21:56 -07:00
13 changed files with 85084 additions and 54 deletions

View File

@ -1 +0,0 @@
node_modules

View File

@ -1,10 +0,0 @@
{
"node": true,
"curly": true,
"latedef": true,
"quotmark": true,
"undef": true,
"unused": true,
"trailing": true
}

21
.travis.yml Normal file
View File

@ -0,0 +1,21 @@
language: node_js
node_js:
- "4.0"
branches:
only:
- master
before_install:
- npm i -g npm
# Workaround for a permissions issue with Travis virtual machine images
addons:
firefox: 'latest'
before_script:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
script:
- npm test

View File

@ -1,44 +1,71 @@
ipfs-peer-id Node.js implementation peer-id JavaScript implementation
=================================== =================================
[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io)
[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs)
[![Build Status](https://travis-ci.org/diasdavid/js-peer-id.svg?style=flat-square)](https://travis-ci.org/diasdavid/js-peer-id)
> IPFS Peer Id implementation in Node.js ![](https://img.shields.io/badge/coverage-95%25-yellow.svg?style=flat-square)
[![Dependency Status](https://david-dm.org/diasdavid/js-peer-id.svg?style=flat-square)](https://david-dm.org/diasdavid/js-peer-id)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
> IPFS Peer Id implementation in JavaScript
# Description # Description
A IPFS Peer Id is based on a sha256 has of the peer public key, using [multihash](https://github.com/jbenet/multihash) An IPFS Peer Id is based on a sha256 hash of the peer public key, using [multihash](https://github.com/jbenet/multihash)
The public key is a base64 encoded string of a protobuf containing an RSA DER buffer. This uses a node buffer to pass the base64 encoded public key protobuf to the multihash for ID generation.
# Usage # Usage
### Installing ### In Node.js through npm
```bash
> npm install --save peer-id
``` ```
$ npm install ipfs-peer-id
```javascript
const PeerId = require('peer-id')
``` ```
### In the Browser through browserify
TODO: Figure out how to get this working with browserify and webpack. Browserify can't bundle our replacement of ```fs.readFileSync``` with ```require('buffer!./file')```.
### In the Browser through `<script>` tag
Make the [peer-id.js](/dist/peer-id.js) available through your server and load it using a normal `<script>` tag, this will export the `PeerId` object, such that:
```JavaScript
const Id = PeerId
```
#### Gotchas
You will need to use Node.js `Buffer` API compatible, if you are running inside the browser, you can access it by `PeerId.Buffer` or you can install Feross's [Buffer](https://github.com/feross/buffer).
### Creating a new Id ### Creating a new Id
``` ```
var PeerId = require('ipfs-peer') const PeerId = require('ipfs-peer')
// Create a new Id // Create a new Id
var id = new Id.create() const id = PeerId.create()
// Recreate an Id from Hex string // Recreate an Id from Hex string
var id = new Id.createFromHexString(str) const id = PeerId.createFromHexString(str)
// Recreate an Id from a Buffer // Recreate an Id from a Buffer
var id = new Id.createFromBytes(buf) const id = PeerId.createFromBytes(buf)
// Recreate an B58 String // Recreate an B58 String
var id = new Id.createFromB58String(str) const id = PeerId.createFromB58String(str)
// Recreate from a Public Key // Recreate from a Public Key
var id = new Id.createFromPubKey(pubKey) const id = PeerId.createFromPubKey(pubKey)
// Recreate from a Private Key // Recreate from a Private Key
var id = new Id.createFromPrivKey(privKey) const id = PeerId.createFromPrivKey(privKey)
``` ```
### Exporting an Id ### Exporting an Id

29552
deps/forge.bundle.js vendored Normal file

File diff suppressed because it is too large Load Diff

55163
dist/peer-id.js vendored Normal file

File diff suppressed because one or more lines are too long

61
karma.conf.js Normal file
View File

@ -0,0 +1,61 @@
module.exports = (config) => {
const path = require('path')
const node_modules_dir = path.join(__dirname, 'node_modules')
const deps = [
'deps/forge.bundle.js'
]
config.set({
basePath: '',
frameworks: ['mocha'],
files: [
'tests/test.js'
],
preprocessors: {
'tests/*': ['webpack']
},
webpack: {
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
},
resolve: {
extensions: ['', '.js', '.json'],
alias: { 'node-forge': path.resolve(__dirname, 'deps/forge.bundle.js') }
},
externals: {
fs: '{}'
},
node: {
Buffer: true
},
module: {
loaders: [
{ test: /\.json$/, loader: 'json' }
],
noParse: []
}
},
webpackMiddleware: {
noInfo: true,
stats: {
colors: true
}
},
reporters: ['spec'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: process.env.TRAVIS ? ['Firefox'] : ['Chrome'],
singleRun: true
})
deps.forEach((dep) => {
const depPath = path.resolve(node_modules_dir, dep)
config.webpack.module.noParse.push(depPath)
})
}

View File

@ -1,12 +1,21 @@
{ {
"name": "ipfs-peer-id", "name": "peer-id",
"version": "0.2.0", "version": "0.5.3",
"description": "IPFS Peer Id implementation in Node.js", "description": "IPFS Peer Id implementation in Node.js",
"main": "src/index.js", "main": "src/index.js",
"scripts": { "scripts": {
"test": "./node_modules/.bin/lab tests/*-test.js", "lint": "standard",
"coverage": "./node_modules/.bin/lab -t 100 tests/*-test.js", "test": "npm run test:node && npm run test:browser",
"codestyle": "./node_modules/.bin/standard --format" "test:node": "mocha tests/test.js",
"test:browser": "karma start karma.conf.js",
"coverage": "istanbul cover --print both -- _mocha tests/test.js",
"build": "webpack"
},
"standard": {
"ignore": [
"dist",
"deps"
]
}, },
"keywords": [ "keywords": [
"IPFS" "IPFS"
@ -14,21 +23,42 @@
"author": "David Dias <daviddias@ipfs.io>", "author": "David Dias <daviddias@ipfs.io>",
"license": "MIT", "license": "MIT",
"pre-commit": [ "pre-commit": [
"codestyle", "lint",
"test" "test"
], ],
"bugs": { "engines": {
"url": "https://github.com/diasdavid/node-ipfs-peer-id/issues" "node": "^4.3.0"
}, },
"homepage": "https://github.com/diasdavid/node-ipfs-peer-id", "bugs": {
"url": "https://github.com/diasdavid/js-peer-id/issues"
},
"homepage": "https://github.com/diasdavid/js-peer-id",
"devDependencies": { "devDependencies": {
"code": "^1.4.1", "browserify": "^13.0.0",
"lab": "^5.13.0", "buffer-loader": "0.0.1",
"precommit-hook": "^3.0.0", "chai": "^3.5.0",
"standard": "^4.5.2" "istanbul": "^0.4.2",
"json-loader": "^0.5.4",
"karma": "^0.13.19",
"karma-chrome-launcher": "^0.2.2",
"karma-cli": "^0.1.2",
"karma-firefox-launcher": "^0.1.7",
"karma-mocha": "^0.2.1",
"karma-spec-reporter": "0.0.24",
"karma-webpack": "^1.7.0",
"mocha": "^2.4.5",
"pre-commit": "^1.1.1",
"standard": "^6.0.7",
"webpack": "^1.12.14"
}, },
"dependencies": { "dependencies": {
"bs58": "^2.0.1", "bs58": "^3.0.0",
"multihashing": "^0.1.3" "multihashing": "^0.2.0",
"node-forge": "^0.6.38",
"protocol-buffers": "^3.1.4"
},
"repository": {
"type": "git",
"url": "https://github.com/diasdavid/js-peer-id.git"
} }
} }

View File

@ -2,14 +2,25 @@
* Id is an object representation of a peer Id. a peer Id is a multihash * Id is an object representation of a peer Id. a peer Id is a multihash
*/ */
var multihashing = require('multihashing') const fs = require('fs')
var base58 = require('bs58') const multihashing = require('multihashing')
var crypto = require('crypto') const base58 = require('bs58')
const forge = require('node-forge')
const protobuf = require('protocol-buffers')
const path = require('path')
const isNode = !global.window
// protobuf read from file
const messages = isNode ? protobuf(fs.readFileSync(path.resolve(__dirname, 'pb/crypto.proto')))
: protobuf(require('buffer!./pb/crypto.proto'))
exports = module.exports = Id exports = module.exports = Id
exports.Buffer = Buffer
function Id (id, privKey, pubKey) { function Id (id, privKey, pubKey) {
var self = this const self = this
if (!(self instanceof Id)) { if (!(self instanceof Id)) {
throw new Error('Id must be called with new') throw new Error('Id must be called with new')
@ -23,7 +34,7 @@ function Id (id, privKey, pubKey) {
self.toPrint = function () { self.toPrint = function () {
return { return {
id: id.toHexString(), id: self.toB58String(),
privKey: privKey.toString('hex'), privKey: privKey.toString('hex'),
pubKey: pubKey.toString('hex') pubKey: pubKey.toString('hex')
} }
@ -42,22 +53,72 @@ function Id (id, privKey, pubKey) {
self.toB58String = function () { self.toB58String = function () {
return base58.encode(self.id) return base58.encode(self.id)
} }
}
// unwrap the private key protobuf
function unmarshal (key) {
return messages.PrivateKey.decode(key)
}
// create a public key protobuf to be base64 string stored in config
function marshal (data, type) {
var epb
if (type === 'Public') {
epb = messages.PublicKey.encode({
Type: 0,
Data: data
})
}
if (type === 'Private') {
epb = messages.PrivateKey.encode({
Type: 0,
Data: data
})
}
return epb
}
// this returns a base64 encoded protobuf of the public key
function formatKey (key, type) {
// create der buffer of public key asn.1 object
const der = forge.asn1.toDer(key)
// create forge buffer of der public key buffer
const fDerBuf = forge.util.createBuffer(der.data, 'binary')
// convert forge buffer to node buffer public key
const nDerBuf = new Buffer(fDerBuf.getBytes(), 'binary')
// protobuf the new DER bytes to the PublicKey Data: field
const marshalKey = marshal(nDerBuf, type)
// encode the protobuf public key to base64 string
const b64 = marshalKey.toString('base64')
return b64
} }
// generation // generation
exports.create = function () { exports.create = function () {
var ecdh = crypto.createECDH('secp256k1') // generate keys
ecdh.generateKeys() const pair = forge.rsa.generateKeyPair({ bits: 2048, e: 0x10001 })
var mhId = multihashing(ecdh.getPublicKey(), 'sha2-256') // return the RSA public/private key to asn1 object
const asnPub = forge.pki.publicKeyToAsn1(pair.publicKey)
const asnPriv = forge.pki.privateKeyToAsn1(pair.privateKey)
return new Id(mhId, ecdh.getPrivateKey(), ecdh.getPublicKey()) // format the keys to protobuf base64 encoded string
const protoPublic64 = formatKey(asnPub, 'Public')
const protoPrivate64 = formatKey(asnPriv, 'Private')
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
return new Id(mhId, protoPrivate64, protoPublic64)
} }
exports.createFromHexString = function (str) { exports.createFromHexString = function (str) {
return new Id(new Buffer(str), 'hex') return new Id(new Buffer(str, 'hex'))
} }
exports.createFromBytes = function (buf) { exports.createFromBytes = function (buf) {
@ -69,10 +130,35 @@ exports.createFromB58String = function (str) {
} }
exports.createFromPubKey = function (pubKey) { exports.createFromPubKey = function (pubKey) {
var mhId = multihashing(pubKey, 'sha2-256') const buf = new Buffer(pubKey, 'base64')
const mhId = multihashing(buf, 'sha2-256')
return new Id(mhId, null, pubKey) return new Id(mhId, null, pubKey)
} }
exports.createFromPrivKey = function () { exports.createFromPrivKey = function (privKey) {
// TODO(daviddias) derive PubKey from priv // create a buffer from the base64 encoded string
const buf = new Buffer(privKey, 'base64')
// get the private key data from the protobuf
const mpk = unmarshal(buf)
// create a forge buffer
const fbuf = forge.util.createBuffer(mpk.Data.toString('binary'))
// create an asn1 object from the private key bytes saved in the protobuf Data: field
const asnPriv = forge.asn1.fromDer(fbuf)
// get the RSA privatekey data from the asn1 object
const privateKey = forge.pki.privateKeyFromAsn1(asnPriv)
// set the RSA public key to the modulus and exponent of the private key
const publicKey = forge.pki.rsa.setPublicKey(privateKey.n, privateKey.e)
// return the RSA public key to asn1 object
const asnPub = forge.pki.publicKeyToAsn1(publicKey)
// format the public key
const protoPublic64 = formatKey(asnPub, 'Public')
const mhId = multihashing(new Buffer(protoPublic64, 'base64'), 'sha2-256')
return new Id(mhId, privKey, protoPublic64)
} }

13
src/pb/crypto.proto Normal file
View File

@ -0,0 +1,13 @@
enum KeyType {
RSA = 0;
}
message PublicKey {
required KeyType Type = 1;
required bytes Data = 2;
}
message PrivateKey {
required KeyType Type = 1;
required bytes Data = 2;
}

View File

59
tests/test.js Normal file
View File

@ -0,0 +1,59 @@
/* globals describe, it */
'use strict'
const expect = require('chai').expect
const PeerId = require('../src')
const testId = {
id: '1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d',
privKey: 'CAASpgkwggSiAgEAAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAECggEAZtju/bcKvKFPz0mkHiaJcpycy9STKphorpCT83srBVQi59CdFU6Mj+aL/xt0kCPMVigJw8P3/YCEJ9J+rS8BsoWE+xWUEsJvtXoT7vzPHaAtM3ci1HZd302Mz1+GgS8Epdx+7F5p80XAFLDUnELzOzKftvWGZmWfSeDnslwVONkL/1VAzwKy7Ce6hk4SxRE7l2NE2OklSHOzCGU1f78ZzVYKSnS5Ag9YrGjOAmTOXDbKNKN/qIorAQ1bovzGoCwx3iGIatQKFOxyVCyO1PsJYT7JO+kZbhBWRRE+L7l+ppPER9bdLFxs1t5CrKc078h+wuUr05S1P1JjXk68pk3+kQKBgQDeK8AR11373Mzib6uzpjGzgNRMzdYNuExWjxyxAzz53NAR7zrPHvXvfIqjDScLJ4NcRO2TddhXAfZoOPVH5k4PJHKLBPKuXZpWlookCAyENY7+Pd55S8r+a+MusrMagYNljb5WbVTgN8cgdpim9lbbIFlpN6SZaVjLQL3J8TWH6wKBgQDSChzItkqWX11CNstJ9zJyUE20I7LrpyBJNgG1gtvz3ZMUQCn3PxxHtQzN9n1P0mSSYs+jBKPuoSyYLt1wwe10/lpgL4rkKWU3/m1Myt0tveJ9WcqHh6tzcAbb/fXpUFT/o4SWDimWkPkuCb+8j//2yiXk0a/T2f36zKMuZvujqQKBgC6B7BAQDG2H2B/ijofp12ejJU36nL98gAZyqOfpLJ+FeMz4TlBDQ+phIMhnHXA5UkdDapQ+zA3SrFk+6yGk9Vw4Hf46B+82SvOrSbmnMa+PYqKYIvUzR4gg34rL/7AhwnbEyD5hXq4dHwMNsIDq+l2elPjwm/U9V0gdAl2+r50HAoGALtsKqMvhv8HucAMBPrLikhXP/8um8mMKFMrzfqZ+otxfHzlhI0L08Bo3jQrb0Z7ByNY6M8epOmbCKADsbWcVre/AAY0ZkuSZK/CaOXNX/AhMKmKJh8qAOPRY02LIJRBCpfS4czEdnfUhYV/TYiFNnKRj57PPYZdTzUsxa/yVTmECgYBr7slQEjb5Onn5mZnGDh+72BxLNdgwBkhO0OCdpdISqk0F0Pxby22DFOKXZEpiyI9XYP1C8wPiJsShGm2yEwBPWXnrrZNWczaVuCbXHrZkWQogBDG3HGXNdU4MAWCyiYlyinIBpPpoAJZSzpGLmWbMWh28+RJS6AQX6KHrK1o2uw==',
pubKey: 'CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2SKo/HMFZeBml1AF3XijzrxrfQXdJzjePBZAbdxqKR1Mc6juRHXij6HXYPjlAk01BhF1S3Ll4Lwi0cAHhggf457sMg55UWyeGKeUv0ucgvCpBwlR5cQ020i0MgzjPWOLWq1rtvSbNcAi2ZEVn6+Q2EcHo3wUvWRtLeKz+DZSZfw2PEDC+DGPJPl7f8g7zl56YymmmzH9liZLNrzg/qidokUv5u1pdGrcpLuPNeTODk0cqKB+OUbuKj9GShYECCEjaybJDl9276oalL9ghBtSeEv20kugatTvYy590wFlJkkvyl+nPxIH0EEYMKK9XRWlu9XYnoSfboiwcv8M3SlsjAgMBAAE='
}
const testIdHex = '1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d'
const testIdBytes = new Buffer('1220151ab1658d8294ab34b71d5582cfe20d06414212f440a69366f1bc31deb5c72d', 'hex')
const testIdB58String = 'QmQ2zigjQikYnyYUSXZydNXrDRhBut2mubwJBaLXobMt3A'
describe('id', function (done) {
this.timeout(30000)
it('create a new id', (done) => {
const id = PeerId.create()
expect(id.toB58String().length).to.equal(46)
done()
})
it('recreate an Id from Hex string', (done) => {
const id = PeerId.createFromHexString(testIdHex)
expect(testIdBytes).to.deep.equal(id.id)
done()
})
it('Recreate an Id from a Buffer', (done) => {
const id = PeerId.createFromBytes(testIdBytes)
expect(testId.id).to.equal(id.toHexString())
done()
})
it('Recreate a B58 String', (done) => {
const id = PeerId.createFromB58String(testIdB58String)
expect(testIdB58String).to.equal(id.toB58String())
done()
})
it('Recreate from a Public Key', (done) => {
const id = PeerId.createFromPubKey(testId.pubKey)
expect(testIdB58String).to.equal(id.toB58String())
done()
})
it('Recreate from a Private Key', (done) => {
const id = PeerId.createFromPrivKey(testId.privKey)
expect(testIdB58String).to.equal(id.toB58String())
done()
})
})

29
webpack.config.js Normal file
View File

@ -0,0 +1,29 @@
var path = require('path')
module.exports = {
name: 'peerid',
context: __dirname,
entry: './src/index.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'peer-id.js',
libraryTarget: 'var',
library: 'PeerId'
},
resolve: {
extensions: ['', '.js', '.json'],
alias: { 'node-forge': path.resolve(__dirname, 'deps/forge.bundle.js') }
},
externals: {
fs: '{}'
},
node: {
Buffer: true
},
module: {
loaders: [
{ test: /\.json$/, loader: 'json' }
],
noParse: []
}
}