You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2016/02/22 18:16:41 UTC

[4/6] qpid-dispatch git commit: removed rhea.js and use rhea-min.js

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/f60fd9f6/console/stand-alone/plugin/lib/rhea.js
----------------------------------------------------------------------
diff --git a/console/stand-alone/plugin/lib/rhea.js b/console/stand-alone/plugin/lib/rhea.js
deleted file mode 100644
index fa323a3..0000000
--- a/console/stand-alone/plugin/lib/rhea.js
+++ /dev/null
@@ -1,7716 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (process,Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var sasl = require('./sasl.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-var Session = require('./session.js');
-var Transport = require('./transport.js');
-
-var net = require("net");
-var tls = require("tls");
-var EventEmitter = require('events').EventEmitter;
-
-var AMQP_PROTOCOL_ID = 0x00;
-var TLS_PROTOCOL_ID = 0x02;
-
-function get_socket_id(socket) {
-    if (socket.get_id_string) return socket.get_id_string();
-    return socket.localAddress + ':' + socket.localPort + ' -> ' + socket.remoteAddress + ':' + socket.remotePort;
-};
-
-function session_per_connection(conn) {
-    var ssn = null;
-    return {
-        'get_session' : function () {
-            if (!ssn) {
-                ssn = conn.create_session();
-                ssn.begin();
-            }
-            return ssn;
-        }
-    };
-};
-
-function restrict(count, f) {
-    if (count) {
-        var current = count;
-        var reset;
-        return function (successful_attempts) {
-            if (reset !== successful_attempts) {
-                current = count;
-                reset = successful_attempts;
-            }
-            if (current--) return f(successful_attempts);
-            else return -1;
-        };
-    } else {
-        return f;
-    }
-}
-
-function backoff(initial, max) {
-    var delay = initial;
-    var reset;
-    return function (successful_attempts) {
-        if (reset !== successful_attempts) {
-            delay = initial;
-            reset = successful_attempts;
-        }
-        var current = delay;
-        var next = delay*2;
-        delay = max > next ? next : max;
-        return current;
-    };
-}
-
-function get_connect_fn(options) {
-    if (options.transport === undefined || options.transport === 'tcp') {
-        return net.connect;
-    } else if (options.transport === 'tls' || options.transport === 'ssl') {
-        return tls.connect;
-    } else {
-        throw Error('Unrecognised transport: ' + options.transport);
-    }
-}
-
-function connection_details(options) {
-    var details = {};
-    details.connect = options.connect ? options.connect : get_connect_fn(options);
-    details.host = options.host ? options.host : 'localhost';
-    details.port = options.port ? options.port : 5672;
-    details.options = options;
-    return details;
-};
-
-var conn_counter = 1;
-
-var Connection = function (options, container) {
-    this.options = {};
-    if (options) {
-        for (var k in options) {
-            this.options[k] = options[k];
-        }
-    }
-    this.container = container;
-    if (!this.options.id) {
-        this.options.id = 'connection-' + conn_counter++;
-    }
-    if (!this.options.container_id) {
-        this.options.container_id = container ? container.id : util.generate_uuid();
-    }
-    if (!this.options.connection_details) {
-        var self = this;
-        this.options.connection_details = function() { return connection_details(self.options); };
-    }
-    var reconnect = this.get_option('reconnect', true);
-    if (typeof reconnect === 'boolean' && reconnect) {
-        var initial = this.get_option('initial_reconnect_delay', 100);
-        var max = this.get_option('max_reconnect_delay', 60000);
-        this.options.reconnect = restrict(this.get_option('reconnect_limit'), backoff(initial, max));
-    } else if (typeof reconnect === 'number') {
-        var fixed = this.options.reconnect
-        this.options.reconnect = restrict(this.get_option('reconnect_limit'), function () { return fixed; });
-    }
-    this.registered = false;
-    this.state = new EndpointState();
-    this.local_channel_map = {};
-    this.remote_channel_map = {};
-    this.local = {};
-    this.remote = {};
-    this.local.open = frames.open(this.options);
-    this.local.close = frames.close({});
-    this.session_policy = session_per_connection(this);
-    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
-    this.sasl_transport = undefined;
-    this.transport = this.amqp_transport;
-    this.conn_established_counter = 0;
-    this.heartbeat_out = undefined;
-    this.heartbeat_in = undefined;
-    this.abort_idle = false;
-    this.socket_ready = false;
-};
-
-Connection.prototype = Object.create(EventEmitter.prototype);
-Connection.prototype.constructor = Connection;
-Connection.prototype.dispatch = function(name, context) {
-    log.events('Connection got event: ' + name);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-        return true;
-    } else if (this.container) {
-        return this.container.dispatch.apply(this.container, arguments);
-    }
-};
-
-Connection.prototype.reset = function() {
-    if (this.abort_idle) {
-        this.abort_idle = false;
-        this.local.close.error = undefined;
-        this.state = new EndpointState();
-        this.state.open();
-    }
-
-    //reset transport
-    this.amqp_transport = new Transport(this.options.id, AMQP_PROTOCOL_ID, frames.TYPE_AMQP, this);
-    this.sasl_transport = undefined;
-    this.transport = this.amqp_transport;
-
-    //reset remote endpoint state
-    this.state.disconnected();
-    this.remote = {};
-    //reset sessions:
-    this.remote_channel_map = {};
-    for (var k in this.local_channel_map) {
-        this.local_channel_map[k].reset();
-    }
-    this.socket_ready = false;
-}
-
-Connection.prototype.connect = function () {
-    this.is_server = false;
-    this._connect(this.options.connection_details(this.conn_established_counter));
-    this.open();
-    return this;
-};
-Connection.prototype.reconnect = function () {
-    log.reconnect('reconnecting...');
-    this.reset();
-    this._connect(this.options.connection_details(this.conn_established_counter));
-    process.nextTick(this._process.bind(this));
-    return this;
-};
-
-Connection.prototype._connect = function (details) {
-    if (details.connect) {
-        this.init(details.connect(details.port, details.host, details.options, this.connected.bind(this)));
-    } else {
-        this.init(get_connect_fn(details)(details.port, details.host, details.options, this.connected.bind(this)));
-    }
-    return this;
-};
-
-Connection.prototype.accept = function (socket) {
-    this.is_server = true;
-    log.io('[' + this.id + '] client accepted: '+ get_socket_id(socket));
-    this.socket_ready = true;
-    return this.init(socket);
-};
-
-Connection.prototype.init = function (socket) {
-    this.socket = socket;
-    this.socket.on('data', this.input.bind(this));
-    this.socket.on('error', this.error.bind(this));
-    this.socket.on('end', this.eof.bind(this));
-
-    if (this.is_server) {
-        var mechs;
-        if (this.container && Object.getOwnPropertyNames(this.container.sasl_server_mechanisms).length) {
-            mechs = this.container.sasl_server_mechanisms;
-        }
-        if (this.socket.encrypted && this.socket.authorized && this.get_option('enable_sasl_external', false)) {
-            mechs = sasl.server_add_external(mechs ? util.clone(mechs) : {});
-        }
-        if (mechs) {
-            this.sasl_transport = new sasl.Server(this, mechs);
-        }
-    } else {
-        var mechanisms = this.get_option('sasl_mechanisms');
-        if (!mechanisms) {
-            var username = this.get_option('username');
-            var password = this.get_option('password');
-            if (username) {
-                mechanisms = sasl.client_mechanisms();
-                if (password) mechanisms.enable_plain(username, password);
-                else mechanisms.enable_anonymous(username);
-            }
-        }
-        if (this.socket.encrypted && this.options.cert && this.get_option('enable_sasl_external', false)) {
-            if (!mechanisms) mechanisms = sasl.client_mechanisms();
-            mechanisms.enable_external();
-        }
-
-        if (mechanisms) {
-            this.sasl_transport = new sasl.Client(this, mechanisms);
-        }
-    }
-    this.transport = this.sasl_transport ? this.sasl_transport : this.amqp_transport;
-    return this;
-};
-
-Connection.prototype.attach_sender = function (options) {
-    return this.session_policy.get_session().attach_sender(options);
-};
-Connection.prototype.open_sender = Connection.prototype.attach_sender;//alias
-
-Connection.prototype.attach_receiver = function (options) {
-    return this.session_policy.get_session().attach_receiver(options);
-};
-Connection.prototype.open_receiver = Connection.prototype.attach_receiver;//alias
-
-Connection.prototype.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else if (this.container) return this.container.get_option(name, default_value);
-    else return default_value;
-};
-
-Connection.prototype.connected = function () {
-    this.socket_ready = true;
-    this.conn_established_counter++;
-    log.io('[' + this.options.id + '] connected ' + get_socket_id(this.socket));
-    this.output();
-};
-Connection.prototype.sasl_failed = function (text) {
-    this.transport_error = {condition:'amqp:unauthorized-access', description:text};
-    this._handle_error();
-}
-
-Connection.prototype._handle_error = function () {
-    var error = this.get_error();
-    if (error) {
-        //TODO: invoke connection_close regardless of whether connection_error is handled
-        //TODO: example for error handling
-        if (!this.dispatch('connection_error', this._context())) {
-            if (!this.dispatch('connection_close', this._context())) {
-                console.log('error: ' + JSON.stringify(error));
-            }
-        }
-        return true;
-    } else {
-        return false;
-    }
-}
-
-Connection.prototype.get_error = function () {
-    if (this.transport_error) return this.transport_error;
-    if (this.remote.close && this.remote.close.error) return this.remote.close.error;
-    return undefined;
-}
-
-Connection.prototype.output = function () {
-    if (this.socket && this.socket_ready) {
-        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
-        this.transport.write(this.socket);
-        if (((this.is_closed() && this.state.has_settled()) || this.abort_idle || this.transport_error) && !this.transport.has_writes_pending()) {
-            this.socket.end();
-        } else if (this.is_open() && this.remote.open.idle_time_out) {
-            this.heartbeat_out = setTimeout(this._write_frame.bind(this), this.remote.open.idle_time_out / 2);
-        }
-    }
-};
-
-Connection.prototype.input = function (buff) {
-    if (this.heartbeat_in) clearTimeout(this.heartbeat_in);
-    log.io('[' + this.options.id + '] read ' + buff.length + ' bytes');
-    var buffer;
-    if (this.previous_input) {
-        buffer = Buffer.concat([this.previous_input, buff], this.previous_input.length + buff.length);
-        this.previous_input = null;
-    } else {
-        buffer = buff;
-    }
-    var read = this.transport.read(buffer, this);
-    if (read < buffer.length) {
-        this.previous_input = buffer.slice(read);
-    }
-    if (this.local.open.idle_time_out) this.heartbeat_in = setTimeout(this.idle.bind(this), this.local.open.idle_time_out);
-    if (this.transport.has_writes_pending()) this.output();
-};
-
-Connection.prototype.idle = function () {
-    if (this.is_open()) {
-        this.abort_idle = true;
-        this.local.close.error = {condition:'amqp:resource-limit-exceeded', description:'max idle time exceeded'};
-        this.close();
-    }
-};
-
-Connection.prototype.error = function (e) {
-    console.log('[' + this.options.id + '] error: ' + e);
-    this._disconnected();
-};
-
-Connection.prototype.eof = function (e) {
-    this._disconnected();
-};
-
-Connection.prototype._disconnected = function () {
-    if (!this.is_closed()) {
-        if (!this.dispatch('disconnected', this._context())) {
-            console.log('[' + this.options.id + '] disconnected');
-        }
-        if (!this.is_server && !this.transport_error && this.options.reconnect) {
-            var delay = this.options.reconnect(this.conn_established_counter);
-            if (delay >= 0) {
-                log.reconnect('Scheduled reconnect in ' + delay + 'ms');
-                setTimeout(this.reconnect.bind(this), delay);
-            }
-        }
-    }
-};
-
-Connection.prototype.open = function () {
-    if (this.state.open()) {
-        this._register();
-    }
-};
-Connection.prototype.close = function () {
-    if (this.state.close()) {
-        this._register();
-    }
-};
-
-Connection.prototype.is_open = function () {
-    return this.state.is_open();
-};
-
-Connection.prototype.is_closed = function () {
-    return this.state.is_closed();
-};
-
-Connection.prototype.create_session = function () {
-    var i = 0;
-    while (this.local_channel_map[i]) i++;
-    var session = new Session(this, i);
-    this.local_channel_map[i] = session;
-    return session;
-}
-
-Connection.prototype.on_open = function (frame) {
-    if (this.state.remote_opened()) {
-        this.remote.open = frame.performative;
-        this.open();
-        this.dispatch('connection_open', this._context());
-    } else {
-        throw Error('Open already received');
-    }
-};
-
-Connection.prototype.on_close = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.close = frame.performative;
-        this.close();
-        if (this.remote.close.error) {
-            this._handle_error();
-        } else {
-            this.dispatch('connection_close', this._context());
-        }
-        if (this.heartbeat_out) clearTimeout(this.heartbeat_out);
-    } else {
-        throw Error('Close already received');
-    }
-};
-
-Connection.prototype._register = function () {
-    if (!this.registered) {
-        this.registered = true;
-        process.nextTick(this._process.bind(this));
-    }
-};
-
-Connection.prototype._process = function () {
-    this.registered = false;
-    do {
-        if (this.state.need_open()) {
-            this._write_open();
-        }
-        for (var k in this.local_channel_map) {
-            this.local_channel_map[k]._process();
-        }
-        if (this.state.need_close()) {
-            this._write_close();
-        }
-    } while (!this.state.has_settled());
-};
-
-Connection.prototype._write_frame = function (channel, frame, payload) {
-    this.amqp_transport.encode(frames.amqp_frame(channel, frame, payload));
-    this.output();
-};
-
-Connection.prototype._write_open = function () {
-    this._write_frame(0, this.local.open.described());
-};
-
-Connection.prototype._write_close = function () {
-    this._write_frame(0, this.local.close.described());
-};
-
-Connection.prototype.on_begin = function (frame) {
-    var session;
-    if (frame.performative.remote_channel === null || frame.performative.remote_channel === undefined) {
-        //peer initiated
-        session = this.create_session();
-        session.local.begin.remote_channel = frame.channel;
-    } else {
-        session = this.local_channel_map[frame.performative.remote_channel];
-        if (!session) throw Error('Invalid value for remote channel ' + frame.performative.remote_channel);
-    }
-    session.on_begin(frame);
-    this.remote_channel_map[frame.channel] = session;
-};
-
-Connection.prototype.get_peer_certificate = function() {
-    if (this.socket && this.socket.getPeerCertificate) {
-        return this.socket.getPeerCertificate();
-    } else {
-        return undefined;
-    }
-};
-
-Connection.prototype._context = function (c) {
-    var context = c ? c : {};
-    context.connection = this;
-    if (this.container) context.container = this.container;
-    return context;
-};
-
-function delegate_to_session(name) {
-    Connection.prototype['on_' + name] = function (frame) {
-        var session = this.remote_channel_map[frame.channel];
-        if (!session) {
-            throw Error(name + ' received on invalid channel ' + frame.channel);
-        }
-        session['on_' + name](frame);
-    };
-};
-
-delegate_to_session('end');
-delegate_to_session('attach');
-delegate_to_session('detach');
-delegate_to_session('transfer');
-delegate_to_session('disposition');
-delegate_to_session('flow');
-
-module.exports = Connection
-
-}).call(this,require('_process'),require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./sasl.js":8,"./session.js":9,"./transport.js":11,"./types.js":12,"./util.js":13,"_process":24,"buffer":19,"events":23,"net":18,"tls":18}],2:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var EndpointState = function () {
-    this.init();
-};
-
-EndpointState.prototype.init = function () {
-    this.local_open = false;
-    this.remote_open = false;
-    this.open_requests = 0;
-    this.close_requests = 0;
-    this.initialised = false;
-};
-
-EndpointState.prototype.open = function () {
-    this.initialised = true;
-    if (!this.local_open) {
-        this.local_open = true;
-        this.open_requests++;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.close = function () {
-    if (this.local_open) {
-        this.local_open = false;
-        this.close_requests++;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.disconnected = function () {
-    var was_open = this.local_open;
-    this.init();
-    if (was_open) {
-        this.open();
-    } else {
-        this.close();
-    }
-};
-
-EndpointState.prototype.remote_opened = function (frame) {
-    if (!this.remote_open) {
-        this.remote_open = true;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.remote_closed = function (frame) {
-    if (this.remote_open) {
-        this.remote_open = false;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.is_open = function () {
-    return this.local_open && this.remote_open;
-};
-
-EndpointState.prototype.is_closed = function () {
-    return this.initialised && !this.local_open && !this.remote_open;
-};
-
-EndpointState.prototype.has_settled = function () {
-    return this.open_requests == 0 && this.close_requests == 0;
-};
-
-EndpointState.prototype.need_open = function () {
-    if (this.open_requests > 0) {
-        this.open_requests--;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-EndpointState.prototype.need_close = function () {
-    if (this.close_requests > 0) {
-        this.close_requests--;
-        return true;
-    } else {
-        return false;
-    }
-};
-
-module.exports = EndpointState
-
-},{}],3:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var frames = {};
-var by_descriptor = {};
-
-frames.read_header = function(buffer) {
-    var offset = 4;
-    var header = {};
-    var name = buffer.toString('ascii', 0, offset);
-    if (name !== 'AMQP') {
-        throw Error('Invalid protocol header for AMQP ' + name);
-    }
-    header.protocol_id = buffer.readUInt8(offset++);
-    header.major = buffer.readUInt8(offset++);
-    header.minor = buffer.readUInt8(offset++);
-    header.revision = buffer.readUInt8(offset++);
-    if (header.major !== 1 || header.minor !== 0) {
-        throw Error('Unsupported AMQP version: ' + JSON.stringify(header));
-    }
-    return header;
-};
-frames.write_header = function(buffer, header) {
-    var offset = 4;
-    buffer.write('AMQP', 0, offset, 'ascii');
-    buffer.writeUInt8(header.protocol_id, offset++);
-    buffer.writeUInt8(header.major, offset++);
-    buffer.writeUInt8(header.minor, offset++);
-    buffer.writeUInt8(header.revision, offset++);
-    return 8;
-};
-//todo: define enumeration for frame types
-frames.TYPE_AMQP = 0x00;
-frames.TYPE_SASL = 0x01;
-
-frames.read_frame = function(buffer) {
-    var reader = new types.Reader(buffer);
-    var frame = {};
-    frame.size = reader.read_uint(4);
-    if (reader.remaining < frame.size) {
-        return null;
-    }
-    var doff = reader.read_uint(1);
-    if (doff < 2) {
-        throw Error('Invalid data offset, must be at least 2 was ' + doff);
-    }
-    frame.type = reader.read_uint(1);
-    if (frame.type === frames.TYPE_AMQP) {
-        frame.channel = reader.read_uint(2);
-    } else if (frame.type === frames.TYPE_SASL) {
-        reader.skip(2);
-    } else {
-        throw Error('Unknown frame type ' + frame.type);
-    }
-    if (doff > 1) {
-        //ignore any extended header
-        reader.skip(doff * 4 - 8);
-    }
-    if (reader.remaining()) {
-        frame.performative = reader.read();
-        var c = by_descriptor[frame.performative.descriptor.value];
-        if (c) {
-            frame.performative = new c(frame.performative.value);
-        }
-        if (reader.remaining()) {
-            frame.payload = reader.read_bytes(reader.remaining());
-        }
-    }
-    return frame;
-};
-
-frames.write_frame = function(frame) {
-    var writer = new types.Writer();
-    writer.skip(4);//skip size until we know how much we have written
-    writer.write_uint(2, 1);//doff
-    writer.write_uint(frame.type, 1);
-    if (frame.type === frames.TYPE_AMQP) {
-        writer.write_uint(frame.channel, 2);
-    } else if (frame.type === frames.TYPE_SASL) {
-        writer.write_uint(0, 2);
-    } else {
-        throw Error('Unknown frame type ' + frame.type);
-    }
-    if (frame.performative) {
-        writer.write(frame.performative);
-        if (frame.payload) {
-            writer.write_bytes(frame.payload);
-        }
-    }
-    var buffer = writer.toBuffer();
-    buffer.writeUInt32BE(buffer.length, 0);//fill in the size
-    return buffer;
-};
-
-frames.amqp_frame = function(channel, performative, payload) {
-    return {'channel': channel || 0, 'type': frames.TYPE_AMQP, 'performative': performative, 'payload': payload};
-};
-frames.sasl_frame = function(performative) {
-    return {'channel': 0, 'type': frames.TYPE_SASL, 'performative': performative};
-};
-
-function define_frame(type, def) {
-    var c = types.define_composite(def);
-    frames[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-};
-
-var open = {name: "open",
-            code: 0x10,
-            fields: [
-                 {name:"container_id", type:"string", mandatory:true},
-                 {name:"hostname", type:"string"},
-                 {name:"max_frame_size", type:"uint", default_value:4294967295},
-                 {name:"channel_max", type:"ushort", default_value:65535},
-                 {name:"idle_time_out", type:"uint"},
-                 {name:"outgoing_locales", type:"symbol", multiple:true},
-                 {name:"incoming_locales", type:"symbol", multiple:true},
-                 {name:"offered_capabilities", type:"symbol", multiple:true},
-                 {name:"desired_capabilities", type:"symbol", multiple:true},
-                 {name:"properties", type:"symbolic_map"}
-             ]
-           };
-
-var begin = {name:"begin",
-             code:0x11,
-             fields:[
-                 {name:"remote_channel", type:"ushort"},
-                 {name:"next_outgoing_id", type:"uint", mandatory:true},
-                 {name:"incoming_window", type:"uint", mandatory:true},
-                 {name:"outgoing_window", type:"uint", mandatory:true},
-                 {name:"handle_max", type:"uint", default_value:"4294967295"},
-                 {name:"offered_capabilities", type:"symbol", multiple:true},
-                 {name:"desired_capabilities", type:"symbol", multiple:true},
-                 {name:"properties", type:"symbolic_map"}
-             ]
-            };
-
-var attach = {name:"attach",
-              code:0x12,
-              fields:[
-                  {name:"name", type:"string", mandatory:true},
-                  {name:"handle", type:"uint", mandatory:true},
-                  {name:"role", type:"boolean", mandatory:true},
-                  {name:"snd_settle_mode", type:"ubyte", default_value:2},
-                  {name:"rcv_settle_mode", type:"ubyte", default_value:0},
-                  {name:"source", type:"*"},
-                  {name:"target", type:"*"},
-                  {name:"unsettled", type:"map"},
-                  {name:"incomplete_unsettled", type:"boolean", default_value:false},
-                  {name:"initial_delivery_count", type:"uint"},
-                  {name:"max_message_size", type:"ulong"},
-                  {name:"offered_capabilities", type:"symbol", multiple:true},
-                  {name:"desired_capabilities", type:"symbol", multiple:true},
-                  {name:"properties", type:"symbolic_map"}
-              ]
-             };
-
-var flow = {name:"flow",
-            code:0x13,
-            fields:[
-                {name:"next_incoming_id", type:"uint"},
-                {name:"incoming_window", type:"uint", mandatory:true},
-                {name:"next_outgoing_id", type:"uint", mandatory:true},
-                {name:"outgoing_window", type:"uint", mandatory:true},
-                {name:"handle", type:"uint"},
-                {name:"delivery_count", type:"uint"},
-                {name:"link_credit", type:"uint"},
-                {name:"available", type:"uint"},
-                {name:"drain", type:"boolean", default_value:false},
-                {name:"echo", type:"boolean", default_value:false},
-                {name:"properties", type:"symbolic_map"}
-            ]
-           };
-
-var transfer = {name:"transfer",
-                code:0x14,
-                fields:[
-                    {name:"handle", type:"uint", mandatory:true},
-                    {name:"delivery_id", type:"uint"},
-                    {name:"delivery_tag", type:"binary"},
-                    {name:"message_format", type:"uint"},
-                    {name:"settled", type:"boolean"},
-                    {name:"more", type:"boolean", default_value:false},
-                    {name:"rcv_settle_mode", type:"ubyte"},
-                    {name:"state", type:"delivery_state"},
-                    {name:"resume", type:"boolean", default_value:false},
-                    {name:"aborted", type:"boolean", default_value:false},
-                    {name:"batchable", type:"boolean", default_value:false}
-                ]
-               };
-
-var disposition = {name:"disposition",
-                   code:0x15,
-                   fields:[
-                       {name:"role", type:"boolean", mandatory:true},
-                       {name:"first", type:"uint", mandatory:true},
-                       {name:"last", type:"uint"},
-                       {name:"settled", type:"boolean", default_value:false},
-                       {name:"state", type:"*"},
-                       {name:"batchable", type:"boolean", default_value:false}
-                   ]
-                  };
-
-var detach = {name: "detach",
-             code: 0x16,
-              fields: [
-                  {name:"handle", type:"uint", mandatory:true},
-                  {name:"closed", type:"boolean", default_value:false},
-                  {name:"error", type:"error"}
-              ]
-             };
-
-var end = {name: "end",
-             code: 0x17,
-             fields: [
-                 {name:"error", type:"error"}
-             ]
-            };
-
-var close = {name: "close",
-             code: 0x18,
-             fields: [
-                 {name:"error", type:"error"}
-             ]
-            };
-
-define_frame(frames.TYPE_AMQP, open);
-define_frame(frames.TYPE_AMQP, begin);
-define_frame(frames.TYPE_AMQP, attach);
-define_frame(frames.TYPE_AMQP, flow);
-define_frame(frames.TYPE_AMQP, transfer);
-define_frame(frames.TYPE_AMQP, disposition);
-define_frame(frames.TYPE_AMQP, detach);
-define_frame(frames.TYPE_AMQP, end);
-define_frame(frames.TYPE_AMQP, close);
-
-var sasl_mechanisms = {name:"sasl_mechanisms", code:0x40,
-                       fields: [
-                           {name:"sasl_server_mechanisms", type:"symbol", multiple:true, mandatory:true}
-                       ]};
-
-var sasl_init = {name:"sasl_init", code:0x41,
-                 fields: [
-                     {name:"mechanism", type:"symbol", mandatory:true},
-                     {name:"initial_response", type:"binary"},
-                     {name:"hostname", type:"string"}
-                 ]};
-
-var sasl_challenge = {name:"sasl_challenge", code:0x42,
-                      fields: [
-                          {name:"challenge", type:"binary", mandatory:true}
-                      ]};
-
-var sasl_response = {name:"sasl_response", code:0x43,
-                     fields: [
-                         {name:"response", type:"binary", mandatory:true}
-                     ]};
-
-var sasl_outcome = {name:"sasl_outcome", code:0x44,
-                    fields: [
-                        {name:"code", type:"ubyte", mandatory:true},
-                        {name:"additional_data", type:"binary"}
-                    ]};
-
-define_frame(frames.TYPE_SASL, sasl_mechanisms);
-define_frame(frames.TYPE_SASL, sasl_init);
-define_frame(frames.TYPE_SASL, sasl_challenge);
-define_frame(frames.TYPE_SASL, sasl_response);
-define_frame(frames.TYPE_SASL, sasl_outcome);
-
-module.exports = frames;
-
-},{"./types.js":12}],4:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var terminus = require('./terminus.js')
-var types = require('./types.js')
-var EndpointState = require('./endpoint.js');
-
-var FlowController = function (window) {
-    this.window = window;
-};
-FlowController.prototype.update = function (context) {
-    var delta = this.window - context.receiver.credit;
-    context.receiver.flow(delta);
-};
-
-function auto_settle(context) {
-    context.delivery.settled = true;
-};
-
-function auto_accept(context) {
-    context.delivery.update(true, message.accepted().described());
-};
-
-var EventEmitter = require('events').EventEmitter;
-
-var link = Object.create(EventEmitter.prototype);
-link.dispatch = function(name, context) {
-    log.events('Link got event: '+ name);
-    EventEmitter.prototype.emit.apply(this.observers, arguments);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-    } else {
-        this.session.dispatch.apply(this.session, arguments);
-    }
-};
-link.set_source = function (fields) {
-    this.local.attach.source = terminus.source(fields).described();
-};
-link.set_target = function (fields) {
-    this.local.attach.target = terminus.target(fields).described();
-};
-
-link.attach = function () {
-    if (this.state.open()) {
-        this.connection._register();
-    }
-};
-link.open = link.attach;
-
-link.detach = function () {
-    this.local.detach.closed = false;
-    if (this.state.close()) {
-        this.connection._register();
-    }
-};
-link.close = function() {
-    this.local.detach.closed = true;
-    if (this.state.close()) {
-        this.connection._register();
-    }
-}
-
-link.is_open = function () {
-    return this.session.is_open() && this.state.is_open();
-};
-
-link.is_closed = function () {
-    return this.session.is_closed() || this.state.is_closed();
-};
-
-link._process = function () {
-    do {
-        if (this.state.need_open()) {
-            this.session.output(this.local.attach.described());
-        }
-
-        if (this.issue_flow) {
-            this.session._write_flow(this);
-            this.issue_flow = false;
-        }
-
-        if (this.state.need_close()) {
-            this.session.output(this.local.detach.described());
-        }
-    } while (!this.state.has_settled());
-};
-
-link.on_attach = function (frame) {
-    if (this.state.remote_opened()) {
-        if (!this.remote.handle) {
-            this.remote.handle = frame.handle;
-        }
-        frame.performative.source = terminus.unwrap(frame.performative.source);
-        frame.performative.target = terminus.unwrap(frame.performative.target);
-        this.remote.attach = frame.performative;
-        this.open();
-        this.dispatch(this.is_receiver() ? 'receiver_open' : 'sender_open', this._context());
-    } else {
-        throw Error('Attach already received');
-    }
-};
-
-link.on_detach = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.detach = frame.performative;
-        this.close();
-        this.dispatch(this.local.attach.role ? 'receiver_close' : 'sender_close', this._context());
-    } else {
-        throw Error('Detach already received');
-    }
-};
-
-function is_internal(name) {
-    switch (name) {
-    case 'handle':
-    case 'role':
-    case 'initial_delivery_count':
-        return true;
-    default:
-        return false;
-    }
-}
-
-link.init = function (session, name, local_handle, opts, is_receiver) {
-    this.session = session;
-    this.connection = session.connection;
-    this.name = name;
-    this.options = opts === undefined ? {} : opts;
-    this.state = new EndpointState();
-    this.issue_flow = false;//currently only used by receiver
-    this.local = {'handle': local_handle};
-    this.local.attach = frames.attach({'handle':local_handle,'name':name, role:is_receiver});
-    for (var f in this.local.attach) {
-        if (!is_internal(f) && this.options[f] !== undefined) {
-            this.local.attach[f] = this.options[f];
-        }
-    }
-    this.local.detach = frames.detach({'handle':local_handle, 'closed':true});
-    this.remote = {'handle':undefined};
-    this.delivery_count = 0;
-    this.credit = 0;
-    this.observers = new EventEmitter();
-};
-link.reset = function() {
-    this.state.disconnected();
-    this.remote = {'handle':undefined};
-    this.delivery_count = 0;
-    this.credit = 0;
-};
-
-link.has_credit = function () {
-    return this.credit > 0;
-};
-link.is_receiver = function () {
-    return this.local.attach.role;
-};
-link._context = function (c) {
-    var context = c ? c : {};
-    if (this.is_receiver()) {
-        context.receiver = this;
-    } else {
-        context.sender = this;
-    }
-    return this.session._context(context);
-};
-link.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else return this.session.get_option(name, default_value);
-};
-
-var Sender = function (session, name, local_handle, opts) {
-    this.init(session, name, local_handle, opts, false);
-    this.local.attach.initial_delivery_count = 0;
-    this.tag = 0;
-    if (this.get_option('autosettle', true)) {
-        this.observers.on('settled', auto_settle);
-    }
-};
-Sender.prototype = Object.create(link);
-Sender.prototype.constructor = Sender;
-Sender.prototype.next_tag = function () {
-    return new String(this.tag++);
-};
-Sender.prototype.sendable = function (frame) {
-    return this.credit && this.session.outgoing.available();
-}
-Sender.prototype.on_flow = function (frame) {
-    var flow = frame.performative;
-    this.credit = flow.delivery_count + flow.link_credit - this.delivery_count;
-    if (this.is_open()) {
-        this.dispatch('sender_flow', this._context());
-        if (this.sendable()) {
-            this.dispatch('sendable', this._context());
-        }
-    }
-};
-Sender.prototype.on_transfer = function (frame) {
-    throw Error('got transfer on sending link');
-};
-Sender.prototype.send = function (msg, tag) {
-    return this.session.send(this, tag ? tag : this.next_tag(), message.encode(msg), 0);
-};
-
-
-var Receiver = function (session, name, local_handle, opts) {
-    this.init(session, name, local_handle, opts, true);
-    this.set_prefetch(this.get_option('prefetch', 100));
-    if (this.get_option('autoaccept', true)) {
-        this.observers.on('message', auto_accept);
-    }
-};
-Receiver.prototype = Object.create(link);
-Receiver.prototype.constructor = Receiver;
-Receiver.prototype.on_flow = function (frame) {
-    this.dispatch('receiver_flow', this._context());
-};
-Receiver.prototype.flow = function(credit) {
-    if (credit > 0) {
-        this.credit += credit;
-        this.issue_flow = true;
-        this.connection._register();
-    }
-};
-
-Receiver.prototype.set_prefetch = function(prefetch) {
-    if (prefetch > 0) {
-        var flow_controller = new FlowController(prefetch);
-        var listener = flow_controller.update.bind(flow_controller);
-        this.observers.on('message', listener);
-        this.observers.on('receiver_open', listener);
-    }
-}
-
-module.exports = {'Sender': Sender, 'Receiver':Receiver};
-
-},{"./endpoint.js":2,"./frames.js":3,"./log.js":5,"./message.js":6,"./terminus.js":10,"./types.js":12,"events":23}],5:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var debug = require('debug');
-
-module.exports = {
-    'frames' : debug('rhea:frames'),
-    'raw' : debug('rhea:raw'),
-    'reconnect' : debug('rhea:reconnect'),
-    'events' : debug('rhea:events'),
-    'message' : debug('rhea:message'),
-    'flow' : debug('rhea:flow'),
-    'io' : debug('rhea:io')
-}
-
-},{"debug":15}],6:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var log = require('./log.js');
-var types = require('./types.js');
-
-var by_descriptor = {};
-var unwrappers = {};
-var wrappers = [];
-var message = {};
-
-function define_section(descriptor, unwrap, wrap) {
-    unwrap.descriptor = descriptor;
-    unwrappers[descriptor.symbolic] = unwrap;
-    unwrappers[Number(descriptor.numeric).toString(10)] = unwrap;
-    if (wrap) {
-        wrappers.push(wrap);
-    }
-};
-
-function define_composite_section(def) {
-    var c = types.define_composite(def);
-    message[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-
-    var unwrap = function (msg, section) {
-        msg[def.name] = new c(section.value);
-    };
-
-    var wrap = function (sections, msg) {
-        if (msg[def.name]) {
-            if (msg[def.name].described) {
-                sections.push(msg[def.name].described());
-            } else {
-                sections.push(c.create(msg[def.name]).described());
-            }
-        }
-    };
-    define_section(c.descriptor, unwrap, wrap);
-};
-
-
-function define_map_section(def) {
-    var descriptor = {numeric:def.code};
-    descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map';
-    var unwrap = function (msg, section) {
-        msg[def.name] = types.unwrap(section);
-    };
-    var wrap = function (sections, msg) {
-        if (msg[def.name]) {
-            sections.push(types.described(types.wrap_ulong(descriptor.numeric), types.wrap_map(msg[def.name])));
-        }
-    };
-    define_section(descriptor, unwrap, wrap);
-};
-
-define_composite_section({name:"header",
-                          code:0x70,
-                          fields:[
-                              {name:"durable", type:"boolean", default_value:false},
-                              {name:"priority", type:"ubyte", default_value:4},
-                              {name:"ttl", type:"uint"},
-                              {name:"first_acquirer", type:"boolean", default_value:false},
-                              {name:"delivery_count", type:"uint", default_value:0}
-                          ]
-                         });
-define_map_section({name:"delivery_annotations", code:0x71});
-define_map_section({name:"message_annotations", code:0x72});
-define_composite_section({name:"properties",
-                          code:0x73,
-                          fields:[
-                              {name:"message_id", type:"message_id"},
-                              {name:"user_id", type:"binary"},
-                              {name:"to", type:"string"},
-                              {name:"subject", type:"string"},
-                              {name:"reply_to", type:"string"},
-                              {name:"correlation_id", type:"message_id"},
-                              {name:"content_type", type:"symbol"},
-                              {name:"content_encoding", type:"symbol"},
-                              {name:"absolute_expiry_time", type:"timestamp"},
-                              {name:"creation_time", type:"timestamp"},
-                              {name:"group_id", type:"string"},
-                              {name:"group_sequence", type:"uint"},
-                              {name:"reply_to_group_id", type:"string"}
-                          ]
-                         });
-define_map_section({name:"application_properties", code:0x74});
-
-define_section({numeric:0x77, symbolic:'amqp:value:*'},
-               function(msg, section) { msg.body = types.unwrap(section); },
-               function(sections, msg) { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); });
-
-define_map_section({name:"footer", code:0x78});
-
-message.encode = function(obj) {
-    var sections = [];
-
-    wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, obj); });
-    var writer = new types.Writer();
-    for (var i = 0; i < sections.length; i++) {
-        log.message('Encoding section ' + (i+1) + ' of ' + sections.length + ': ' + sections[i]);
-        writer.write(sections[i]);
-    }
-    var data = writer.toBuffer();
-    log.message('encoded ' + data.length + ' bytes');
-    return data;
-}
-
-message.decode = function(buffer) {
-    var msg = {};
-    var reader = new types.Reader(buffer);
-    while (reader.remaining()) {
-        var s = reader.read();
-        log.message('decoding section: ' + JSON.stringify(s) + ' of type: ' + JSON.stringify(s.descriptor));
-        if (s.descriptor) {
-            var unwrap = unwrappers[s.descriptor.value];
-            if (unwrap) {
-                unwrap(msg, s);
-            } else {
-                console.log("WARNING: did not recognise message section with descriptor " + s.descriptor);
-            }
-        } else {
-            console.log("WARNING: expected described message section got " + JSON.stringify(s));
-        }
-    }
-    return msg;
-}
-
-var outcomes = {};
-
-function define_outcome(def) {
-    var c = types.define_composite(def);
-    c.composite_type = def.name;
-    message[def.name] = c.create;
-    outcomes[Number(c.descriptor.numeric).toString(10)] = c;
-    outcomes[c.descriptor.symbolic] = c;
-    message['is_' + def.name] = function (o) {
-        if (o && o.descriptor) {
-            var c = outcomes[o.descriptor.value];
-            if (c) {
-                return c.descriptor.numeric == def.code;
-            }
-        }
-        return false;
-    };
-}
-
-message.unwrap_outcome = function (outcome) {
-    if (outcome && outcome.descriptor) {
-        var c = outcomes[outcome.descriptor.value];
-        if (c) {
-            return new c(outcome);
-        }
-    }
-    console.log('unrecognised outcome');
-    return outcome;
-};
-
-message.are_outcomes_equivalent = function(a, b) {
-    if (a === undefined && b === undefined) return true;
-    else if (a === undefined || b === undefined) return false;
-    else return a.descriptor.value == b.descriptor.value && JSON.stringify(a) == JSON.stringify(b);
-};
-
-define_outcome({name:"received", code:0x23,
-                fields:[
-                    {name:"section-number", type:"uint", mandatory:true},
-                    {name:"section-offset", type:"ulong", mandatory:true}
-                ]});
-define_outcome({name:"accepted", code:0x24, fields:[]});
-define_outcome({name:"rejected", code:0x25, fields:[{name:"error", type:"error"}]});
-define_outcome({name:"released", code:0x26, fields:[]});
-define_outcome({name:"modified",
- code:0x27,
- fields:[
-     {name:"delivery-failed", type:"boolean"},
-     {name:"undeliverable-here", type:"boolean"},
-     {name:"message-annotations", type:"fields"}
-]});
-
-module.exports = message;
-
-},{"./log.js":5,"./types.js":12}],7:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var url = require('url');
-
-var simple_id_generator = {
-    counter : 1,
-    next : function() {
-        return this.counter++;
-    }
-};
-
-var Client = function (container, address) {
-    var u = url.parse(address);
-    //TODO: handle scheme and user/password if present
-    this.connection = container.connect({'host':u.hostname, 'port':u.port});
-    this.connection.on('message', this._response.bind(this));
-    this.connection.on('receiver_open', this._ready.bind(this));
-    this.sender = this.connection.attach_sender(u.path.substr(1));
-    this.receiver = this.connection.attach_receiver({source:{dynamic:true}});
-    this.id_generator = simple_id_generator;
-    this.pending = [];//requests yet to be made (waiting for receiver to open)
-    this.outstanding = {};//requests sent, for which responses have not yet been received
-};
-
-Client.prototype._request = function (id, name, args, callback) {
-    var request = {properties:{}};
-    request.properties.subject = name;
-    request.body = args;
-    request.properties.message_id = id;
-    request.properties.reply_to = this.receiver.remote.attach.source.address;
-    this.outstanding[id] = callback;
-    this.sender.send(request);
-};
-
-Client.prototype._response = function (context) {
-    var id = context.message.properties.correlation_id;
-    var callback = this.outstanding[id];
-    if (callback) {
-        if (context.message.properties.subject === 'ok') {
-            callback(context.message.body);
-        } else {
-            callback(undefined, {name: context.message.properties.subject, description: context.message.body});
-        }
-    } else {
-        console.log('no request pending for ' + id + ', ignoring response');
-    }
-};
-
-Client.prototype._ready = function (context) {
-    this._process_pending();
-};
-
-Client.prototype._process_pending = function () {
-    for (var i = 0; i < this.pending.length; i++) {
-        var r = this.pending[i];
-        this._request(r.id, r.name, r.args, r.callback);
-    }
-    this.pending = [];
-};
-
-Client.prototype.call = function (name, args, callback) {
-    var id = this.id_generator.next();
-    if (this.receiver.is_open() && this.pending.length === 0) {
-        this._request(id, name, args, callback);
-    } else {
-        //need to wait for reply-to address
-        this.pending.push({'name':name, 'args':args, 'callback':callback, 'id':id});
-    }
-};
-
-Client.prototype.close = function () {
-    this.receiver.close();
-    this.sender.close();
-    this.connection.close();
-};
-
-Client.prototype.define = function (name) {
-    this[name] = function (args, callback) { this.call(name, args, callback); };
-};
-
-var Cache = function (ttl, purged) {
-    this.ttl = ttl;
-    this.purged = purged;
-    this.entries = {};
-    this.timeout = undefined;
-};
-
-Cache.prototype.clear = function () {
-    if (this.timeout) clearTimeout(this.timeout);
-    this.entries = {};
-}
-
-Cache.prototype.put = function (key, value) {
-    this.entries[key] = {'value':value, 'last_accessed': Date.now()};
-    if (!this.timeout) this.timeout = setTimeout(this.purge.bind(this), this.ttl);
-};
-
-Cache.prototype.get = function (key) {
-    var entry = this.entries[key];
-    if (entry) {
-        entry.last_accessed = Date.now();
-        return entry.value;
-    } else {
-        return undefined;
-    }
-};
-
-Cache.prototype.purge = function() {
-    //TODO: this could be optimised if the map is large
-    var now = Date.now();
-    var expired = [];
-    var live = 0;
-    for (var k in this.entries) {
-        if (now - this.entries[k].last_accessed >= this.ttl) {
-            expired.push(k);
-        } else {
-            live++;
-        }
-    }
-    for (var i = 0; i < expired.length; i++) {
-        var entry = this.entries[expired[i]];
-        delete this.entries[expired[i]];
-        this.purged(entry.value);
-    }
-    if (live && !this.timeout) {
-        this.timeout = setTimeout(this.purge.bind(this), this.ttl);
-    }
-};
-
-var LinkCache = function (factory, ttl) {
-    this.factory = factory;
-    this.cache = new Cache(ttl, function(link) { link.close(); });
-}
-
-LinkCache.prototype.clear = function () {
-    this.cache.clear();
-}
-
-LinkCache.prototype.get = function (address) {
-    var link = this.cache.get(address);
-    if (link === undefined) {
-        link = this.factory(address);
-        this.cache.put(address, link);
-    }
-    return link;
-};
-
-var Server = function (container, address, options) {
-    this.options = options || {};
-    var u = url.parse(address);
-    //TODO: handle scheme and user/password if present
-    this.connection = container.connect({'host':u.hostname, 'port':u.port});
-    this.connection.on('connection_open', this._connection_open.bind(this));
-    this.connection.on('message', this._request.bind(this));
-    this.receiver = this.connection.attach_receiver(u.path.substr(1));
-    this.callbacks = {};
-    this._send = undefined;
-    this._clear = undefined;
-};
-
-function match(desired, offered) {
-    if (offered) {
-        if (Array.isArray(offered)) {
-            return offered.indexOf(desired) > -1;
-        } else {
-            return desired === offered;
-        }
-    } else {
-        return false;
-    }
-}
-
-Server.prototype._connection_open = function (context) {
-    if (match('ANONYMOUS-RELAY', this.connection.remote.open.offered_capabilities)) {
-        var relay = this.connection.attach_sender({target:{}});
-        this._send = function (msg) { relay.send(msg); };
-    } else {
-        var cache = new LinkCache(this.connection.attach_sender.bind(this.connection), this.options.cache_ttl || 60000);
-        this._send = function (msg) { var s = cache.get(msg.properties.to); if (s) s.send(msg); };
-        this._clear = function () { cache.clear(); }
-    }
-}
-
-Server.prototype._respond = function (response) {
-    var server = this;
-    return function (result, error) {
-        if (error) {
-            response.properties.subject = error.name || 'error';
-            response.body = error.description || error;
-        } else {
-            response.properties.subject = 'ok';
-            response.body = result;
-        }
-        server._send(response);
-    };
-}
-
-Server.prototype._request = function (context) {
-    var request = context.message;
-    var response = {properties:{}};
-    response.properties.to = request.properties.reply_to;
-    response.properties.correlation_id = request.properties.message_id;
-    var callback = this.callbacks[request.properties.subject];
-    if (callback) {
-        callback(request.body, this._respond(response));
-    } else {
-        response.properties.subject = 'bad-method';
-        response.body = 'Unrecognised method ' + request.properties.subject;
-        this._send(response);
-    }
-};
-
-Server.prototype.bind_sync = function (f, name) {
-    this.callbacks[name || f.name] = function (args, callback) { var result = f(args); callback(result); };
-};
-Server.prototype.bind = function (f, name) {
-    this.callbacks[name || f.name] = f;
-};
-
-Server.prototype.close = function () {
-    if (this._clear) this._clear();
-    this.receiver.close();
-    this.connection.close();
-};
-
-module.exports = {
-    server : function(container, address, options) { return new Server(container, address, options); },
-    client : function(connection, address) { return new Client(connection, address); }
-};
-
-},{"url":29}],8:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var log = require('./log.js');
-var Transport = require('./transport.js');
-
-var sasl_codes = {
-    "OK":0,
-    "AUTH":1,
-    "SYS":2,
-    "SYS_PERM":3,
-    "SYS_TEMP":4,
-};
-
-var SASL_PROTOCOL_ID = 0x03;
-
-function intersection(lista, listb) {
-    return lista.filter(function (a) { return listb.indexOf(a) >= 0; });
-}
-function extract(buffer) {
-    var results = [];
-    var start = 0;
-    var i = 0;
-    while (i < buffer.length) {
-        if (buffer[i] === 0x00) {
-            if (i > start) results.push(buffer.toString('utf8', start, i));
-            else results.push(null);
-            start = ++i;
-        } else {
-            ++i;
-        }
-    }
-    if (i > start) results.push(buffer.toString('utf8', start, i));
-    else results.push(null);
-    return results;
-}
-
-var PlainServer = function(callback) {
-    this.callback = callback;
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-PlainServer.prototype.start = function(response) {
-    var fields = extract(response);
-    if (fields.length !== 3) {
-        this.connection.sasl_failed('Unexpected response in PLAIN, got ' + fields.length + ' fields, expected 3');
-    }
-    if (this.callback(fields[1], fields[2])) {
-        this.outcome = true;
-        this.username = fields[1];
-    } else {
-        this.outcome = false;
-    }
-};
-
-var PlainClient = function(username, password) {
-    this.username = username;
-    this.password = password;
-};
-
-PlainClient.prototype.start = function() {
-    var response = new Buffer(1 + this.username.length + 1 + this.password.length);
-    response.writeUInt8(0, 0);
-    response.write(this.username, 1);
-    response.writeUInt8(0, 1 + this.username.length);
-    response.write(this.password, 1 + this.username.length + 1);
-    return response;
-};
-
-var AnonymousServer = function() {
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-AnonymousServer.prototype.start = function(response) {
-    this.outcome = true;
-    this.username = response ? response.toString('utf8') : 'anonymous';
-};
-
-var AnonymousClient = function(name) {
-    this.username = name ? name : 'anonymous';
-};
-
-AnonymousClient.prototype.start = function() {
-    var response = new Buffer(1 + this.username.length);
-    response.writeUInt8(0, 0);
-    response.write(this.username, 1);
-    return response;
-};
-
-var ExternalServer = function() {
-    this.outcome = undefined;
-    this.username = undefined;
-};
-
-ExternalServer.prototype.start = function(response) {
-    this.outcome = true;
-};
-
-var ExternalClient = function() {
-    this.username = undefined;
-};
-
-ExternalClient.prototype.start = function() {
-    return null;
-};
-
-/**
- * The mechanisms argument is a map of mechanism names to factory
- * functions for objects that implement that mechanism.
- */
-var SaslServer = function (connection, mechanisms) {
-    this.connection = connection;
-    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
-    this.next = connection.amqp_transport;
-    this.mechanisms = mechanisms;
-    this.mechanism = undefined;
-    this.outcome = undefined;
-    this.username = undefined;
-    var mechlist = Object.getOwnPropertyNames(mechanisms);
-    this.transport.encode(frames.sasl_frame(frames.sasl_mechanisms({sasl_server_mechanisms:mechlist}).described()));
-};
-
-SaslServer.prototype.do_step = function (challenge) {
-    if (this.mechanism.outcome === undefined) {
-        this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge':challenge}).described()));
-    } else {
-        this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH;
-        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
-        if (this.outcome === sasl_codes.OK) {
-            this.username = this.mechanism.username;
-            this.transport.write_complete = true;
-            this.transport.read_complete = true;
-        }
-    }
-};
-
-SaslServer.prototype.on_sasl_init = function (frame) {
-    var f = this.mechanisms[frame.performative.mechanism];
-    if (f) {
-        this.mechanism = f();
-        var challenge = this.mechanism.start(frame.performative.initial_response);
-        this.do_step(challenge);
-    } else {
-        this.outcome = sasl_codes.AUTH;
-        this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}).described()));
-    }
-};
-SaslServer.prototype.on_sasl_response = function (frame) {
-    this.do_step(this.mechanism.step(frame.performative.response));
-};
-
-SaslServer.prototype.has_writes_pending = function () {
-    return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslServer.prototype.write = function (socket) {
-    if (this.transport.write_complete && this.transport.pending.length === 0) {
-        return this.next.write(socket);
-    } else {
-        return this.transport.write(socket);
-    }
-};
-
-SaslServer.prototype.read = function (buffer) {
-    if (this.transport.read_complete) {
-        return this.next.read(buffer);
-    } else {
-        return this.transport.read(buffer);
-    }
-};
-
-var SaslClient = function (connection, mechanisms) {
-    this.connection = connection;
-    this.transport = new Transport(connection.amqp_transport.identifier, SASL_PROTOCOL_ID, frames.TYPE_SASL, this);
-    this.next = connection.amqp_transport;
-    this.mechanisms = mechanisms;
-    this.mechanism = undefined;
-    this.mechanism_name = undefined;
-    this.failed = false;
-};
-
-SaslClient.prototype.on_sasl_mechanisms = function (frame) {
-    for (var i = 0; this.mechanism === undefined && i < frame.performative.sasl_server_mechanisms.length; i++) {
-        var mech = frame.performative.sasl_server_mechanisms[i];
-        var f = this.mechanisms[mech];
-        if (f) {
-            this.mechanism = f();
-            this.mechanism_name = mech;
-        }
-    }
-    if (this.mechanism) {
-        var response = this.mechanism.start();
-        this.transport.encode(frames.sasl_frame(frames.sasl_init({'mechanism':this.mechanism_name,'initial_response':response}).described()));
-    } else {
-        this.failed = true;
-        this.connection.sasl_failed('No suitable mechanism; server supports ' + frame.performative.sasl_server_mechanisms);
-    }
-};
-SaslClient.prototype.on_sasl_challenge = function (frame) {
-    var response = this.mechanism.step(frame.performative.challenge);
-    this.transport.encode(frames.sasl_frame(frames.sasl_response({'response':response}).described()));
-};
-SaslClient.prototype.on_sasl_outcome = function (frame) {
-    switch (frame.performative.code) {
-    case sasl_codes.OK:
-        this.transport.read_complete = true;
-        this.transport.write_complete = true;
-        break;
-    default:
-        this.transport.write_complete = true;
-        this.connection.sasl_failed("Failed to authenticate: " + frame.performative.code);
-    }
-};
-
-SaslClient.prototype.has_writes_pending = function () {
-    return this.transport.has_writes_pending() || this.next.has_writes_pending();
-}
-
-SaslClient.prototype.write = function (socket) {
-    if (this.transport.write_complete) {
-        return this.next.write(socket);
-    } else {
-        return this.transport.write(socket);
-    }
-};
-
-SaslClient.prototype.read = function (buffer) {
-    if (this.transport.read_complete) {
-        return this.next.read(buffer);
-    } else {
-        return this.transport.read(buffer);
-    }
-};
-
-var default_server_mechanisms = {
-    enable_anonymous: function () {
-        this['ANONYMOUS'] = function() { return new AnonymousServer(); };
-    },
-    enable_plain: function (callback) {
-        this['PLAIN'] = function() { return new PlainServer(callback); };
-    }
-};
-
-var default_client_mechanisms = {
-    enable_anonymous: function (name) {
-        this['ANONYMOUS'] = function() { return new AnonymousClient(name); };
-    },
-    enable_plain: function (username, password) {
-        this['PLAIN'] = function() { return new PlainClient(username, password); };
-    },
-    enable_external: function () {
-        this['EXTERNAL'] = function() { return new ExternalClient(); };
-    }
-};
-
-module.exports = {
-    Client : SaslClient,
-    Server : SaslServer,
-    server_mechanisms : function () {
-        return Object.create(default_server_mechanisms);
-    },
-    client_mechanisms : function () {
-        return Object.create(default_client_mechanisms);
-    },
-    server_add_external: function (mechs) {
-        mechs['EXTERNAL'] = function() { return new ExternalServer(); };
-        return mechs;
-    }
-};
-
-}).call(this,require("buffer").Buffer)
-},{"./frames.js":3,"./log.js":5,"./transport.js":11,"buffer":19}],9:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var frames = require('./frames.js');
-var link = require('./link.js');
-var log = require('./log.js');
-var message = require('./message.js');
-var types = require('./types.js');
-var util = require('./util.js');
-var EndpointState = require('./endpoint.js');
-
-var EventEmitter = require('events').EventEmitter;
-
-var CircularBuffer = function (capacity) {
-    this.capacity = capacity;
-    this.size = 0;
-    this.head = 0;
-    this.tail = 0;
-    this.entries = [];
-};
-
-CircularBuffer.prototype.available = function () {
-    return this.capacity - this.size;
-};
-
-CircularBuffer.prototype.push = function (o) {
-    if (this.size < this.capacity) {
-        this.entries[this.tail] = o;
-        this.tail = (this.tail + 1) % this.capacity;
-        this.size++;
-    } else {
-        throw Error('circular buffer overflow: head=' + this.head + ' tail=' + this.tail + ' size=' + this.size + ' capacity=' + this.capacity);
-    }
-};
-
-CircularBuffer.prototype.pop_if = function (f) {
-    var count = 0;
-    while (this.size && f(this.entries[this.head])) {
-        this.entries[this.head] = undefined;
-        this.head = (this.head + 1) % this.capacity;
-        this.size--;
-        count++;
-    }
-    return count;
-};
-
-CircularBuffer.prototype.by_id = function (id) {
-    if (this.size > 0) {
-        var gap = id - this.entries[this.head].id;
-        if (gap < this.size) {
-            return this.entries[(this.head + gap) % this.capacity];
-        }
-    }
-    return undefined;
-};
-
-CircularBuffer.prototype.get_head = function (id) {
-    return this.size > 0 ? this.entries[this.head] : undefined;
-};
-
-
-var Outgoing = function () {
-    this.deliveries = new CircularBuffer(2048/*TODO= configurable?*/);
-    this.updated = [];
-    this.next_delivery_id = 0;
-    this.next_pending_delivery = 0;
-    this.next_transfer_id = 0;
-    this.window = types.MAX_UINT;
-    this.remote_next_transfer_id = undefined;
-    this.remote_window = undefined;
-};
-
-Outgoing.prototype.available = function () {
-    return this.deliveries.available();
-};
-
-Outgoing.prototype.send = function (sender, tag, data, format) {
-    var d = {'id':this.next_delivery_id++,
-             'tag':tag,
-             'link':sender,
-             'data': data,
-             'format':format ? format : 0,
-             'sent': false,
-             'settled': false,
-             'state': undefined,
-             'remote_settled': false,
-             'remote_state': undefined};
-    this.deliveries.push(d);
-    return d;
-};
-
-Outgoing.prototype.on_begin = function (fields) {
-    this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_flow = function (fields) {
-    this.remote_next_transfer_id = fields.next_incoming_id;
-    this.remote_window = fields.incoming_window;
-};
-
-Outgoing.prototype.on_disposition = function (fields) {
-    var last = fields.last ? fields.last : fields.first;
-    for (var i = fields.first; i <= last; i++) {
-        var d = this.deliveries.by_id(i);
-        if (!d) {
-            console.log('Could not find delivery for ' + i + ' [' + JSON.stringify(fields) + ']');
-        }
-        if (d && !d.remote_settled) {
-            var updated = false;
-            if (fields.settled) {
-                d.remote_settled = fields.settled;
-                updated = true;
-            }
-            if (fields.state && fields.state !== d.remote_state) {
-                d.remote_state = fields.state;
-                updated = true;
-            }
-            if (updated) {
-                this.updated.push(d);
-            }
-        }
-    }
-};
-
-Outgoing.prototype.transfer_window = function() {
-    if (this.remote_window) {
-        return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id);
-    }
-};
-
-Outgoing.prototype.process = function() {
-    // send pending deliveries for which there is credit:
-    while (this.next_pending_delivery < this.next_delivery_id) {
-        var d = this.deliveries.by_id(this.next_pending_delivery);
-        if (d) {
-            if (d.link.has_credit()) {
-                d.link.delivery_count++;
-                //TODO: fragment as appropriate
-                d.transfers_required = 1;
-                if (this.transfer_window() >= d.transfers_required) {
-                    this.next_transfer_id += d.transfers_required;
-                    this.window -= d.transfers_required;
-                    d.link.session.output(frames.transfer({'handle':d.link.local.handle,'message_format':d.format,'delivery_id':d.id, 'delivery_tag':d.tag}).described(), d.data);
-                    d.link.credit--;
-                    this.next_pending_delivery++;
-                } else {
-                    log.flow('Incoming window of peer preventing sending further transfers: remote_window=' + this.remote_window + ", remote_next_transfer_id=" + this.remote_next_transfer_id
-                               + ", next_transfer_id=" + this.next_transfer_id);
-                    break;
-                }
-            } else {
-                log.flow('Link has no credit');
-                break;
-            }
-        } else {
-            console.log('ERROR: Next pending delivery not found: ' + this.next_pending_delivery);
-            break;
-        }
-    }
-
-    // notify application of any updated deliveries:
-    for (var i = 0; i < this.updated.length; i++) {
-        var d = this.updated[i];
-        if (d.remote_state) {
-            d.remote_state = message.unwrap_outcome(d.remote_state);
-            if (d.remote_state && d.remote_state.constructor.composite_type) {
-                d.link.dispatch(d.remote_state.constructor.composite_type, d.link._context({'delivery':d}));
-            }
-        }
-        if (d.remote_settled) d.link.dispatch('settled', d.link._context({'delivery':d}));
-    }
-    this.updated = [];
-
-    // remove any fully settled deliveries:
-    this.deliveries.pop_if(function (d) { return d.settled && d.remote_settled; });
-};
-
-var Incoming = function () {
-    this.deliveries = new CircularBuffer(2048/*TODO: configurable?*/);
-    this.updated = [];
-    this.next_transfer_id = 0;
-    this.next_delivery_id = undefined;
-    this.window = 2048/*TODO: configurable?*/;
-    this.remote_next_transfer_id = undefined;
-    this.remote_window = undefined;
-};
-
-Incoming.prototype.update = function (delivery, settled, state) {
-    if (delivery) {
-        delivery.settled = settled;
-        if (state !== undefined) delivery.state = state;
-        if (!delivery.remote_settled) {
-            this.updated.push(delivery);
-        }
-        delivery.link.connection._register();
-    }
-};
-
-Incoming.prototype.on_transfer = function(frame, receiver) {
-    this.next_transfer_id++;
-    if (receiver.is_open()) {
-        if (this.next_delivery_id === undefined) {
-            this.next_delivery_id = frame.performative.delivery_id;
-        }
-        var current;
-        var data;
-        var last = this.deliveries.get_head();
-        if (last && last.incomplete) {
-            if (frame.performative.delivery_id !== undefined && this.next_delivery_id != frame.performative.delivery_id) {
-                //TODO: better error handling
-                throw Error("frame sequence error: delivery " + this.next_delivery_id + " not complete, got " + frame.performative.delivery_id);
-            }
-            current = last;
-            data = Buffer.concat([current.data, frame.payload], current.data.size() + frame.payload.size());
-        } else if (this.next_delivery_id === frame.performative.delivery_id) {
-            current = {'id':frame.performative.delivery_id,
-                       'tag':frame.performative.delivery_tag,
-                       'link':receiver,
-                       'settled': false,
-                       'state': undefined,
-                       'remote_settled': frame.performative.settled,
-                       'remote_state': undefined};
-            var self = this;
-            current.update = function (settled, state) { self.update(current, settled, state); };
-            this.deliveries.push(current);
-            data = frame.payload;
-        } else {
-            //TODO: better error handling
-            throw Error("frame sequence error: expected " + this.next_delivery_id + ", got " + frame.performative.delivery_id);
-        }
-        current.incomplete = frame.performative.more;
-        if (current.incomplete) {
-            current.data = data;
-        } else {
-            receiver.credit--;
-            receiver.delivery_count++;
-            this.next_delivery_id++;
-            receiver.dispatch('message', receiver._context({'message':message.decode(data), 'delivery':current}));
-        }
-    }
-};
-
-Incoming.prototype.process = function () {
-    if (this.updated.length > 0) {
-        var first;
-        var last;
-        var next_id;
-
-        for (var i = 0; i < this.updated.length; i++) {
-            var delivery = this.updated[i];
-            if (first === undefined) {
-                first = delivery;
-                last = delivery;
-                next_id = delivery.id;
-            }
-
-            if (!message.are_outcomes_equivalent(last.state, delivery.state) || last.settled !== delivery.settled || next_id !== delivery.id) {
-                first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
-                first = delivery;
-                last = delivery;
-                next_id = delivery.id;
-            } else {
-                if (last.id !== delivery.id) {
-                    last = delivery;
-                }
-                next_id++;
-            }
-        }
-        if (first !== undefined && last !== undefined) {
-            first.link.session.output(frames.disposition({'role':true,'first':first.id,'last':last.id, 'state':first.state, 'settled':first.settled}).described());
-        }
-
-        this.updated = [];
-    }
-
-    // remove any fully settled deliveries:
-    this.deliveries.pop_if(function (d) { return d.settled; });
-};
-
-Incoming.prototype.on_begin = function (fields) {
-    this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_flow = function (fields) {
-    this.remote_next_transfer_id = fields.next_outgoing_id;
-    this.remote_window = fields.outgoing_window;
-};
-
-Incoming.prototype.on_disposition = function (fields) {
-    var last = fields.last ? fields.last : fields.first;
-    for (var i = fields.first; i <= last; i++) {
-        var d = this.deliveries.by_id(i);
-        if (!d) {
-            console.log('Could not find delivery for ' + i);
-        }
-        if (d && !d.remote_settled) {
-            var updated = false;
-            if (fields.settled) {
-                d.remote_settled = fields.settled;
-                updated = true;
-            }
-            if (fields.state && fields.state !== d.remote_state) {
-                d.remote_state = fields.state;
-                updated = true;
-            }
-            if (updated) {
-                console.log(d.link.connection.options.id + ' added delivery to updated list following receipt of disposition for incoming deliveries');
-                this.updated.push(d);
-            }
-        }
-    }
-
-};
-
-var Session = function (connection, local_channel) {
-    this.connection = connection;
-    this.outgoing = new Outgoing();
-    this.incoming = new Incoming();
-    this.state = new EndpointState();
-    this.local = {'channel': local_channel, 'handles':{}};
-    this.local.begin = frames.begin({next_outgoing_id:this.outgoing.next_transfer_id,incoming_window:this.incoming.window,outgoing_window:this.outgoing.window});
-    this.local.end = frames.end();
-    this.remote = {'handles':{}};
-    this.links = {}; // map by name
-    this.options = {};
-};
-Session.prototype = Object.create(EventEmitter.prototype);
-Session.prototype.constructor = Session;
-
-Session.prototype.reset = function() {
-    this.state.disconnected();
-    this.outgoing = new Outgoing();
-    this.incoming = new Incoming();
-    this.remote = {'handles':{}};
-    for (var l in this.links) {
-        this.links[l].reset();
-    }
-};
-
-Session.prototype.dispatch = function(name, context) {
-    log.events('Session got event: '+ name);
-    if (this.listeners(name).length) {
-        EventEmitter.prototype.emit.apply(this, arguments);
-    } else {
-        this.connection.dispatch.apply(this.connection, arguments);
-    }
-};
-Session.prototype.output = function (frame, payload) {
-    this.connection._write_frame(this.local.channel, frame, payload);
-};
-
-Session.prototype.create_sender = function (name, opts) {
-    return this.create_link(name, link.Sender, opts);
-};
-
-Session.prototype.create_receiver = function (name, opts) {
-    return this.create_link(name, link.Receiver, opts);
-};
-
-function attach(factory, args, remote_terminus) {
-    var opts = args ? args : {};
-    if (typeof args === 'string') {
-        opts = {};
-        opts[remote_terminus] = args;
-    }
-    if (!opts.name) opts.name = util.generate_uuid();
-    var l = factory(opts.name, opts);
-    for (var t in {'source':0, 'target':0}) {
-        if (opts[t]) {
-            if (typeof opts[t] === 'string') {
-                opts[t] = {'address' : opts[t]};
-            }
-            l['set_' + t](opts[t]);
-        }
-    }
-    l.attach();
-    return l;
-}
-
-Session.prototype.get_option = function (name, default_value) {
-    if (this.options[name] !== undefined) return this.options[name];
-    else return this.connection.get_option(name, default_value);
-};
-
-Session.prototype.attach_sender = function (args) {
-    return attach(this.create_sender.bind(this), args, 'target');
-};
-Session.prototype.open_sender = Session.prototype.attach_sender;//alias
-
-Session.prototype.attach_receiver = function (args) {
-    return attach(this.create_receiver.bind(this), args, 'source');
-};
-Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias
-
-Session.prototype.create_link = function (name, constructor, opts) {
-    var i = 0;
-    while (this.local.handles[i]) i++;
-    var l = new constructor(this, name, i, opts);
-    this.links[name] = l;
-    this.local.handles[i] = l;
-    return l;
-};
-
-Session.prototype.begin = function () {
-    if (this.state.open()) {
-        this.connection._register();
-    }
-};
-Session.prototype.open = Session.prototype.begin;
-
-Session.prototype.end = function () {
-    if (this.state.close()) {
-        this.connection._register();
-    }
-};
-Session.prototype.close = Session.prototype.end;
-
-Session.prototype.is_open = function () {
-    return this.connection.is_open() && this.state.is_open();
-};
-
-Session.prototype.is_closed = function () {
-    return this.connection.is_closed() || this.state.is_closed();
-};
-
-Session.prototype._process = function () {
-    do {
-        if (this.state.need_open()) {
-            this.output(this.local.begin.described());
-        }
-
-        this.outgoing.process();
-        this.incoming.process();
-        for (var k in this.links) {
-            this.links[k]._process();
-        }
-
-        if (this.state.need_close()) {
-            this.output(this.local.end.described());
-        }
-    } while (!this.state.has_settled());
-};
-
-Session.prototype.send = function (sender, tag, data, format) {
-    var d = this.outgoing.send(sender, tag, data, format);
-    this.connection._register();
-    return d;
-};
-
-Session.prototype._write_flow = function (link) {
-    var fields = {'next_incoming_id':this.incoming.next_transfer_id,
-                  'incoming_window':this.incoming.window,
-                  'next_outgoing_id':this.outgoing.next_transfer_id,
-                  'outgoing_window':this.outgoing.window
-                 };
-    if (link) {
-        fields.delivery_count = link.delivery_count;
-        fields.handle = link.local.handle;
-        fields.link_credit = link.credit;
-    }
-    this.output(frames.flow(fields).described());
-};
-
-Session.prototype.on_begin = function (frame) {
-    if (this.state.remote_opened()) {
-        if (!this.remote.channel) {
-            this.remote.channel = frame.channel;
-        }
-        this.remote.begin = frame.performative;
-        this.outgoing.on_begin(frame.performative);
-        this.incoming.on_begin(frame.performative);
-        this.open();
-        this.dispatch('session_open', this._context());
-    } else {
-        throw Error('Begin already received');
-    }
-};
-Session.prototype.on_end = function (frame) {
-    if (this.state.remote_closed()) {
-        this.remote.end = frame.performative;
-        this.close();
-        this.dispatch('session_close', this._context());
-    } else {
-        throw Error('End already received');
-    }
-};
-
-Session.prototype.on_attach = function (frame) {
-    var name = frame.performative.name;
-    var link = this.links[name];
-    if (!link) {
-        // if role is true, peer is receiver, so we are sender
-        link = frame.performative.role ? this.create_sender(name) : this.create_receiver(name);
-    }
-    this.remote.handles[frame.performative.handle] = link;
-    link.on_attach(frame);
-    link.remote.attach = frame.performative;
-};
-
-Session.prototype.on_disposition = function (frame) {
-    if (frame.performative.role) {
-        log.events('Received disposition for outgoing transfers');
-        this.outgoing.on_disposition(frame.performative);
-    } else {
-        log.events('Received disposition for incoming transfers');
-        this.incoming.on_disposition(frame.performative);
-    }
-    this.connection._register();
-}
-
-Session.prototype.on_flow = function (frame) {
-    this.outgoing.on_flow(frame.performative);
-    this.incoming.on_flow(frame.performative);
-    if (frame.performative.handle !== undefined) {
-        this._get_link(frame).on_flow(frame);
-    }
-    this.connection._register();
-}
-Session.prototype._context = function (c) {
-    var context = c ? c : {};
-    context.session = this;
-    return this.connection._context(context);
-};
-
-Session.prototype._get_link = function (frame) {
-    var handle = frame.performative.handle;
-    var link = this.remote.handles[handle];
-    if (!link) {
-        throw Error('Invalid handle ' + handle);
-    }
-    return link;
-};
-
-Session.prototype.on_detach = function (frame) {
-    this._get_link(frame).on_detach(frame);
-    //remove link
-    var handle = frame.performative.handle;
-    var link = this.remote.handles[handle];
-    delete this.remote.handles[handle];
-    delete this.local.handles[link.local.handle];
-    delete this.links[link.name];
-};
-
-Session.prototype.on_transfer = function (frame) {
-    this.incoming.on_transfer(frame, this._get_link(frame));
-};
-
-module.exports = Session;
-
-}).call(this,require("buffer").Buffer)
-},{"./endpoint.js":2,"./frames.js":3,"./link.js":4,"./log.js":5,"./message.js":6,"./types.js":12,"./util.js":13,"buffer":19,"events":23}],10:[function(require,module,exports){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-'use strict';
-
-var types = require('./types.js');
-
-var terminus = {};
-var by_descriptor = {};
-
-function define_terminus(def) {
-    var c = types.define_composite(def);
-    terminus[def.name] = c.create;
-    by_descriptor[Number(c.descriptor.numeric).toString(10)] = c;
-    by_descriptor[c.descriptor.symbolic] = c;
-};
-
-terminus.unwrap = function(field) {
-    if (field && field.descriptor) {
-        var c = by_descriptor[field.descriptor.value];
-        if (c) {
-            return new c(field.value)
-        } else {
-            console.log('Unknown terminus: ' + field.descriptor);
-        }
-    }
-    return null;
-};
-
-define_terminus(
-    {name:"source",
-     code:0x28,
-     fields: [
-         {name:"address", type:"string"},
-         {name:"durable", type:"uint", default_value:0},
-         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
-         {name:"timeout", type:"uint", default_value:0},
-         {name:"dynamic", type:"boolean", default_value:false},
-         {name:"dynamic_node_properties", type:"symbolic_map"},
-         {name:"distribution_mode", type:"symbol"},
-         {name:"filter", type:"symbolic_map"},
-         {name:"default_outcome", type:"*"},
-         {name:"outcomes", type:"symbol", multiple:true},
-         {name:"capabilities", type:"symbol", multiple:true}
-     ]
-    });
-
-define_terminus(
-    {name:"target",
-     code:0x29,
-     fields: [
-         {name:"address", type:"string"},
-         {name:"durable", type:"uint", default_value:0},
-         {name:"expiry_policy", type:"symbol", default_value:"session-end"},
-         {name:"timeout", type:"uint", default_value:0},
-         {name:"dynamic", type:"boolean", default_value:false},
-         {name:"dynamic_node_properties", type:"symbolic_map"},
-         {name:"capabilities", type:"symbol", multiple:true}
-     ]
-    });
-
-module.exports = terminus;
-
-},{"./types.js":12}],11:[function(require,module,exports){
-(function (Buffer){
-/*
- * Copyright 2015 Red Hat Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "Lic

<TRUNCATED>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org