53 lines
1.3 KiB
JavaScript
53 lines
1.3 KiB
JavaScript
// read-core.js
|
|
|
|
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
var ExtUnpacker = require("./ext-unpacker");
|
|
var readUint8 = require("./read-format").readUint8;
|
|
var ReadToken = require("./read-token");
|
|
var CodecBase = require("./codec-base");
|
|
|
|
CodecBase.install({
|
|
addExtUnpacker: addExtUnpacker,
|
|
getExtUnpacker: getExtUnpacker,
|
|
init: init
|
|
});
|
|
|
|
exports.preset = init.call(CodecBase.preset);
|
|
|
|
function getDecoder(options) {
|
|
var readToken = ReadToken.getReadToken(options);
|
|
return decode;
|
|
|
|
function decode(decoder) {
|
|
var type = readUint8(decoder);
|
|
var func = readToken[type];
|
|
if (!func) throw new Error("Invalid type: " + (type ? ("0x" + type.toString(16)) : type));
|
|
return func(decoder);
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
var options = this.options;
|
|
this.decode = getDecoder(options);
|
|
|
|
if (options && options.preset) {
|
|
ExtUnpacker.setExtUnpackers(this);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
function addExtUnpacker(etype, unpacker) {
|
|
var unpackers = this.extUnpackers || (this.extUnpackers = []);
|
|
unpackers[etype] = CodecBase.filter(unpacker);
|
|
}
|
|
|
|
function getExtUnpacker(type) {
|
|
var unpackers = this.extUnpackers || (this.extUnpackers = []);
|
|
return unpackers[type] || extUnpacker;
|
|
|
|
function extUnpacker(buffer) {
|
|
return new ExtBuffer(buffer, type);
|
|
}
|
|
}
|