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