-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreceive.js
84 lines (71 loc) · 1.73 KB
/
receive.js
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
const { Reader } = require('./reader')
const duplexify = require('duplexify')
const { Box } = require('./box')
const collect = require('collect-stream')
const codecs = require('./codecs')
const assert = require('assert')
const path = require('path')
const pump = require('pump')
const tar = require('tar-stream')
/**
* The `Receive` class TBD
* @class Receive
* @extends Reader
*/
class Receive extends Reader {
/**
*/
[Box.codec](opts) {
if (encryptionKey && nonce) {
const { encryptionKey, nonce } = opts
assert(Buffer.isBuffer(nonce))
assert(Buffer.isBuffer(encryptionKey))
return codecs.xsalsa20poly1305({ nonce, encryptionKey })
}
}
/**
*/
unpackFile(name, opts, callback) {
if ('function' === typeof opts) {
callback = opts
opts = {}
}
assert('function' === typeof callback)
const stream = this.createUnpackStream(name, opts)
collect(stream, callback)
}
/**
*/
createUnpackStream(name, opts) {
name = path.resolve('/', name)
opts = Object.assign({ }, opts)
const unpack = tar.extract()
const reader = this.createReadStream(opts)
const stream = duplexify()
unpack.on('entry', onentry)
stream.once('end', onend)
pump(reader, unpack)
return stream
function onend() {
unpack.removeListener('entry', onentry)
}
function onentry(header, source, next) {
if (header && path.resolve(name) === path.resolve(header.name)) {
stream.setReadable(source)
} else {
source.on('end', next)
source.resume()
}
}
}
}
/**
*/
function createReceive(storage, key, opts) {
return new Receive(storage, key, opts)
}
/**
*/
module.exports = Object.assign(createReceive, {
Receive,
})