aboutsummaryrefslogtreecommitdiff
path: root/bog.js
blob: aa347cec913e8aa4c9bf15dd778443fb9996d55f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// bog.open -- opens a signature and returns content if you pass a signature and a public key
// EX:  open(msg).then(content => { console.log(content) })

async function open (msg) {

  var pubkey = nacl.util.decodeBase64(msg.author.substring(1))
  var sig = nacl.util.decodeBase64(msg.signature)
  var opened = await JSON.parse(nacl.util.encodeUTF8(nacl.sign.open(sig, pubkey)))

  opened.key = msg.key

  return opened
}

// bog.keys -- gets your public/private keypair, generates one if there is none
// EX: keys().then(key => { console.log(key)})

async function keys (key) { 
  var keypair = await localforage.getItem('id')
  if (keypair != null) {
    return keypair
  } else {
    var genkey = nacl.sign.keyPair()
    var keypair = {
      publicKey: '@' + nacl.util.encodeBase64(genkey.publicKey),
      privateKey: nacl.util.encodeBase64(genkey.secretKey)
    }
    localforage.setItem('id', keypair)
    return keypair 
  }
}

// bog.get -- iterates over log and returns a post.
// EX: get('%x5T7KZ5haR2F59ynUuCggwEdFXlLHEtFoBQIyKYppZYerq9oMoIqH76YzXQpw2DnYiM0ugEjePXv61g3E4l/Gw==').then(msg => { console.log(msg)})

async function get (key) {
  var log = await localforage.getItem('log')
  if (log != null) {
    for (var i = log.length - 1; i >= 0; --i) {
      if (log[i].key === key) {
        return log[i]
      }
    }
  }
}

// bog.getName -- iterates over a feed and returns a person's name

function getName (id) {
  var name = h('span')

  name.textContent = id.substring(0, 10) + '...'

  return name
}

// bog.log (feed) -- returns a specific feed if a parameter is passed, if not returns the entire log
// EX: bog().then(log => { console.log(log)})
// EX: bog('@ExE3QXmBhYQlGVA3WM2BD851turNzwhruWbIpMd7rbQ=').then(log => { console.log(log)})


async function bog (feed) {
  if (feed) {
    var log = await localforage.getItem(feed)
    return log
  } else {
    var log = await localforage.getItem('log')
    return log
  }
}

// bog.publish -- publishes a new bog post and updates the feeds
// EX: publish({type: 'post', timestamp: Date.now(), text: 'Hello World'}).then(msg => { console.log(msg)})

async function publish (post, keys) {
  post.author = keys.publicKey

  var message = { author: keys.publicKey }

  var feed = await localforage.getItem(keys.publicKey)
  if (feed) {
    var firstMsg = await open(feed[0])

    post.seq = ++firstMsg.seq

    message.key = '%' + nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(post)))),
    message.signature = nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(post)), nacl.util.decodeBase64(keys.privateKey)))

    localforage.getItem('log').then(log => {
      if (log) {
        log.unshift(message)
        localforage.setItem('log', log)
      } else {
        var feed = [message]
        localforage.setItem('log', feed)
      }
    })

    feed.unshift(message)
    localforage.setItem(keys.publicKey, feed)

    return message

  } else {

    post.seq = 0

    message.key = '%' + nacl.util.encodeBase64(nacl.hash(nacl.util.decodeUTF8(JSON.stringify(post)))),
    message.signature = nacl.util.encodeBase64(nacl.sign(nacl.util.decodeUTF8(JSON.stringify(post)), nacl.util.decodeBase64(keys.privateKey)))

    localforage.getItem('log').then(log => {
      if (log) {
        log.unshift(message)
        localforage.setItem('log', log)
      } else {
        var feed = [message]
        localforage.setItem('log', feed)
      }
    })

    var feed = [message]
    localforage.setItem(keys.publicKey, feed)

    return message
  }
}