libamf
Version:
Action Message Format library for node.js
124 lines (100 loc) • 3.2 kB
JavaScript
;
const {convertToBuffer} = require('./utils/Utils');
const ByteArray = require('bytearray-node');
const classMap = {
'flex.messaging.io.ArrayCollection': require('./amf/flash/flex/ArrayCollection')
};
class AMF {
constructor() {
this.ENCODING = {
AMF0: 0,
AMF3: 3
};
this.exportClasses();
}
get classMap() {
return classMap;
}
/**
* @private
*/
exportClasses() {
for (var i in classMap) {
const cl = classMap[i];
const name = cl.name;
this[name] = cl;
}
}
/**
* Register an alias for a class/typed object.
* @param {String=} name
* @param {Function} cls
*/
registerClassAlias(name, cls) {
if(typeof name === 'function' && !cls) {
cls = name;
name = cls.name;
}
classMap[name] = cls;
}
/**
* @param {String} action
* @param {*} data
* @param {Number} [encoding=0] - AMF.ENCODING.AMF0 or AMF.ENCODING.AMF3
* @private
*/
run(action, data, encoding) {
const handler = encoding == 3 ? new this.AMF3(this) : new this.AMF0(this);
var method;
handler.reset();
const args = [];
switch(action) {
case 'serializer':
case 'serialize':
method = 'write';
args.push(data);
break;
default:
method = 'read';
if(data.buffer && (!(data instanceof Buffer))) {
handler.byteArray = data;
} else {
handler.byteArray = new ByteArray(convertToBuffer(data));
}
}
return handler[method](...args);
}
/**
* Serialize data using AMF0 or AMF3
* @param {*} data
* @param {Number} encoding - AMF.ENCODING.AMF0 or AMF.ENCODING.AMF3
* @returns {Buffer}
*/
serialize(data, encoding = 0) {
return this.run('serializer', data, encoding);
}
/**
* Deserialize data using AMF0 or AMF3
* @param {*} data
* @param {Number} encoding - AMF.ENCODING.AMF0 or AMF.ENCODING.AMF3
* @returns {*}
*/
deserialize(data, encoding = 0) {
return this.run('deserializer', data, encoding);
}
}
module.exports = new AMF;
module.exports.AMF0 = require('./amf/AMF0');
module.exports.AMF3 = require('./amf/AMF3');
module.exports.XML = require('./amf/flash/XML');
module.exports.Dictionary = require('./amf/flash/Dictionary');
module.exports.Vector = require('./amf/flash/Vector');
module.exports.ByteArray = require('bytearray-node');
module.exports.Packet = require('./net/Packet');
module.exports.Header = require('./net/Header');
module.exports.Message = require('./net/Message');
module.exports.Service = require('./net/Service');
module.exports.Server = require('./net/Server');
module.exports.Client = require('./net/Client');
module.exports.SOL = require('./amf/flash/sol/SOL');
// Is this a horrible solution for cyclic dependencies? If you know a better solution please submit a PR