diff --git a/README.md b/README.md
index cde1025..d34cc98 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@ JavaScript Bitmessage library for both browserify and node. The goal of this pro
Public library API is currently in alpha stage, breaking changes are very likely to happen.
+API documentation available [here](https://bitchan.github.io/bitmessage/docs/).
+
## References
* [Project wiki](https://bitmessage.org/wiki/Main_Page)
diff --git a/jsdoc.json b/jsdoc.json
new file mode 100644
index 0000000..7529d86
--- /dev/null
+++ b/jsdoc.json
@@ -0,0 +1,13 @@
+{
+ "source": {
+ "include": ["lib", "README.md"]
+ },
+ "plugins": ["plugins/markdown"],
+ "markdown": {
+ "parser": "gfm"
+ },
+ "opts": {
+ "recurse": true,
+ "destination": "docs"
+ }
+}
diff --git a/lib/address.js b/lib/address.js
index 178be7e..1bfcd0a 100644
--- a/lib/address.js
+++ b/lib/address.js
@@ -1,5 +1,6 @@
/**
* Working with Bitmessage addresses.
+ * @see {@link https://bitmessage.org/wiki/Address}
* @module bitmessage/address
*/
@@ -36,8 +37,7 @@ function Address(opts) {
/**
* Parse Bitmessage address into address object.
* @param {String} str - Address string (with or without `BM-` prefix)
- * @return {Promise.
} Decoded address object
- * @static
+ * @return {Promise.} Decoded address object.
*/
Address.decode = function(str) {
str = str.trim();
@@ -110,7 +110,7 @@ function keys2ripe(signKey, encKey) {
/**
* Calculate the Ripe hash of the address.
* @param {?Object} opts - Options
- * @return {Promise.} Resulting Ripe hash
+ * @return {Promise.} Resulting Ripe hash.
*/
Address.prototype.getRipe = function(opts) {
var self = this;
@@ -179,7 +179,7 @@ function checkripelen(ripelen, version) {
/**
* Encode Bitmessage address object into address string.
- * @return {Promise.} Address string
+ * @return {Promise.} Address string.
*/
Address.prototype.encode = function() {
var self = this;
@@ -200,8 +200,7 @@ Address.prototype.encode = function() {
* Create new Bitmessage address from random encryption and signing
* private keys.
* @param {?Object} opts - Address options
- * @return {Promise.} Generated address object
- * @static
+ * @return {Promise.} Generated address object.
*/
Address.fromRandom = function(opts) {
opts = opts || {};
diff --git a/lib/crypto-platform.browser.js b/lib/crypto-platform.browser.js
index aeec1ab..c8e521f 100644
--- a/lib/crypto-platform.browser.js
+++ b/lib/crypto-platform.browser.js
@@ -1,8 +1,8 @@
/**
* Browser Bitmessage crypto implementation.
- * Documentation:
- * Browsers support:
- * Blink implementation details:
+ * @see {@link http://www.w3.org/TR/WebCryptoAPI/}
+ * @see {@link http://caniuse.com/#feat=cryptography}
+ * @see {@link https://sites.google.com/a/chromium.org/dev/blink/webcrypto}
*/
"use strict";
diff --git a/lib/crypto-platform.js b/lib/crypto-platform.js
index 81ae9c0..0cb0ad8 100644
--- a/lib/crypto-platform.js
+++ b/lib/crypto-platform.js
@@ -8,18 +8,33 @@
require("es6-promise").polyfill();
var crypto = require("crypto");
+/**
+ * Calculate SHA-512 hash.
+ * @param {Buffer} buf - Input data
+ * @return {Promise.} Resulting hash.
+ */
exports.sha512 = function(buf) {
var hash = crypto.createHash("sha512");
hash.update(buf);
return Promise.resolve(hash.digest());
};
+/**
+ * Calculate SHA-256 hash.
+ * @param {Buffer} buf - Input data
+ * @return {Promise.} Resulting hash.
+ */
exports.sha256 = function(buf) {
var hash = crypto.createHash("sha256");
hash.update(buf);
return Promise.resolve(hash.digest());
};
+/**
+ * Calculate RIPEMD-160 hash.
+ * @param {Buffer} buf - Input data
+ * @return {Promise.} Resulting hash.
+ */
exports.ripemd160 = function(buf) {
var hash = crypto.createHash("ripemd160");
hash.update(buf);
diff --git a/lib/crypto.js b/lib/crypto.js
index d5d7724..7588efa 100644
--- a/lib/crypto.js
+++ b/lib/crypto.js
@@ -1,6 +1,7 @@
/**
- * Isomorphic Bitmessage crypto module. Reexports platform-specific
- * functions and also some common routines.
+ * Isomorphic Bitmessage crypto module. Reexports
+ * [platform-specific functions]{@link module:bitmessage/crypto-platform}
+ * and also some common routines.
* @module bitmessage/crypto
*/
@@ -21,4 +22,10 @@ exports.getPrivate = function() {
return cryptoPlatform.randomBytes(32);
};
+/**
+ * Generate public key for a given private key.
+ * @param {Buffer} privateKey - Private key
+ * @return {Buffer} Public key.
+ * @function
+ */
exports.getPublic = eccrypto.getPublic;
diff --git a/lib/index.js b/lib/index.js
index 1045c2c..02ce5bf 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -5,8 +5,15 @@
"use strict";
-// uint64_t implementation used for operations with int64. You may
-// replace it with other library with the same API.
+/**
+ * `uint64_t` implementation used to represent such numbers in
+ * JavaScript. Default is
+ * [int64-native](https://www.npmjs.com/package/int64-native) for Node
+ * platform and [node-int64](https://www.npmjs.com/package/node-int64)
+ * for Browser. You may replace it with other library with the same API.
+ */
exports.Int64 = require("int64-native");
+/** Working with addresses. */
exports.Address = require("./address");
+/** Working with WIF. */
exports.wif = require("./wif");
diff --git a/lib/varint.js b/lib/varint.js
index 9af832c..755033f 100644
--- a/lib/varint.js
+++ b/lib/varint.js
@@ -1,6 +1,6 @@
/**
- * Implement `var_int` encoding/decoding.
- * Reference:
+ * Implements `var_int` encoding/decoding.
+ * @see {@link https://bitmessage.org/wiki/Protocol_specification#Variable_length_integer}
* @module bitmessage/varint
*/
@@ -12,7 +12,8 @@ var bitmessage = require("./");
/**
* Decode var_int.
* @param {Buffer} buf - Buffer that starts with encoded var_int
- * @return {var_int} Decoded var_int structure
+ * @return {{value: (number|Int64), length: number, rest: number}}
+ * Decoded var_int structure.
*/
exports.decode = function(buf) {
assert(buf.length > 0, "Empty buffer");
@@ -46,7 +47,7 @@ exports.decode = function(buf) {
/**
* Encode number into var_int.
* @param {(number|Int64|Buffer)} value - Input number
- * @return {Buffer} Encoded var_int
+ * @return {Buffer} Encoded var_int.
*/
exports.encode = function(value) {
var buf, buf64, targetStart;
diff --git a/lib/wif.js b/lib/wif.js
index 9c62451..17bd5cf 100644
--- a/lib/wif.js
+++ b/lib/wif.js
@@ -1,6 +1,6 @@
/**
- * Implement WIF encoding/decoding.
- * Reference:
+ * Implements WIF encoding/decoding.
+ * @see {@link https://en.bitcoin.it/wiki/Wallet_import_format}
* @module bitmessage/wif
*/
@@ -21,14 +21,13 @@ function getchecksum(data) {
/**
* Decode WIF encoded private key.
- * @param {string} input - Input data
- * @param {Promise.} A promise than contain private
- * key when fulfilled
+ * @param {string} wif - Encoded key
+ * @return {Promise.} Private key.
*/
-exports.decode = function(input) {
+exports.decode = function(wif) {
var bytes;
try {
- bytes = bs58.decode(input);
+ bytes = bs58.decode(wif);
assert(bytes[0] === 0x80, "Bad WIF");
} catch(e) {
return Promise.reject(e);
@@ -44,8 +43,7 @@ exports.decode = function(input) {
/**
* Convert private key to a WIF.
* @param {Buffer} privateKey - A private key to encode
- * @return {Promise.} A promise that contains the
- * encoded key when fulfilled
+ * @return {Promise.} Encoded private key.
*/
exports.encode = function(privateKey) {
var data = Buffer.concat([new Buffer([0x80]), privateKey]);
diff --git a/package.json b/package.json
index c251c7c..d7e7f1e 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,8 @@
"k": "xvfb-run -a karma start",
"kc": "xvfb-run -a karma start --browsers Chromium",
"kf": "xvfb-run -a karma start --browsers Firefox",
- "j": "jshint ."
+ "j": "jshint .",
+ "docs": "jsdoc -c jsdoc.json"
},
"repository": {
"type": "git",
@@ -33,6 +34,7 @@
"homepage": "https://github.com/bitchan/bitmessage",
"devDependencies": {
"chai": "*",
+ "jsdoc": "^3.3.0-alpha13",
"jshint": "*",
"karma": "^0.12.28",
"karma-browserify": "^1.0.1",