Spaces:
Sleeping
Sleeping
| 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); | |
| }; | |