remove libraries which are now in bower
This commit is contained in:
parent
f72cb24fc5
commit
2a3ff256b9
@ -1,53 +0,0 @@
|
|||||||
define([
|
|
||||||
'/bower_components/tweetnacl/nacl-fast.min.js',
|
|
||||||
], function () {
|
|
||||||
var Nacl = window.nacl;
|
|
||||||
var module = { exports: {} };
|
|
||||||
|
|
||||||
var encryptStr = function (str, key) {
|
|
||||||
var array = Nacl.util.decodeUTF8(str);
|
|
||||||
var nonce = Nacl.randomBytes(24);
|
|
||||||
var packed = Nacl.secretbox(array, nonce, key);
|
|
||||||
if (!packed) { throw new Error(); }
|
|
||||||
return Nacl.util.encodeBase64(nonce) + "|" + Nacl.util.encodeBase64(packed);
|
|
||||||
};
|
|
||||||
|
|
||||||
var decryptStr = function (str, key) {
|
|
||||||
var arr = str.split('|');
|
|
||||||
if (arr.length !== 2) { throw new Error(); }
|
|
||||||
var nonce = Nacl.util.decodeBase64(arr[0]);
|
|
||||||
var packed = Nacl.util.decodeBase64(arr[1]);
|
|
||||||
var unpacked = Nacl.secretbox.open(packed, nonce, key);
|
|
||||||
if (!unpacked) { throw new Error(); }
|
|
||||||
return Nacl.util.encodeUTF8(unpacked);
|
|
||||||
};
|
|
||||||
|
|
||||||
var encrypt = module.exports.encrypt = function (msg, key) {
|
|
||||||
return encryptStr(msg, key);
|
|
||||||
};
|
|
||||||
|
|
||||||
var decrypt = module.exports.decrypt = function (msg, key) {
|
|
||||||
return decryptStr(msg, key);
|
|
||||||
};
|
|
||||||
|
|
||||||
var parseKey = module.exports.parseKey = function (str) {
|
|
||||||
var array = Nacl.util.decodeBase64(str);
|
|
||||||
var hash = Nacl.hash(array);
|
|
||||||
var lk = hash.subarray(32);
|
|
||||||
return {
|
|
||||||
lookupKey: lk,
|
|
||||||
cryptKey: hash.subarray(0,32),
|
|
||||||
channel: Nacl.util.encodeBase64(lk).substring(0,10)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var rand64 = module.exports.rand64 = function (bytes) {
|
|
||||||
return Nacl.util.encodeBase64(Nacl.randomBytes(bytes));
|
|
||||||
};
|
|
||||||
|
|
||||||
var genKey = module.exports.genKey = function () {
|
|
||||||
return rand64(18);
|
|
||||||
};
|
|
||||||
|
|
||||||
return module.exports;
|
|
||||||
});
|
|
||||||
9
www/common/es6-promise.min.js
vendored
9
www/common/es6-promise.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,98 +0,0 @@
|
|||||||
define([], function () {
|
|
||||||
// this makes recursing a lot simpler
|
|
||||||
var isArray = function (A) {
|
|
||||||
return Object.prototype.toString.call(A)==='[object Array]';
|
|
||||||
};
|
|
||||||
|
|
||||||
var callOnHyperJSON = function (hj, cb) {
|
|
||||||
var children;
|
|
||||||
|
|
||||||
if (hj && hj[2]) {
|
|
||||||
children = hj[2].map(function (child) {
|
|
||||||
if (isArray(child)) {
|
|
||||||
// if the child is an array, recurse
|
|
||||||
return callOnHyperJSON(child, cb);
|
|
||||||
} else if (typeof (child) === 'string') {
|
|
||||||
return child;
|
|
||||||
} else {
|
|
||||||
// the above branches should cover all methods
|
|
||||||
// if we hit this, there is a problem
|
|
||||||
throw new Error();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
children = [];
|
|
||||||
}
|
|
||||||
// this should return the top level element of your new DOM
|
|
||||||
return cb(hj[0], hj[1], children);
|
|
||||||
};
|
|
||||||
|
|
||||||
var isTruthy = function (x) {
|
|
||||||
return x;
|
|
||||||
};
|
|
||||||
|
|
||||||
var DOM2HyperJSON = function(el, predicate, filter){
|
|
||||||
if(!el.tagName && el.nodeType === Node.TEXT_NODE){
|
|
||||||
return el.textContent;
|
|
||||||
}
|
|
||||||
if(!el.attributes){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (predicate) {
|
|
||||||
if (!predicate(el)) {
|
|
||||||
// shortcircuit
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var attributes = {};
|
|
||||||
|
|
||||||
var i = 0;
|
|
||||||
for(;i < el.attributes.length; i++){
|
|
||||||
var attr = el.attributes[i];
|
|
||||||
if(attr.name && attr.value){
|
|
||||||
attributes[attr.name] = attr.value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// this should never be longer than three elements
|
|
||||||
var result = [];
|
|
||||||
|
|
||||||
// get the element type, id, and classes of the element
|
|
||||||
// and push them to the result array
|
|
||||||
var sel = el.tagName;
|
|
||||||
|
|
||||||
if(attributes.id){
|
|
||||||
// we don't have to do much to validate IDs because the browser
|
|
||||||
// will only permit one id to exist
|
|
||||||
// unless we come across a strange browser in the wild
|
|
||||||
sel = sel +'#'+ attributes.id;
|
|
||||||
delete attributes.id;
|
|
||||||
}
|
|
||||||
result.push(sel);
|
|
||||||
|
|
||||||
// second element of the array is the element attributes
|
|
||||||
result.push(attributes);
|
|
||||||
|
|
||||||
// third element of the array is an array of child nodes
|
|
||||||
var children = [];
|
|
||||||
|
|
||||||
// js hint complains if we use 'var' here
|
|
||||||
i = 0;
|
|
||||||
for(; i < el.childNodes.length; i++){
|
|
||||||
children.push(DOM2HyperJSON(el.childNodes[i], predicate, filter));
|
|
||||||
}
|
|
||||||
result.push(children.filter(isTruthy));
|
|
||||||
|
|
||||||
if (filter) {
|
|
||||||
return filter(result);
|
|
||||||
} else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
fromDOM: DOM2HyperJSON,
|
|
||||||
callOn: callOnHyperJSON
|
|
||||||
};
|
|
||||||
});
|
|
||||||
@ -1,291 +0,0 @@
|
|||||||
/*global: WebSocket */
|
|
||||||
define(function () {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var MAX_LAG_BEFORE_PING = 15000;
|
|
||||||
var MAX_LAG_BEFORE_DISCONNECT = 30000;
|
|
||||||
var PING_CYCLE = 5000;
|
|
||||||
var REQUEST_TIMEOUT = 30000;
|
|
||||||
|
|
||||||
var now = function now() {
|
|
||||||
return new Date().getTime();
|
|
||||||
};
|
|
||||||
|
|
||||||
var networkSendTo = function networkSendTo(ctx, peerId, content) {
|
|
||||||
var seq = ctx.seq++;
|
|
||||||
ctx.ws.send(JSON.stringify([seq, 'MSG', peerId, content]));
|
|
||||||
return new Promise(function (res, rej) {
|
|
||||||
ctx.requests[seq] = { reject: rej, resolve: res, time: now() };
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var channelBcast = function channelBcast(ctx, chanId, content) {
|
|
||||||
var chan = ctx.channels[chanId];
|
|
||||||
if (!chan) {
|
|
||||||
throw new Error("no such channel " + chanId);
|
|
||||||
}
|
|
||||||
var seq = ctx.seq++;
|
|
||||||
ctx.ws.send(JSON.stringify([seq, 'MSG', chanId, content]));
|
|
||||||
return new Promise(function (res, rej) {
|
|
||||||
ctx.requests[seq] = { reject: rej, resolve: res, time: now() };
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var channelLeave = function channelLeave(ctx, chanId, reason) {
|
|
||||||
var chan = ctx.channels[chanId];
|
|
||||||
if (!chan) {
|
|
||||||
throw new Error("no such channel " + chanId);
|
|
||||||
}
|
|
||||||
delete ctx.channels[chanId];
|
|
||||||
ctx.ws.send(JSON.stringify([ctx.seq++, 'LEAVE', chanId, reason]));
|
|
||||||
};
|
|
||||||
|
|
||||||
var makeEventHandlers = function makeEventHandlers(ctx, mappings) {
|
|
||||||
return function (name, handler) {
|
|
||||||
var handlers = mappings[name];
|
|
||||||
if (!handlers) {
|
|
||||||
throw new Error("no such event " + name);
|
|
||||||
}
|
|
||||||
handlers.push(handler);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var mkChannel = function mkChannel(ctx, id) {
|
|
||||||
var internal = {
|
|
||||||
onMessage: [],
|
|
||||||
onJoin: [],
|
|
||||||
onLeave: [],
|
|
||||||
members: [],
|
|
||||||
jSeq: ctx.seq++
|
|
||||||
};
|
|
||||||
var chan = {
|
|
||||||
_: internal,
|
|
||||||
time: now(),
|
|
||||||
id: id,
|
|
||||||
members: internal.members,
|
|
||||||
bcast: function bcast(msg) {
|
|
||||||
return channelBcast(ctx, chan.id, msg);
|
|
||||||
},
|
|
||||||
leave: function leave(reason) {
|
|
||||||
return channelLeave(ctx, chan.id, reason);
|
|
||||||
},
|
|
||||||
on: makeEventHandlers(ctx, { message: internal.onMessage, join: internal.onJoin, leave: internal.onLeave })
|
|
||||||
};
|
|
||||||
ctx.requests[internal.jSeq] = chan;
|
|
||||||
ctx.ws.send(JSON.stringify([internal.jSeq, 'JOIN', id]));
|
|
||||||
|
|
||||||
return new Promise(function (res, rej) {
|
|
||||||
chan._.resolve = res;
|
|
||||||
chan._.reject = rej;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var mkNetwork = function mkNetwork(ctx) {
|
|
||||||
var network = {
|
|
||||||
webChannels: ctx.channels,
|
|
||||||
getLag: function getLag() {
|
|
||||||
return ctx.lag;
|
|
||||||
},
|
|
||||||
sendto: function sendto(peerId, content) {
|
|
||||||
return networkSendTo(ctx, peerId, content);
|
|
||||||
},
|
|
||||||
join: function join(chanId) {
|
|
||||||
return mkChannel(ctx, chanId);
|
|
||||||
},
|
|
||||||
on: makeEventHandlers(ctx, { message: ctx.onMessage, disconnect: ctx.onDisconnect })
|
|
||||||
};
|
|
||||||
network.__defineGetter__("webChannels", function () {
|
|
||||||
return Object.keys(ctx.channels).map(function (k) {
|
|
||||||
return ctx.channels[k];
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return network;
|
|
||||||
};
|
|
||||||
|
|
||||||
var onMessage = function onMessage(ctx, evt) {
|
|
||||||
var msg = void 0;
|
|
||||||
try {
|
|
||||||
msg = JSON.parse(evt.data);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.stack);return;
|
|
||||||
}
|
|
||||||
if (msg[0] !== 0) {
|
|
||||||
var req = ctx.requests[msg[0]];
|
|
||||||
if (!req) {
|
|
||||||
console.log("error: " + JSON.stringify(msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
delete ctx.requests[msg[0]];
|
|
||||||
if (msg[1] === 'ACK') {
|
|
||||||
if (req.ping) {
|
|
||||||
// ACK of a PING
|
|
||||||
ctx.lag = now() - Number(req.ping);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
req.resolve();
|
|
||||||
} else if (msg[1] === 'JACK') {
|
|
||||||
if (req._) {
|
|
||||||
// Channel join request...
|
|
||||||
if (!msg[2]) {
|
|
||||||
throw new Error("wrong type of ACK for channel join");
|
|
||||||
}
|
|
||||||
req.id = msg[2];
|
|
||||||
ctx.channels[req.id] = req;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
req.resolve();
|
|
||||||
} else if (msg[1] === 'ERROR') {
|
|
||||||
req.reject({ type: msg[2], message: msg[3] });
|
|
||||||
} else {
|
|
||||||
req.reject({ type: 'UNKNOWN', message: JSON.stringify(msg) });
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg[2] === 'IDENT') {
|
|
||||||
ctx.uid = msg[3];
|
|
||||||
|
|
||||||
setInterval(function () {
|
|
||||||
if (now() - ctx.timeOfLastMessage < MAX_LAG_BEFORE_PING) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var seq = ctx.seq++;
|
|
||||||
var currentDate = now();
|
|
||||||
ctx.requests[seq] = { time: now(), ping: currentDate };
|
|
||||||
ctx.ws.send(JSON.stringify([seq, 'PING', currentDate]));
|
|
||||||
if (now() - ctx.timeOfLastMessage > MAX_LAG_BEFORE_DISCONNECT) {
|
|
||||||
ctx.ws.close();
|
|
||||||
}
|
|
||||||
}, PING_CYCLE);
|
|
||||||
|
|
||||||
return;
|
|
||||||
} else if (!ctx.uid) {
|
|
||||||
// extranious message, waiting for an ident.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (msg[2] === 'PING') {
|
|
||||||
msg[2] = 'PONG';
|
|
||||||
ctx.ws.send(JSON.stringify(msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg[2] === 'MSG') {
|
|
||||||
var handlers = void 0;
|
|
||||||
if (msg[3] === ctx.uid) {
|
|
||||||
handlers = ctx.onMessage;
|
|
||||||
} else {
|
|
||||||
var chan = ctx.channels[msg[3]];
|
|
||||||
if (!chan) {
|
|
||||||
console.log("message to non-existant chan " + JSON.stringify(msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
handlers = chan._.onMessage;
|
|
||||||
}
|
|
||||||
handlers.forEach(function (h) {
|
|
||||||
try {
|
|
||||||
h(msg[4], msg[1]);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg[2] === 'LEAVE') {
|
|
||||||
var _chan = ctx.channels[msg[3]];
|
|
||||||
if (!_chan) {
|
|
||||||
console.log("leaving non-existant chan " + JSON.stringify(msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_chan._.onLeave.forEach(function (h) {
|
|
||||||
try {
|
|
||||||
h(msg[1], msg[4]);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.stack);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg[2] === 'JOIN') {
|
|
||||||
var _chan2 = ctx.channels[msg[3]];
|
|
||||||
if (!_chan2) {
|
|
||||||
console.log("ERROR: join to non-existant chan " + JSON.stringify(msg));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// have we yet fully joined the chan?
|
|
||||||
var synced = _chan2._.members.indexOf(ctx.uid) !== -1;
|
|
||||||
_chan2._.members.push(msg[1]);
|
|
||||||
if (!synced && msg[1] === ctx.uid) {
|
|
||||||
// sync the channel join event
|
|
||||||
_chan2.myID = ctx.uid;
|
|
||||||
_chan2._.resolve(_chan2);
|
|
||||||
}
|
|
||||||
if (synced) {
|
|
||||||
_chan2._.onJoin.forEach(function (h) {
|
|
||||||
try {
|
|
||||||
h(msg[1]);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.stack);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var connect = function connect(websocketURL) {
|
|
||||||
var ctx = {
|
|
||||||
ws: new WebSocket(websocketURL),
|
|
||||||
seq: 1,
|
|
||||||
lag: 0,
|
|
||||||
uid: null,
|
|
||||||
network: null,
|
|
||||||
channels: {},
|
|
||||||
onMessage: [],
|
|
||||||
onDisconnect: [],
|
|
||||||
requests: {}
|
|
||||||
};
|
|
||||||
setInterval(function () {
|
|
||||||
for (var id in ctx.requests) {
|
|
||||||
var req = ctx.requests[id];
|
|
||||||
if (now() - req.time > REQUEST_TIMEOUT) {
|
|
||||||
delete ctx.requests[id];
|
|
||||||
if (typeof req.reject === "function") {
|
|
||||||
req.reject({ type: 'TIMEOUT', message: 'waited ' + (now() - req.time) + 'ms' });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 5000);
|
|
||||||
ctx.network = mkNetwork(ctx);
|
|
||||||
ctx.ws.onmessage = function (msg) {
|
|
||||||
return onMessage(ctx, msg);
|
|
||||||
};
|
|
||||||
ctx.ws.onclose = function (evt) {
|
|
||||||
ctx.onDisconnect.forEach(function (h) {
|
|
||||||
try {
|
|
||||||
h(evt.reason);
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e.stack);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
ctx.ws.onopen = function () {
|
|
||||||
var count = 0;
|
|
||||||
var interval = 100;
|
|
||||||
var checkIdent = function() {
|
|
||||||
if(ctx.uid !== null) {
|
|
||||||
return resolve(ctx.network);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(count * interval > REQUEST_TIMEOUT) {
|
|
||||||
return reject({ type: 'TIMEOUT', message: 'waited ' + (count * interval) + 'ms' });
|
|
||||||
}
|
|
||||||
setTimeout(checkIdent, 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
checkIdent();
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return { connect: connect };
|
|
||||||
});
|
|
||||||
Loading…
x
Reference in New Issue
Block a user