nodemagi
v0.4.1
Published
Magi RPC client
Readme
A Node.js Magi Client!
This is a fork made by Arkanic from the original repository: (https://github.com/m-pays/node-magi). The purpose of the fork is to re-upload the code to npm, add ts typings, and to add some generateable documentation to the original code. A re-write by Arkanic in the future may be considered.
node-magi is a Magi client for Node.js. It is a fork of the excellent Kapitalize Bitcoin Client (now removed from GitHub) intended for use with Magi. The purpose of this repository is:
- Provide a one-stop resource for the Node.js developer to get started with Magi integration.
- Prevent would-be Magi web developers worrying whether a Bitcoin client will work out of the box.
- Promote Node.js development of Magi web apps.
- Identify and address any incompatibilities with the Magi and Bitcoin APIs that exist now and/or in the future.
Dependencies
You'll need a running instance of magid to connect with.
Then, install the node-magi NPM package.
npm install node-magi
Examples
Some code examples follow below, but for more complete examples:
var magi = require('node-magi')()
magi.auth('myusername', 'mypassword')
magi.getDifficulty(function() {
console.log(arguments);
})
Chaining
Pretty much everything is chainable.
var magi = require('node-magi')()
magi
.auth('MyUserName', 'mypassword')
.getNewAddress()
.getBalance()Methods
The Litecoin API is supported as direct methods. Use either camelcase or lowercase.
magi.getNewAddress(function(err, address) {
this.validateaddress(address, function(err, info) {
})
}).exec(command [string], ...arguments..., callback [function])
Executes the given command with optional arguments. Function callback defaults to console.log.
All of the API commands are supported in lowercase or camelcase. Or uppercase. Anycase!
magi.exec('getNewAddress')
magi.exec('getbalance', function(err, balance) {
}).set(key [string, object], value [optional])
Accepts either key & value strings or an Object containing settings, returns this for chainability.
magi.set('host', '127.0.0.1').get(key [string])
Returns the specified option's value
magi.get('user').auth(user [string], pass [string])
Generates authorization header, returns this for chainability
Commands
TODO: Write tests for these.
All Litecoin API commands are supported, in lowercase or camelcase form.
Generation is limited to [genproclimit] processors, -1 is unlimited.
Options
You may pass options to the initialization function or to the set method.
var magi = require('magi')({
user:'user'
})
magi.set('pass', 'somn')
magi.set({port:22555})
Available options and default values:
- host localhost
- port 22555
- user
- pass
- passphrasecallback
- https
- ca
Passphrase Callback
With an encryped wallet, any operation that accesses private keys requires a wallet unlock. A wallet is unlocked using the walletpassphrase <passphrase> <timeout> JSON-RPC method: the wallet will relock after timeout seconds.
You may pass an optional function passphrasecallback to the node-magi initialization function to manage wallet unlocks. passphrasecallback should be a function accepting three arguments:
function(command, args, callback) {}- command is the command that failed due to a locked wallet.
- args is the arguments for the failed command.
- callback is a typical node-style continuation callback of the form
function(err, passphrase, timeout) {}. Call callback with the wallet passphrase and desired timeout from within your passphrasecallback to unlock the wallet.
You may hard code your passphrase (not recommended) as follows:
var magi = require('node-magi')({
passphrasecallback: function(command, args, callback) {
callback(null, 'passphrase', 30);
}
})Because passphrasecallback is a continuation, you can retrieve the passphrase in an asynchronous manner. For example, by prompting the user:
var readline = require('readline')
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
var magi = require('node-magi')({
passphrasecallback: function(command, args, callback) {
rl.question('Enter passphrase for "' + command + '" operation: ', function(passphrase) {
if (passphrase) {
callback(null, passphrase, 1)
} else {
callback(new Error('no passphrase entered'))
}
})
}
})Secure RPC with SSL
By default magid exposes its JSON-RPC interface via HTTP; that is, all RPC commands are transmitted in plain text across the network! To secure the JSON-RPC channel you can supply magid with a self-signed SSL certificate and an associated private key to enable HTTPS. For example, in your magi.conf:
rpcssl=1
rpcsslcertificatechainfile=/etc/ssl/certs/magid.crt
rpcsslprivatekeyfile=/etc/ssl/private/magid.pemIn order to securely access an SSL encrypted JSON-RPC interface you need a copy of the self-signed certificate from the server: in this case magid.crt. Pass your self-signed certificate in the ca option and set https: true and node-magi is secured!
var fs = require('fs')
var ca = fs.readFileSync('magid.crt')
var magi = require('node-magi')({
user: 'rpcusername',
pass: 'rpcpassword',
https: true,
ca: ca
})Testing
npm install -g nodeunit
nodeunit test/test-node-magi.jsBounties
Magi donation address is 95V9eZnrghtEriGUhBwwEuqMbDm1HBJ58u
Donations in Magi will be used for bounties. The first bounty will be awarded for creating a unit test suite. As a side note: I encourage all GitHub repository owners to post a donation address so their community can easily support development financially.)
