57 lines
1.2 KiB
JavaScript
57 lines
1.2 KiB
JavaScript
'use strict'
|
|
|
|
var Buffer = require('safe-buffer').Buffer
|
|
var writeToStream = require('./writeToStream')
|
|
var EE = require('events').EventEmitter
|
|
var inherits = require('inherits')
|
|
|
|
function generate (packet) {
|
|
var stream = new Accumulator()
|
|
writeToStream(packet, stream)
|
|
return stream.concat()
|
|
}
|
|
|
|
function Accumulator () {
|
|
this._array = new Array(20)
|
|
this._i = 0
|
|
}
|
|
|
|
inherits(Accumulator, EE)
|
|
|
|
Accumulator.prototype.write = function (chunk) {
|
|
this._array[this._i++] = chunk
|
|
return true
|
|
}
|
|
|
|
Accumulator.prototype.concat = function () {
|
|
var length = 0
|
|
var lengths = new Array(this._array.length)
|
|
var list = this._array
|
|
var pos = 0
|
|
var i
|
|
var result
|
|
|
|
for (i = 0; i < list.length && list[i] !== undefined; i++) {
|
|
if (typeof list[i] !== 'string') lengths[i] = list[i].length
|
|
else lengths[i] = Buffer.byteLength(list[i])
|
|
|
|
length += lengths[i]
|
|
}
|
|
|
|
result = Buffer.allocUnsafe(length)
|
|
|
|
for (i = 0; i < list.length && list[i] !== undefined; i++) {
|
|
if (typeof list[i] !== 'string') {
|
|
list[i].copy(result, pos)
|
|
pos += lengths[i]
|
|
} else {
|
|
result.write(list[i], pos)
|
|
pos += lengths[i]
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
module.exports = generate
|