blob/html/input.jsView |
---|
1 | 1 … | var h = require('mutant/h') |
| 2 … | +var resolve = require('mutant/resolve') |
| 3 … | +var onceTrue = require('mutant/once-true') |
2 | 4 … | var pull = require('pull-stream') |
3 | 5 … | var mime = require('simple-mime')('application/octect-stream') |
4 | 6 … | var split = require('split-buffer') |
5 | 7 … | var nest = require('depnest') |
| 8 … | +var Defer = require('pull-defer') |
| 9 … | +var BoxStream = require('pull-box-stream') |
| 10 … | +var crypto = require('crypto') |
| 11 … | +var zeros = Buffer.alloc(24, 0) |
6 | 12 … | |
7 | 13 … | module.exports = { |
8 | 14 … | needs: nest({ |
9 | | - 'sbot.async.addBlob': 'first' |
| 15 … | + 'sbot.obs.connection': 'first' |
| 16 … | + |
10 | 17 … | }), |
11 | 18 … | gives: nest('blob.html.input'), |
12 | 19 … | create: function (api) { |
13 | 20 … | return nest('blob.html.input', function FileInput (onAdded, opts = {}) { |
49 | 56 … | function next (file) { |
50 | 57 … | var reader = new global.FileReader() |
51 | 58 … | reader.onload = function () { |
52 | 59 … | var stream = pull.values(split(new Buffer(reader.result), 64 * 1024)) |
53 | | - api.sbot.async.addBlob(stream, function (err, blob) { |
| 60 … | + pull(stream, AddBlob({ |
| 61 … | + connection: api.sbot.obs.connection, |
| 62 … | + encrypt: resolve(opts.private) |
| 63 … | + }, (err, blob) => { |
54 | 64 … | if (err) return console.error(err) |
55 | 65 … | onAdded({ |
56 | 66 … | link: blob, |
57 | 67 … | name: fileName, |
59 | 69 … | type: mimeType |
60 | 70 … | }) |
61 | 71 … | |
62 | 72 … | ev.target.value = '' |
63 | | - }) |
| 73 … | + })) |
64 | 74 … | } |
65 | 75 … | reader.readAsArrayBuffer(file) |
66 | 76 … | } |
67 | 77 … | } |
157 | 167 … | |
158 | 168 … | ctx.drawImage(img, -img.width / 2, -img.height / 2) |
159 | 169 … | return canvas |
160 | 170 … | } |
| 171 … | + |
| 172 … | +function AddBlob ({connection, encrypt = false}, cb) { |
| 173 … | + var stream = Defer.sink() |
| 174 … | + onceTrue(connection, sbot => { |
| 175 … | + if (encrypt) { |
| 176 … | + |
| 177 … | + |
| 178 … | + |
| 179 … | + |
| 180 … | + |
| 181 … | + |
| 182 … | + |
| 183 … | + stream.resolve(Hash(function (err, buffers, key) { |
| 184 … | + if (err) return cb(err) |
| 185 … | + pull( |
| 186 … | + pull.once(Buffer.concat(buffers)), |
| 187 … | + BoxStream.createBoxStream(key, zeros), |
| 188 … | + Hash(function (err, buffers, hash) { |
| 189 … | + if (err) return cb(err) |
| 190 … | + var id = '&' + hash.toString('base64') + '.sha256' |
| 191 … | + pull( |
| 192 … | + pull.values(buffers), |
| 193 … | + sbot.blobs.add(id, function (err) { |
| 194 … | + if (err) return cb(err) |
| 195 … | + sbot.blobs.push(id, function (err) { |
| 196 … | + if (err) return cb(err) |
| 197 … | + cb(null, id + '?unbox=' + key.toString('base64') + '.boxs') |
| 198 … | + }) |
| 199 … | + }) |
| 200 … | + ) |
| 201 … | + }) |
| 202 … | + ) |
| 203 … | + })) |
| 204 … | + } else { |
| 205 … | + stream.resolve(sbot.blobs.add(cb)) |
| 206 … | + } |
| 207 … | + }) |
| 208 … | + return stream |
| 209 … | +} |
| 210 … | + |
| 211 … | +function Hash (cb) { |
| 212 … | + var hash = crypto.createHash('sha256') |
| 213 … | + var buffers = [] |
| 214 … | + var hasher = pull.drain(function (data) { |
| 215 … | + data = typeof data === 'string' ? new Buffer(data) : data |
| 216 … | + buffers.push(data) |
| 217 … | + hash.update(data) |
| 218 … | + }, function (err) { |
| 219 … | + cb(err, buffers, hash.digest()) |
| 220 … | + }) |
| 221 … | + return hasher |
| 222 … | +} |