70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
// write-core.js
|
|
|
|
var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
|
var ExtPacker = require("./ext-packer");
|
|
var WriteType = require("./write-type");
|
|
var CodecBase = require("./codec-base");
|
|
|
|
CodecBase.install({
|
|
addExtPacker: addExtPacker,
|
|
getExtPacker: getExtPacker,
|
|
init: init
|
|
});
|
|
|
|
exports.preset = init.call(CodecBase.preset);
|
|
|
|
function getEncoder(options) {
|
|
var writeType = WriteType.getWriteType(options);
|
|
return encode;
|
|
|
|
function encode(encoder, value) {
|
|
var func = writeType[typeof value];
|
|
if (!func) throw new Error("Unsupported type \"" + (typeof value) + "\": " + value);
|
|
func(encoder, value);
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
var options = this.options;
|
|
this.encode = getEncoder(options);
|
|
|
|
if (options && options.preset) {
|
|
ExtPacker.setExtPackers(this);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
function addExtPacker(etype, Class, packer) {
|
|
packer = CodecBase.filter(packer);
|
|
var name = Class.name;
|
|
if (name && name !== "Object") {
|
|
var packers = this.extPackers || (this.extPackers = {});
|
|
packers[name] = extPacker;
|
|
} else {
|
|
// fallback for IE
|
|
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
list.unshift([Class, extPacker]);
|
|
}
|
|
|
|
function extPacker(value) {
|
|
if (packer) value = packer(value);
|
|
return new ExtBuffer(value, etype);
|
|
}
|
|
}
|
|
|
|
function getExtPacker(value) {
|
|
var packers = this.extPackers || (this.extPackers = {});
|
|
var c = value.constructor;
|
|
var e = c && c.name && packers[c.name];
|
|
if (e) return e;
|
|
|
|
// fallback for IE
|
|
var list = this.extEncoderList || (this.extEncoderList = []);
|
|
var len = list.length;
|
|
for (var i = 0; i < len; i++) {
|
|
var pair = list[i];
|
|
if (c === pair[0]) return pair[1];
|
|
}
|
|
}
|