123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /**
- * Module dependencies.
- */
- var fmt = require('util').format;
- var amp = require('amp');
- /**
- * Proxy methods.
- */
- var methods = [
- 'push',
- 'pop',
- 'shift',
- 'unshift'
- ];
- /**
- * Expose `Message`.
- */
- module.exports = Message;
- /**
- * Initialize an AMP message with the
- * given `args` or message buffer.
- *
- * @param {Array|Buffer} args or blob
- * @api public
- */
- function Message(args) {
- if (Buffer.isBuffer(args)) args = decode(args);
- this.args = args || [];
- }
- // proxy methods
- methods.forEach(function(method){
- Message.prototype[method] = function(){
- return this.args[method].apply(this.args, arguments);
- };
- });
- /**
- * Inspect the message.
- *
- * @return {String}
- * @api public
- */
- Message.prototype.inspect = function(){
- return fmt('<Message args=%d size=%d>',
- this.args.length,
- this.toBuffer().length);
- };
- /**
- * Return an encoded AMP message.
- *
- * @return {Buffer}
- * @api public
- */
- Message.prototype.toBuffer = function(){
- return encode(this.args);
- };
- /**
- * Decode `msg` and unpack all args.
- *
- * @param {Buffer} msg
- * @return {Array}
- * @api private
- */
- function decode(msg) {
- var args = amp.decode(msg);
-
- for (var i = 0; i < args.length; i++) {
- args[i] = unpack(args[i]);
- }
- return args;
- }
- /**
- * Encode and pack all `args`.
- *
- * @param {Array} args
- * @return {Buffer}
- * @api private
- */
- function encode(args) {
- var tmp = new Array(args.length);
- for (var i = 0; i < args.length; i++) {
- tmp[i] = pack(args[i]);
- }
- return amp.encode(tmp);
- }
- /**
- * Pack `arg`.
- *
- * @param {Mixed} arg
- * @return {Buffer}
- * @api private
- */
- function pack(arg) {
- // blob
- if (Buffer.isBuffer(arg)) return arg;
- // string
- if ('string' == typeof arg) return new Buffer('s:' + arg);
- // undefined
- if (arg === undefined) arg = null;
- // json
- return new Buffer('j:' + JSON.stringify(arg));
- }
- /**
- * Unpack `arg`.
- *
- * @param {Buffer} arg
- * @return {Mixed}
- * @api private
- */
- function unpack(arg) {
- // json
- if (isJSON(arg)) return JSON.parse(arg.slice(2));
- // string
- if (isString(arg)) return arg.slice(2).toString();
-
- // blob
- return arg;
- }
- /**
- * String argument.
- */
- function isString(arg) {
- return 115 == arg[0] && 58 == arg[1];
- }
- /**
- * JSON argument.
- */
- function isJSON(arg) {
- return 106 == arg[0] && 58 == arg[1];
- }
- /**
- * ID argument.
- */
- function isId(arg) {
- return 105 == arg[0] && 58 == arg[1];
- }
|