You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
// 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]; |
|
} |
|
}
|
|
|