diff --git a/examples/docs.html b/examples/docs.html index ba9c4040..f0d734e2 100644 --- a/examples/docs.html +++ b/examples/docs.html @@ -42,7 +42,7 @@ var gun = Gun(['https://guntest.herokuapp.com/gun', 'http://localhost:8765/gun'] ;(window.onhashchange = function(){ var file = (location.hash||'').slice(1); var S = +new Date; - $('#page').empty(); + $('#page').empty().attr('contenteditable', 'false'); gun.get('test/gun/docs/'+file).get('what').map().on(function render(data, i){ if(window.LOCK){ return } var p = $('#page').children().get(i); @@ -68,11 +68,7 @@ meta.edit({ if($(eve.target).closest('p').length){ return } var edit = this; setTimeout(function(){ meta.flip(false) },1); - var doc = $('#page').attr('contenteditable', 'true'); - if(!doc.text()){ - doc.html('
'); - } - edit.select(doc.children().first().get(0)); + edit.init(); $(document).on('keydown.tmp', '[contenteditable]', function(eve){ if(eve.which != 13){ return } eve.preventDefault(); @@ -94,10 +90,13 @@ meta.edit({ edit.save(this); }); }).on('keyup.tmp', '[contenteditable]', function(eve){ - $('#debug').val(doc.html()); + //$('#debug').val(doc.html()); var p = $(window.getSelection().anchorNode).closest('p'); var r = monotype(p); var html = p.html() || ''; + if(!html && !p.prev().length && !p.next().length && !$('#page').html()){ + edit.init(); + } var safe = $.normalize(html); p.html(safe); r.restore(); @@ -108,11 +107,19 @@ meta.edit({ console.log("UP"); $('[contenteditable=true]').off('.tmp'); }, + init: function(){ + var edit = this; + var doc = $('#page').attr('contenteditable', 'true'); + if(!doc.text()){ + doc.html(''); + } + edit.select(doc.children().first().get(0)); + }, save: function(p){ p = $(p); var i = p.index();// = Array.prototype.indexOf.call(parent.children, child); var file = (location.hash||'').slice(1); - var data = p.get(0).outerHTML; + var data = (p.get(0)||{}).outerHTML||''; window.LOCK = true; gun.get('test/gun/docs/'+file).get('what').get(i).put(data); window.LOCK = false; diff --git a/sea.js b/sea.js index f42db5d0..7910a10c 100644 --- a/sea.js +++ b/sea.js @@ -190,8 +190,8 @@ //console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed."); //} }catch(e){ - console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); - OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; + console.log("text-encoding and @peculiar/webcrypto may not be included by default, please add it to your package.json!"); + TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} module.exports = api diff --git a/test/panic/bulkimport.js b/test/panic/bulkimport.js new file mode 100644 index 00000000..734dd901 --- /dev/null +++ b/test/panic/bulkimport.js @@ -0,0 +1,137 @@ +/* +This is the first in a series of basic networking correctness tests. +Each test itself might be dumb and simple, but built up together, +they prove desired end goals for behavior at scale. +1. (this file) Is a browser write is confirmed as save by multiple peers even if by daisy chain. +2. +*/ + +var config = { + IP: require('ip').address(), + port: 8765, + servers: 1, + browsers: 2, + puts: 1000, + route: { + '/': __dirname + '/index.html', + '/gun.js': __dirname + '/../../gun.js', + '/jquery.js': __dirname + '/../../examples/jquery.js' + } +} + +var panic = require('panic-server'); +panic.server().on('request', function(req, res){ + config.route[req.url] && require('fs').createReadStream(config.route[req.url]).pipe(res); +}).listen(config.port); + +var clients = panic.clients; +var manager = require('panic-manager')(); + +manager.start({ + clients: Array(config.servers).fill().map(function(u, i){ + return { + type: 'node', + port: config.port + (i + 1) + } + }), + panic: 'http://' + config.IP + ':' + config.port +}); + +var servers = clients.filter('Node.js'); +var bob = servers.pluck(1); +var browsers = clients.excluding(servers); +var alice = browsers.pluck(1); +var carl = browsers.excluding(alice).pluck(1); + +describe("Put ACK", function(){ + //this.timeout(5 * 60 * 1000); + this.timeout(10 * 60 * 1000); + + it("Servers have joined!", function(){ + return servers.atLeast(config.servers); + }); + + it("GUN started!", function(){ + var tests = [], i = 0; + servers.each(function(client){ + tests.push(client.run(function(test){ + var env = test.props; + test.async(); + try{ require('fs').unlinkSync(env.i+'data') }catch(e){} + try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){} + var server = require('http').createServer(function(req, res){ + res.end("I am "+ env.i +"!"); + }); + var port = env.config.port + env.i; + var Gun = require('gun'); + var peers = [], i = env.config.servers; + while(i--){ + var tmp = (env.config.port + (i + 1)); + if(port != tmp){ // ignore ourselves + peers.push('http://'+ env.config.IP + ':' + tmp + '/gun'); + } + } + console.log(port, " connect to ", peers); + var gun = Gun({file: env.i+'data', peers: peers, web: server}); + server.listen(port, function(){ + test.done(); + }); + }, {i: i += 1, config: config})); + }); + return Promise.all(tests); + }); + + it(config.browsers +" browser(s) have joined!", function(){ + console.log("PLEASE OPEN http://"+ config.IP +":"+ config.port +" IN "+ config.browsers +" BROWSER(S)!"); + return browsers.atLeast(config.browsers); + }); + + it("Browsers initialized gun!", function(){ + var tests = [], i = 0; + browsers.each(function(client, id){ + tests.push(client.run(function(test){ + try{ localStorage.clear() }catch(e){} + try{ indexedDB.deleteDatabase('radata') }catch(e){} + var env = test.props; + var gun = Gun('http://'+ env.config.IP + ':' + (env.config.port + 1) + '/gun'); + window.ref = gun.get('test'); + }, {i: i += 1, config: config})); + }); + return Promise.all(tests); + }); + + it("Puts", function(){ + return alice.run(function(test){ + console.log("I AM ALICE"); + test.async(); + var i = test.props.puts, d = 0; + while(i--){ go(i) } + function go(i){ + ref.get(i).put({hello: 'world'}, function(ack){ + if(ack.err){ put_failed } + if(++d !== test.props.puts){ return } + console.log("all success", d); + test.done(); + }); + } + }, {puts: config.puts}); + }); + + it("All finished!", function(done){ + console.log("Done! Cleaning things up..."); + setTimeout(function(){ + done(); + },1000); + }); + + after("Everything shut down.", function(){ + browsers.run(function(){ + //location.reload(); + //setTimeout(function(){ + //}, 15 * 1000); + }); + return servers.run(function(){ + process.exit(); + }); + }); +}); \ No newline at end of file