1 |
|
2 |
|
3 | exports.Ext = Ext;
|
4 |
|
5 | var ExtBuffer = require("./ext-buffer").ExtBuffer;
|
6 |
|
7 | function Ext() {
|
8 | if (!(this instanceof Ext)) return new Ext();
|
9 | this.extPackers = {};
|
10 | this.extUnpackers = [];
|
11 | }
|
12 |
|
13 | Ext.prototype.addExtPacker = function(etype, Class, packer) {
|
14 | var name = Class.name;
|
15 | if (name && name !== "Object") {
|
16 | this.extPackers[name] = extPacker;
|
17 | } else {
|
18 | var list = this.extEncoderList || (this.extEncoderList = []);
|
19 | list.unshift([Class, extPacker]);
|
20 | }
|
21 |
|
22 | function extPacker(value) {
|
23 | var buffer = packer(value);
|
24 | return new ExtBuffer(buffer, etype);
|
25 | }
|
26 | };
|
27 |
|
28 | Ext.prototype.addExtUnpacker = function(etype, unpacker) {
|
29 | this.extUnpackers[etype] = unpacker;
|
30 | };
|
31 |
|
32 | Ext.prototype.getExtPacker = function(value) {
|
33 | var c = value.constructor;
|
34 | var e = c && c.name && this.extPackers[c.name];
|
35 | if (e) return e;
|
36 | var list = this.extEncoderList;
|
37 | if (!list) return;
|
38 | var len = list.length;
|
39 | for (var i = 0; i < len; i++) {
|
40 | var pair = list[i];
|
41 | if (c === pair[0]) return pair[1];
|
42 | }
|
43 | };
|
44 |
|
45 | Ext.prototype.getExtUnpacker = function(type) {
|
46 | return this.extUnpackers[type] || extUnpacker;
|
47 |
|
48 | function extUnpacker(buffer) {
|
49 | return new ExtBuffer(buffer, type);
|
50 | }
|
51 | };
|