blocktrail-sdk
Version:
BlockTrail's Developer Friendly API binding for NodeJS
552 lines (523 loc) • 16.5 kB
JavaScript
// Default modules to build
var defaults = [
'utils',
'globals',
'aes-cbc',
'aes-gcm',
'sha1',
'sha256',
'hmac-sha1',
'hmac-sha256',
'pbkdf2-hmac-sha1',
'pbkdf2-hmac-sha256',
'rng',
'bn',
'rsa-pkcs1',
'rng-globals',
'origin',
];
// Map each of the modules and their deps
// Topo-sorted
var modules = [
{
name: 'common',
files: [ 'src/errors.js' ]
},
{
name: 'utils',
files: [ 'src/utils.js' ],
implies: [ 'exports' ]
},
{
name: 'origin',
files: [ 'src/origin.js' ],
},
{
name: 'exports',
files: [ 'src/exports.js' ],
depends: [ 'utils' ]
},
{
name: 'globals',
files: [ 'src/globals.js' ],
depends: [ 'common' ]
},
{
name: 'aes',
files: [ 'src/aes/aes.asm.js', 'src/aes/aes.js' ],
depends: [ 'common', 'utils' ]
},
{
name: 'aes-ecb',
files: [ 'src/aes/ecb/ecb.js' ],
depends: [ 'aes' ],
implies: [ 'aes-exports', 'aes-ecb-exports' ]
},
{
name: 'aes-cbc',
files: [ 'src/aes/cbc/cbc.js' ],
depends: [ 'aes' ],
implies: [ 'aes-exports', 'aes-cbc-exports' ]
},
{
name: 'aes-cfb',
files: [ 'src/aes/cfb/cfb.js' ],
depends: [ 'aes' ],
implies: [ 'aes-exports', 'aes-cfb-exports' ]
},
{
name: 'aes-ofb',
files: [ 'src/aes/ofb/ofb.js' ],
depends: [ 'aes' ],
implies: [ 'aes-exports', 'aes-ofb-exports' ]
},
{
name: 'aes-ctr',
files: [ 'src/aes/ctr/ctr.js' ],
depends: [ 'aes' ],
implies: [ 'aes-exports', 'aes-ctr-exports' ]
},
{
name: 'aes-ccm',
files: [ 'src/aes/ccm/ccm.js' ],
depends: [ 'aes', 'aes-ctr' ],
implies: [ 'aes-exports', 'aes-ccm-exports' ]
},
{
name: 'aes-gcm',
files: [ 'src/aes/gcm/gcm.js' ],
depends: [ 'aes', 'aes-ctr' ],
implies: [ 'aes-exports', 'aes-gcm-exports' ]
},
{
name: 'aes-exports',
files: [ 'src/aes/exports.js' ],
depends: [ 'aes' ]
},
{
name: 'aes-ecb-exports',
files: [ 'src/aes/ecb/exports.js' ],
depends: [ 'aes-ecb', 'aes-exports' ]
},
{
name: 'aes-cbc-exports',
files: [ 'src/aes/cbc/exports.js' ],
depends: [ 'aes-cbc', 'aes-exports' ]
},
{
name: 'aes-cfb-exports',
files: [ 'src/aes/cfb/exports.js' ],
depends: [ 'aes-cfb', 'aes-exports' ]
},
{
name: 'aes-ofb-exports',
files: [ 'src/aes/ofb/exports.js' ],
depends: [ 'aes-ofb', 'aes-exports' ]
},
{
name: 'aes-ctr-exports',
files: [ 'src/aes/ctr/exports.js' ],
depends: [ 'aes-ctr', 'aes-exports' ]
},
{
name: 'aes-ccm-exports',
files: [ 'src/aes/ccm/exports.js' ],
depends: [ 'aes-ccm', 'aes-exports' ]
},
{
name: 'aes-gcm-exports',
files: [ 'src/aes/gcm/exports.js' ],
depends: [ 'aes-gcm', 'aes-exports' ]
},
{
name: 'hash',
files: [ 'src/hash/hash.js' ],
depends: [ 'common', 'utils' ]
},
{
name: 'sha1',
files: [ 'src/hash/sha1/sha1.asm.js', 'src/hash/sha1/sha1.js' ],
depends: [ 'common', 'hash', 'utils' ],
implies: [ 'sha1-exports' ]
},
{
name: 'sha1-exports',
files: [ 'src/hash/sha1/exports.js' ],
depends: [ 'sha1' ]
},
{
name: 'sha256',
files: [ 'src/hash/sha256/sha256.asm.js', 'src/hash/sha256/sha256.js' ],
depends: [ 'common', 'hash', 'utils' ],
implies: [ 'sha256-exports' ]
},
{
name: 'sha256-exports',
files: [ 'src/hash/sha256/exports.js' ],
depends: [ 'sha256' ],
},
{
name: 'sha512',
files: [ 'src/hash/sha512/sha512.asm.js', 'src/hash/sha512/sha512.js' ],
depends: [ 'common', 'hash', 'utils' ],
implies: [ 'sha512-exports' ]
},
{
name: 'sha512-exports',
files: [ 'src/hash/sha512/exports.js' ],
depends: [ 'sha512' ]
},
{
name: 'hmac',
files: [ 'src/hmac/hmac.js' ],
depends: [ 'common', 'utils' ]
},
{
name: 'hmac-sha1',
files: [ 'src/hmac/hmac-sha1.js' ],
depends: [ 'hmac', 'sha1' ],
implies: [ 'hmac-sha1-exports' ]
},
{
name: 'hmac-sha256',
files: [ 'src/hmac/hmac-sha256.js' ],
depends: [ 'hmac', 'sha256' ],
implies: [ 'hmac-sha256-exports' ]
},
{
name: 'hmac-sha512',
files: [ 'src/hmac/hmac-sha512.js' ],
depends: [ 'hmac', 'sha512' ],
implies: [ 'hmac-sha512-exports' ]
},
{
name: 'hmac-sha1-exports',
files: [ 'src/hmac/exports-hmac-sha1.js' ],
depends: [ 'hmac-sha1' ]
},
{
name: 'hmac-sha256-exports',
files: [ 'src/hmac/exports-hmac-sha256.js' ],
depends: [ 'hmac-sha256' ]
},
{
name: 'hmac-sha512-exports',
files: [ 'src/hmac/exports-hmac-sha512.js' ],
depends: [ 'hmac-sha512' ]
},
{
name: 'pbkdf2',
files: [ 'src/pbkdf2/pbkdf2.js' ],
depends: [ 'common', 'utils' ]
},
{
name: 'pbkdf2-hmac-sha1',
files: [ 'src/pbkdf2/pbkdf2-hmac-sha1.js' ],
depends: [ 'pbkdf2', 'hmac-sha1' ],
implies: [ 'pbkdf2-hmac-sha1-exports' ]
},
{
name: 'pbkdf2-hmac-sha256',
files: [ 'src/pbkdf2/pbkdf2-hmac-sha256.js' ],
depends: [ 'pbkdf2', 'hmac-sha256' ],
implies: [ 'pbkdf2-hmac-sha256-exports' ]
},
{
name: 'pbkdf2-hmac-sha512',
files: [ 'src/pbkdf2/pbkdf2-hmac-sha512.js' ],
depends: [ 'pbkdf2', 'hmac-sha512' ],
implies: [ 'pbkdf2-hmac-sha512-exports' ]
},
{
name: 'pbkdf2-hmac-sha1-exports',
files: [ 'src/pbkdf2/exports-pbkdf2-hmac-sha1.js' ],
depends: [ 'pbkdf2' ]
},
{
name: 'pbkdf2-hmac-sha256-exports',
files: [ 'src/pbkdf2/exports-pbkdf2-hmac-sha256.js' ],
depends: [ 'pbkdf2' ]
},
{
name: 'pbkdf2-hmac-sha512-exports',
files: [ 'src/pbkdf2/exports-pbkdf2-hmac-sha512.js' ],
depends: [ 'pbkdf2' ]
},
{
name: 'rng',
files: [ 'src/random/isaac.js', 'src/random/random.js' ],
depends: [ 'common', 'utils', 'pbkdf2-hmac-sha256' ],
implies: [ 'rng-exports' ]
},
{
name: 'rng-exports',
files: [ 'src/random/exports.js' ],
depends: [ 'rng' ]
},
{
name: 'rng-globals',
files: [ 'src/random/globals.js' ],
depends: [ 'rng' ]
},
{
name: 'bn',
files: [ 'src/bignum/bigint.asm.js', 'src/bignum/bignum.js', 'src/bignum/extgcd.js', 'src/bignum/modulus.js', 'src/bignum/prime.js' ],
depends: [ 'common', 'rng' ],
implies: [ 'bn-exports' ]
},
{
name: 'bn-exports',
files: [ 'src/bignum/exports.js' ],
depends: [ 'bn' ]
},
{
name: 'rsa',
files: [ 'src/rsa/rsa.js', 'src/rsa/genkey.js' ],
depends: [ 'bn', 'rng' ],
implies: [ 'rsa-keygen-exports' ]
},
{
name: 'rsa-raw',
files: [ 'src/rsa/raw.js' ],
depends: [ 'rsa' ],
implies: [ 'rsa-keygen-exports', 'rsa-raw-exports' ]
},
{
name: 'rsa-pkcs1',
files: [ 'src/rsa/pkcs1.js' ],
depends: [ 'rsa' ],
implies: [ 'rsa-keygen-exports', 'rsa-oaep-sha1-exports', 'rsa-oaep-sha256-exports', 'rsa-oaep-sha512-exports',
'rsa-pss-sha1-exports', 'rsa-pss-sha256-exports', 'rsa-pss-sha512-exports' ]
},
{
name: 'rsa-keygen-exports',
files: [ 'src/rsa/exports-keygen.js' ],
depends: [ 'rsa' ]
},
{
name: 'rsa-raw-exports',
files: [ 'src/rsa/exports-raw.js' ],
depends: [ 'rsa-raw' ]
},
{
name: 'rsa-oaep-sha1-exports',
files: [ 'src/rsa/exports-oaep-sha1.js' ],
depends: [ 'rsa-pkcs1', 'sha1' ]
},
{
name: 'rsa-oaep-sha256-exports',
files: [ 'src/rsa/exports-oaep-sha256.js' ],
depends: [ 'rsa-pkcs1', 'sha256' ]
},
{
name: 'rsa-oaep-sha512-exports',
files: [ 'src/rsa/exports-oaep-sha512.js' ],
depends: [ 'rsa-pkcs1', 'sha512' ]
},
{
name: 'rsa-pss-sha1-exports',
files: [ 'src/rsa/exports-pss-sha1.js' ],
depends: [ 'rsa-pkcs1', 'sha1' ]
},
{
name: 'rsa-pss-sha256-exports',
files: [ 'src/rsa/exports-pss-sha256.js' ],
depends: [ 'rsa-pkcs1', 'sha256' ]
},
{
name: 'rsa-pss-sha512-exports',
files: [ 'src/rsa/exports-pss-sha512.js' ],
depends: [ 'rsa-pkcs1', 'sha512' ]
}
];
// Supported browsers
var browsers = [
// Latest browsers
{
browserName: 'Firefox',
},
{
browserName: 'Chrome',
},
{
browserName: 'Internet Explorer',
},
{
browserName: 'Safari',
platform: 'OS X 10.11',
},
// Legacy browsers
{
browserName: 'Firefox',
version: '22',
},
{
browserName: 'Internet Explorer',
version: '10',
},
{
browserName: 'Opera',
version: '12',
},
{
browserName: 'Safari',
version: '5.1',
},
];
// Grunt setup
module.exports = function ( grunt ) {
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-saucelabs');
grunt.loadNpmTasks('grunt-jsdoc');
function sources () {
// Get the list of modules split by commas
var includeModules = {};
( grunt.option('with') || process.env.WITH || '' ).split(',')
.map( function ( moduleName ) { return moduleName.trim() } )
.filter( function ( moduleName ) { return moduleName.length > 0 } )
.forEach( function ( moduleName ) { includeModules[ moduleName ] = true } );
// Check for keyword "ALL"
if ( includeModules.ALL ) {
includeModules = {};
modules.forEach( function ( module ) { includeModules[ module.name ] = true } );
}
// No modules specified, put defaults here
if ( Object.keys( includeModules ).length === 0 )
defaults.forEach( function ( moduleName ) { includeModules[moduleName] = true } );
// Trace build configuration
var traceModules = modules.filter( function ( module ) { return includeModules[module.name] } )
.map( function ( module ) { return module.name } );
grunt.log.writeln( "Building modules: " + traceModules.join(", ") );
// Recurse into dependancy tree
function traverseDependancies ( moduleName, includeModules ) {
if ( includeModules[moduleName] )
return;
var result = modules.filter( function ( module ) { return module.name === moduleName } );
if ( !result || result.length === 0 )
grunt.fail.fatal( "An unknown module '" + moduleName + "' specified" );
includeModules[ result[0].name ] = true;
// Get the deps and call recursively
var depends = result[0].depends || [];
depends.forEach( function ( dependsName ) { traverseDependancies( dependsName, includeModules ) } );
}
// Loop each of the specified module names
var deepIncludeModules = {};
Object.keys(includeModules).forEach( function ( moduleName ) { traverseDependancies( moduleName, deepIncludeModules ) } );
// Insert implied modules only when theirs dependancies are there
var impliedModules = {};
for ( var i = 0; i < modules.length; i++ ) {
if ( !includeModules[ modules[i].name ] || !modules[i].implies ) continue;
modules[i].implies.forEach( function ( moduleName ) { impliedModules[moduleName] = true } );
}
for ( var i = 0; i < modules.length; i++ ) {
if ( !modules[i].depends ) continue;
modules[i].depends.forEach( function ( moduleName ) { if ( !deepIncludeModules[moduleName] ) delete impliedModules[ modules[i].name ] } );
if ( !impliedModules[ modules[i].name ] ) continue;
deepIncludeModules[ modules[i].name ] = true;
}
Object.keys(impliedModules).forEach( function ( moduleName ) { deepIncludeModules[moduleName] = true } );
// Hold the array of files as specified by the modules
var sourceFiles = [];
for ( var i = 0; i < modules.length; i++ ) {
if ( !deepIncludeModules[ modules[i].name ] ) continue;
sourceFiles = sourceFiles.concat(modules[i].files);
}
// grunt.log.writeln( "Building files:\n" + sourceFiles.join("\n") );
grunt.config( 'sources.files', sourceFiles );
return true;
}
// Finally, configure
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
banner: "/*! asmCrypto<%= pkg.version && ' v'+pkg.version %>, (c) 2013 <%= pkg.author.name %>, opensource.org/licenses/<%= pkg.license %> */\n"
+ "(function ( exports, global ) {\n\n",
footer: "\n\n'function'==typeof define&&define.amd?define([],function(){return exports}):"
+ "'object'==typeof module&&module.exports?module.exports=exports:global.asmCrypto=exports;"
+ "\n\nreturn exports;\n})( {}, function(){return this}() );",
sourceMap: true,
sourceMapStyle: 'link'
},
all: {
files: {
'asmcrypto.js': '<%= sources.files %>'
}
}
},
uglify: {
options: {
mangle: {},
compress: {},
sourceMap: true,
sourceMapIn: 'asmcrypto.js.map',
sourceMapIncludeSources: true,
screwIE8: true,
banner: "/*! asmCrypto<%= pkg.version && ' v'+pkg.version %>, (c) 2013 <%= pkg.author.name %>, opensource.org/licenses/<%= pkg.license %> */"
},
all: {
files: {
'asmcrypto.js': 'asmcrypto.js'
}
}
},
jsdoc: {
all: {
src: [ 'src/**/*.js', 'README.md' ],
options: {
destination: 'doc'
}
}
},
qunit: {
all: {
options: {
timeout: 60000,
urls: [ 'http://localhost:9999/index.html' ]
}
}
},
'saucelabs-qunit': {
all: {
options: {
testname: 'asmcrypto.js',
urls: [ 'http://localhost:9999/' ],
browsers: browsers,
build: process.env.TRAVIS_JOB_ID,
'max-duration': 600
}
}
},
connect: {
all: {
options: {
hostname: 'localhost',
port: 9999,
base: [ 'test', '.' ],
directory: 'test'
}
}
},
watch: {
all: {
files: '<%= sources.files %>',
tasks: ['sources','concat']
}
},
clean: [
'asmcrypto.js',
'asmcrypto.js.map',
'doc/'
]
});
grunt.registerTask('sources', sources);
grunt.registerTask('default', ['sources','concat','uglify']);
grunt.registerTask('devel', ['sources','concat','connect','watch']);
grunt.registerTask('test', ['connect','qunit']);
grunt.registerTask('sauce', ['connect','saucelabs-qunit']);
};