WIP roster definition
This commit is contained in:
parent
7cc1832a1f
commit
c17a28cced
3
scripts/tests/roster.js
Normal file
3
scripts/tests/roster.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module.exports = require("../../www/common/outer/roster.js");
|
||||||
|
|
||||||
|
|
||||||
@ -1,12 +1,14 @@
|
|||||||
/* globals process */
|
/* globals process */
|
||||||
|
|
||||||
var Client = require("../../lib/client/");
|
var Client = require("../../lib/client/");
|
||||||
var Mailbox = require("../../www/bower_components/chainpad-crypto").Mailbox;
|
var Crypto = require("../../www/bower_components/chainpad-crypto");
|
||||||
|
var Mailbox = Crypto.Mailbox;
|
||||||
var Nacl = require("tweetnacl");
|
var Nacl = require("tweetnacl");
|
||||||
var nThen = require("nthen");
|
var nThen = require("nthen");
|
||||||
var Rpc = require("../../www/common/rpc");
|
var Rpc = require("../../www/common/rpc");
|
||||||
var Hash = require("../../www/common/common-hash");
|
var Hash = require("../../www/common/common-hash");
|
||||||
var CpNetflux = require("../../www/bower_components/chainpad-netflux");
|
var CpNetflux = require("../../www/bower_components/chainpad-netflux");
|
||||||
|
var Roster = require("./roster");
|
||||||
|
|
||||||
var createMailbox = function (config, cb) {
|
var createMailbox = function (config, cb) {
|
||||||
var webchannel;
|
var webchannel;
|
||||||
@ -30,6 +32,15 @@ var createMailbox = function (config, cb) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var createRoster = function (config, cb) {
|
||||||
|
Roster.create({
|
||||||
|
network: config.network,
|
||||||
|
channel: config.channel,
|
||||||
|
owners: config.owners,
|
||||||
|
crypto: config.crypto,
|
||||||
|
}, cb);
|
||||||
|
};
|
||||||
|
|
||||||
process.on('unhandledRejection', function (err) {
|
process.on('unhandledRejection', function (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
});
|
});
|
||||||
@ -50,11 +61,16 @@ var makeEdKeys = function () {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var makeRosterHash = function () {
|
||||||
|
return Hash.createRandomHash('pad', '');//.replace(/\/pad\//, '/roster/');
|
||||||
|
};
|
||||||
|
|
||||||
var EMPTY_ARRAY_HASH = 'slspTLTetp6gCkw88xE5BIAbYBXllWvQGahXCx/h1gQOlE7zze4W0KRlA8puZZol8hz5zt3BPzUqPJgTjBXWrw==';
|
var EMPTY_ARRAY_HASH = 'slspTLTetp6gCkw88xE5BIAbYBXllWvQGahXCx/h1gQOlE7zze4W0KRlA8puZZol8hz5zt3BPzUqPJgTjBXWrw==';
|
||||||
|
|
||||||
var createUser = function (config, cb) {
|
var createUser = function (config, cb) {
|
||||||
// config should contain keys for a team rpc (ed)
|
// config should contain keys for a team rpc (ed)
|
||||||
// teamEdKeys
|
// teamEdKeys
|
||||||
|
// rosterHash
|
||||||
|
|
||||||
var user;
|
var user;
|
||||||
nThen(function (w) {
|
nThen(function (w) {
|
||||||
@ -75,6 +91,26 @@ var createUser = function (config, cb) {
|
|||||||
user.mailbox = Mailbox.createEncryptor(user.curveKeys);
|
user.mailbox = Mailbox.createEncryptor(user.curveKeys);
|
||||||
user.mailboxChannel = Hash.createChannelId();
|
user.mailboxChannel = Hash.createChannelId();
|
||||||
|
|
||||||
|
//console.log(config.rosterHash);
|
||||||
|
//console.log(Hash.parseTypeHash('pad', config.rosterHash));
|
||||||
|
|
||||||
|
user.roster = Hash.getSecrets('pad', config.rosterHash, '');
|
||||||
|
console.log(user.roster);
|
||||||
|
var crypto = Crypto.createEncryptor(user.roster.keys);
|
||||||
|
|
||||||
|
console.log(crypto);
|
||||||
|
|
||||||
|
createRoster({
|
||||||
|
network: network,
|
||||||
|
channel: user.roster.channel,
|
||||||
|
owners: [ user.edKeys.edPublic ],
|
||||||
|
crypto: crypto,
|
||||||
|
validateKey: user.roster.validateKey,
|
||||||
|
}, w(function (err, roster) {
|
||||||
|
if (err) { return void console.error(err); }
|
||||||
|
user.roster = roster;
|
||||||
|
}));
|
||||||
|
|
||||||
// create an anon rpc for alice
|
// create an anon rpc for alice
|
||||||
Rpc.createAnonymous(network, w(function (err, rpc) {
|
Rpc.createAnonymous(network, w(function (err, rpc) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -221,6 +257,7 @@ var alice, bob;
|
|||||||
nThen(function (w) {
|
nThen(function (w) {
|
||||||
var sharedConfig = {
|
var sharedConfig = {
|
||||||
teamEdKeys: makeEdKeys(),
|
teamEdKeys: makeEdKeys(),
|
||||||
|
rosterHash: makeRosterHash(),
|
||||||
};
|
};
|
||||||
|
|
||||||
createUser(sharedConfig, w(function (err, _alice) {
|
createUser(sharedConfig, w(function (err, _alice) {
|
||||||
|
|||||||
98
www/common/outer/roster.js
Normal file
98
www/common/outer/roster.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
(function () {
|
||||||
|
var factory = function (Util, Hash, CPNetflux) {
|
||||||
|
var Roster = {};
|
||||||
|
|
||||||
|
Roster.commands = {};
|
||||||
|
|
||||||
|
Roster.create = function (config, _cb) {
|
||||||
|
if (typeof(_cb) !== 'function') { throw new Error("EXPECTED_CALLBACK"); }
|
||||||
|
var cb = Util.once(Util.mkAsync(_cb));
|
||||||
|
|
||||||
|
if (!config.network) { return void cb("EXPECTED_NETWORK"); }
|
||||||
|
if (!config.channel) { return void cb("EXPECTED_CHANNEL"); }
|
||||||
|
if (!config.owners) { return void cb("EXPECTED_OWNERS"); }
|
||||||
|
if (!config.crypto) { return void cb("EXPECTED_CRYPTO"); }
|
||||||
|
|
||||||
|
var roster = {};
|
||||||
|
|
||||||
|
/* Commands
|
||||||
|
* addUser(key, role) // owner, member
|
||||||
|
* describeUser(key, data) // mailbox, role
|
||||||
|
* removeUser(key)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Events
|
||||||
|
* checkpoint(id)
|
||||||
|
* description(data)
|
||||||
|
* metadata change
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ready = false;
|
||||||
|
var onReady = function (/* info */) {
|
||||||
|
ready = true;
|
||||||
|
cb(void 0, roster);
|
||||||
|
};
|
||||||
|
|
||||||
|
var onChannelError = function (info) {
|
||||||
|
if (!ready) { return void cb(info); } // XXX make sure we don't reconnect
|
||||||
|
console.error("CHANNEL_ERROR", info);
|
||||||
|
};
|
||||||
|
|
||||||
|
var onConnect = function (/* wc, sendMessage */) {
|
||||||
|
Util.both(Util.bake(console.log, "onConnect"), console.log).apply(null, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
var onMessage = function (msg, user, vKey, isCp, hash /*, author */) {
|
||||||
|
if (isCp) { roster.lastKnownCp = hash; }
|
||||||
|
console.log("onMessage");
|
||||||
|
console.log.apply(null, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CPNetflux.start({
|
||||||
|
lastKnownHash: config.lastKnownHash,
|
||||||
|
|
||||||
|
network: config.network,
|
||||||
|
channel: config.channel,
|
||||||
|
|
||||||
|
crypto: config.crypto,
|
||||||
|
validateKey: config.validateKey,
|
||||||
|
|
||||||
|
owners: config.owners,
|
||||||
|
|
||||||
|
onChannelError: onChannelError,
|
||||||
|
onReady: onReady,
|
||||||
|
onConnect: onConnect,
|
||||||
|
onConnectionChange: function () {},
|
||||||
|
onMessage: onMessage,
|
||||||
|
|
||||||
|
noChainPad: true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return Roster;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof(module) !== 'undefined' && module.exports) {
|
||||||
|
module.exports = factory(
|
||||||
|
require("../common-util"),
|
||||||
|
require("../common-hash"),
|
||||||
|
require("../../bower_components/chainpad-netflux/chainpad-netflux.js")
|
||||||
|
);
|
||||||
|
} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) {
|
||||||
|
define([
|
||||||
|
'/common/common-util.js',
|
||||||
|
'/common/common-hash.js',
|
||||||
|
'/bower_components/chainpad-netflux/chainpad-netflux.js',
|
||||||
|
//'/bower_components/tweetnacl/nacl-fast.min.js',
|
||||||
|
], function (Util, Hash, CPNF) {
|
||||||
|
return factory.apply(null, [
|
||||||
|
Util,
|
||||||
|
Hash,
|
||||||
|
CPNF
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// I'm not gonna bother supporting any other kind of instanciation
|
||||||
|
}
|
||||||
|
}());
|
||||||
Loading…
x
Reference in New Issue
Block a user