Compare commits

...

60 Commits

Author SHA1 Message Date
85dac48621 bump dependencies 2021-04-09 17:10:55 +03:00
f3fc3449c1 chore: release version v0.14.6 2021-04-06 14:09:48 +02:00
927a6cf078 chore: update contributors 2021-04-06 14:09:48 +02:00
73fe2c553f chore: add no types to release script 2021-04-06 14:04:43 +02:00
719ddfe8e2 chore: update deps (#143) 2021-04-06 13:59:19 +02:00
037ed87dac chore: release version v0.14.4 2021-03-29 12:57:18 +02:00
af47794289 chore: update contributors 2021-03-29 12:57:18 +02:00
eeb53305c8 fix: remove toString side effect that breaks deep equals (#142)
Makes the cached string cid property non-enumerable so deep equals
still works even after a peer id has been stringifed.

Fixes #141
2021-03-29 12:53:11 +02:00
5468ee0877 chore: release version v0.14.3 2021-01-26 09:22:15 +01:00
f895151451 chore: update contributors 2021-01-26 09:22:15 +01:00
e7d0eaa796 chore: update deps (#137) 2021-01-26 09:10:46 +01:00
41ab96c47d docs: correct case for RSA keyType (#136)
* docs: correct case for RSA keyType

correct case of rsa keytype in docs/examples to match keyType exported from libp2p-crypto

Co-authored-by: Vasco Santos <vasco.santos@ua.pt>
2021-01-06 15:13:25 +01:00
4178e53db8 docs: add documentation for isPeerId(id) (#134) (#135) 2020-12-01 17:33:15 +01:00
10ead07dd9 chore: release version v0.14.2 2020-09-23 19:11:12 +02:00
d940099131 chore: update contributors 2020-09-23 19:11:12 +02:00
b2ee34295b feat: has inline public key method (#132) 2020-09-23 19:07:28 +02:00
ecc1e5be6d chore: release version v0.14.1 2020-09-03 18:49:02 +02:00
153bc8ea38 chore: update contributors 2020-09-03 18:49:01 +02:00
d40d588776 fix: ts constructor types (#130) 2020-08-26 11:46:38 +02:00
224b30cb65 fix: privKey possible undefined (#129) 2020-08-17 16:35:13 +02:00
6d571ae196 fix: typo in readme (#128) 2020-08-12 13:40:13 +02:00
ff4bd96467 chore: release version v0.14.0 2020-08-07 17:41:53 +02:00
427b46c86e chore: update contributors 2020-08-07 17:41:52 +02:00
d16ce9c2ac fix: replace node buffers with uint8arrays (#127)
* fix: replace node buffers with uint8arrays

Replaces all uses of node Buffers with Uint8Arrays

BREAKING CHANGES:

- Where node Buffers were returned, now Uint8Arrays are

* chore: remove gh dep
2020-08-07 17:36:22 +02:00
cd99cb2c7d chore: release version v0.13.13 2020-06-23 18:58:05 +02:00
c295329300 chore: update contributors 2020-06-23 18:58:04 +02:00
bb32b12395 chore: update deps (#126)
Allows for deduping multihashes module
2020-06-23 18:43:30 +02:00
6fd5ca2a12 chore(deps-dev): bump aegir from 21.10.2 to 22.0.0 (#124)
Bumps [aegir](https://github.com/ipfs/aegir) from 21.10.2 to 22.0.0.
- [Release notes](https://github.com/ipfs/aegir/releases)
- [Changelog](https://github.com/ipfs/aegir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ipfs/aegir/compare/v21.10.2...v22.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-05-28 18:10:20 +02:00
020b963711 chore: release version v0.13.12 2020-04-22 16:35:07 +02:00
e3da29a440 chore: update contributors 2020-04-22 16:35:07 +02:00
8cd9dfb137 feat(cli): add support for specifying type and size (#122) 2020-04-22 16:32:38 +02:00
3598a433dc chore: release version v0.13.11 2020-03-26 09:07:55 +01:00
5ec88281e2 chore: update contributors 2020-03-26 09:07:55 +01:00
a80c481146 chore(deps): bump cids from 0.7.5 to 0.8.0 (#121)
Bumps [cids](https://github.com/multiformats/js-cid) from 0.7.5 to 0.8.0.
- [Release notes](https://github.com/multiformats/js-cid/releases)
- [Changelog](https://github.com/multiformats/js-cid/blob/master/CHANGELOG.md)
- [Commits](https://github.com/multiformats/js-cid/compare/v0.7.5...v0.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-26 09:05:51 +01:00
efc96106a4 chore: release version v0.13.10 2020-03-18 17:38:41 +01:00
16e1c74e9a chore: update contributors 2020-03-18 17:38:40 +01:00
c305c36b26 fix: add buffer (#120)
related to this https://github.com/ipfs/js-ipfs/issues/2924
2020-03-18 17:33:29 +01:00
7e985b127f chore(deps-dev): bump @types/mocha from 5.2.7 to 7.0.2 (#119)
Bumps [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha) from 5.2.7 to 7.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/mocha)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-04 14:23:01 +01:00
40d68cb512 chore(deps-dev): bump aegir from 20.6.1 to 21.2.0
Bumps [aegir](https://github.com/ipfs/aegir) from 20.6.1 to 21.2.0.
- [Release notes](https://github.com/ipfs/aegir/releases)
- [Changelog](https://github.com/ipfs/aegir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ipfs/aegir/compare/v20.6.1...v21.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-20 08:14:43 -05:00
1d86506c64 chore: release version v0.13.9 2020-02-19 12:06:43 -05:00
9dc7ce5f5e chore: update contributors 2020-02-19 12:06:42 -05:00
f775e3509b chore: update index.d.ts (#115)
Tell Typescript that `isPeerId(id)` returns true if, and only if, `id` is of type `PeerId`.

See https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates
2020-02-19 11:51:59 -05:00
00819ba4eb chore: update index.d.ts (#116)
This tells Typescript that `id` is immutable.
2020-02-19 09:17:30 -05:00
6870c8c4d7 chore: release version v0.13.8 2020-02-18 08:44:53 -05:00
71d3a100c9 chore: update contributors 2020-02-18 08:44:52 -05:00
f44645ef7e fix: remove use of assert module (#117)
The polyfill is big, we can simulate it by throwing an Error and it doesn't work under React Native.
2020-02-18 08:42:39 -05:00
a68855a5d2 chore: release version v0.13.7 2020-01-27 12:10:00 +01:00
d8c307a44f chore: update contributors 2020-01-27 12:09:59 +01:00
a5070aea6e feat: adds typescript types + type tests (#110)
* feat: adds typescript types + type tests

Signed-off-by: Carson Farmer <carson.farmer@gmail.com>

* feat: updates to latest cids release

Signed-off-by: Carson Farmer <carson.farmer@gmail.com>
2020-01-27 12:07:52 +01:00
fc9698476f chore: release version v0.13.6 2019-12-18 10:43:10 +00:00
ffe04c12a0 chore: update contributors 2019-12-18 10:43:10 +00:00
65e0b746a5 fix: catch errors thrown by multihash decode (#109) 2019-12-18 10:17:59 +00:00
74cdb24544 chore: typo publick -> public (#108) 2019-11-28 11:39:55 +01:00
b5335cd4ee chore: release version v0.13.5 2019-11-12 15:06:13 +01:00
519052693d chore: update contributors 2019-11-12 15:06:13 +01:00
bbf0416f08 feat: deprecate isEqual in favor of equals (#107) 2019-11-12 15:00:11 +01:00
4fbf859efc chore: release version v0.13.4 2019-11-04 19:15:07 +01:00
52bd949b43 chore: update contributors 2019-11-04 19:15:07 +01:00
544ca7d74b feat: support Peer ID represented as CID (#105)
* feat: support Peer ID represented as CID

This change adds two functions:

- createFromCID accepts CID as String|CID|Buffer
  and creates PeerId from the multihash value inside of it
- toCIDString serializes PeerId multihash into a CIDv1 in Base32,
  as agreed in https://github.com/libp2p/specs/pull/209

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* refactor: rename toCIDString to toString

CIDv1 is self describing, and toString was not defined.
Makes sense to use generic toString in this case.

This change also:
- remembers string with CID, so it is lazily generated only once
- switches createFromB58String to createFromCID (b58 is CIDv0),
  making it easier to migrate existing codebases.

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* docs: comment tests

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>

* feat: validate CID multicodec

- require CID with 'libp2p-key' (CIDv1) or 'dag-pb' (CIDv0 converted to CIDv1)
- delegate CID validation to CID constructor

License: MIT
Signed-off-by: Marcin Rataj <lidel@lidel.org>
2019-11-04 18:22:29 +01:00
11d4ec10bd fix: bang in bin.js (#106) 2019-11-04 12:26:50 +01:00
9 changed files with 731 additions and 87 deletions

7
.aegir.js Normal file
View File

@ -0,0 +1,7 @@
'use strict'
module.exports = {
bundlesize: {
maxSize: '140kB'
}
}

View File

@ -1,3 +1,162 @@
## [0.14.6](https://github.com/libp2p/js-peer-id/compare/v0.14.4...v0.14.6) (2021-04-06)
## [0.14.4](https://github.com/libp2p/js-peer-id/compare/v0.14.3...v0.14.4) (2021-03-29)
### Bug Fixes
* remove toString side effect that breaks deep equals ([#142](https://github.com/libp2p/js-peer-id/issues/142)) ([eeb5330](https://github.com/libp2p/js-peer-id/commit/eeb53305c8767a6a2b3f610fe9e45a589b4fa972)), closes [#141](https://github.com/libp2p/js-peer-id/issues/141)
## [0.14.3](https://github.com/libp2p/js-peer-id/compare/v0.14.2...v0.14.3) (2021-01-26)
<a name="0.14.2"></a>
## [0.14.2](https://github.com/libp2p/js-peer-id/compare/v0.14.1...v0.14.2) (2020-09-23)
### Features
* has inline public key method ([#132](https://github.com/libp2p/js-peer-id/issues/132)) ([b2ee342](https://github.com/libp2p/js-peer-id/commit/b2ee342))
<a name="0.14.1"></a>
## [0.14.1](https://github.com/libp2p/js-peer-id/compare/v0.13.13...v0.14.1) (2020-09-03)
### Bug Fixes
* privKey possible undefined ([#129](https://github.com/libp2p/js-peer-id/issues/129)) ([224b30c](https://github.com/libp2p/js-peer-id/commit/224b30c))
* replace node buffers with uint8arrays ([#127](https://github.com/libp2p/js-peer-id/issues/127)) ([d16ce9c](https://github.com/libp2p/js-peer-id/commit/d16ce9c))
* ts constructor types ([#130](https://github.com/libp2p/js-peer-id/issues/130)) ([d40d588](https://github.com/libp2p/js-peer-id/commit/d40d588))
* typo in readme ([#128](https://github.com/libp2p/js-peer-id/issues/128)) ([6d571ae](https://github.com/libp2p/js-peer-id/commit/6d571ae))
### BREAKING CHANGES
* - Where node Buffers were returned, now Uint8Arrays are
* chore: remove gh dep
<a name="0.14.0"></a>
# [0.14.0](https://github.com/libp2p/js-peer-id/compare/v0.13.13...v0.14.0) (2020-08-07)
### Bug Fixes
* replace node buffers with uint8arrays ([#127](https://github.com/libp2p/js-peer-id/issues/127)) ([d16ce9c](https://github.com/libp2p/js-peer-id/commit/d16ce9c))
### BREAKING CHANGES
* - Where node Buffers were returned, now Uint8Arrays are
* chore: remove gh dep
<a name="0.13.13"></a>
## [0.13.13](https://github.com/libp2p/js-peer-id/compare/v0.13.12...v0.13.13) (2020-06-23)
<a name="0.13.12"></a>
## [0.13.12](https://github.com/libp2p/js-peer-id/compare/v0.13.11...v0.13.12) (2020-04-22)
### Features
* **cli:** add support for specifying type and size ([#122](https://github.com/libp2p/js-peer-id/issues/122)) ([8cd9dfb](https://github.com/libp2p/js-peer-id/commit/8cd9dfb))
<a name="0.13.11"></a>
## [0.13.11](https://github.com/libp2p/js-peer-id/compare/v0.13.10...v0.13.11) (2020-03-26)
<a name="0.13.10"></a>
## [0.13.10](https://github.com/libp2p/js-peer-id/compare/v0.13.9...v0.13.10) (2020-03-18)
### Bug Fixes
* add buffer ([#120](https://github.com/libp2p/js-peer-id/issues/120)) ([c305c36](https://github.com/libp2p/js-peer-id/commit/c305c36))
<a name="0.13.9"></a>
## [0.13.9](https://github.com/libp2p/js-peer-id/compare/v0.13.8...v0.13.9) (2020-02-19)
<a name="0.13.8"></a>
## [0.13.8](https://github.com/libp2p/js-peer-id/compare/v0.13.6...v0.13.8) (2020-02-18)
### Bug Fixes
* remove use of assert module ([#117](https://github.com/libp2p/js-peer-id/issues/117)) ([f44645e](https://github.com/libp2p/js-peer-id/commit/f44645e))
### Features
* adds typescript types + type tests ([#110](https://github.com/libp2p/js-peer-id/issues/110)) ([a5070ae](https://github.com/libp2p/js-peer-id/commit/a5070ae))
<a name="0.13.7"></a>
## [0.13.7](https://github.com/libp2p/js-peer-id/compare/v0.13.6...v0.13.7) (2020-01-27)
### Features
* adds typescript types + type tests ([#110](https://github.com/libp2p/js-peer-id/issues/110)) ([a5070ae](https://github.com/libp2p/js-peer-id/commit/a5070ae))
<a name="0.13.6"></a>
## [0.13.6](https://github.com/libp2p/js-peer-id/compare/v0.13.5...v0.13.6) (2019-12-18)
### Bug Fixes
* catch errors thrown by multihash decode ([#109](https://github.com/libp2p/js-peer-id/issues/109)) ([65e0b74](https://github.com/libp2p/js-peer-id/commit/65e0b74))
<a name="0.13.5"></a>
## [0.13.5](https://github.com/libp2p/js-peer-id/compare/v0.13.4...v0.13.5) (2019-11-12)
### Features
* deprecate isEqual in favor of equals ([#107](https://github.com/libp2p/js-peer-id/issues/107)) ([bbf0416](https://github.com/libp2p/js-peer-id/commit/bbf0416))
<a name="0.13.4"></a>
## [0.13.4](https://github.com/libp2p/js-peer-id/compare/v0.13.3...v0.13.4) (2019-11-04)
### Bug Fixes
* bang in bin.js ([#106](https://github.com/libp2p/js-peer-id/issues/106)) ([11d4ec1](https://github.com/libp2p/js-peer-id/commit/11d4ec1))
### Features
* support Peer ID represented as CID ([#105](https://github.com/libp2p/js-peer-id/issues/105)) ([544ca7d](https://github.com/libp2p/js-peer-id/commit/544ca7d))
<a name="0.13.3"></a> <a name="0.13.3"></a>
## [0.13.3](https://github.com/libp2p/js-peer-id/compare/v0.13.2...v0.13.3) (2019-09-25) ## [0.13.3](https://github.com/libp2p/js-peer-id/compare/v0.13.2...v0.13.3) (2019-09-25)

View File

@ -17,6 +17,9 @@
## Table of Contents ## Table of Contents
- [peer-id](#peer-id)
- [Lead Maintainer](#lead-maintainer)
- [Table of Contents](#table-of-contents)
- [Description](#description) - [Description](#description)
- [Example](#example) - [Example](#example)
- [Installation](#installation) - [Installation](#installation)
@ -25,6 +28,7 @@
- [Node.js](#nodejs) - [Node.js](#nodejs)
- [Browser: Browserify, Webpack, other bundlers](#browser-browserify-webpack-other-bundlers) - [Browser: Browserify, Webpack, other bundlers](#browser-browserify-webpack-other-bundlers)
- [Browser: `<script>` Tag](#browser-script-tag) - [Browser: `<script>` Tag](#browser-script-tag)
- [CLI](#cli)
- [API](#api) - [API](#api)
- [Create](#create) - [Create](#create)
- [`new PeerId(id[, privKey, pubKey])`](#new-peeridid-privkey-pubkey) - [`new PeerId(id[, privKey, pubKey])`](#new-peeridid-privkey-pubkey)
@ -32,16 +36,25 @@
- [Import](#import) - [Import](#import)
- [`createFromHexString(str)`](#createfromhexstringstr) - [`createFromHexString(str)`](#createfromhexstringstr)
- [`createFromBytes(buf)`](#createfrombytesbuf) - [`createFromBytes(buf)`](#createfrombytesbuf)
- [`createFromCID(cid)`](#createfromcidcid)
- [`createFromB58String(str)`](#createfromb58stringstr) - [`createFromB58String(str)`](#createfromb58stringstr)
- [`createFromPubKey(pubKey)`](#createfrompubkeypubkey) - [`createFromPubKey(pubKey)`](#createfrompubkeypubkey)
- [`createFromPrivKey(privKey)`](#createfromprivkeyprivkey) - [`createFromPrivKey(privKey)`](#createfromprivkeyprivkey)
- [`createFromJSON(obj)`](#createfromjsonobj) - [`createFromJSON(obj)`](#createfromjsonobj)
- [`createFromProtobuf(buf)`](#createfromprotobufbuf)
- [Export](#export) - [Export](#export)
- [`toHexString()`](#tohexstring) - [`toHexString()`](#tohexstring)
- [`toBytes()`](#tobytes) - [`toBytes()`](#tobytes)
- [`toString()`](#tostring)
- [`toB58String()`](#tob58string) - [`toB58String()`](#tob58string)
- [`toJSON()`](#tojson) - [`toJSON()`](#tojson)
- [`marshal(excludePrivateKey)`](#marshalexcludeprivatekey)
- [`marshalPubKey()`](#marshalpubkey)
- [`toPrint()`](#toprint) - [`toPrint()`](#toprint)
- [`equals(id)`](#equalsid)
- [`isEqual(id)`](#isequalid)
- [Others](#others)
- [`isPeerId(id)`](#ispeeridid)
- [License](#license) - [License](#license)
# Description # Description
@ -57,7 +70,7 @@ The public key is a base64 encoded string of a protobuf containing an RSA DER bu
```JavaScript ```JavaScript
const PeerId = require('peer-id') const PeerId = require('peer-id')
const id = await PeerId.create({ bits: 1024, keyType: 'rsa' }) const id = await PeerId.create({ bits: 1024, keyType: 'RSA' })
console.log(JSON.stringify(id.toJSON(), null, 2)) console.log(JSON.stringify(id.toJSON(), null, 2))
``` ```
@ -107,6 +120,14 @@ the global namespace.
<script src="https://unpkg.com/peer-id/dist/index.js"></script> <script src="https://unpkg.com/peer-id/dist/index.js"></script>
``` ```
# CLI
After installing `peer-id`, `npm install peer-id`, you can leverage the cli to generate keys exported as JSON. You can specify the type for the key and size, as detailed in [`create([opts])`](#createopts). The defaults are shown here.
```sh
> peer-id --type rsa --bits 2048
```
# API # API
```js ```js
@ -117,7 +138,7 @@ const PeerId = require('peer-id')
### `new PeerId(id[, privKey, pubKey])` ### `new PeerId(id[, privKey, pubKey])`
- `id: Buffer` - The multihash of the publick key as `Buffer` - `id: Buffer` - The multihash of the public key as `Buffer`
- `privKey: RsaPrivateKey` - The private key - `privKey: RsaPrivateKey` - The private key
- `pubKey: RsaPublicKey` - The public key - `pubKey: RsaPublicKey` - The public key
@ -127,7 +148,8 @@ The key format is detailed in [libp2p-crypto](https://github.com/libp2p/js-libp2
Generates a new Peer ID, complete with public/private keypair. Generates a new Peer ID, complete with public/private keypair.
- `opts: Object`: Default: `{bits: 2048, keyType: 'rsa'}` - `opts.bits: number` - The size of the key. Default: `2048`
- `opts.keyType: string` - The key type, one of: `['RSA', 'Ed25519', 'secp256k1']`. Default: `RSA`
Returns `Promise<PeerId>`. Returns `Promise<PeerId>`.
@ -137,7 +159,7 @@ Returns `Promise<PeerId>`.
Creates a Peer ID from hex string representing the key's multihash. Creates a Peer ID from hex string representing the key's multihash.
Returns `PeerId. Returns `PeerId`.
### `createFromBytes(buf)` ### `createFromBytes(buf)`
@ -145,6 +167,14 @@ Creates a Peer ID from a buffer representing the key's multihash.
Returns `PeerId`. Returns `PeerId`.
### `createFromCID(cid)`
- `cid: CID|String|Buffer` - The multihash encoded as [CID](https://github.com/ipld/js-cid) (object, `String` or `Buffer`)
Creates a Peer ID from a CID representation of the key's multihash ([RFC 0001](https://github.com/libp2p/specs/blob/master/RFC/0001-text-peerid-cid.md)).
Returns `PeerId`.
### `createFromB58String(str)` ### `createFromB58String(str)`
Creates a Peer ID from a Base58 string representing the key's multihash. Creates a Peer ID from a Base58 string representing the key's multihash.
@ -197,9 +227,18 @@ Returns the Peer ID's `id` as a buffer.
<Buffer 12 20 d6 24 39 98 f2 fc 56 34 3a d7 ed 03 42 ab 78 86 a4 eb 18 d7 36 f1 b6 7d 44 b3 7f cc 81 e0 f3 9f> <Buffer 12 20 d6 24 39 98 f2 fc 56 34 3a d7 ed 03 42 ab 78 86 a4 eb 18 d7 36 f1 b6 7d 44 b3 7f cc 81 e0 f3 9f>
``` ```
### `toString()`
Returns the Peer ID's `id` as a self-describing CIDv1 in Base32 ([RFC 0001](https://github.com/libp2p/specs/blob/master/RFC/0001-text-peerid-cid.md))
```
bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4
```
### `toB58String()` ### `toB58String()`
Returns the Peer ID's `id` as a base58 string. Returns the Peer ID's `id` as a base58 string (multihash/CIDv0).
``` ```
QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi
@ -237,10 +276,25 @@ Returns the Peer ID as a printable string without the `Qm` prefix.
Example: `<peer.ID xxxxxx>` Example: `<peer.ID xxxxxx>`
### `isEqual(id)` ### `equals(id)`
Returns `true` if the given PeerId is equal to the current instance.
- `id` can be a PeerId or a Buffer containing the id - `id` can be a PeerId or a Buffer containing the id
### `isEqual(id)`
**Deprecation Notice**: Use [`equals`](#equalsid), `isEqual` will be removed in 0.14.0.
- `id` can be a PeerId or a Buffer containing the id
## Others
### `isPeerId(id)`
Returns `true` if the given id is an instance of PeerId
- `id` should be an instance of PeerId
# License # License
MIT MIT

View File

@ -1,21 +1,23 @@
{ {
"name": "peer-id", "name": "peer-id",
"version": "0.13.3", "version": "0.14.6",
"description": "IPFS Peer Id implementation in Node.js", "description": "IPFS Peer Id implementation in Node.js",
"leadMaintainer": "Vasco Santos <santos.vasco10@gmail.com>", "leadMaintainer": "Vasco Santos <santos.vasco10@gmail.com>",
"main": "src/index.js", "main": "src/index.js",
"types": "src/index.d.ts",
"bin": "src/bin.js", "bin": "src/bin.js",
"scripts": { "scripts": {
"lint": "aegir lint", "lint": "aegir lint",
"build": "aegir build", "build": "aegir build --no-types",
"test": "aegir test", "test": "aegir test",
"test:node": "aegir test -t node", "test:node": "aegir test -t node",
"test:browser": "aegir test -t browser -t webworker", "test:browser": "aegir test -t browser -t webworker",
"release": "aegir release", "test:types": "npx tsc",
"release": "aegir release --no-types",
"release-minor": "aegir release --type minor", "release-minor": "aegir release --type minor",
"release-major": "aegir release --type major", "release-major": "aegir release --type major",
"coverage": "aegir coverage", "coverage": "aegir coverage",
"size": "bundlesize -f dist/index.min.js -s 140kB" "size": "aegir build -b"
}, },
"files": [ "files": [
"src", "src",
@ -34,43 +36,51 @@
}, },
"homepage": "https://github.com/libp2p/js-peer-id", "homepage": "https://github.com/libp2p/js-peer-id",
"devDependencies": { "devDependencies": {
"aegir": "^20.0.0", "@types/chai": "^4.2.14",
"bundlesize": "~0.18.0", "@types/dirty-chai": "^2.0.2",
"chai": "^4.2.0", "@types/mocha": "^8.2.0",
"dirty-chai": "^2.0.1" "aegir": "^32.2.0"
}, },
"dependencies": { "dependencies": {
"cids": "^1.1.6",
"class-is": "^1.1.0", "class-is": "^1.1.0",
"libp2p-crypto": "~0.17.0", "libp2p-crypto": "fluencelabs/js-libp2p-crypto",
"multihashes": "~0.4.15", "minimist": "^1.2.5",
"protons": "^1.0.1" "multihashes": "^4.0.2",
"protons": "^2.0.0",
"uint8arrays": "^2.1.4"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/libp2p/js-peer-id.git" "url": "https://github.com/libp2p/js-peer-id.git"
}, },
"contributors": [ "contributors": [
"Arve Knudsen <arve.knudsen@gmail.com>",
"David Dias <daviddias.p@gmail.com>", "David Dias <daviddias.p@gmail.com>",
"David Dias <mail@daviddias.me>", "Vasco Santos <vasco.santos@moxy.studio>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>", "nginnever <ginneversource@gmail.com>",
"Henrique Dias <hacdias@gmail.com>", "dignifiedquire <dignifiedquire@gmail.com>",
"Hugo Dias <hugomrdias@gmail.com>",
"Jacob Heun <jacobheun@gmail.com>", "Jacob Heun <jacobheun@gmail.com>",
"Maciej Krüger <mkg20001@gmail.com>",
"Michael Garvin <gar+gh@danger.computer>",
"Pedro Teixeira <i@pgte.me>", "Pedro Teixeira <i@pgte.me>",
"Stephen Whitmore <stephen.whitmore@gmail.com>",
"Alex Potsides <alex@achingbrain.net>",
"Hugo Dias <hugomrdias@gmail.com>",
"Maciej Krüger <mkg20001@gmail.com>",
"Nate Foss <npfoss@gmail.com>",
"Robert Kiel <robert.kiel@validitylabs.org>",
"Adam Uhlíř <adam@uhlir.dev>",
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>",
"Arve Knudsen <arve.knudsen@gmail.com>",
"Carson Farmer <carson.farmer@gmail.com>",
"Christian Paul <info@jaller.de>",
"Henrique Dias <hacdias@gmail.com>",
"Marcin Rataj <lidel@lidel.org>",
"Michael Garvin <gar+gh@danger.computer>",
"Prashanth Chandra <coolshanth94@gmail.com>", "Prashanth Chandra <coolshanth94@gmail.com>",
"Richard Littauer <richard.littauer@gmail.com>", "Richard Littauer <richard.littauer@gmail.com>",
"Richard Schneider <makaretu@gmail.com>", "Richard Schneider <makaretu@gmail.com>",
"Stephen Whitmore <stephen.whitmore@gmail.com>",
"Topper Bowers <topper@quorumcontrol.com>", "Topper Bowers <topper@quorumcontrol.com>",
"Vasco Santos <vasco.santos@moxy.studio>", "Vojtech Simetka <vojtech@simetka.cz>",
"Vasco Santos <vasco.santos@ua.pt>",
"Yahya <ya7yaz@gmail.com>", "Yahya <ya7yaz@gmail.com>",
"greenkeeperio-bot <support@greenkeeper.io>", "a1300 <matthias-knopp@gmx.net>"
"nginnever <ginneversource@gmail.com>",
"npmcdn-to-unpkg-bot <npmcdn-to-unpkg-bot@users.noreply.github.com>",
"ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>"
] ]
} }

View File

@ -1,11 +1,15 @@
#!/usr/local/bin/node #!/usr/bin/env node
'use strict' 'use strict'
const PeerId = require('./index.js') const PeerId = require('./index.js')
const argv = require('minimist')(process.argv.slice(2))
async function main () { async function main () {
const id = await PeerId.create() const id = await PeerId.create({
keyType: argv.type,
bits: argv.bits
})
console.log(JSON.stringify(id.toJSON(), null, 2)) // eslint-disable-line no-console console.log(JSON.stringify(id.toJSON(), null, 2)) // eslint-disable-line no-console
} }

193
src/index.d.ts vendored Normal file
View File

@ -0,0 +1,193 @@
import { PrivateKey, PublicKey, KeyType } from "libp2p-crypto";
import CID from 'cids'
declare namespace PeerId {
/**
* Options for PeerId creation.
*/
type CreateOptions = {
/**
* The number of bits to use.
*/
bits?: number;
/**
* The type of key to use.
*/
keyType?: KeyType;
};
/**
* PeerId JSON format.
*/
type JSONPeerId = {
/**
* String representation of PeerId.
*/
id: string;
/**
* Public key.
*/
pubKey?: string;
/**
* Private key.
*/
privKey?: string;
};
/**
* Checks if a value is an instance of PeerId.
* @param id The value to check.
*/
function isPeerId(id: any): id is PeerId
/**
* Create a new PeerId.
* @param opts Options.
*/
function create(opts?: PeerId.CreateOptions): Promise<PeerId>;
/**
* Create PeerId from hex string.
* @param str The input hex string.
*/
function createFromHexString(str: string): PeerId;
/**
* Create PeerId from raw bytes.
* @param buf The raw bytes.
*/
function createFromBytes(buf: Uint8Array): PeerId;
/**
* Create PeerId from base58-encoded string.
* @param str The base58-encoded string.
*/
function createFromB58String(str: string): PeerId;
/**
* Create PeerId from CID.
* @param cid The CID.
*/
function createFromCID(cid: CID | Uint8Array | string | object): PeerId;
/**
* Create PeerId from public key.
* @param key Public key, as Uint8Array or base64-encoded string.
*/
function createFromPubKey(key: Uint8Array | string): Promise<PeerId>;
/**
* Create PeerId from private key.
* @param key Private key, as Uint8Array or base64-encoded string.
*/
function createFromPrivKey(key: Uint8Array | string): Promise<PeerId>;
/**
* Create PeerId from PeerId JSON formatted object.
* @see {@link PeerId#toJSON}
* @param json PeerId in JSON format.
*/
function createFromJSON(json: JSONPeerId): Promise<PeerId>;
/**
* Create PeerId from Protobuf bytes.
* @param buf Protobuf bytes, as Uint8Array or hex-encoded string.
*/
function createFromProtobuf(buf: Uint8Array | string): Promise<PeerId>;
}
/**
* PeerId is an object representation of a peer identifier.
*/
declare class PeerId {
constructor(id: Uint8Array, privKey?: PrivateKey, pubKey?: PublicKey);
/**
* Raw id.
*/
readonly id: Uint8Array;
/**
* Private key.
*/
privKey: PrivateKey;
/**
* Public key.
*/
pubKey: PublicKey;
/**
* Return the protobuf version of the public key, matching go ipfs formatting.
*/
marshalPubKey(): Uint8Array;
/**
* Return the protobuf version of the private key, matching go ipfs formatting.
*/
marshalPrivKey(): Uint8Array;
/**
* Return the protobuf version of the peer-id.
* @param excludePriv Whether to exclude the private key information from the output.
*/
marshal(excludePriv?: boolean): Uint8Array;
/**
* String representation.
*/
toPrint(): string;
/**
* Return the jsonified version of the key.
* Matches the formatting of go-ipfs for its config file.
* @see {@link PeerId.createFromJSON}
*/
toJSON(): PeerId.JSONPeerId;
/**
* Encode to hex.
*/
toHexString(): string;
/**
* Return raw id bytes.
*/
toBytes(): Uint8Array;
/**
* Encode to base58 string.
*/
toB58String(): string;
/**
* Return self-describing string representation.
* Uses default format from RFC 0001: https://github.com/libp2p/specs/pull/209
*/
toString(): string;
/**
* Checks the equality of `this` peer against a given PeerId.
* @param id The other PeerId.
*/
equals(id: PeerId | Uint8Array): boolean;
/**
* Checks the equality of `this` peer against a given PeerId.
* @deprecated Use {.equals}
* @param id The other PeerId.
*/
isEqual(id: PeerId | Uint8Array): boolean;
/**
* Check if this PeerId instance is valid (privKey -> pubKey -> Id)
*/
isValid(): boolean;
/**
* Check if the PeerId has an inline public key.
*/
hasInlinePublicKey(): boolean;
}
export = PeerId;

View File

@ -5,17 +5,22 @@
'use strict' 'use strict'
const mh = require('multihashes') const mh = require('multihashes')
const CID = require('cids')
const cryptoKeys = require('libp2p-crypto/src/keys') const cryptoKeys = require('libp2p-crypto/src/keys')
const assert = require('assert')
const withIs = require('class-is') const withIs = require('class-is')
const { PeerIdProto } = require('./proto') const { PeerIdProto } = require('./proto')
const uint8ArrayEquals = require('uint8arrays/equals')
const uint8ArrayFromString = require('uint8arrays/from-string')
const uint8ArrayToString = require('uint8arrays/to-string')
class PeerId { class PeerId {
constructor (id, privKey, pubKey) { constructor (id, privKey, pubKey) {
assert(Buffer.isBuffer(id), 'invalid id provided') if (!(id instanceof Uint8Array)) {
throw new Error('invalid id provided')
}
if (privKey && pubKey) { if (privKey && pubKey && !uint8ArrayEquals(privKey.public.bytes, pubKey.bytes)) {
assert(privKey.public.bytes.equals(pubKey.bytes), 'inconsistent arguments') throw new Error('inconsistent arguments')
} }
this._id = id this._id = id
@ -49,12 +54,17 @@ class PeerId {
return this._privKey.public return this._privKey.public
} }
const decoded = mh.decode(this.id) try {
const decoded = mh.decode(this.id)
if (decoded.name === 'identity') { if (decoded.name === 'identity') {
this._pubKey = cryptoKeys.unmarshalPublicKey(decoded.digest) this._pubKey = cryptoKeys.unmarshalPublicKey(decoded.digest)
return this._pubKey }
} catch (_) {
// Ignore, there is no valid public key
} }
return this._pubKey
} }
set pubKey (pubKey) { set pubKey (pubKey) {
@ -122,16 +132,47 @@ class PeerId {
return this._idB58String return this._idB58String
} }
isEqual (id) { // return self-describing String representation
if (Buffer.isBuffer(id)) { // in default format from RFC 0001: https://github.com/libp2p/specs/pull/209
return this.id.equals(id) toString () {
if (!this._idCIDString) {
const cid = new CID(1, 'libp2p-key', this.id, 'base32')
Object.defineProperty(this, '_idCIDString', {
value: cid.toBaseEncodedString('base32'),
enumerable: false
})
}
return this._idCIDString
}
/**
* Checks the equality of `this` peer against a given PeerId.
*
* @param {Uint8Array|PeerId} id
* @returns {boolean}
*/
equals (id) {
if (id instanceof Uint8Array) {
return uint8ArrayEquals(this.id, id)
} else if (id.id) { } else if (id.id) {
return this.id.equals(id.id) return uint8ArrayEquals(this.id, id.id)
} else { } else {
throw new Error('not valid Id') throw new Error('not valid Id')
} }
} }
/**
* Checks the equality of `this` peer against a given PeerId.
*
* @deprecated Use `.equals`
* @param {Uint8Array|PeerId} id
* @returns {boolean}
*/
isEqual (id) {
return this.equals(id)
}
/* /*
* Check if this PeerId instance is valid (privKey -> pubKey -> Id) * Check if this PeerId instance is valid (privKey -> pubKey -> Id)
*/ */
@ -140,8 +181,26 @@ class PeerId {
return Boolean(this.privKey && return Boolean(this.privKey &&
this.privKey.public && this.privKey.public &&
this.privKey.public.bytes && this.privKey.public.bytes &&
Buffer.isBuffer(this.pubKey.bytes) && this.pubKey.bytes instanceof Uint8Array &&
this.privKey.public.bytes.equals(this.pubKey.bytes)) uint8ArrayEquals(this.privKey.public.bytes, this.pubKey.bytes))
}
/**
* Check if the PeerId has an inline public key.
*
* @returns {boolean}
*/
hasInlinePublicKey () {
try {
const decoded = mh.decode(this.id)
if (decoded.name === 'identity') {
return true
}
} catch (_) {
// Ignore, there is no valid public key
}
return false
} }
} }
@ -184,19 +243,30 @@ exports.createFromBytes = (buf) => {
} }
exports.createFromB58String = (str) => { exports.createFromB58String = (str) => {
return new PeerIdWithIs(mh.fromB58String(str)) return exports.createFromCID(str) // B58String is CIDv0
} }
// Public Key input will be a buffer const validMulticodec = (cid) => {
// supported: 'libp2p-key' (CIDv1) and 'dag-pb' (CIDv0 converted to CIDv1)
return cid.codec === 'libp2p-key' || cid.codec === 'dag-pb'
}
exports.createFromCID = (cid) => {
cid = CID.isCID(cid) ? cid : new CID(cid)
if (!validMulticodec(cid)) throw new Error('Supplied PeerID CID has invalid multicodec: ' + cid.codec)
return new PeerIdWithIs(cid.multihash)
}
// Public Key input will be a Uint8Array
exports.createFromPubKey = async (key) => { exports.createFromPubKey = async (key) => {
let buf = key let buf = key
if (typeof buf === 'string') { if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64') buf = uint8ArrayFromString(key, 'base64pad')
} }
if (!Buffer.isBuffer(buf)) { if (!(buf instanceof Uint8Array)) {
throw new Error('Supplied key is neither a base64 string nor a buffer') throw new Error('Supplied key is neither a base64 string nor a Uint8Array')
} }
const pubKey = await cryptoKeys.unmarshalPublicKey(buf) const pubKey = await cryptoKeys.unmarshalPublicKey(buf)
@ -205,24 +275,22 @@ exports.createFromPubKey = async (key) => {
// Private key input will be a string // Private key input will be a string
exports.createFromPrivKey = async (key) => { exports.createFromPrivKey = async (key) => {
let buf = key if (typeof key === 'string') {
key = uint8ArrayFromString(key, 'base64pad')
if (typeof buf === 'string') {
buf = Buffer.from(key, 'base64')
} }
if (!Buffer.isBuffer(buf)) { if (!(key instanceof Uint8Array)) {
throw new Error('Supplied key is neither a base64 string nor a buffer') throw new Error('Supplied key is neither a base64 string nor a Uint8Array')
} }
const privKey = await cryptoKeys.unmarshalPrivateKey(buf) const privKey = await cryptoKeys.unmarshalPrivateKey(key)
return computePeerId(privKey, privKey.public) return computePeerId(privKey, privKey.public)
} }
exports.createFromJSON = async (obj) => { exports.createFromJSON = async (obj) => {
const id = mh.fromB58String(obj.id) const id = mh.fromB58String(obj.id)
const rawPrivKey = obj.privKey && Buffer.from(obj.privKey, 'base64') const rawPrivKey = obj.privKey && uint8ArrayFromString(obj.privKey, 'base64pad')
const rawPubKey = obj.pubKey && Buffer.from(obj.pubKey, 'base64') const rawPubKey = obj.pubKey && uint8ArrayFromString(obj.pubKey, 'base64pad')
const pub = rawPubKey && await cryptoKeys.unmarshalPublicKey(rawPubKey) const pub = rawPubKey && await cryptoKeys.unmarshalPublicKey(rawPubKey)
if (!rawPrivKey) { if (!rawPrivKey) {
@ -238,11 +306,11 @@ exports.createFromJSON = async (obj) => {
pubDigest = await computeDigest(pub) pubDigest = await computeDigest(pub)
} }
if (pub && !privDigest.equals(pubDigest)) { if (pub && !uint8ArrayEquals(privDigest, pubDigest)) {
throw new Error('Public and private key do not match') throw new Error('Public and private key do not match')
} }
if (id && !privDigest.equals(id)) { if (id && !uint8ArrayEquals(privDigest, id)) {
throw new Error('Id and private key do not match') throw new Error('Id and private key do not match')
} }
@ -251,7 +319,7 @@ exports.createFromJSON = async (obj) => {
exports.createFromProtobuf = async (buf) => { exports.createFromProtobuf = async (buf) => {
if (typeof buf === 'string') { if (typeof buf === 'string') {
buf = Buffer.from(buf, 'hex') buf = uint8ArrayFromString(buf, 'base16')
} }
let { id, privKey, pubKey } = PeerIdProto.decode(buf) let { id, privKey, pubKey } = PeerIdProto.decode(buf)
@ -272,7 +340,7 @@ exports.createFromProtobuf = async (buf) => {
if (privKey) { if (privKey) {
if (pubKey) { if (pubKey) {
if (!privDigest.equals(pubDigest)) { if (!uint8ArrayEquals(privDigest, pubDigest)) {
throw new Error('Public and private key do not match') throw new Error('Public and private key do not match')
} }
} }
@ -300,6 +368,6 @@ exports.isPeerId = (peerId) => {
function toB64Opt (val) { function toB64Opt (val) {
if (val) { if (val) {
return val.toString('base64') return uint8ArrayToString(val, 'base64pad')
} }
} }

View File

@ -2,12 +2,12 @@
/* eslint-env mocha */ /* eslint-env mocha */
'use strict' 'use strict'
const chai = require('chai') const { expect } = require('aegir/utils/chai')
const dirtyChai = require('dirty-chai')
chai.use(dirtyChai)
const expect = chai.expect
const crypto = require('libp2p-crypto') const crypto = require('libp2p-crypto')
const mh = require('multihashes') const mh = require('multihashes')
const CID = require('cids')
const uint8ArrayFromString = require('uint8arrays/from-string')
const uint8ArrayToString = require('uint8arrays/to-string')
const PeerId = require('../src') const PeerId = require('../src')
@ -17,6 +17,8 @@ const testId = require('./fixtures/sample-id')
const testIdHex = testId.id const testIdHex = testId.id
const testIdBytes = mh.fromHexString(testId.id) const testIdBytes = mh.fromHexString(testId.id)
const testIdB58String = mh.toB58String(testIdBytes) const testIdB58String = mh.toB58String(testIdBytes)
const testIdCID = new CID(1, 'libp2p-key', testIdBytes)
const testIdCIDString = testIdCID.toBaseEncodedString('base32')
const goId = require('./fixtures/go-private-key') const goId = require('./fixtures/go-private-key')
@ -52,54 +54,124 @@ describe('PeerId', () => {
const id = await PeerId.create(testOpts) const id = await PeerId.create(testOpts)
expect(PeerId.isPeerId(id)).to.equal(true) expect(PeerId.isPeerId(id)).to.equal(true)
expect(PeerId.isPeerId('aaa')).to.equal(false) expect(PeerId.isPeerId('aaa')).to.equal(false)
expect(PeerId.isPeerId(Buffer.from('batatas'))).to.equal(false) expect(PeerId.isPeerId(uint8ArrayFromString('batatas'))).to.equal(false)
}) })
it('throws on changing the id', async () => { it('throws on changing the id', async () => {
const id = await PeerId.create(testOpts) const id = await PeerId.create(testOpts)
expect(id.toB58String().length).to.equal(46) expect(id.toB58String().length).to.equal(46)
expect(() => { expect(() => {
id.id = Buffer.from('hello') // @ts-ignore
id.id = uint8ArrayFromString('hello')
}).to.throw(/immutable/) }).to.throw(/immutable/)
}) })
it('recreate an Id from Hex string', () => { it('recreate from Hex string', () => {
const id = PeerId.createFromHexString(testIdHex) const id = PeerId.createFromHexString(testIdHex)
expect(testIdBytes).to.deep.equal(id.id) expect(testIdBytes).to.deep.equal(id.toBytes())
}) })
it('Recreate an Id from a Buffer', () => { it('recreate from a Uint8Array', () => {
const id = PeerId.createFromBytes(testIdBytes) const id = PeerId.createFromBytes(testIdBytes)
expect(testId.id).to.equal(id.toHexString()) expect(testId.id).to.equal(id.toHexString())
expect(testIdBytes).to.deep.equal(id.toBytes())
}) })
it('Recreate a B58 String', () => { it('recreate from a B58 String', () => {
const id = PeerId.createFromB58String(testIdB58String) const id = PeerId.createFromB58String(testIdB58String)
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
expect(testIdBytes).to.deep.equal(id.toBytes())
}) })
it('Recreate from a Public Key', async () => { it('recreate from CID object', () => {
const id = PeerId.createFromCID(testIdCID)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from Base58 String (CIDv0))', () => {
const id = PeerId.createFromCID(testIdB58String)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CIDv1 Base32 (libp2p-key multicodec)', () => {
const cid = new CID(1, 'libp2p-key', testIdBytes)
const cidString = cid.toBaseEncodedString('base32')
const id = PeerId.createFromCID(cidString)
expect(cidString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CIDv1 Base32 (dag-pb multicodec)', () => {
const cid = new CID(1, 'dag-pb', testIdBytes)
const cidString = cid.toBaseEncodedString('base32')
const id = PeerId.createFromCID(cidString)
// toString should return CID with multicodec set to libp2p-key
expect(new CID(id.toString()).codec).to.equal('libp2p-key')
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('recreate from CID Uint8Array', () => {
const id = PeerId.createFromCID(testIdCID.bytes)
expect(testIdCIDString).to.equal(id.toString())
expect(testIdBytes).to.deep.equal(id.toBytes())
})
it('throws on invalid CID multicodec', () => {
// only libp2p and dag-pb are supported
const invalidCID = new CID(1, 'raw', testIdBytes).toBaseEncodedString('base32')
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Supplied PeerID CID has invalid multicodec: raw/)
})
it('throws on invalid CID value', () => {
// using function code that does not represent valid hash function
// https://github.com/multiformats/js-multihash/blob/b85999d5768bf06f1b0f16b926ef2cb6d9c14265/src/constants.js#L345
const invalidCID = 'QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpu5rmrkPdT3L'
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/multihash unknown function code: 0x50/)
})
it('throws on invalid CID object', () => {
const invalidCID = {}
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Invalid version, must be a number equal to 1 or 0/)
})
it('throws on invalid CID object', () => {
const invalidCID = {}
expect(() => {
PeerId.createFromCID(invalidCID)
}).to.throw(/Invalid version, must be a number equal to 1 or 0/)
})
it('recreate from a Public Key', async () => {
const id = await PeerId.createFromPubKey(testId.pubKey) const id = await PeerId.createFromPubKey(testId.pubKey)
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
expect(testIdBytes).to.deep.equal(id.toBytes())
}) })
it('Recreate from a Private Key', async () => { it('recreate from a Private Key', async () => {
const id = await PeerId.createFromPrivKey(testId.privKey) const id = await PeerId.createFromPrivKey(testId.privKey)
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
const encoded = Buffer.from(testId.privKey, 'base64') const encoded = uint8ArrayFromString(testId.privKey, 'base64pad')
const id2 = await PeerId.createFromPrivKey(encoded) const id2 = await PeerId.createFromPrivKey(encoded)
expect(testIdB58String).to.equal(id2.toB58String()) expect(testIdB58String).to.equal(id2.toB58String())
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey()) expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
}) })
it('Recreate from Protobuf', async () => { it('recreate from Protobuf', async () => {
const id = await PeerId.createFromProtobuf(testId.marshaled) const id = await PeerId.createFromProtobuf(testId.marshaled)
expect(testIdB58String).to.equal(id.toB58String()) expect(testIdB58String).to.equal(id.toB58String())
const encoded = Buffer.from(testId.privKey, 'base64') const encoded = uint8ArrayFromString(testId.privKey, 'base64pad')
const id2 = await PeerId.createFromPrivKey(encoded) const id2 = await PeerId.createFromPrivKey(encoded)
expect(testIdB58String).to.equal(id2.toB58String()) expect(testIdB58String).to.equal(id2.toB58String())
expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey()) expect(id.marshalPubKey()).to.deep.equal(id2.marshalPubKey())
expect(id.marshal().toString('hex')).to.deep.equal(testId.marshaled) expect(uint8ArrayToString(id.marshal(), 'base16')).to.deep.equal(testId.marshaled)
}) })
it('can be created from a Secp256k1 public key', async () => { it('can be created from a Secp256k1 public key', async () => {
@ -144,7 +216,7 @@ describe('PeerId', () => {
it('toBytes', () => { it('toBytes', () => {
const id = PeerId.createFromHexString(testIdHex) const id = PeerId.createFromHexString(testIdHex)
expect(id.toBytes().toString('hex')).to.equal(testIdBytes.toString('hex')) expect(uint8ArrayToString(id.toBytes(), 'base16')).to.equal(uint8ArrayToString(testIdBytes, 'base16'))
}) })
it('isEqual', async () => { it('isEqual', async () => {
@ -159,6 +231,30 @@ describe('PeerId', () => {
expect(ids[0].isEqual(ids[1].id)).to.equal(false) expect(ids[0].isEqual(ids[1].id)).to.equal(false)
}) })
it('equals', async () => {
const ids = await Promise.all([
PeerId.create(testOpts),
PeerId.create(testOpts)
])
expect(ids[0].equals(ids[0])).to.equal(true)
expect(ids[0].equals(ids[1])).to.equal(false)
expect(ids[0].equals(ids[0].id)).to.equal(true)
expect(ids[0].equals(ids[1].id)).to.equal(false)
})
describe('hasInlinePublicKey', () => {
it('returns true if uses a key type with inline public key', async () => {
const peerId = await PeerId.create({ keyType: 'secp256k1' })
expect(peerId.hasInlinePublicKey()).to.equal(true)
})
it('returns false if uses a key type with no inline public key', async () => {
const peerId = await PeerId.create({ keyType: 'RSA' })
expect(peerId.hasInlinePublicKey()).to.equal(false)
})
})
describe('fromJSON', () => { describe('fromJSON', () => {
it('full node', async () => { it('full node', async () => {
const id = await PeerId.create(testOpts) const id = await PeerId.create(testOpts)
@ -187,33 +283,49 @@ describe('PeerId', () => {
it('set privKey (valid)', async () => { it('set privKey (valid)', async () => {
const peerId = await PeerId.create(testOpts) const peerId = await PeerId.create(testOpts)
// @ts-ignore
peerId.privKey = peerId._privKey peerId.privKey = peerId._privKey
expect(peerId.isValid()).to.equal(true) expect(peerId.isValid()).to.equal(true)
}) })
it('set pubKey (valid)', async () => { it('set pubKey (valid)', async () => {
const peerId = await PeerId.create(testOpts) const peerId = await PeerId.create(testOpts)
// @ts-ignore
peerId.pubKey = peerId._pubKey peerId.pubKey = peerId._pubKey
expect(peerId.isValid()).to.equal(true) expect(peerId.isValid()).to.equal(true)
}) })
it('set privKey (invalid)', async () => { it('set privKey (invalid)', async () => {
const peerId = await PeerId.create(testOpts) const peerId = await PeerId.create(testOpts)
peerId.privKey = Buffer.from('bufff') // @ts-ignore
peerId.privKey = uint8ArrayFromString('bufff')
expect(peerId.isValid()).to.equal(false) expect(peerId.isValid()).to.equal(false)
}) })
it('set pubKey (invalid)', async () => { it('set pubKey (invalid)', async () => {
const peerId = await PeerId.create(testOpts) const peerId = await PeerId.create(testOpts)
peerId.pubKey = Buffer.from('bufff') // @ts-ignore
peerId.pubKey = uint8ArrayFromString('bufff')
expect(peerId.isValid()).to.equal(false) expect(peerId.isValid()).to.equal(false)
}) })
it('keys are equal after one is stringified', async () => {
const peerId = await PeerId.create(testOpts)
const peerId1 = PeerId.createFromB58String(peerId.toB58String())
const peerId2 = PeerId.createFromB58String(peerId.toB58String())
expect(peerId1).to.deep.equal(peerId2)
peerId1.toString()
expect(peerId1).to.deep.equal(peerId2)
})
describe('returns error via cb instead of crashing', () => { describe('returns error via cb instead of crashing', () => {
const garbage = [ const garbage = [
Buffer.from('00010203040506070809', 'hex'), uint8ArrayFromString('00010203040506070809', 'base16'),
{}, null, false, undefined, true, 1, 0, {}, null, false, undefined, true, 1, 0,
Buffer.from(''), 'aGVsbG93b3JsZA==', 'helloworld', '' uint8ArrayFromString(''), 'aGVsbG93b3JsZA==', 'helloworld', ''
] ]
const fncs = ['createFromPubKey', 'createFromPrivKey', 'createFromJSON', 'createFromProtobuf'] const fncs = ['createFromPubKey', 'createFromPrivKey', 'createFromJSON', 'createFromProtobuf']

37
tsconfig.json Normal file
View File

@ -0,0 +1,37 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6"
],
"target": "ES5",
"noImplicitAny": false,
"noImplicitThis": true,
"strictFunctionTypes": true,
"strictNullChecks": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"allowJs": true,
"checkJs": true,
"baseUrl": ".",
"paths": {
"peer-id": [
"./src",
"../src",
]
},
"types": [
"node",
"mocha",
"chai"
],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"./src/index.d.ts",
],
"include": [
"./test/**/*.spec.js"
]
}