forked from jcorbin/hexer
/
chunked_hex_transform.js
58 lines (51 loc) · 1.57 KB
/
chunked_hex_transform.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
'use strict';
var util = require('util');
var HexTransform = require('./hex_transform');
function ChunkedHexTransform(options) {
if (!(this instanceof ChunkedHexTransform)) {
return new ChunkedHexTransform(options);
}
options = options || {};
HexTransform.call(this, options);
var self = this;
if (typeof options.header === 'function') {
self.header = options.header;
} else if (typeof options.header === 'object') {
self.header = simpleHeader(options.header);
} else if (typeof options.header === 'string') {
self.header = simpleHeader({
label: options.header
});
} else {
self.header = simpleHeader();
}
self.chunkNum = 0;
}
util.inherits(ChunkedHexTransform, HexTransform);
ChunkedHexTransform.prototype._transform = function transform(chunk, encoding, done) {
var self = this;
if (self.totalOffset) {
self.reset();
}
++self.chunkNum;
var header = self.header(self.chunkNum, chunk);
if (header.length) {
self.push(header);
}
HexTransform.prototype._transform.call(self, chunk, encoding, function subDone(err) {
self.reset();
done(err);
});
};
function simpleHeader(opts) {
opts = opts || {};
var fmt = '-- ';
if (opts.label) fmt += opts.label + ' ';
fmt += 'chunk[%s] length: %s (0x%s)\n';
return function header(chunkNum, chunk) {
var len = chunk.length;
var hexlen = len.toString(16);
return util.format(fmt, chunkNum, len, hexlen);
};
}
module.exports = ChunkedHexTransform;