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.
61 lines
1.5 KiB
61 lines
1.5 KiB
var asn1 = require('../asn1'); |
|
var inherits = require('inherits'); |
|
|
|
var api = exports; |
|
|
|
api.define = function define(name, body) { |
|
return new Entity(name, body); |
|
}; |
|
|
|
function Entity(name, body) { |
|
this.name = name; |
|
this.body = body; |
|
|
|
this.decoders = {}; |
|
this.encoders = {}; |
|
}; |
|
|
|
Entity.prototype._createNamed = function createNamed(base) { |
|
var named; |
|
try { |
|
named = require('vm').runInThisContext( |
|
'(function ' + this.name + '(entity) {\n' + |
|
' this._initNamed(entity);\n' + |
|
'})' |
|
); |
|
} catch (e) { |
|
named = function (entity) { |
|
this._initNamed(entity); |
|
}; |
|
} |
|
inherits(named, base); |
|
named.prototype._initNamed = function initnamed(entity) { |
|
base.call(this, entity); |
|
}; |
|
|
|
return new named(this); |
|
}; |
|
|
|
Entity.prototype._getDecoder = function _getDecoder(enc) { |
|
enc = enc || 'der'; |
|
// Lazily create decoder |
|
if (!this.decoders.hasOwnProperty(enc)) |
|
this.decoders[enc] = this._createNamed(asn1.decoders[enc]); |
|
return this.decoders[enc]; |
|
}; |
|
|
|
Entity.prototype.decode = function decode(data, enc, options) { |
|
return this._getDecoder(enc).decode(data, options); |
|
}; |
|
|
|
Entity.prototype._getEncoder = function _getEncoder(enc) { |
|
enc = enc || 'der'; |
|
// Lazily create encoder |
|
if (!this.encoders.hasOwnProperty(enc)) |
|
this.encoders[enc] = this._createNamed(asn1.encoders[enc]); |
|
return this.encoders[enc]; |
|
}; |
|
|
|
Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) { |
|
return this._getEncoder(enc).encode(data, reporter); |
|
};
|
|
|