Get the channel history
parent
525d35c9ec
commit
43c045721c
@ -0,0 +1,156 @@
|
||||
define([
|
||||
'/bower_components/chainpad-json-validator/json-ot.js',
|
||||
'/bower_components/chainpad-crypto/crypto.js',
|
||||
'/bower_components/jquery/dist/jquery.min.js',
|
||||
'/bower_components/chainpad/chainpad.dist.js',
|
||||
], function (JsonOT, Crypto) {
|
||||
var $ = window.jQuery;
|
||||
var ChainPad = window.ChainPad;
|
||||
var History = {};
|
||||
|
||||
|
||||
/* TODO
|
||||
* Implement GET_FULL_HISTORY serverside
|
||||
* All the history messages should be ['FULL_HISTORY', wc.id, msg]
|
||||
* Send [FULL_HISTORY_END, wc.id]
|
||||
*
|
||||
* We also need a chainpad without pruning and with the ability to get old messages
|
||||
*/
|
||||
var loadHistory = function (common, cb) {
|
||||
var network = common.getNetwork();
|
||||
var hkn = network.historyKeeper;
|
||||
|
||||
var wcId = common.hrefToHexChannelId(window.location.href);
|
||||
|
||||
var createRealtime = function(chan) {
|
||||
console.log(ChainPad);
|
||||
return ChainPad.create({
|
||||
userName: 'history',
|
||||
initialState: '',
|
||||
transformFunction: JsonOT.validate,
|
||||
logLevel: 0
|
||||
});
|
||||
};
|
||||
var realtime = createRealtime();
|
||||
|
||||
var secret = Cryptpad.getSecrets();
|
||||
var crypto = Crypto.createEncryptor(secret.keys);
|
||||
|
||||
var to = window.setTimeout(function () {
|
||||
cb('[GET_FULL_HISTORY_TIMEOUT]');
|
||||
}, 3000);
|
||||
|
||||
var parse = function (msg) {
|
||||
try {
|
||||
return JSON.parse(msg);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
var onMsg = function (msg) {
|
||||
var parsed = parse(msg);
|
||||
if (parsed[0] === 'FULL_HISTORY_END') {
|
||||
window.clearTimeout(to);
|
||||
cb(null, realtime);
|
||||
return;
|
||||
}
|
||||
if (parsed[0] !== 'FULL_HISTORY') { return; }
|
||||
var msg = parsed[1];
|
||||
var decryptedMsg = crypto.decrypt(msg, secret.keys.validateKey);
|
||||
realtime.message(decryptedMsg);
|
||||
};
|
||||
|
||||
network.on('message', function (msg, sender) {
|
||||
onMsg(msg);
|
||||
});
|
||||
|
||||
network.sendto(hkn, JSON.stringify(['GET_FULL_HISTORY', wcId]));
|
||||
};
|
||||
|
||||
var create = History.create = function (common, cb) {
|
||||
var exp = {};
|
||||
|
||||
var states = exp.states = ['a', 'b', 'c'];
|
||||
var c = exp.current = states.length - 1;
|
||||
console.log(c);
|
||||
|
||||
var onUpdate;
|
||||
|
||||
var update = exp.update = function () {
|
||||
states = [];
|
||||
if (typeof onUpdate === "function") { onUpdate(); }
|
||||
return states;
|
||||
};
|
||||
|
||||
var get = exp.get = function (i) {
|
||||
i = parseInt(i);
|
||||
console.log('getting', i);
|
||||
if (typeof(i) !== "number" || i < 0 || i > states.length - 1) { return; }
|
||||
var hash = states[i];
|
||||
c = i;
|
||||
if (typeof onUpdate === "function") { onUpdate(); }
|
||||
return '';
|
||||
};
|
||||
|
||||
var getNext = exp.getNext = function () {
|
||||
if (c < states.length - 1) { return get(++c); }
|
||||
};
|
||||
var getPrevious = exp.getPrevious = function () {
|
||||
if (c > 0) { return get(--c); }
|
||||
};
|
||||
|
||||
var display = exp.display = function ($toolbar, render, onClose) {
|
||||
var $hist = $toolbar.find('.cryptpad-toolbar-history').html('').show();
|
||||
var $left = $toolbar.find('.cryptpad-toolbar-leftside').hide();
|
||||
var $right = $toolbar.find('.cryptpad-toolbar-rightside').hide();
|
||||
|
||||
var $prev =$('<button>', {'class': 'previous'}).text('<<').appendTo($hist);
|
||||
var $next = $('<button>', {'class': 'next'}).text('>>').appendTo($hist);
|
||||
|
||||
var $nav = $('<div>', {'class': 'goto'}).appendTo($hist);
|
||||
var $cur = $('<input>', {
|
||||
'type' : 'number',
|
||||
'min' : '1',
|
||||
'max' : states.length
|
||||
}).val(c + 1).appendTo($nav);
|
||||
var $label = $('<label>').text(' / '+ states.length).appendTo($nav);
|
||||
var $goTo = $('<button>').text('V').appendTo($nav);
|
||||
$('<br>').appendTo($nav);
|
||||
var $rev = $('<button>', {'class':'revertHistory'}).text('TODO: revert').appendTo($nav);
|
||||
var $close = $('<button>', {'class':'closeHistory'}).text('TODO: close').appendTo($nav);
|
||||
|
||||
onUpdate = function () {
|
||||
$cur.attr('max', exp.states.length);
|
||||
$cur.val(c+1);
|
||||
};
|
||||
|
||||
var toRender = function (getter) {
|
||||
return function () { render(getter()) };
|
||||
};
|
||||
|
||||
$prev.click(toRender(getPrevious));
|
||||
$next.click(toRender(getNext));
|
||||
$goTo.click(function () {
|
||||
render( get($cur.val() - 1) )
|
||||
});
|
||||
|
||||
$close.click(function () {
|
||||
$hist.hide();
|
||||
$left.show();
|
||||
$right.show();
|
||||
onClose();
|
||||
});
|
||||
|
||||
render(get(c));
|
||||
};
|
||||
|
||||
loadHistory(common, function (err, newRt) {
|
||||
if (err) { throw new Error(err); }
|
||||
realtime = exp.realtime = newRt;
|
||||
cb(exp);
|
||||
});
|
||||
};
|
||||
|
||||
return History;
|
||||
});
|
||||
|
Loading…
Reference in New Issue