diff options
Diffstat (limited to 'lib.js')
-rw-r--r-- | lib.js | 388 |
1 files changed, 227 insertions, 161 deletions
@@ -1,135 +1,193 @@ // generate a public.private keypair with TweetNaCl.js function getKeys () { - if (localStorage['id']) { - var keys = JSON.parse(localStorage['id']) - return keys - } else { - - var genkey = nacl.sign.keyPair() - if (genkey) { - var keys = { - publicKey: '@' + nacl.util.encodeBase64(genkey.publicKey), - privateKey: nacl.util.encodeBase64(genkey.secretKey), + localforage.getItem('id', function(err, value) { + if (value) { + var keys = value + return keys + } else if (value == null) { + var genkey = nacl.sign.keyPair() + if (genkey) { + var keys = { + publicKey: '@' + nacl.util.encodeBase64(genkey.publicKey), + privateKey: nacl.util.encodeBase64(genkey.secretKey) + } + // when we get our next round of funding, let's figure out how to do this without a page reload + if (keys.publicKey.includes('/')) { + console.log('TRYING AGAIN') + setTimeout(function () { + window.location.reload() + }, 10) + } else { + localforage.setItem('id', keys) + return keys + } } + } + }) + return keys +} - console.log(genkey) +function requestFeed (src, server) { + var ws = new WebSocket(server + src) - // for some reason keys with /'s in them mess up node, so we'll try generating keys again if they contain slashes - if (keys.publicKey.includes('/')) { - console.log('TRYING AGAIN') - setTimeout(function () { - window.location.reload() - }, 10) - } else { - localStorage['id'] = JSON.stringify(keys) - return keys + localforage.getItem(src, function (err, log) { + if (log) { + // update the log + + console.log('LOG DOES EXIST, asking') + ws.onopen = function () { + // req feed + var clientLog = { + publicKey: src, + log: log + } + console.log(clientLog) + ws.send(JSON.stringify(clientLog)) + } + ws.onmessage = function (ev) { + console.log(ev.data) + var serverLog = JSON.parse(ev.data) + + if (serverLog.log.length > log.length) { + // update the log of the id + localforage.setItem(src, serverLog.log) + + // concat new items from the log onto the client's public log + localforage.getItem('log', function (err, feed) { + if (feed) { + var num = serverLog.log.length - log.length + var diff = serverLog.log.slice(0, num) + oldLog = feed + newLog = diff.concat(oldLog) + localforage.setItem('log', newLog) + } + }) + } + } + } else { + ws.onopen = function () { + // req feed + var clientLog = { + publicKey: src, + log: [] + } + ws.send(JSON.stringify(clientLog)) } + // request the log (because we don't have it) + console.log('LOG DOES NOT EXIST, asking') + ws.onmessage = function (ev) { + serverLog = JSON.parse(ev.data) + localforage.setItem(src, serverLog.log) + + // concat new items from the log onto the client's public log + localforage.getItem('log', function (err, feed) { + if (feed) { + newLog = serverLog.log.concat(feed) + localforage.setItem('log', newLog) + } else { + localforage.setItem('log', serverLog.log) + } + }) + } } - } + }) } -function requestFeed (src, server) { - var ws = new WebSocket(server + src) +// publish new messages to your log +function publish (content, keys) { - var clientLog = { - publicKey: src - } + console.log(content) + console.log(keys) + localforage.getItem(keys.publicKey, function (err, log) { + if (log) { + var lastPost = log[0] + var seq = lastPost.content.sequence + content.sequence = ++seq + content.previous = nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(log[0])))) - if (localStorage[src]) { - clientLog.log = JSON.parse(localStorage[src]) - } else { - clientLog.log = [] - } + var post = { + content: content, + signature: nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(content)), nacl.util.decodeBase64(keys.privateKey))) + } - ws.onopen = function () { - ws.send(JSON.stringify(clientLog)) - } + // add key (which is a hash of the stringified object post) + post.key = '%' + nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(post)))) - ws.onmessage = function (ev) { - var serverData = JSON.parse(ev.data) - if (serverData.log.length > clientLog.log.length) { + // update the log + updateLog(keys.publicKey, post) - // update the log of the id - localStorage[src] = JSON.stringify(serverData.log) + var pubs = JSON.parse(localStorage['pubs']) - // contact new items from the log onto the client's log of everything - var num = serverData.log.length - clientLog.log.length - var diff = serverData.log.slice(0, num) + for (i = 0; i < pubs.length; i++) { + requestFeed(keys.publicKey, pubs[i]) + } - if (localStorage['log']) { - var oldLog = JSON.parse(localStorage['log']) + var scroller = document.getElementById('scroller') + if (scroller.firstChild) { + scroller.insertBefore(renderMessage(post), scroller.childNodes[1]) } else { - var oldLog = [] + scroller.appendChild(renderMessage(post)) } - var newLog = diff.concat(oldLog) - localStorage['log'] = JSON.stringify(newLog) - location.reload() - } - } -} - -// publish new messages to your log -function publish (content, keys) { + } else { + content.sequence = 0 + var post = { + content: content, + signature: nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(content)), nacl.util.decodeBase64(keys.privateKey))) + } - if (localStorage[keys.publicKey]) { - var log = JSON.parse(localStorage[keys.publicKey]) - var lastPost = log[0] - var seq = lastPost.content.sequence - content.sequence = ++seq - content.previous = nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(log[0])))) - console.log(content.previous) - } else { - console.log('SEQUENCE 0') - content.sequence = 0 - } + // add key (which is a hash of the stringified object post) + post.key = '%' + nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(post)))) - var post = { - content: content, - signature: nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(content)), nacl.util.decodeBase64(keys.privateKey))) - } + // update the log + updateLog(keys.publicKey, post) - // add key (which is a hash of the stringified object post) - post.key = '%' + nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(post)))) + var pubs = JSON.parse(localStorage['pubs']) - // update the log - updateLog(keys.publicKey, post) - - var pubs = JSON.parse(localStorage['pubs']) + for (i = 0; i < pubs.length; i++) { + requestFeed(keys.publicKey, pubs[i]) + } - for (i = 0; i < pubs.length; i++) { - requestFeed(keys.publicKey, pubs[i]) - } + var scroller = document.getElementById('scroller') + if (scroller.firstChild) { + scroller.insertBefore(renderMessage(post), scroller.childNodes[1]) + } else { + scroller.appendChild(renderMessage(post)) + } - var scroller = document.getElementById('scroller') - if (scroller.firstChild) { - scroller.insertBefore(renderMessage(post), scroller.childNodes[1]) - } else { - scroller.appendChild(renderMessage(post)) - } + } + }) } // update your log in the browser function updateLog (feed, post) { - if (localStorage[feed]) { - var log = JSON.parse(localStorage[feed]) - log.unshift(post) - localStorage[feed] = JSON.stringify(log) - } else { - var log = [post] - localStorage[feed] = JSON.stringify(log) - } + console.log('UPDATE LOG') + console.log(feed) + console.log(post) + localforage.getItem(feed, function (err, log) { + if (log) { + log.unshift(post) + localforage.setItem(feed, log) + } else { + log = [] + log.unshift(post) + localforage.setItem(feed, log) + } + }) - if (localStorage['log']) { - var log = JSON.parse(localStorage['log']) - log.unshift(post) - localStorage['log'] = JSON.stringify(log) - } else { - var log = [post] - localStorage['log'] = JSON.stringify(log) - } + localforage.getItem('log', function (err, log) { + if (log) { + log.unshift(post) + localforage.setItem('log', log) + } else { + log = [] + log.unshift(post) + localforage.setItem('log', log) + } + + }) } // file uploaders for user images @@ -181,23 +239,22 @@ function renderMessage (post) { if (post.content.type == 'post') { - var log = JSON.parse(localStorage['log']) - setTimeout(function () { - for (var i = log.length - 1; i >= 0; --i) { - //console.log(i) - if (log[i].content.reply == post.key) { - var nextPost = log[i] - console.log(nextPost) - var messageExists = (document.getElementById(nextPost.key) !== null); - if (!messageExists) { - messageDiv.appendChild(h('div', {classList: 'submessage'}, [ - renderMessage(nextPost) - ])) + localforage.getItem('log', function (err, log) { + if (log) { + for (var i = log.length - 1; i >= 0; --i) { + if (log[i].content.reply == post.key) { + var nextPost = log[i] + var messageExists = (document.getElementById(nextPost.key) !== null); + if (!messageExists) { + messageDiv.appendChild(h('div', {classList: 'submessage'}, [ + renderMessage(nextPost) + ])) + } } } } - }, 10) - + }) + var renderer = new marked.Renderer(); renderer.link = function(href, title, text) { if ((href[0] == '@') || (href[0] == '%')) { @@ -222,7 +279,6 @@ function renderMessage (post) { message.appendChild(h('div', {innerHTML: marked(post.content.text)})) - message.appendChild(h('span', {id: post.key + 'src', classList: 'right'}, [ h('a', { onclick: function () { @@ -235,37 +291,41 @@ function renderMessage (post) { var gotName = getName(post.content.author) - var publishButton = h('button', { - onclick: function () { - if (textarea.value) { - var content = { - author: keys.publicKey, - type: 'post', - text: textarea.value, - reply: post.key, - timestamp: Date.now() + localforage.getItem('id', function (err, keys) { + + var publishButton = h('button', { + onclick: function () { + if (textarea.value) { + var content = { + author: keys.publicKey, + type: 'post', + text: textarea.value, + reply: post.key, + timestamp: Date.now() + } + publish(content, keys) + message.removeChild(textarea) + message.removeChild(publishButton) } - console.log(content) - publish(content, keys) - message.removeChild(textarea) - message.removeChild(publishButton) } - } - }, ['Publish']) + }, ['Publish']) - var textarea = h('textarea', {placeholder: 'Reply to this bog post'}, ['['+ gotName.textContent + '](' + post.content.author + ')']) - var replyButton = h('button', { - classList: 'replyButton:' + post.key, - onclick: function () { - message.removeChild(replyButton) - message.appendChild(textarea) - message.appendChild(publishButton) - - } - }, ['Reply']) + var textarea = h('textarea', {placeholder: 'Reply to this bog post'}, ['['+ gotName.textContent + '](' + post.content.author + ')']) + + var replyButton = h('button', { + classList: 'replyButton:' + post.key, + onclick: function () { + message.removeChild(replyButton) + message.appendChild(textarea) + message.appendChild(publishButton) + + } + }, ['Reply']) + + message.appendChild(replyButton) + }) - message.appendChild(replyButton) messageDiv.appendChild(message) } @@ -274,34 +334,40 @@ function renderMessage (post) { function getImage (id) { - var image = h('img', {classList: 'small'}) - - if (localStorage[id]) { - var log = JSON.parse(localStorage[id]) - for (var i=0; i < log.length; i++) { - var imagePost = log[i] - if (imagePost.content.type == 'image') { - image = h('img', {classList: 'small', src: imagePost.content.image}) - return image - } + var image = h('span') + + //image.appendChild(h('img', {classList: 'small'})) + + localforage.getItem(id, function (err, log) { + if (log) { + for (var i=0; i < log.length; i++) { + var imagePost = log[i] + if (imagePost.content.type == 'image') { + image.appendChild(h('img', {classList: 'small', src: imagePost.content.image})) + return + } + } } - } + }) return image } function getName (id) { - var name = h('span', [id.substring(0, 10) + '...']) - if (localStorage[id]) { - var log = JSON.parse(localStorage[id]) - for (var i=0; i < log.length; i++) { - var namePost = log[i] - if (namePost.content.type == 'name') { - name = h('span', ['@' + namePost.content.text]) - return name + var name = h('span') + name.textContent = id.substring(0, 10) + '...' + + localforage.getItem(id, function (err, log) { + if (log) { + for (var i=0; i < log.length; i++) { + var namePost = log[i] + if (namePost.content.type == 'name') { + name.textContent = '@' + namePost.content.text + //return name + } } } - } + }) return name } |