viraljs
Version:
P2P distributed application made easy
131 lines (107 loc) • 4.04 kB
JavaScript
var transportCreationTemplate = require('./transport-creation-template.js');
module.exports = function (recommendedPeerId) {
return `<!DOCTYPE html>
<html>
${transportCreationTemplate()}
var recommendedPeerId = '${recommendedPeerId}';
console.log('Requesting app from ' + recommendedPeerId);
var timeout = setTimeout(function(){
location.href = location.href + '?forceDirect=true';
}, 5000);
var receivedBodyChunks = [];
var receivedHeadChunks = [];
var bodyReceived = false;
var headReceived = false;
var allReceived = function() {
clearTimeout(timeout);
if (bodyReceived && headReceived) {
executeScripts(document.head);
executeScripts(document.body);
var evt = document.createEvent('Event');
evt.initEvent('load', false, false);
window.dispatchEvent(evt);
/* Object.keys(window.ViralContainer.p2p._peers).forEach(function(peerId){
var peer = window.ViralContainer.p2p._peers[peerId];
peer.destroy();
}); */
}
}
var p2p = window.ViralContainer.p2p = new P2P(window.ViralContainer.socket, opts, function (data) {
p2p.emit('getApp', recommendedPeerId);
p2p.on('body', function(data){
if (data !== 'end') {
receivedBodyChunks.push(data);
} else {
p2p.off('body');
console.log('Received body');
bodyReceived = true;
document.body.innerHTML = receivedBodyChunks.join('');
allReceived();
}
});
p2p.on('head', function(data){
if (data !== 'end') {
receivedHeadChunks.push(data);
} else {
p2p.off('head');
console.log('Received head');
headReceived = true;
document.head.innerHTML = receivedHeadChunks.join('');
allReceived();
}
});
});
window.addEventListener('beforeunload', function(){
window.ViralContainer.socket.disconnect();
});
window.ViralContainer.p2p.useSockets = false;
window.ViralContainer.p2p.upgrade();
</script>
<script>
function executeScripts(body_el) {
// Finds and executes scripts in a newly added element's body.
// Needed since innerHTML does not run scripts.
//
// Argument body_el is an element in the dom.
function nodeName(elem, name) {
return elem.nodeName && elem.nodeName.toUpperCase() ===
name.toUpperCase();
};
function evalScript(elem) {
var data = (elem.text || elem.textContent || elem.innerHTML || "" ),
head = document.getElementsByTagName("head")[0] ||
document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
try {
// doesn't work on ie...
script.appendChild(document.createTextNode(data));
} catch(e) {
// IE has funky script nodes
script.text = data;
}
head.insertBefore(script, head.firstChild);
//head.removeChild(script);
};
// main section of function
var scripts = [],
script,
children_nodes = body_el.childNodes,
child,
i;
for (i = 0; children_nodes[i]; i++) {
child = children_nodes[i];
if (nodeName(child, "script" ) &&
(!child.type || child.type.toLowerCase() === "text/javascript")) {
scripts.push(child);
}
}
for (i = 0; scripts[i]; i++) {
script = scripts[i];
if (script.parentNode) {script.parentNode.removeChild(script);}
evalScript(scripts[i]);
}
};
</script>
</html>`;
}