apiVersion: v1 items: - apiVersion: v1 data: rhea.html: "\n\n\n cli-rhea client\n \ \n \ \n\n\n\n

Browser based testing

\n\n\n\n\n\n" rhea.js: | require = (function () { function r(e, n, t) { function o(i, f) { if (!n[i]) { if (!e[i]) { var c = "function" == typeof require && require; if (!f && c) return c(i, !0); if (u) return u(i, !0); var a = new Error("Cannot find module '" + i + "'"); throw a.code = "MODULE_NOT_FOUND", a } var p = n[i] = {exports: {}}; e[i][0].call(p.exports, function (r) { var n = e[i][1][r]; return o(n || r) }, p, p.exports, r, e, n, t) } return n[i].exports } for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); return o } return r })()({ 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 errors = require('./errors.js'); var frames = require('./frames.js'); var log = require('./log.js'); var sasl = require('./sasl.js'); var util = require('./util.js'); var EndpointState = require('./endpoint.js'); var Session = require('./session.js'); var Transport = require('./transport.js'); var fs = require('fs'); var os = require('os'); var path = require('path'); var net = require('net'); var tls = require('tls'); var EventEmitter = require('events').EventEmitter; var AMQP_PROTOCOL_ID = 0x00; function find_connect_config() { var paths; if (process.env.MESSAGING_CONNECT_FILE) { paths = [process.env.MESSAGING_CONNECT_FILE]; } else { paths = [process.cwd(), path.join(os.homedir(), '.config/messaging'), '/etc/messaging'].map(function (base) { return path.join(base, '/connect.json'); }); } for (var i = 0; i < paths.length; i++) { if (fs.existsSync(paths[i])) { var obj = JSON.parse(fs.readFileSync(paths[i], 'utf8')); log.config('using config from %s: %j', paths[i], obj); return obj; } } return {}; } function get_default_connect_config() { var config = find_connect_config(); var options = {}; if (config.scheme === 'amqps') options.transport = 'tls'; if (config.host) options.host = config.host; if (config.port) options.port = config.port; if (!(config.sasl && config.sasl.enabled === false)) { if (config.user) options.username = config.user; else options.username = 'anonymous'; if (config.password) options.password = config.password; if (config.sasl_mechanisms) options.sasl_mechanisms = config.sasl_mechanisms; } if (config.tls) { if (config.tls.key) options.key = fs.readFileSync(config.tls.key); if (config.tls.cert) options.cert = fs.readFileSync(config.tls.cert); if (config.tls.ca) options.ca = [fs.readFileSync(config.tls.ca)]; if (config.verify === false) options.rejectUnauthorized = false; } if (options.transport === 'tls') { options.servername = options.host; } return options; } 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.observers.on('session_close', function () { ssn = null; }); 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 aliases = [ 'container_id', 'hostname', 'max_frame_size', 'channel_max', 'idle_time_out', 'outgoing_locales', 'incoming_locales', 'offered_capabilities', 'desired_capabilities', 'properties' ]; function remote_property_shortcut(name) { return function () { return this.remote.open ? this.remote.open[name] : undefined; }; } function connection_fields(fields) { var o = {}; aliases.forEach(function (name) { if (fields[name] !== undefined) { o[name] = fields[name]; } }); return o; } var conn_counter = 1; var Connection = function (options, container) { this.options = {}; if (options) { for (var k in options) { this.options[k] = options[k]; } if ((options.transport === 'tls' || options.transport === 'ssl') && options.servername === undefined && options.host !== undefined) { this.options.servername = options.host; } } else { this.options = get_default_connect_config(); } 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(connection_fields(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; this.scheduled_reconnect = undefined; this.default_sender = undefined; this.closed_with_non_fatal_error = false; for (var i in aliases) { var f = aliases[i]; Object.defineProperty(this, f, {get: remote_property_shortcut(f)}); } Object.defineProperty(this, 'error', { get: function () { return this.remote.close ? this.remote.close.error : undefined; } }); }; Connection.prototype = Object.create(EventEmitter.prototype); Connection.prototype.constructor = Connection; Connection.prototype.dispatch = function (name) { log.events('[%s] Connection got event: %s', this.options.id, 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); } else { return false; } }; Connection.prototype._disconnect = function () { this.state.disconnected(); for (var k in this.local_channel_map) { this.local_channel_map[k]._disconnect(); } this.socket_ready = false; }; Connection.prototype._reconnect = function () { if (this.abort_idle) { this.abort_idle = false; this.local.close.error = undefined; this.state = new EndpointState(); this.state.open(); } this.state.reconnect(); this._reset_remote_state(); }; Connection.prototype._reset_remote_state = function () { //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.remote = {}; //reset sessions: this.remote_channel_map = {}; for (var k in this.local_channel_map) { this.local_channel_map[k]._reconnect(); } }; Connection.prototype.connect = function () { this.is_server = false; this._reset_remote_state(); this._connect(this.options.connection_details(this.conn_established_counter)); this.open(); return this; }; Connection.prototype.reconnect = function () { this.scheduled_reconnect = undefined; log.reconnect('[%s] reconnecting...', this.options.id); this._reconnect(); 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('[%s] client accepted: %s', this.id, get_socket_id(socket)); this.socket_ready = true; return this.init(socket); }; Connection.prototype.init = function (socket) { this.socket = socket; if (this.get_option('tcp_no_delay', false) && this.socket.setNoDelay) { this.socket.setNoDelay(true); } this.socket.on('data', this.input.bind(this)); this.socket.on('error', this.on_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) { if (mechs.ANONYMOUS !== undefined && !this.get_option('require_sasl', false)) { this.sasl_transport = new sasl.Selective(this, mechs); } else { this.sasl_transport = new sasl.Server(this, mechs); } } else { if (!this.get_option('disable_sasl', false)) { var anon = sasl.server_mechanisms(); anon.enable_anonymous(); this.sasl_transport = new sasl.Selective(this, anon); } } } else { var mechanisms = this.get_option('sasl_mechanisms'); if (!mechanisms) { var username = this.get_option('username'); var password = this.get_option('password'); var token = this.get_option('token'); if (username) { mechanisms = sasl.client_mechanisms(); if (password) mechanisms.enable_plain(username, password); else if (token) mechanisms.enable_xoauth2(username, token); 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.options.sasl_init_hostname || this.options.servername || this.options.host); } } 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) { if (this.get_option('tcp_no_delay', true) && this.socket.setNoDelay) { this.socket.setNoDelay(true); } 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.send = function (msg) { if (this.default_sender === undefined) { this.default_sender = this.open_sender({target: {}}); } return this.default_sender.send(msg); }; Connection.prototype.connected = function () { this.socket_ready = true; this.conn_established_counter++; log.io('[%s] connected %s', this.options.id, get_socket_id(this.socket)); this.output(); }; Connection.prototype.sasl_failed = function (text) { this.transport_error = new errors.ConnectionError(text, 'amqp:unauthorized-access', this); this._handle_error(); this.socket.end(); }; Connection.prototype._is_fatal = function (error_condition) { var non_fatal = this.get_option('non_fatal_errors', ['amqp:connection:forced']); return non_fatal.indexOf(error_condition) < 0; }; Connection.prototype._handle_error = function () { var error = this.get_error(); if (error) { var handled = this.dispatch('connection_error', this._context({error: error})); handled = this.dispatch('connection_close', this._context({error: error})) || handled; if (!this._is_fatal(error.condition)) { this.closed_with_non_fatal_error = true; } else if (!handled) { this.dispatch('error', new errors.ConnectionError(error.description, error.condition, this)); } 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 new errors.ConnectionError(this.remote.close.error.description, this.remote.close.error.condition, this); } return undefined; }; Connection.prototype._get_peer_details = function () { var s = ''; if (this.remote.open && this.remote.open.container) { s += this.remote.open.container + ' '; } if (this.remote.open && this.remote.open.properties) { s += JSON.stringify(this.remote.open.properties); } return s; }; Connection.prototype.output = function () { try { 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); } } } catch (e) { this.saved_error = e; if (e.name === 'ProtocolError') { console.error('[' + this.options.id + '] error on write: ' + e + ' ' + this._get_peer_details() + ' ' + e.name); this.dispatch('protocol_error', e) || console.error('[' + this.options.id + '] error on write: ' + e + ' ' + this._get_peer_details()); } else { this.dispatch('error', e); } this.socket.end(); } }; function byte_to_hex(value) { if (value < 16) return '0x0' + Number(value).toString(16); else return '0x' + Number(value).toString(16); } function buffer_to_hex(buffer) { var bytes = []; for (var i = 0; i < buffer.length; i++) { bytes.push(byte_to_hex(buffer[i])); } return bytes.join(','); } Connection.prototype.input = function (buff) { var buffer; try { if (this.heartbeat_in) clearTimeout(this.heartbeat_in); log.io('[%s] read %d bytes', this.options.id, buff.length); 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(); } else if (this.is_closed() && this.state.has_settled()) { this.socket.end(); } else if (this.is_open() && this.remote.open.idle_time_out && !this.heartbeat_out) { this.heartbeat_out = setTimeout(this._write_frame.bind(this), this.remote.open.idle_time_out / 2); } } catch (e) { this.saved_error = e; if (e.name === 'ProtocolError') { this.dispatch('protocol_error', e) || console.error('[' + this.options.id + '] error on read: ' + e + ' ' + this._get_peer_details() + ' (buffer:' + buffer_to_hex(buffer) + ')'); } else { this.dispatch('error', e); } this.socket.end(); } }; 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.on_error = function (e) { this._disconnected(e); }; Connection.prototype.eof = function (e) { var error = e || this.saved_error; this.saved_error = undefined; this._disconnected(error); }; Connection.prototype._disconnected = function (error) { if (this.heartbeat_out) clearTimeout(this.heartbeat_out); if (this.heartbeat_in) clearTimeout(this.heartbeat_in); var was_closed_with_non_fatal_error = this.closed_with_non_fatal_error; if (this.closed_with_non_fatal_error) { this.closed_with_non_fatal_error = false; if (this.options.reconnect) this.open(); } if ((!this.is_closed() || was_closed_with_non_fatal_error) && this.scheduled_reconnect === undefined) { this._disconnect(); var disconnect_ctxt = {}; if (error) { disconnect_ctxt.error = error; } if (!this.is_server && !this.transport_error && this.options.reconnect) { var delay = this.options.reconnect(this.conn_established_counter); if (delay >= 0) { log.reconnect('[%s] Scheduled reconnect in ' + delay + 'ms', this.options.id); this.scheduled_reconnect = setTimeout(this.reconnect.bind(this), delay); disconnect_ctxt.reconnecting = true; } else { disconnect_ctxt.reconnecting = false; } } if (!this.dispatch('disconnected', this._context(disconnect_ctxt))) { console.warn('[' + this.options.id + '] disconnected %s', disconnect_ctxt.error || ''); } } }; Connection.prototype.open = function () { if (this.state.open()) { this._register(); } }; Connection.prototype.close = function (error) { if (error) this.local.close.error = error; if (this.state.close()) { this._register(); } }; Connection.prototype.is_open = function () { return this.state.is_open(); }; Connection.prototype.is_remote_open = function () { return this.state.remote_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.find_sender = function (filter) { return this.find_link(util.sender_filter(filter)); }; Connection.prototype.find_receiver = function (filter) { return this.find_link(util.receiver_filter(filter)); }; Connection.prototype.find_link = function (filter) { for (var channel in this.local_channel_map) { var session = this.local_channel_map[channel]; var result = session.find_link(filter); if (result) return result; } return undefined; }; Connection.prototype.each_receiver = function (action, filter) { this.each_link(action, util.receiver_filter(filter)); }; Connection.prototype.each_sender = function (action, filter) { this.each_link(action, util.sender_filter(filter)); }; Connection.prototype.each_link = function (action, filter) { for (var channel in this.local_channel_map) { var session = this.local_channel_map[channel]; session.each_link(action, filter); } }; 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 new errors.ProtocolError('Open already received'); } }; Connection.prototype.on_close = function (frame) { if (this.state.remote_closed()) { this.remote.close = frame.performative; if (this.remote.close.error) { this._handle_error(); } else { this.dispatch('connection_close', this._context()); } if (this.heartbeat_out) clearTimeout(this.heartbeat_out); var self = this; process.nextTick(function () { self.close(); }); } else { throw new errors.ProtocolError('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); }; Connection.prototype._write_close = function () { this._write_frame(0, this.local.close); }; 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 new errors.ProtocolError('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.get_tls_socket = function () { if (this.socket && (this.options.transport === 'tls' || this.options.transport === 'ssl')) { return this.socket; } else { return undefined; } }; Connection.prototype._context = function (c) { var context = c ? c : {}; context.connection = this; if (this.container) context.container = this.container; return context; }; Connection.prototype.remove_session = function (session) { if (this.remote_channel_map[session.remote.channel] === session) { delete this.remote_channel_map[session.remote.channel]; } if (this.local_channel_map[session.local.channel] === session) { delete this.local_channel_map[session.local.channel]; } }; Connection.prototype.remove_all_sessions = function () { this.remote_channel_map = {}; this.local_channel_map = {}; }; function delegate_to_session(name) { Connection.prototype['on_' + name] = function (frame) { var session = this.remote_channel_map[frame.channel]; if (!session) { throw new errors.ProtocolError(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, "./errors.js": 3, "./frames.js": 6, "./log.js": 8, "./sasl.js": 10, "./session.js": 11, "./transport.js": 13, "./util.js": 15, "_process": 27, "buffer": 19, "events": 22, "fs": 18, "net": 18, "os": 25, "path": 26, "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; this.marker = undefined; }; EndpointState.prototype.mark = function (o) { this.marker = o || Date.now(); return this.marker; }; EndpointState.prototype.open = function () { this.marker = undefined; this.initialised = true; if (!this.local_open) { this.local_open = true; this.open_requests++; return true; } else { return false; } }; EndpointState.prototype.close = function () { this.marker = undefined; if (this.local_open) { this.local_open = false; this.close_requests++; return true; } else { return false; } }; EndpointState.prototype.disconnected = function () { var was_initialised = this.initialised; this.was_open = this.local_open; this.init(); this.initialised = was_initialised; }; EndpointState.prototype.reconnect = function () { if (this.was_open) { this.open(); this.was_open = undefined; } }; EndpointState.prototype.remote_opened = function () { if (!this.remote_open) { this.remote_open = true; return true; } else { return false; } }; EndpointState.prototype.remote_closed = function () { 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.was_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 util = require('util'); function ProtocolError(message) { Error.call(this); this.message = message; this.name = 'ProtocolError'; } util.inherits(ProtocolError, Error); function TypeError(message) { ProtocolError.call(this, message); this.message = message; this.name = 'TypeError'; } util.inherits(TypeError, ProtocolError); function ConnectionError(message, condition, connection) { Error.call(this, message); this.message = message; this.name = 'ConnectionError'; this.condition = condition; this.description = message; this.connection = connection; } util.inherits(ConnectionError, Error); ConnectionError.prototype.toJSON = function () { return { type: this.name, code: this.condition, message: this.description }; }; module.exports = { ProtocolError: ProtocolError, TypeError: TypeError, ConnectionError: ConnectionError }; }, {"util": 30}], 4: [function (require, module, exports) { /* * Copyright 2018 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 ReceiverEvents; (function (ReceiverEvents) { /** * @property {string} message Raised when a message is received. */ ReceiverEvents['message'] = 'message'; /** * @property {string} receiverOpen Raised when the remote peer indicates the link is * open (i.e. attached in AMQP parlance). */ ReceiverEvents['receiverOpen'] = 'receiver_open'; /** * @property {string} receiverDrained Raised when the remote peer * indicates that it has drained all credit (and therefore there * are no more messages at present that it can send). */ ReceiverEvents['receiverDrained'] = 'receiver_drained'; /** * @property {string} receiverFlow Raised when a flow is received for receiver. */ ReceiverEvents['receiverFlow'] = 'receiver_flow'; /** * @property {string} receiverError Raised when the remote peer * closes the receiver with an error. The context may also have an * error property giving some information about the reason for the * error. */ ReceiverEvents['receiverError'] = 'receiver_error'; /** * @property {string} receiverClose Raised when the remote peer indicates the link is closed. */ ReceiverEvents['receiverClose'] = 'receiver_close'; /** * @property {string} settled Raised when the receiver link receives a disposition. */ ReceiverEvents['settled'] = 'settled'; })(ReceiverEvents || (ReceiverEvents = {})); var SenderEvents; (function (SenderEvents) { /** * @property {string} sendable Raised when the sender has sufficient credit to be able * to transmit messages to its peer. */ SenderEvents['sendable'] = 'sendable'; /** * @property {string} senderOpen Raised when the remote peer indicates the link is * open (i.e. attached in AMQP parlance). */ SenderEvents['senderOpen'] = 'sender_open'; /** * @property {string} senderDraining Raised when the remote peer * requests that the sender drain its credit; sending all * available messages within the credit limit and ensuring credit * is used up.. */ SenderEvents['senderDraining'] = 'sender_draining'; /** * @property {string} senderFlow Raised when a flow is received for sender. */ SenderEvents['senderFlow'] = 'sender_flow'; /** * @property {string} senderError Raised when the remote peer * closes the sender with an error. The context may also have an * error property giving some information about the reason for the * error. */ SenderEvents['senderError'] = 'sender_error'; /** * @property {string} senderClose Raised when the remote peer indicates the link is closed. */ SenderEvents['senderClose'] = 'sender_close'; /** * @property {string} accepted Raised when a sent message is accepted by the peer. */ SenderEvents['accepted'] = 'accepted'; /** * @property {string} released Raised when a sent message is released by the peer. */ SenderEvents['released'] = 'released'; /** * @property {string} rejected Raised when a sent message is rejected by the peer. */ SenderEvents['rejected'] = 'rejected'; /** * @property {string} modified Raised when a sent message is modified by the peer. */ SenderEvents['modified'] = 'modified'; /** * @property {string} settled Raised when the sender link receives a disposition. */ SenderEvents['settled'] = 'settled'; })(SenderEvents || (SenderEvents = {})); var SessionEvents; (function (SessionEvents) { /** * @property {string} sessionOpen Raised when the remote peer indicates the session is * open (i.e. attached in AMQP parlance). */ SessionEvents['sessionOpen'] = 'session_open'; /** * @property {string} sessionError Raised when the remote peer receives an error. The context * may also have an error property giving some information about the reason for the error. */ SessionEvents['sessionError'] = 'session_error'; /** * @property {string} sessionClose Raised when the remote peer indicates the session is closed. */ SessionEvents['sessionClose'] = 'session_close'; /** * @property {string} settled Raised when the session receives a disposition. */ SessionEvents['settled'] = 'settled'; })(SessionEvents || (SessionEvents = {})); var ConnectionEvents; (function (ConnectionEvents) { /** * @property {string} connectionOpen Raised when the remote peer indicates the connection is open. */ ConnectionEvents['connectionOpen'] = 'connection_open'; /** * @property {string} connectionClose Raised when the remote peer indicates the connection is closed. */ ConnectionEvents['connectionClose'] = 'connection_close'; /** * @property {string} connectionError Raised when the remote peer indicates an error occurred on * the connection. */ ConnectionEvents['connectionError'] = 'connection_error'; /** * @property {string} protocolError Raised when a protocol error is received on the underlying socket. */ ConnectionEvents['protocolError'] = 'protocol_error', /** * @property {string} error Raised when an error is received on the underlying socket. */ ConnectionEvents['error'] = 'error', /** * @property {string} disconnected Raised when the underlying tcp connection is lost. The context * has a reconnecting property which is true if the library is attempting to automatically reconnect * and false if it has reached the reconnect limit. If reconnect has not been enabled or if the connection * is a tcp server, then the reconnecting property is undefined. The context may also have an error * property giving some information about the reason for the disconnect. */ ConnectionEvents['disconnected'] = 'disconnected'; /** * @property {string} settled Raised when the connection receives a disposition. */ ConnectionEvents['settled'] = 'settled'; })(ConnectionEvents || (ConnectionEvents = {})); module.exports = { ReceiverEvents: ReceiverEvents, SenderEvents: SenderEvents, SessionEvents: SessionEvents, ConnectionEvents: ConnectionEvents }; }, {}], 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 amqp_types = require('./types.js'); module.exports = { selector: function (s) { return {'jms-selector': amqp_types.wrap_described(s, 0x468C00000004)}; } }; }, {"./types.js": 14}], 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 types = require('./types.js'); var errors = require('./errors.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 new errors.ProtocolError('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++); //the protocol header is interpreted in different ways for //different versions(!); check some special cases to give clearer //error messages: if (header.protocol_id === 0 && header.major === 0 && header.minor === 9 && header.revision === 1) { throw new errors.ProtocolError('Unsupported AMQP version: 0-9-1'); } if (header.protocol_id === 1 && header.major === 1 && header.minor === 0 && header.revision === 10) { throw new errors.ProtocolError('Unsupported AMQP version: 0-10'); } if (header.major !== 1 || header.minor !== 0) { throw new errors.ProtocolError('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 new errors.ProtocolError('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); frame.channel = 0; } else { throw new errors.ProtocolError('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 new errors.ProtocolError('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; }, {"./errors.js": 3, "./types.js": 14}], 7: [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 message = require('./message.js'); var terminus = require('./terminus.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; if (delta >= (this.window / 4)) { context.receiver.flow(delta); } }; function auto_settle(context) { context.delivery.settled = true; } function auto_accept(context) { context.delivery.update(undefined, message.accepted().described()); } function LinkError(message, condition, link) { Error.call(this); Error.captureStackTrace(this, this.constructor); this.message = message; this.condition = condition; this.description = message; this.link = link; } require('util').inherits(LinkError, Error); var EventEmitter = require('events').EventEmitter; var link = Object.create(EventEmitter.prototype); link.dispatch = function (name) { log.events('[%s] Link got event: %s', this.connection.options.id, name); EventEmitter.prototype.emit.apply(this.observers, arguments); if (this.listeners(name).length) { EventEmitter.prototype.emit.apply(this, arguments); return true; } else { return 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 (error) { if (error) this.local.detach.error = error; this.local.detach.closed = true; if (this.state.close()) { this.connection._register(); } }; /** * This forcibly removes the link from the parent session. It should * not be called for a link on an active session/connection, where * close() should be used instead. */ link.remove = function () { this.session.remove_link(this); }; link.is_open = function () { return this.session.is_open() && this.state.is_open(); }; link.is_remote_open = function () { return this.session.is_remote_open() && this.state.remote_open; }; link.is_itself_closed = function () { return this.state.is_closed(); }; link.is_closed = function () { return this.session.is_closed() || this.is_itself_closed(); }; link._process = function () { do { if (this.state.need_open()) { this.session.output(this.local.attach); } if (this.issue_flow && this.state.local_open) { this.session._write_flow(this); this.issue_flow = false; } if (this.state.need_close()) { this.session.output(this.local.detach); } } 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.prefix_event = function (event) { return (this.local.attach.role ? 'receiver_' : 'sender_') + event; }; link.on_detach = function (frame) { if (this.state.remote_closed()) { this.remote.detach = frame.performative; var error = this.remote.detach.error; if (error) { var handled = this.dispatch(this.prefix_event('error'), this._context()); handled = this.dispatch(this.prefix_event('close'), this._context()) || handled; if (!handled) { EventEmitter.prototype.emit.call(this.connection.container, 'error', new LinkError(error.description, error.condition, this)); } } else { this.dispatch(this.prefix_event('close'), this._context()); } var self = this; var token = this.state.mark(); process.nextTick(function () { if (self.state.marker === token) { self.close(); process.nextTick(function () { self.remove(); }); } }); } else { throw Error('Detach already received'); } }; function is_internal(name) { switch (name) { case 'name': case 'handle': case 'role': case 'initial_delivery_count': return true; default: return false; } } var aliases = [ 'snd_settle_mode', 'rcv_settle_mode', 'source', 'target', 'max_message_size', 'offered_capabilities', 'desired_capabilities', 'properties' ]; function remote_property_shortcut(name) { return function () { return this.remote.attach ? this.remote.attach[name] : undefined; }; } 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; this.local = {'handle': local_handle}; this.local.attach = frames.attach({'handle': local_handle, 'name': name, role: is_receiver}); for (var field in this.local.attach) { if (!is_internal(field) && this.options[field] !== undefined) { this.local.attach[field] = this.options[field]; } } 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(); for (var i in aliases) { var alias = aliases[i]; Object.defineProperty(this, alias, {get: remote_property_shortcut(alias)}); } Object.defineProperty(this, 'error', { get: function () { return this.remote.detach ? this.remote.detach.error : undefined; } }); }; link._disconnect = function () { this.state.disconnected(); if (!this.state.was_open) { this.remove(); } }; link._reconnect = function () { this.state.reconnect(); 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.is_sender = function () { return !this.is_receiver(); }; 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._draining = false; this._drained = false; this.local.attach.initial_delivery_count = 0; this.tag = 0; if (this.get_option('autosettle', true)) { this.observers.on('settled', auto_settle); } var sender = this; if (this.get_option('treat_modified_as_released', true)) { this.observers.on('modified', function (context) { sender.dispatch('released', context); }); } }; Sender.prototype = Object.create(link); Sender.prototype.constructor = Sender; Sender.prototype._get_drain = function () { if (this._draining && this._drained && this.credit) { while (this.credit) { ++this.delivery_count; --this.credit; } return true; } else { return false; } }; Sender.prototype.set_drained = function (drained) { this._drained = drained; if (this._draining && this._drained) { this.issue_flow = true; } }; Sender.prototype.next_tag = function () { return Buffer.from(new String(this.tag++)); }; Sender.prototype.sendable = function () { return Boolean(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; this._draining = flow.drain; this._drained = this.credit > 0; if (this.is_open()) { this.dispatch('sender_flow', this._context()); if (this._draining) { this.dispatch('sender_draining', this._context()); } if (this.sendable()) { this.dispatch('sendable', this._context()); } } }; Sender.prototype.on_transfer = function () { throw Error('got transfer on sending link'); }; Sender.prototype.send = function (msg, tag, format) { var payload = format === undefined ? message.encode(msg) : msg; var delivery = this.session.send(this, tag ? tag : this.next_tag(), payload, format); if (this.local.attach.snd_settle_mode === 1) { delivery.settled = true; } return delivery; }; var Receiver = function (session, name, local_handle, opts) { this.init(session, name, local_handle, opts, true); this.drain = false; this.set_credit_window(this.get_option('credit_window', 1000)); if (this.get_option('autoaccept', true)) { this.observers.on('message', auto_accept); } if (this.local.attach.rcv_settle_mode === 1 && this.get_option('autosettle', true)) { this.observers.on('settled', auto_settle); } }; Receiver.prototype = Object.create(link); Receiver.prototype.constructor = Receiver; Receiver.prototype.on_flow = function (frame) { this.dispatch('receiver_flow', this._context()); if (frame.performative.drain) { this.credit = frame.performative.link_credit; this.delivery_count = frame.performative.delivery_count; if (frame.performative.link_credit > 0) console.error('ERROR: received flow with drain set, but non zero credit'); else this.dispatch('receiver_drained', this._context()); } }; Receiver.prototype.flow = function (credit) { if (credit > 0) { this.credit += credit; this.issue_flow = true; this.connection._register(); } }; Receiver.prototype.add_credit = Receiver.prototype.flow;//alias Receiver.prototype._get_drain = function () { return this.drain; }; Receiver.prototype.set_credit_window = function (credit_window) { if (credit_window > 0) { var flow_controller = new FlowController(credit_window); 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}; }).call(this, require('_process'), require("buffer").Buffer) }, { "./endpoint.js": 2, "./frames.js": 6, "./log.js": 8, "./message.js": 9, "./terminus.js": 12, "_process": 27, "buffer": 19, "events": 22, "util": 30 }], 8: [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'); if (debug.formatters) { debug.formatters.h = function (v) { return v.toString('hex'); }; } module.exports = { 'config': debug('rhea:config'), '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": 20}], 9: [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) { var composite = new c(section.value); for (var i = 0; i < def.fields.length; i++) { var f = def.fields[i]; var v = composite[f.name]; if (v !== undefined && v !== null) { msg[f.name] = v; } } }; var wrap = function (sections, msg) { sections.push(c.create(msg).described()); }; define_section(c.descriptor, unwrap, wrap); } function define_map_section(def, symbolic) { var wrapper = symbolic ? types.wrap_symbolic_map : types.wrap_map; var descriptor = {numeric: def.code}; descriptor.symbolic = 'amqp:' + def.name.replace(/_/g, '-') + ':map'; var unwrap = function (msg, section) { msg[def.name] = types.unwrap_map_simple(section); }; var wrap = function (sections, msg) { if (msg[def.name]) { sections.push(types.described_nc(types.wrap_ulong(descriptor.numeric), wrapper(msg[def.name]))); } }; define_section(descriptor, unwrap, wrap); } function Section(typecode, content, multiple) { this.typecode = typecode; this.content = content; this.multiple = multiple; } Section.prototype.described = function (item) { return types.described(types.wrap_ulong(this.typecode), types.wrap(item || this.content)); }; Section.prototype.collect_sections = function (sections) { if (this.multiple) { for (var i = 0; i < this.content.length; i++) { sections.push(this.described(this.content[i])); } } else { sections.push(this.described()); } }; 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}, true); define_map_section({name: 'message_annotations', code: 0x72}, true); 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}); function unwrap_body_section(msg, section, typecode) { if (msg.body === undefined) { msg.body = new Section(typecode, types.unwrap(section)); } else if (msg.body.constructor === Section && msg.body.typecode === typecode) { if (msg.body.multiple) { msg.body.content.push(types.unwrap(section)); } else { msg.body.multiple = true; msg.body.content = [msg.body.content, types.unwrap(section)]; } } } define_section({numeric: 0x75, symbolic: 'amqp:data:binary'}, function (msg, section) { unwrap_body_section(msg, section, 0x75); }); define_section({numeric: 0x76, symbolic: 'amqp:amqp-sequence:list'}, function (msg, section) { unwrap_body_section(msg, section, 0x76); }); define_section({numeric: 0x77, symbolic: 'amqp:value:*'}, function (msg, section) { msg.body = types.unwrap(section); }); define_map_section({name: 'footer', code: 0x78}); function wrap_body(sections, msg) { if (msg.body && msg.body.collect_sections) { msg.body.collect_sections(sections); } else { sections.push(types.described(types.wrap_ulong(0x77), types.wrap(msg.body))); } } wrappers.push(wrap_body); message.data_section = function (data) { return new Section(0x75, data); }; message.sequence_section = function (list) { return new Section(0x76, list); }; message.data_sections = function (data_elements) { return new Section(0x75, data_elements, true); }; message.sequence_sections = function (lists) { return new Section(0x76, lists, true); }; function copy(src, tgt) { for (var k in src) { var v = src[k]; if (typeof v === 'object') { copy(v, tgt[k]); } else { tgt[k] = v; } } } function Message(o) { if (o) { copy(o, this); } } Message.prototype.toJSON = function () { var o = {}; for (var key in this) { if (typeof this[key] === 'function') continue; o[key] = this[key]; } return o; }; Message.prototype.toString = function () { return JSON.stringify(this.toJSON()); }; message.encode = function (msg) { var sections = []; wrappers.forEach(function (wrapper_fn) { wrapper_fn(sections, msg); }); var writer = new types.Writer(); for (var i = 0; i < sections.length; i++) { log.message('Encoding section %d of %d: %o', (i + 1), sections.length, sections[i]); writer.write(sections[i]); } var data = writer.toBuffer(); log.message('encoded %d bytes', data.length); return data; }; message.decode = function (buffer) { var msg = new Message(); var reader = new types.Reader(buffer); while (reader.remaining()) { var s = reader.read(); log.message('decoding section: %o of type: %o', s, s.descriptor); if (s.descriptor) { var unwrap = unwrappers[s.descriptor.value]; if (unwrap) { unwrap(msg, s); } else { console.warn('WARNING: did not recognise message section with descriptor ' + s.descriptor); } } else { console.warn('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.value); } } console.error('unrecognised outcome: ' + JSON.stringify(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 && a.descriptor.value === 0x24;//only batch accepted }; 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: 'map'} ] }); module.exports = message; }, {"./log.js": 8, "./types.js": 14}], 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 errors = require('./errors.js'); var frames = require('./frames.js'); var Transport = require('./transport.js'); var util = require('./util.js'); var sasl_codes = { 'OK': 0, 'AUTH': 1, 'SYS': 2, 'SYS_PERM': 3, 'SYS_TEMP': 4, }; var SASL_PROTOCOL_ID = 0x03; 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, hostname) { 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], hostname)) { 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 (callback) { var response = util.allocate_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); callback(undefined, 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 (callback) { var response = util.allocate_buffer(1 + this.username.length); response.writeUInt8(0, 0); response.write(this.username, 1); callback(undefined, response); }; var ExternalServer = function () { this.outcome = undefined; this.username = undefined; }; ExternalServer.prototype.start = function () { this.outcome = true; }; var ExternalClient = function () { this.username = undefined; }; ExternalClient.prototype.start = function (callback) { callback(undefined, ''); }; ExternalClient.prototype.step = function (callback) { callback(undefined, ''); }; var XOAuth2Client = function (username, token) { this.username = username; this.token = token; }; XOAuth2Client.prototype.start = function (callback) { var response = util.allocate_buffer(this.username.length + this.token.length + 5 + 12 + 3); var count = 0; response.write('user=', count); count += 5; response.write(this.username, count); count += this.username.length; response.writeUInt8(1, count); count += 1; response.write('auth=Bearer ', count); count += 12; response.write(this.token, count); count += this.token.length; response.writeUInt8(1, count); count += 1; response.writeUInt8(1, count); count += 1; callback(undefined, response); }; /** * 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}))); }; SaslServer.prototype.do_step = function (challenge) { if (this.mechanism.outcome === undefined) { this.transport.encode(frames.sasl_frame(frames.sasl_challenge({'challenge': challenge}))); } else { this.outcome = this.mechanism.outcome ? sasl_codes.OK : sasl_codes.AUTH; this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}))); 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, frame.performative.hostname); this.do_step(challenge); } else { this.outcome = sasl_codes.AUTH; this.transport.encode(frames.sasl_frame(frames.sasl_outcome({code: this.outcome}))); } }; 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, hostname) { 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.hostname = hostname; this.failed = false; }; SaslClient.prototype.on_sasl_mechanisms = function (frame) { var offered_mechanisms = []; if (Array.isArray(frame.performative.sasl_server_mechanisms)) { offered_mechanisms = frame.performative.sasl_server_mechanisms; } else if (frame.performative.sasl_server_mechanisms) { offered_mechanisms = [frame.performative.sasl_server_mechanisms]; } for (var i = 0; this.mechanism === undefined && i < offered_mechanisms.length; i++) { var mech = offered_mechanisms[i]; var f = this.mechanisms[mech]; if (f) { this.mechanism = typeof f === 'function' ? f() : f; this.mechanism_name = mech; } } if (this.mechanism) { var self = this; this.mechanism.start(function (err, response) { if (err) { self.failed = true; self.connection.sasl_failed('SASL mechanism init failed: ' + err); } else { var init = {'mechanism': self.mechanism_name, 'initial_response': response}; if (self.hostname) { init.hostname = self.hostname; } self.transport.encode(frames.sasl_frame(frames.sasl_init(init))); self.connection.output(); } }); } 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 self = this; this.mechanism.step(frame.performative.challenge, function (err, response) { if (err) { self.failed = true; self.connection.sasl_failed('SASL mechanism challenge failed: ' + err); } else { self.transport.encode(frames.sasl_frame(frames.sasl_response({'response': response}))); self.connection.output(); } }); }; 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 SelectiveServer = function (connection, mechanisms) { this.header_received = false; this.transports = { 0: connection.amqp_transport, 3: new SaslServer(connection, mechanisms) }; this.selected = undefined; }; SelectiveServer.prototype.has_writes_pending = function () { return this.header_received && this.selected.has_writes_pending(); }; SelectiveServer.prototype.write = function (socket) { if (this.selected) { return this.selected.write(socket); } else { return 0; } }; SelectiveServer.prototype.read = function (buffer) { if (!this.header_received) { if (buffer.length < 8) { return 0; } else { this.header_received = frames.read_header(buffer); this.selected = this.transports[this.header_received.protocol_id]; if (this.selected === undefined) { throw new errors.ProtocolError('Invalid AMQP protocol id ' + this.header_received.protocol_id); } } } return this.selected.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(); }; }, enable_xoauth2: function (username, token) { if (username && token) { this['XOAUTH2'] = function () { return new XOAuth2Client(username, token); }; } else if (token === undefined) { throw Error('token must be specified'); } else if (username === undefined) { throw Error('username must be specified'); } } }; module.exports = { Client: SaslClient, Server: SaslServer, Selective: SelectiveServer, 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; } }; }, {"./errors.js": 3, "./frames.js": 6, "./transport.js": 13, "./util.js": 15}], 11: [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 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; function SessionError(message, condition, session) { Error.call(this); Error.captureStackTrace(this, this.constructor); this.message = message; this.condition = condition; this.description = message; this.session = session; } require('util').inherits(SessionError, Error); 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 () { return this.size > 0 ? this.entries[this.head] : undefined; }; CircularBuffer.prototype.get_tail = function () { return this.size > 0 ? this.entries[(this.head + this.size - 1) % this.capacity] : undefined; }; function write_dispositions(deliveries) { var first, last, next_id, i, delivery; for (i = 0; i < deliveries.length; i++) { delivery = deliveries[i]; if (first === undefined) { first = delivery; last = delivery; next_id = delivery.id; } if ((first !== last && !message.are_outcomes_equivalent(last.state, delivery.state)) || last.settled !== delivery.settled || next_id !== delivery.id) { first.link.session.output(frames.disposition({ 'role': first.link.is_receiver(), 'first': first.id, 'last': last.id, 'state': first.state, 'settled': first.settled })); 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': first.link.is_receiver(), 'first': first.id, 'last': last.id, 'state': first.state, 'settled': first.settled })); } } var Outgoing = function (connection) { /* TODO: make size configurable? */ this.deliveries = new CircularBuffer(2048); this.updated = []; this.pending_dispositions = []; 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; this.connection = connection; }; Outgoing.prototype.available = function () { return this.deliveries.available(); }; Outgoing.prototype.compute_max_payload = function (tag) { if (this.connection.max_frame_size) { return this.connection.max_frame_size - (50 + tag.length); } else { return undefined; } }; Outgoing.prototype.send = function (sender, tag, data, format) { var fragments = []; var max_payload = this.compute_max_payload(tag); if (max_payload && data.length > max_payload) { var start = 0; while (start < data.length) { var end = Math.min(start + max_payload, data.length); fragments.push(data.slice(start, end)); start = end; } } else { fragments.push(data); } var d = { 'id': this.next_delivery_id++, 'tag': tag, 'link': sender, 'data': fragments, 'format': format ? format : 0, 'sent': false, 'settled': false, 'state': undefined, 'remote_settled': false, 'remote_state': undefined }; var self = this; d.update = function (settled, state) { self.update(d, settled, state); }; 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 && !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 = message.unwrap_outcome(fields.state); updated = true; } if (updated) { this.updated.push(d); } } } }; Outgoing.prototype.update = function (delivery, settled, state) { if (delivery) { delivery.settled = settled; if (state !== undefined) delivery.state = state; if (!delivery.remote_settled) { this.pending_dispositions.push(delivery); } delivery.link.connection._register(); } }; Outgoing.prototype.transfer_window = function () { if (this.remote_window) { return this.remote_window - (this.next_transfer_id - this.remote_next_transfer_id); } else { return 0; } }; Outgoing.prototype.process = function () { var d; // send pending deliveries for which there is credit: while (this.next_pending_delivery < this.next_delivery_id) { d = this.deliveries.by_id(this.next_pending_delivery); if (d) { if (d.link.has_credit()) { if (this.transfer_window() >= d.data.length) { this.window -= d.data.length; for (var i = 0; i < d.data.length; i++) { this.next_transfer_id++; var more = (i + 1) < d.data.length; var transfer = frames.transfer({ 'handle': d.link.local.handle, 'message_format': d.format, 'delivery_id': d.id, 'delivery_tag': d.tag, 'settled': d.settled, 'more': more }); d.link.session.output(transfer, d.data[i]); if (d.settled) { d.remote_settled = true;//if sending presettled, it can now be cleaned up } } d.link.credit--; d.link.delivery_count++; this.next_pending_delivery++; } else { log.flow('[%s] Incoming window of peer preventing sending further transfers: remote_window=%d, remote_next_transfer_id=%d, next_transfer_id=%d', this.connection.options.id, this.remote_window, this.remote_next_transfer_id, this.next_transfer_id); break; } } else { log.flow('[%s] Link has no credit', this.connection.options.id); break; } } else { console.error('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++) { d = this.updated[i]; 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 = []; if (this.pending_dispositions.length) { write_dispositions(this.pending_dispositions); this.pending_dispositions = []; } // 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; Object.defineProperty(this, 'window', { get: function () { return this.deliveries.available(); } }); this.remote_next_transfer_id = undefined; this.remote_window = undefined; this.max_transfer_id = this.next_transfer_id + this.window; }; 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_remote_open()) { if (this.next_delivery_id === undefined) { this.next_delivery_id = frame.performative.delivery_id; } var current; var data; var last = this.deliveries.get_tail(); if (last && last.incomplete) { if (util.is_defined(frame.performative.delivery_id) && 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.length + frame.payload.length); } else if (this.next_delivery_id === frame.performative.delivery_id) { current = { 'id': frame.performative.delivery_id, 'tag': frame.performative.delivery_tag, 'format': frame.performative.message_format, 'link': receiver, 'settled': false, 'state': undefined, 'remote_settled': frame.performative.settled === undefined ? false : frame.performative.settled, 'remote_state': frame.performative.state }; var self = this; current.update = function (settled, state) { var settled_ = settled; if (settled_ === undefined) { settled_ = receiver.local.attach.rcv_settle_mode !== 1; } self.update(current, settled_, state); }; current.accept = function () { this.update(undefined, message.accepted().described()); }; current.release = function (params) { if (params) { this.update(undefined, message.modified(params).described()); } else { this.update(undefined, message.released().described()); } }; current.reject = function (error) { this.update(undefined, message.rejected({'error': error}).described()); }; current.modified = function (params) { this.update(undefined, message.modified(params).described()); }; 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 { if (receiver.credit > 0) receiver.credit--; else console.error('Received transfer when credit was %d', receiver.credit); receiver.delivery_count++; this.next_delivery_id++; var msgctxt = current.format === 0 ? { 'message': message.decode(data), 'delivery': current } : {'message': data, 'delivery': current, 'format': current.format}; receiver.dispatch('message', receiver._context(msgctxt)); } } else { throw Error('transfer after detach'); } }; Incoming.prototype.process = function (session) { if (this.updated.length > 0) { write_dispositions(this.updated); this.updated = []; } // remove any fully settled deliveries: this.deliveries.pop_if(function (d) { return d.settled; }); if (this.max_transfer_id - this.next_transfer_id < (this.window / 2)) { session._write_flow(); } }; Incoming.prototype.on_begin = function (fields) { this.remote_window = fields.outgoing_window; this.remote_next_transfer_id = fields.next_outgoing_id; }; 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 && !d.remote_settled) { if (fields.state && fields.state !== d.remote_state) { d.remote_state = message.unwrap_outcome(fields.state); } if (fields.settled) { d.remote_settled = fields.settled; d.link.dispatch('settled', d.link._context({'delivery': d})); } } } }; var Session = function (connection, local_channel) { this.connection = connection; this.outgoing = new Outgoing(connection); 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 = {}; Object.defineProperty(this, 'error', { get: function () { return this.remote.end ? this.remote.end.error : undefined; } }); this.observers = new EventEmitter(); }; Session.prototype = Object.create(EventEmitter.prototype); Session.prototype.constructor = Session; Session.prototype._disconnect = function () { this.state.disconnected(); for (var l in this.links) { this.links[l]._disconnect(); } if (!this.state.was_open) { this.remove(); } }; Session.prototype._reconnect = function () { this.state.reconnect(); this.outgoing = new Outgoing(this.connection); this.incoming = new Incoming(); this.remote = {'handles': {}}; for (var l in this.links) { this.links[l]._reconnect(); } }; Session.prototype.dispatch = function (name) { log.events('[%s] Session got event: %s', this.connection.options.id, name); EventEmitter.prototype.emit.apply(this.observers, arguments); if (this.listeners(name).length) { EventEmitter.prototype.emit.apply(this, arguments); return true; } else { return 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 merge(defaults, specific) { for (var f in specific) { if (f === 'properties' && defaults.properties) { merge(defaults.properties, specific.properties); } else { defaults[f] = specific[f]; } } } function attach(factory, args, remote_terminus, default_args) { var opts = Object.create(default_args || {}); if (typeof args === 'string') { opts[remote_terminus] = args; } else if (args) { merge(opts, 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]); } } if (l.is_sender() && opts.source === undefined) { opts.source = l.set_source({}); } if (l.is_receiver() && opts.target === undefined) { opts.target = l.set_target({}); } 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', this.get_option('sender_options', {})); }; Session.prototype.open_sender = Session.prototype.attach_sender;//alias Session.prototype.attach_receiver = function (args) { return attach(this.create_receiver.bind(this), args, 'source', this.get_option('receiver_options', {})); }; Session.prototype.open_receiver = Session.prototype.attach_receiver;//alias Session.prototype.find_sender = function (filter) { return this.find_link(util.sender_filter(filter)); }; Session.prototype.find_receiver = function (filter) { return this.find_link(util.receiver_filter(filter)); }; Session.prototype.find_link = function (filter) { for (var name in this.links) { var link = this.links[name]; if (filter(link)) return link; } return undefined; }; Session.prototype.each_receiver = function (action, filter) { this.each_link(action, util.receiver_filter(filter)); }; Session.prototype.each_sender = function (action, filter) { this.each_link(action, util.sender_filter(filter)); }; Session.prototype.each_link = function (action, filter) { for (var name in this.links) { var link = this.links[name]; if (filter === undefined || filter(link)) action(link); } }; 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 (error) { if (error) this.local.end.error = error; 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_remote_open = function () { return this.connection.is_remote_open() && this.state.remote_open; }; Session.prototype.is_itself_closed = function () { return this.state.is_closed(); }; Session.prototype.is_closed = function () { return this.connection.is_closed() || this.is_itself_closed(); }; function notify_sendable(sender) { sender.dispatch('sendable', sender._context()); } function is_sender_sendable(sender) { return sender.is_open() && sender.sendable(); } Session.prototype._process = function () { do { if (this.state.need_open()) { this.output(this.local.begin); } var was_blocked = this.outgoing.deliveries.available() === 0; this.outgoing.process(); if (was_blocked && this.outgoing.deliveries.available()) { this.each_sender(notify_sendable, is_sender_sendable); } this.incoming.process(this); for (var k in this.links) { this.links[k]._process(); } if (this.state.need_close()) { this.output(this.local.end); } } 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 }; this.incoming.max_transfer_id = fields.next_incoming_id + fields.incoming_window; if (link) { if (link._get_drain()) fields.drain = true; fields.delivery_count = link.delivery_count; fields.handle = link.local.handle; fields.link_credit = link.credit; } this.output(frames.flow(fields)); }; 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; var error = this.remote.end.error; if (error) { var handled = this.dispatch('session_error', this._context()); handled = this.dispatch('session_close', this._context()) || handled; if (!handled) { EventEmitter.prototype.emit.call(this.connection.container, 'error', new SessionError(error.description, error.condition, this)); } } else { this.dispatch('session_close', this._context()); } var self = this; var token = this.state.mark(); process.nextTick(function () { if (self.state.marker === token) { self.close(); process.nextTick(function () { self.remove(); }); } }); } 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('[%s] Received disposition for outgoing transfers', this.connection.options.id); this.outgoing.on_disposition(frame.performative); } else { log.events('[%s] Received disposition for incoming transfers', this.connection.options.id); 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 (util.is_defined(frame.performative.handle)) { 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); }; Session.prototype.remove_link = function (link) { delete this.remote.handles[link.remote.handle]; delete this.local.handles[link.local.handle]; delete this.links[link.name]; }; /** * This forcibly removes the session from the parent connection. It * should not be called for a link on an active connection, where * close() should be used instead. */ Session.prototype.remove = function () { this.connection.remove_session(this); }; Session.prototype.on_transfer = function (frame) { this.incoming.on_transfer(frame, this._get_link(frame)); }; module.exports = Session; }).call(this, require('_process'), require("buffer").Buffer) }, { "./endpoint.js": 2, "./frames.js": 6, "./link.js": 7, "./log.js": 8, "./message.js": 9, "./types.js": 14, "./util.js": 15, "_process": 27, "buffer": 19, "events": 22, "util": 30 }], 12: [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.warn('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": 14}], 13: [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 errors = require('./errors.js'); var frames = require('./frames.js'); var log = require('./log.js'); var util = require('./util.js'); var Transport = function (identifier, protocol_id, frame_type, handler) { this.identifier = identifier; this.protocol_id = protocol_id; this.frame_type = frame_type; this.handler = handler; this.pending = []; this.header_sent = undefined; this.header_received = undefined; this.write_complete = false; this.read_complete = false; }; Transport.prototype.has_writes_pending = function () { return this.pending.length > 0 || !this.header_sent; }; Transport.prototype.encode = function (frame) { this.pending.push(frame); }; Transport.prototype.write = function (socket) { if (!this.header_sent) { var buffer = util.allocate_buffer(8); var header = {protocol_id: this.protocol_id, major: 1, minor: 0, revision: 0}; log.frames('[%s] -> %o', this.identifier, header); frames.write_header(buffer, header); socket.write(buffer); this.header_sent = header; } for (var i = 0; i < this.pending.length; i++) { var frame = this.pending[i]; var buffer = frames.write_frame(frame); socket.write(buffer); if (frame.performative) { log.frames('[%s]:%s -> %s %j', this.identifier, frame.channel, frame.performative.constructor, frame.performative, frame.payload || ''); } else { log.frames('[%s]:%s -> empty', this.identifier, frame.channel); } log.raw('[%s] SENT: %d %h', this.identifier, buffer.length, buffer); } this.pending = []; }; Transport.prototype.read = function (buffer) { var offset = 0; if (!this.header_received) { if (buffer.length < 8) { return offset; } else { this.header_received = frames.read_header(buffer); log.frames('[%s] <- %o', this.identifier, this.header_received); if (this.header_received.protocol_id !== this.protocol_id) { if (this.protocol_id === 3 && this.header_received.protocol_id === 0) { throw new errors.ProtocolError('Expecting SASL layer'); } else if (this.protocol_id === 0 && this.header_received.protocol_id === 3) { throw new errors.ProtocolError('SASL layer not enabled'); } else { throw new errors.ProtocolError('Invalid AMQP protocol id ' + this.header_received.protocol_id + ' expecting: ' + this.protocol_id); } } offset = 8; } } while (offset < (buffer.length - 4) && !this.read_complete) { var frame_size = buffer.readUInt32BE(offset); log.io('[%s] got frame of size %d', this.identifier, frame_size); if (buffer.length < offset + frame_size) { log.io('[%s] incomplete frame; have only %d of %d', this.identifier, (buffer.length - offset), frame_size); //don't have enough data for a full frame yet break; } else { var slice = buffer.slice(offset, offset + frame_size); log.raw('[%s] RECV: %d %h', this.identifier, slice.length, slice); var frame = frames.read_frame(slice); if (frame.performative) { log.frames('[%s]:%s <- %s %j', this.identifier, frame.channel, frame.performative.constructor, frame.performative, frame.payload || ''); } else { log.frames('[%s]:%s <- empty', this.identifier, frame.channel); } if (frame.type !== this.frame_type) { throw new errors.ProtocolError('Invalid frame type: ' + frame.type); } offset += frame_size; if (frame.performative) { frame.performative.dispatch(this.handler, frame); } } } return offset; }; module.exports = Transport; }, {"./errors.js": 3, "./frames.js": 6, "./log.js": 8, "./util.js": 15}], 14: [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 errors = require('./errors.js'); var util = require('./util.js'); var CAT_FIXED = 1; var CAT_VARIABLE = 2; var CAT_COMPOUND = 3; var CAT_ARRAY = 4; function Typed(type, value, code, descriptor) { this.type = type; this.value = value; if (code) { this.array_constructor = {'typecode': code}; if (descriptor) { this.array_constructor.descriptor = descriptor; } } } Typed.prototype.toString = function () { return this.value ? this.value.toString() : null; }; Typed.prototype.toLocaleString = function () { return this.value ? this.value.toLocaleString() : null; }; Typed.prototype.valueOf = function () { return this.value; }; Typed.prototype.toJSON = function () { return this.value && this.value.toJSON ? this.value.toJSON() : this.value; }; function TypeDesc(name, typecode, props, empty_value) { this.name = name; this.typecode = typecode; var subcategory = typecode >>> 4; switch (subcategory) { case 0x4: this.width = 0; this.category = CAT_FIXED; break; case 0x5: this.width = 1; this.category = CAT_FIXED; break; case 0x6: this.width = 2; this.category = CAT_FIXED; break; case 0x7: this.width = 4; this.category = CAT_FIXED; break; case 0x8: this.width = 8; this.category = CAT_FIXED; break; case 0x9: this.width = 16; this.category = CAT_FIXED; break; case 0xA: this.width = 1; this.category = CAT_VARIABLE; break; case 0xB: this.width = 4; this.category = CAT_VARIABLE; break; case 0xC: this.width = 1; this.category = CAT_COMPOUND; break; case 0xD: this.width = 4; this.category = CAT_COMPOUND; break; case 0xE: this.width = 1; this.category = CAT_ARRAY; break; case 0xF: this.width = 4; this.category = CAT_ARRAY; break; default: //can't happen break; } if (props) { if (props.read) { this.read = props.read; } if (props.write) { this.write = props.write; } if (props.encoding) { this.encoding = props.encoding; } } var t = this; if (subcategory === 0x4) { // 'empty' types don't take a value this.create = function () { return new Typed(t, empty_value); }; } else if (subcategory === 0xE || subcategory === 0xF) { this.create = function (v, code, descriptor) { return new Typed(t, v, code, descriptor); }; } else { this.create = function (v) { return new Typed(t, v); }; } } TypeDesc.prototype.toString = function () { return this.name + '#' + hex(this.typecode); }; function hex(i) { return Number(i).toString(16); } var types = {'by_code': {}}; Object.defineProperty(types, 'MAX_UINT', {value: 4294967295, writable: false, configurable: false}); Object.defineProperty(types, 'MAX_USHORT', {value: 65535, writable: false, configurable: false}); function define_type(name, typecode, annotations, empty_value) { var t = new TypeDesc(name, typecode, annotations, empty_value); t.create.typecode = t.typecode;//hack types.by_code[t.typecode] = t; types[name] = t.create; } function buffer_uint8_ops() { return { 'read': function (buffer, offset) { return buffer.readUInt8(offset); }, 'write': function (buffer, value, offset) { buffer.writeUInt8(value, offset); } }; } function buffer_uint16be_ops() { return { 'read': function (buffer, offset) { return buffer.readUInt16BE(offset); }, 'write': function (buffer, value, offset) { buffer.writeUInt16BE(value, offset); } }; } function buffer_uint32be_ops() { return { 'read': function (buffer, offset) { return buffer.readUInt32BE(offset); }, 'write': function (buffer, value, offset) { buffer.writeUInt32BE(value, offset); } }; } function buffer_int8_ops() { return { 'read': function (buffer, offset) { return buffer.readInt8(offset); }, 'write': function (buffer, value, offset) { buffer.writeInt8(value, offset); } }; } function buffer_int16be_ops() { return { 'read': function (buffer, offset) { return buffer.readInt16BE(offset); }, 'write': function (buffer, value, offset) { buffer.writeInt16BE(value, offset); } }; } function buffer_int32be_ops() { return { 'read': function (buffer, offset) { return buffer.readInt32BE(offset); }, 'write': function (buffer, value, offset) { buffer.writeInt32BE(value, offset); } }; } function buffer_floatbe_ops() { return { 'read': function (buffer, offset) { return buffer.readFloatBE(offset); }, 'write': function (buffer, value, offset) { buffer.writeFloatBE(value, offset); } }; } function buffer_doublebe_ops() { return { 'read': function (buffer, offset) { return buffer.readDoubleBE(offset); }, 'write': function (buffer, value, offset) { buffer.writeDoubleBE(value, offset); } }; } var MAX_UINT = 4294967296; // 2^32 var MIN_INT = -2147483647; function write_ulong(buffer, value, offset) { if ((typeof value) === 'number' || value instanceof Number) { var hi = Math.floor(value / MAX_UINT); var lo = value % MAX_UINT; buffer.writeUInt32BE(hi, offset); buffer.writeUInt32BE(lo, offset + 4); } else { value.copy(buffer, offset); } } function read_ulong(buffer, offset) { var hi = buffer.readUInt32BE(offset); var lo = buffer.readUInt32BE(offset + 4); if (hi < 2097153) { return hi * MAX_UINT + lo; } else { return buffer.slice(offset, offset + 8); } } function write_long(buffer, value, offset) { if ((typeof value) === 'number' || value instanceof Number) { var abs = Math.abs(value); var hi = Math.floor(abs / MAX_UINT); var lo = abs % MAX_UINT; buffer.writeInt32BE(hi, offset); buffer.writeUInt32BE(lo, offset + 4); if (value < 0) { var carry = 1; for (var i = 0; i < 8; i++) { var index = offset + (7 - i); var v = (buffer[index] ^ 0xFF) + carry; buffer[index] = v & 0xFF; carry = v >> 8; } } } else { value.copy(buffer, offset); } } function read_long(buffer, offset) { var hi = buffer.readInt32BE(offset); var lo = buffer.readUInt32BE(offset + 4); if (hi < 2097153 && hi > -2097153) { return hi * MAX_UINT + lo; } else { return buffer.slice(offset, offset + 8); } } define_type('Null', 0x40, undefined, null); define_type('Boolean', 0x56, buffer_uint8_ops()); define_type('True', 0x41, undefined, true); define_type('False', 0x42, undefined, false); define_type('Ubyte', 0x50, buffer_uint8_ops()); define_type('Ushort', 0x60, buffer_uint16be_ops()); define_type('Uint', 0x70, buffer_uint32be_ops()); define_type('SmallUint', 0x52, buffer_uint8_ops()); define_type('Uint0', 0x43, undefined, 0); define_type('Ulong', 0x80, {'write': write_ulong, 'read': read_ulong}); define_type('SmallUlong', 0x53, buffer_uint8_ops()); define_type('Ulong0', 0x44, undefined, 0); define_type('Byte', 0x51, buffer_int8_ops()); define_type('Short', 0x61, buffer_int16be_ops()); define_type('Int', 0x71, buffer_int32be_ops()); define_type('SmallInt', 0x54, buffer_int8_ops()); define_type('Long', 0x81, {'write': write_long, 'read': read_long}); define_type('SmallLong', 0x55, buffer_int8_ops()); define_type('Float', 0x72, buffer_floatbe_ops()); define_type('Double', 0x82, buffer_doublebe_ops()); define_type('Decimal32', 0x74); define_type('Decimal64', 0x84); define_type('Decimal128', 0x94); define_type('CharUTF32', 0x73, buffer_uint32be_ops()); define_type('Timestamp', 0x83, {'write': write_long, 'read': read_long});//TODO: convert to/from Date define_type('Uuid', 0x98);//TODO: convert to/from stringified form? define_type('Vbin8', 0xa0); define_type('Vbin32', 0xb0); define_type('Str8', 0xa1, {'encoding': 'utf8'}); define_type('Str32', 0xb1, {'encoding': 'utf8'}); define_type('Sym8', 0xa3, {'encoding': 'ascii'}); define_type('Sym32', 0xb3, {'encoding': 'ascii'}); define_type('List0', 0x45, undefined, []); define_type('List8', 0xc0); define_type('List32', 0xd0); define_type('Map8', 0xc1); define_type('Map32', 0xd1); define_type('Array8', 0xe0); define_type('Array32', 0xf0); function is_one_of(o, typelist) { for (var i = 0; i < typelist.length; i++) { if (o.type.typecode === typelist[i].typecode) return true; } return false; } function buffer_zero(b, len, neg) { for (var i = 0; i < len && i < b.length; i++) { if (b[i] !== (neg ? 0xff : 0)) return false; } return true; } types.is_ulong = function (o) { return is_one_of(o, [types.Ulong, types.Ulong0, types.SmallUlong]); }; types.is_string = function (o) { return is_one_of(o, [types.Str8, types.Str32]); }; types.is_symbol = function (o) { return is_one_of(o, [types.Sym8, types.Sym32]); }; types.is_list = function (o) { return is_one_of(o, [types.List0, types.List8, types.List32]); }; types.is_map = function (o) { return is_one_of(o, [types.Map8, types.Map32]); }; types.wrap_boolean = function (v) { return v ? types.True() : types.False(); }; types.wrap_ulong = function (l) { if (Buffer.isBuffer(l)) { if (buffer_zero(l, 8, false)) return types.Ulong0(); return buffer_zero(l, 7, false) ? types.SmallUlong(l[7]) : types.Ulong(l); } else { if (l === 0) return types.Ulong0(); else return l > 255 ? types.Ulong(l) : types.SmallUlong(l); } }; types.wrap_uint = function (l) { if (l === 0) return types.Uint0(); else return l > 255 ? types.Uint(l) : types.SmallUint(l); }; types.wrap_ushort = function (l) { return types.Ushort(l); }; types.wrap_ubyte = function (l) { return types.Ubyte(l); }; types.wrap_long = function (l) { if (Buffer.isBuffer(l)) { var negFlag = (l[0] & 0x80) !== 0; if (buffer_zero(l, 7, negFlag) && (l[7] & 0x80) === (negFlag ? 0x80 : 0)) { return types.SmallLong(negFlag ? -((l[7] ^ 0xff) + 1) : l[7]); } return types.Long(l); } else { return l > 127 || l < -128 ? types.Long(l) : types.SmallLong(l); } }; types.wrap_int = function (l) { return l > 127 || l < -128 ? types.Int(l) : types.SmallInt(l); }; types.wrap_short = function (l) { return types.Short(l); }; types.wrap_byte = function (l) { return types.Byte(l); }; types.wrap_float = function (l) { return types.Float(l); }; types.wrap_double = function (l) { return types.Double(l); }; types.wrap_timestamp = function (l) { return types.Timestamp(l); }; types.wrap_char = function (v) { return types.CharUTF32(v); }; types.wrap_uuid = function (v) { return types.Uuid(v); }; types.wrap_binary = function (s) { return s.length > 255 ? types.Vbin32(s) : types.Vbin8(s); }; types.wrap_string = function (s) { return s.length > 255 ? types.Str32(s) : types.Str8(s); }; types.wrap_symbol = function (s) { return s.length > 255 ? types.Sym32(s) : types.Sym8(s); }; types.wrap_list = function (l) { if (l.length === 0) return types.List0(); var items = l.map(types.wrap); return types.List32(items); }; types.wrap_map = function (m, key_wrapper) { var items = []; for (var k in m) { items.push(key_wrapper ? key_wrapper(k) : types.wrap(k)); items.push(types.wrap(m[k])); } return types.Map32(items); }; types.wrap_symbolic_map = function (m) { return types.wrap_map(m, types.wrap_symbol); }; types.wrap_array = function (l, code, descriptors) { if (code) { return types.Array32(l, code, descriptors); } else { console.trace('An array must specify a type for its elements'); throw new errors.TypeError('An array must specify a type for its elements'); } }; types.wrap = function (o) { var t = typeof o; if (t === 'string') { return types.wrap_string(o); } else if (t === 'boolean') { return o ? types.True() : types.False(); } else if (t === 'number' || o instanceof Number) { if (isNaN(o)) { return types.Null(); } else if (Math.floor(o) - o !== 0) { return types.Double(o); } else if (o > 0) { if (o < MAX_UINT) { return types.wrap_uint(o); } else { return types.wrap_ulong(o); } } else { if (o > MIN_INT) { return types.wrap_int(o); } else { return types.wrap_long(o); } } } else if (o instanceof Date) { return types.wrap_timestamp(o.getTime()); } else if (o instanceof Typed) { return o; } else if (o instanceof Buffer) { return types.wrap_binary(o); } else if (t === 'undefined' || o === null) { return types.Null(); } else if (Array.isArray(o)) { return types.wrap_list(o); } else { return types.wrap_map(o); } }; types.wrap_described = function (value, descriptor) { var result = types.wrap(value); if (descriptor) { if (typeof descriptor === 'string') { result = types.described(types.wrap_symbol(descriptor), result); } else if (typeof descriptor === 'number' || descriptor instanceof Number) { result = types.described(types.wrap_ulong(descriptor), result); } } return result; }; types.wrap_message_id = function (o) { var t = typeof o; if (t === 'string') { return types.wrap_string(o); } else if (t === 'number' || o instanceof Number) { return types.wrap_ulong(o); } else if (Buffer.isBuffer(o)) { return types.wrap_uuid(o); } else { //TODO handle uuids throw new errors.TypeError('invalid message id:' + o); } }; /** * Converts the list of keys and values that comprise an AMQP encoded * map into a proper javascript map/object. */ function mapify(elements) { var result = {}; for (var i = 0; i + 1 < elements.length;) { result[elements[i++]] = elements[i++]; } return result; } var by_descriptor = {}; types.unwrap_map_simple = function (o) { return mapify(o.value.map(function (i) { return types.unwrap(i, true); })); }; types.unwrap = function (o, leave_described) { if (o instanceof Typed) { if (o.descriptor) { var c = by_descriptor[o.descriptor.value]; if (c) { return new c(o.value); } else if (leave_described) { return o; } } var u = types.unwrap(o.value, true); return types.is_map(o) ? mapify(u) : u; } else if (Array.isArray(o)) { return o.map(function (i) { return types.unwrap(i, true); }); } else { return o; } }; /* types.described = function (descriptor, typedvalue) { var o = Object.create(typedvalue); if (descriptor.length) { o.descriptor = descriptor.shift(); return types.described(descriptor, o); } else { o.descriptor = descriptor; return o; } }; */ types.described_nc = function (descriptor, o) { if (descriptor.length) { o.descriptor = descriptor.shift(); return types.described(descriptor, o); } else { o.descriptor = descriptor; return o; } }; types.described = types.described_nc; function get_type(code) { var type = types.by_code[code]; if (!type) { throw new errors.TypeError('Unrecognised typecode: ' + hex(code)); } return type; } types.Reader = function (buffer) { this.buffer = buffer; this.position = 0; }; types.Reader.prototype.read_typecode = function () { return this.read_uint(1); }; types.Reader.prototype.read_uint = function (width) { var current = this.position; this.position += width; if (width === 1) { return this.buffer.readUInt8(current); } else if (width === 2) { return this.buffer.readUInt16BE(current); } else if (width === 4) { return this.buffer.readUInt32BE(current); } else { throw new errors.TypeError('Unexpected width for uint ' + width); } }; types.Reader.prototype.read_fixed_width = function (type) { var current = this.position; this.position += type.width; if (type.read) { return type.read(this.buffer, current); } else { return this.buffer.slice(current, this.position); } }; types.Reader.prototype.read_variable_width = function (type) { var size = this.read_uint(type.width); var slice = this.read_bytes(size); return type.encoding ? slice.toString(type.encoding) : slice; }; types.Reader.prototype.read = function () { var constructor = this.read_constructor(); var value = this.read_value(get_type(constructor.typecode)); return constructor.descriptor ? types.described_nc(constructor.descriptor, value) : value; }; types.Reader.prototype.read_constructor = function () { var code = this.read_typecode(); if (code === 0x00) { var d = []; d.push(this.read()); var c = this.read_constructor(); while (c.descriptor) { d.push(c.descriptor); c = this.read_constructor(); } return {'typecode': c.typecode, 'descriptor': d.length === 1 ? d[0] : d}; } else { return {'typecode': code}; } }; types.Reader.prototype.read_value = function (type) { if (type.width === 0) { return type.create(); } else if (type.category === CAT_FIXED) { return type.create(this.read_fixed_width(type)); } else if (type.category === CAT_VARIABLE) { return type.create(this.read_variable_width(type)); } else if (type.category === CAT_COMPOUND) { return this.read_compound(type); } else if (type.category === CAT_ARRAY) { return this.read_array(type); } else { throw new errors.TypeError('Invalid category for type: ' + type); } }; types.Reader.prototype.read_array_items = function (n, type) { var items = []; while (items.length < n) { items.push(this.read_value(type)); } return items; }; types.Reader.prototype.read_n = function (n) { var items = new Array(n); for (var i = 0; i < n; i++) { items[i] = this.read(); } return items; }; types.Reader.prototype.read_size_count = function (width) { return {'size': this.read_uint(width), 'count': this.read_uint(width)}; }; types.Reader.prototype.read_compound = function (type) { var limits = this.read_size_count(type.width); return type.create(this.read_n(limits.count)); }; types.Reader.prototype.read_array = function (type) { var limits = this.read_size_count(type.width); var constructor = this.read_constructor(); return type.create(this.read_array_items(limits.count, get_type(constructor.typecode)), constructor.typecode, constructor.descriptor); }; types.Reader.prototype.toString = function () { var s = 'buffer@' + this.position; if (this.position) s += ': '; for (var i = this.position; i < this.buffer.length; i++) { if (i > 0) s += ','; s += '0x' + Number(this.buffer[i]).toString(16); } return s; }; types.Reader.prototype.reset = function () { this.position = 0; }; types.Reader.prototype.skip = function (bytes) { this.position += bytes; }; types.Reader.prototype.read_bytes = function (bytes) { var current = this.position; this.position += bytes; return this.buffer.slice(current, this.position); }; types.Reader.prototype.remaining = function () { return this.buffer.length - this.position; }; types.Writer = function (buffer) { this.buffer = buffer ? buffer : util.allocate_buffer(1024); this.position = 0; }; types.Writer.prototype.toBuffer = function () { return this.buffer.slice(0, this.position); }; function max(a, b) { return a > b ? a : b; } types.Writer.prototype.ensure = function (length) { if (this.buffer.length < length) { var bigger = util.allocate_buffer(max(this.buffer.length * 2, length)); this.buffer.copy(bigger); this.buffer = bigger; } }; types.Writer.prototype.write_typecode = function (code) { this.write_uint(code, 1); }; types.Writer.prototype.write_uint = function (value, width) { var current = this.position; this.ensure(this.position + width); this.position += width; if (width === 1) { return this.buffer.writeUInt8(value, current); } else if (width === 2) { return this.buffer.writeUInt16BE(value, current); } else if (width === 4) { return this.buffer.writeUInt32BE(value, current); } else { throw new errors.TypeError('Unexpected width for uint ' + width); } }; types.Writer.prototype.write_fixed_width = function (type, value) { var current = this.position; this.ensure(this.position + type.width); this.position += type.width; if (type.write) { type.write(this.buffer, value, current); } else if (value.copy) { value.copy(this.buffer, current); } else { throw new errors.TypeError('Cannot handle write for ' + type); } }; types.Writer.prototype.write_variable_width = function (type, value) { var source = type.encoding ? Buffer.from(value, type.encoding) : Buffer.from(value);//TODO: avoid creating new buffers this.write_uint(source.length, type.width); this.write_bytes(source); }; types.Writer.prototype.write_bytes = function (source) { var current = this.position; this.ensure(this.position + source.length); this.position += source.length; source.copy(this.buffer, current); }; types.Writer.prototype.write_constructor = function (typecode, descriptor) { if (descriptor) { this.write_typecode(0x00); this.write(descriptor); } this.write_typecode(typecode); }; types.Writer.prototype.write = function (o) { if (o.type === undefined) { if (o.described) { this.write(o.described()); } else { throw new errors.TypeError('Cannot write ' + JSON.stringify(o)); } } else { this.write_constructor(o.type.typecode, o.descriptor); this.write_value(o.type, o.value, o.array_constructor); } }; types.Writer.prototype.write_value = function (type, value, constructor/*for arrays only*/) { if (type.width === 0) { return;//nothing further to do } else if (type.category === CAT_FIXED) { this.write_fixed_width(type, value); } else if (type.category === CAT_VARIABLE) { this.write_variable_width(type, value); } else if (type.category === CAT_COMPOUND) { this.write_compound(type, value); } else if (type.category === CAT_ARRAY) { this.write_array(type, value, constructor); } else { throw new errors.TypeError('Invalid category ' + type.category + ' for type: ' + type); } }; types.Writer.prototype.backfill_size = function (width, saved) { var gap = this.position - saved; this.position = saved; this.write_uint(gap - width, width); this.position += (gap - width); }; types.Writer.prototype.write_compound = function (type, value) { var saved = this.position; this.position += type.width;//skip size field this.write_uint(value.length, type.width);//count field for (var i = 0; i < value.length; i++) { if (value[i] === undefined || value[i] === null) { this.write(types.Null()); } else { this.write(value[i]); } } this.backfill_size(type.width, saved); }; types.Writer.prototype.write_array = function (type, value, constructor) { var saved = this.position; this.position += type.width;//skip size field this.write_uint(value.length, type.width);//count field this.write_constructor(constructor.typecode, constructor.descriptor); var ctype = get_type(constructor.typecode); for (var i = 0; i < value.length; i++) { this.write_value(ctype, value[i]); } this.backfill_size(type.width, saved); }; types.Writer.prototype.toString = function () { var s = 'buffer@' + this.position; if (this.position) s += ': '; for (var i = 0; i < this.position; i++) { if (i > 0) s += ','; s += ('00' + Number(this.buffer[i]).toString(16)).slice(-2); } return s; }; types.Writer.prototype.skip = function (bytes) { this.ensure(this.position + bytes); this.position += bytes; }; types.Writer.prototype.clear = function () { this.buffer.fill(0x00); this.position = 0; }; types.Writer.prototype.remaining = function () { return this.buffer.length - this.position; }; function get_constructor(typename) { if (typename === 'symbol') { return {typecode: types.Sym8.typecode}; } throw new errors.TypeError('TODO: Array of type ' + typename + ' not yet supported'); } function wrap_field(definition, instance) { if (instance !== undefined && instance !== null) { if (Array.isArray(instance)) { if (!definition.multiple) { throw new errors.TypeError('Field ' + definition.name + ' does not support multiple values, got ' + JSON.stringify(instance)); } var constructor = get_constructor(definition.type); return types.wrap_array(instance, constructor.typecode, constructor.descriptor); } else if (definition.type === '*') { return instance; } else { var wrapper = types['wrap_' + definition.type]; if (wrapper) { return wrapper(instance); } else { throw new errors.TypeError('No wrapper for field ' + definition.name + ' of type ' + definition.type); } } } else if (definition.mandatory) { throw new errors.TypeError('Field ' + definition.name + ' is mandatory'); } else { return types.Null(); } } function get_accessors(index, field_definition) { var getter; if (field_definition.type === '*') { getter = function () { return this.value[index]; }; } else { getter = function () { return types.unwrap(this.value[index]); }; } var setter = function (o) { this.value[index] = wrap_field(field_definition, o); }; return {'get': getter, 'set': setter, 'enumerable': true, 'configurable': false}; } types.define_composite = function (def) { var c = function (fields) { this.value = fields ? fields : []; }; c.descriptor = { numeric: def.code, symbolic: 'amqp:' + def.name + ':list' }; c.prototype.dispatch = function (target, frame) { target['on_' + def.name](frame); }; //c.prototype.descriptor = c.descriptor.numeric; //c.prototype = Object.create(types.List8.prototype); for (var i = 0; i < def.fields.length; i++) { var f = def.fields[i]; Object.defineProperty(c.prototype, f.name, get_accessors(i, f)); } c.toString = function () { return def.name + '#' + Number(def.code).toString(16); }; c.prototype.toJSON = function () { var o = {}; for (var f in this) { if (f !== 'value' && this[f]) { o[f] = this[f]; } } return o; }; c.create = function (fields) { var o = new c; for (var f in fields) { o[f] = fields[f]; } return o; }; c.prototype.described = function () { return types.described_nc(types.wrap_ulong(c.descriptor.numeric), types.wrap_list(this.value)); }; return c; }; function add_type(def) { var c = types.define_composite(def); types['wrap_' + def.name] = function (fields) { return c.create(fields).described(); }; by_descriptor[Number(c.descriptor.numeric).toString(10)] = c; by_descriptor[c.descriptor.symbolic] = c; } add_type({ name: 'error', code: 0x1d, fields: [ {name: 'condition', type: 'symbol', mandatory: true}, {name: 'description', type: 'string'}, {name: 'info', type: 'map'} ] }); module.exports = types; }).call(this, require("buffer").Buffer) }, {"./errors.js": 3, "./util.js": 15, "buffer": 19}], 15: [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 errors = require('./errors.js'); var util = {}; util.allocate_buffer = function (size) { return Buffer.alloc ? Buffer.alloc(size) : new Buffer(size); }; util.generate_uuid = function () { return util.uuid_to_string(util.uuid4()); }; util.uuid4 = function () { var bytes = util.allocate_buffer(16); for (var i = 0; i < bytes.length; i++) { bytes[i] = Math.random() * 255 | 0; } // From RFC4122, the version bits are set to 0100 bytes[7] &= 0x0F; bytes[7] |= 0x40; // From RFC4122, the top two bits of byte 8 get set to 01 bytes[8] &= 0x3F; bytes[8] |= 0x80; return bytes; }; util.uuid_to_string = function (buffer) { if (buffer.length === 16) { var chunks = [buffer.slice(0, 4), buffer.slice(4, 6), buffer.slice(6, 8), buffer.slice(8, 10), buffer.slice(10, 16)]; return chunks.map(function (b) { return b.toString('hex'); }).join('-'); } else { throw new errors.TypeError('Not a UUID, expecting 16 byte buffer'); } }; var parse_uuid = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/; util.string_to_uuid = function (uuid_string) { var parts = parse_uuid.exec(uuid_string.toLowerCase()); if (parts) { return Buffer.from(parts.slice(1).join(''), 'hex'); } else { throw new errors.TypeError('Not a valid UUID string: ' + uuid_string); } }; util.clone = function (o) { var copy = Object.create(o.prototype || {}); var names = Object.getOwnPropertyNames(o); for (var i = 0; i < names.length; i++) { var key = names[i]; copy[key] = o[key]; } return copy; }; util.and = function (f, g) { if (g === undefined) return f; return function (o) { return f(o) && g(o); }; }; util.is_sender = function (o) { return o.is_sender(); }; util.is_receiver = function (o) { return o.is_receiver(); }; util.sender_filter = function (filter) { return util.and(util.is_sender, filter); }; util.receiver_filter = function (filter) { return util.and(util.is_receiver, filter); }; util.is_defined = function (field) { return field !== undefined && field !== null; }; module.exports = util; }).call(this, require("buffer").Buffer) }, {"./errors.js": 3, "buffer": 19}], 16: [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'; function nulltransform(data) { return data; } function from_arraybuffer(data) { if (data instanceof ArrayBuffer) return Buffer.from(new Uint8Array(data)); else return Buffer.from(data); } function to_typedarray(data) { return new Uint8Array(data); } function wrap(ws) { var data_recv = nulltransform; var data_send = nulltransform; if (ws.binaryType) { ws.binaryType = 'arraybuffer'; data_recv = from_arraybuffer; data_send = to_typedarray; } return { end: function () { ws.close(); }, write: function (data) { try { ws.send(data_send(data), {binary: true}); } catch (e) { ws.onerror(e); } }, on: function (event, handler) { if (event === 'data') { ws.onmessage = function (msg_evt) { handler(data_recv(msg_evt.data)); }; } else if (event === 'end') { ws.onclose = handler; } else if (event === 'error') { ws.onerror = handler; } else { console.error('ERROR: Attempt to set unrecognised handler on websocket wrapper: ' + event); } }, get_id_string: function () { return ws.url; } }; } module.exports = { 'connect': function (Impl) { return function (url, protocols, options) { return function () { return { connect: function (port_ignore, host_ignore, options_ignore, callback) { var c = new Impl(url, protocols, options); c.onopen = callback; return wrap(c); } }; }; }; }, 'wrap': wrap }; }).call(this, require("buffer").Buffer) }, {"buffer": 19}], 17: [function (require, module, exports) { 'use strict' exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } // Support decoding URL-safe base64 strings, as Node.js does. // See: https://en.wikipedia.org/wiki/Base64#URL_applications revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 function getLens(b64) { var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // Trim off extra bytes after placeholder bytes are found // See: https://github.com/beatgammit/base64-js/issues/42 var validLen = b64.indexOf('=') if (validLen === -1) validLen = len var placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4) return [validLen, placeHoldersLen] } // base64 is 4/3 + up to two characters of the original data function byteLength(b64) { var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function _byteLength(b64, validLen, placeHoldersLen) { return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen } function toByteArray(b64) { var tmp var lens = getLens(b64) var validLen = lens[0] var placeHoldersLen = lens[1] var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) var curByte = 0 // if there are placeholders, only get up to the last complete 4 chars var len = placeHoldersLen > 0 ? validLen - 4 : validLen for (var i = 0; i < len; i += 4) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[curByte++] = (tmp >> 16) & 0xFF arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[curByte++] = tmp & 0xFF } if (placeHoldersLen === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[curByte++] = (tmp >> 8) & 0xFF arr[curByte++] = tmp & 0xFF } return arr } function tripletToBase64(num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk(uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = ((uint8[i] << 16) & 0xFF0000) + ((uint8[i + 1] << 8) & 0xFF00) + (uint8[i + 2] & 0xFF) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray(uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk( uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) )) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] parts.push( lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3F] + '==' ) } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + uint8[len - 1] parts.push( lookup[tmp >> 10] + lookup[(tmp >> 4) & 0x3F] + lookup[(tmp << 2) & 0x3F] + '=' ) } return parts.join('') } }, {}], 18: [function (require, module, exports) { }, {}], 19: [function (require, module, exports) { (function (Buffer) { /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 var K_MAX_LENGTH = 0x7fffffff exports.kMaxLength = K_MAX_LENGTH /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Print warning and recommend using `buffer` v4.x which has an Object * implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * We report that the browser does not support typed arrays if the are not subclassable * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support * for __proto__ and has a buggy typed array implementation. */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && typeof console.error === 'function') { console.error( 'This browser lacks typed array (Uint8Array) support which is required by ' + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' ) } function typedArraySupport() { // Can typed array instances can be augmented? try { var arr = new Uint8Array(1) arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } return arr.foo() === 42 } catch (e) { return false } } Object.defineProperty(Buffer.prototype, 'parent', { enumerable: true, get: function () { if (!Buffer.isBuffer(this)) return undefined return this.buffer } }) Object.defineProperty(Buffer.prototype, 'offset', { enumerable: true, get: function () { if (!Buffer.isBuffer(this)) return undefined return this.byteOffset } }) function createBuffer(length) { if (length > K_MAX_LENGTH) { throw new RangeError('The value "' + length + '" is invalid for option "size"') } // Return an augmented `Uint8Array` instance var buf = new Uint8Array(length) buf.__proto__ = Buffer.prototype return buf } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer(arg, encodingOrOffset, length) { // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new TypeError( 'The "string" argument must be of type string. Received type number' ) } return allocUnsafe(arg) } return from(arg, encodingOrOffset, length) } // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 if (typeof Symbol !== 'undefined' && Symbol.species != null && Buffer[Symbol.species] === Buffer) { Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true, enumerable: false, writable: false }) } Buffer.poolSize = 8192 // not used by this implementation function from(value, encodingOrOffset, length) { if (typeof value === 'string') { return fromString(value, encodingOrOffset) } if (ArrayBuffer.isView(value)) { return fromArrayLike(value) } if (value == null) { throw TypeError( 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + (typeof value) ) } if (isInstance(value, ArrayBuffer) || (value && isInstance(value.buffer, ArrayBuffer))) { return fromArrayBuffer(value, encodingOrOffset, length) } if (typeof value === 'number') { throw new TypeError( 'The "value" argument must not be of type number. Received type number' ) } var valueOf = value.valueOf && value.valueOf() if (valueOf != null && valueOf !== value) { return Buffer.from(valueOf, encodingOrOffset, length) } var b = fromObject(value) if (b) return b if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === 'function') { return Buffer.from( value[Symbol.toPrimitive]('string'), encodingOrOffset, length ) } throw new TypeError( 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + 'or Array-like Object. Received type ' + (typeof value) ) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(value, encodingOrOffset, length) } // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: // https://github.com/feross/buffer/pull/148 Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array function assertSize(size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be of type number') } else if (size < 0) { throw new RangeError('The value "' + size + '" is invalid for option "size"') } } function alloc(size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill) } return createBuffer(size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(size, fill, encoding) } function allocUnsafe(size) { assertSize(size) return createBuffer(size < 0 ? 0 : checked(size) | 0) } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(size) } function fromString(string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } var length = byteLength(string, encoding) | 0 var buf = createBuffer(length) var actual = buf.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') buf = buf.slice(0, actual) } return buf } function fromArrayLike(array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 var buf = createBuffer(length) for (var i = 0; i < length; i += 1) { buf[i] = array[i] & 255 } return buf } function fromArrayBuffer(array, byteOffset, length) { if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('"offset" is outside of buffer bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('"length" is outside of buffer bounds') } var buf if (byteOffset === undefined && length === undefined) { buf = new Uint8Array(array) } else if (length === undefined) { buf = new Uint8Array(array, byteOffset) } else { buf = new Uint8Array(array, byteOffset, length) } // Return an augmented `Uint8Array` instance buf.__proto__ = Buffer.prototype return buf } function fromObject(obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 var buf = createBuffer(len) if (buf.length === 0) { return buf } obj.copy(buf, 0, 0, len) return buf } if (obj.length !== undefined) { if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { return createBuffer(0) } return fromArrayLike(obj) } if (obj.type === 'Buffer' && Array.isArray(obj.data)) { return fromArrayLike(obj.data) } } function checked(length) { // Note: cannot use `length < K_MAX_LENGTH` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= K_MAX_LENGTH) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') } return length | 0 } function SlowBuffer(length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer(b) { return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false } Buffer.compare = function compare(a, b) { if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError( 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' ) } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding(encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat(list, length) { if (!Array.isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (isInstance(buf, Uint8Array)) { buf = Buffer.from(buf) } if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength(string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { throw new TypeError( 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + 'Received type ' + typeof string ) } var len = string.length var mustMatch = (arguments.length > 2 && arguments[2] === true) if (!mustMatch && len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (; ;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) { return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 } encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString(encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) // to detect a Buffer instance. It's not possible to use `instanceof Buffer` // reliably in a browserify context because there could be multiple different // copies of the 'buffer' package in use. This method works even for Buffer // instances that were created from another copy of the `buffer` package. // See: https://github.com/feross/buffer/issues/154 Buffer.prototype._isBuffer = true function swap(b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16() { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32() { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64() { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString() { var length = this.length if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.toLocaleString = Buffer.prototype.toString Buffer.prototype.equals = function equals(b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect() { var str = '' var max = exports.INSPECT_MAX_BYTES str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() if (this.length > max) str += ' ... ' return '' } Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { if (isInstance(target, Uint8Array)) { target = Buffer.from(target, target.offset, target.byteLength) } if (!Buffer.isBuffer(target)) { throw new TypeError( 'The "target" argument must be one of type Buffer or Uint8Array. ' + 'Received type ' + (typeof target) ) } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [val], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf(arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read(buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes(val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite(buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } var strLen = string.length if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (numberIsNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write(buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite(buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write(buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write(buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write(buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write(string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset >>> 0 if (isFinite(length)) { length = length >>> 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (; ;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON() { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice(buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice(buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray(codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice(buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice(buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice(buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice(buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) } return res } Buffer.prototype.slice = function slice(start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf = this.subarray(start, end) // Return an augmented `Uint8Array` instance newBuf.__proto__ = Buffer.prototype return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset(offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) { offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt(buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) return offset + 2 } Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) return offset + 4 } function checkIEEE754(buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat(buf, value, offset, littleEndian, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble(buf, value, offset, littleEndian, noAssert) { value = +value offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy(target, targetStart, start, end) { if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('Index out of range') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { // Use built-in when available, missing from IE11 this.copyWithin(targetStart, start, end) } else if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (var i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, end), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill(val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } if (val.length === 1) { var code = val.charCodeAt(0) if ((encoding === 'utf8' && code < 128) || encoding === 'latin1') { // Fast path: If `val` fits into a single byte, use that numeric value. val = code } } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding) var len = bytes.length if (len === 0) { throw new TypeError('The value "' + val + '" is invalid for argument "value"') } for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g function base64clean(str) { // Node takes equal signs as end of the Base64 encoding str = str.split('=')[0] // Node strips out invalid characters like \n and \t from the string, base64-js does not str = str.trim().replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function toHex(n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes(string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes(str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes(str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes(str) { return base64.toByteArray(base64clean(str)) } function blitBuffer(src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass // the `instanceof` check but they should be treated as of that type. // See: https://github.com/feross/buffer/issues/166 function isInstance(obj, type) { return obj instanceof type || (obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name) } function numberIsNaN(obj) { // For IE11 support return obj !== obj // eslint-disable-line no-self-compare } }).call(this, require("buffer").Buffer) }, {"base64-js": 17, "buffer": 19, "ieee754": 23}], 20: [function (require, module, exports) { (function (process) { "use strict"; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } /* eslint-env browser */ /** * This is the web browser implementation of `debug()`. */ exports.log = log; exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = localstorage(); /** * Colors. */ exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33']; /** * Currently only WebKit-based Web Inspectors, Firefox >= v31, * and the Firebug extension (any Firefox version) are known * to support "%c" CSS customizations. * * TODO: add a `localStorage` variable to explicitly enable/disable colors */ // eslint-disable-next-line complexity function useColors() { // NB: In an Electron preload script, document will be defined but not fully // initialized. Since we know we're in Chrome, we'll just detect this case // explicitly if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { return true; } // Internet Explorer and Edge do not support colors. if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { return false; } // Is webkit? http://stackoverflow.com/a/16459606/376773 // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); } /** * Colorize log arguments if enabled. * * @api public */ function formatArgs(args) { args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff); if (!this.useColors) { return; } var c = 'color: ' + this.color; args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other // arguments passed either before or after the %c, so we need to // figure out the correct index to insert the CSS into var index = 0; var lastC = 0; args[0].replace(/%[a-zA-Z%]/g, function (match) { if (match === '%%') { return; } index++; if (match === '%c') { // We only are interested in the *last* %c // (the user may have provided their own) lastC = index; } }); args.splice(lastC, 0, c); } /** * Invokes `console.log()` when available. * No-op when `console.log` is not a "function". * * @api public */ function log() { var _console; // This hackery is required for IE8/9, where // the `console.log` function doesn't have 'apply' return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments); } /** * Save `namespaces`. * * @param {String} namespaces * @api private */ function save(namespaces) { try { if (namespaces) { exports.storage.setItem('debug', namespaces); } else { exports.storage.removeItem('debug'); } } catch (error) {// Swallow // XXX (@Qix-) should we be logging these? } } /** * Load `namespaces`. * * @return {String} returns the previously persisted debug modes * @api private */ function load() { var r; try { r = exports.storage.getItem('debug'); } catch (error) { } // Swallow // XXX (@Qix-) should we be logging these? // If debug isn't set in LS, and we're in Electron, try to load $DEBUG if (!r && typeof process !== 'undefined' && 'env' in process) { r = process.env.DEBUG; } return r; } /** * Localstorage attempts to return the localstorage. * * This is necessary because safari throws * when a user disables cookies/localstorage * and you attempt to access it. * * @return {LocalStorage} * @api private */ function localstorage() { try { // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context // The Browser also has localStorage in the global context. return localStorage; } catch (error) {// Swallow // XXX (@Qix-) should we be logging these? } } module.exports = require('./common')(exports); var formatters = module.exports.formatters; /** * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. */ formatters.j = function (v) { try { return JSON.stringify(v); } catch (error) { return '[UnexpectedJSONParseError]: ' + error.message; } }; }).call(this, require('_process')) }, {"./common": 21, "_process": 27}], 21: [function (require, module, exports) { "use strict"; /** * This is the common logic for both the Node.js and web browser * implementations of `debug()`. */ function setup(env) { createDebug.debug = createDebug; createDebug.default = createDebug; createDebug.coerce = coerce; createDebug.disable = disable; createDebug.enable = enable; createDebug.enabled = enabled; createDebug.humanize = require('ms'); Object.keys(env).forEach(function (key) { createDebug[key] = env[key]; }); /** * Active `debug` instances. */ createDebug.instances = []; /** * The currently active debug mode names, and names to skip. */ createDebug.names = []; createDebug.skips = []; /** * Map of special "%n" handling functions, for the debug "format" argument. * * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". */ createDebug.formatters = {}; /** * Selects a color for a debug namespace * @param {String} namespace The namespace string for the for the debug instance to be colored * @return {Number|String} An ANSI color code for the given namespace * @api private */ function selectColor(namespace) { var hash = 0; for (var i = 0; i < namespace.length; i++) { hash = (hash << 5) - hash + namespace.charCodeAt(i); hash |= 0; // Convert to 32bit integer } return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; } createDebug.selectColor = selectColor; /** * Create a debugger with the given `namespace`. * * @param {String} namespace * @return {Function} * @api public */ function createDebug(namespace) { var prevTime; function debug() { // Disabled? if (!debug.enabled) { return; } for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var self = debug; // Set `diff` timestamp var curr = Number(new Date()); var ms = curr - (prevTime || curr); self.diff = ms; self.prev = prevTime; self.curr = curr; prevTime = curr; args[0] = createDebug.coerce(args[0]); if (typeof args[0] !== 'string') { // Anything else let's inspect with %O args.unshift('%O'); } // Apply any `formatters` transformations var index = 0; args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) { // If we encounter an escaped % then don't increase the array index if (match === '%%') { return match; } index++; var formatter = createDebug.formatters[format]; if (typeof formatter === 'function') { var val = args[index]; match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` args.splice(index, 1); index--; } return match; }); // Apply env-specific formatting (colors, etc.) createDebug.formatArgs.call(self, args); var logFn = self.log || createDebug.log; logFn.apply(self, args); } debug.namespace = namespace; debug.enabled = createDebug.enabled(namespace); debug.useColors = createDebug.useColors(); debug.color = selectColor(namespace); debug.destroy = destroy; debug.extend = extend; // Debug.formatArgs = formatArgs; // debug.rawLog = rawLog; // env-specific initialization logic for debug instances if (typeof createDebug.init === 'function') { createDebug.init(debug); } createDebug.instances.push(debug); return debug; } function destroy() { var index = createDebug.instances.indexOf(this); if (index !== -1) { createDebug.instances.splice(index, 1); return true; } return false; } function extend(namespace, delimiter) { return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); } /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. * * @param {String} namespaces * @api public */ function enable(namespaces) { createDebug.save(namespaces); createDebug.names = []; createDebug.skips = []; var i; var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); var len = split.length; for (i = 0; i < len; i++) { if (!split[i]) { // ignore empty strings continue; } namespaces = split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-') { createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); } else { createDebug.names.push(new RegExp('^' + namespaces + '$')); } } for (i = 0; i < createDebug.instances.length; i++) { var instance = createDebug.instances[i]; instance.enabled = createDebug.enabled(instance.namespace); } } /** * Disable debug output. * * @api public */ function disable() { createDebug.enable(''); } /** * Returns true if the given mode name is enabled, false otherwise. * * @param {String} name * @return {Boolean} * @api public */ function enabled(name) { if (name[name.length - 1] === '*') { return true; } var i; var len; for (i = 0, len = createDebug.skips.length; i < len; i++) { if (createDebug.skips[i].test(name)) { return false; } } for (i = 0, len = createDebug.names.length; i < len; i++) { if (createDebug.names[i].test(name)) { return true; } } return false; } /** * Coerce `val`. * * @param {Mixed} val * @return {Mixed} * @api private */ function coerce(val) { if (val instanceof Error) { return val.stack || val.message; } return val; } createDebug.enable(createDebug.load()); return createDebug; } module.exports = setup; }, {"ms": 24}], 22: [function (require, module, exports) { // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var objectCreate = Object.create || objectCreatePolyfill var objectKeys = Object.keys || objectKeysPolyfill var bind = Function.prototype.bind || functionBindPolyfill function EventEmitter() { if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { this._events = objectCreate(null); this._eventsCount = 0; } this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. var defaultMaxListeners = 10; var hasDefineProperty; try { var o = {}; if (Object.defineProperty) Object.defineProperty(o, 'x', {value: 0}); hasDefineProperty = o.x === 0; } catch (err) { hasDefineProperty = false } if (hasDefineProperty) { Object.defineProperty(EventEmitter, 'defaultMaxListeners', { enumerable: true, get: function () { return defaultMaxListeners; }, set: function (arg) { // check whether the input is a positive number (whose value is zero or // greater and not a NaN). if (typeof arg !== 'number' || arg < 0 || arg !== arg) throw new TypeError('"defaultMaxListeners" must be a positive number'); defaultMaxListeners = arg; } }); } else { EventEmitter.defaultMaxListeners = defaultMaxListeners; } // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { if (typeof n !== 'number' || n < 0 || isNaN(n)) throw new TypeError('"n" argument must be a positive number'); this._maxListeners = n; return this; }; function $getMaxListeners(that) { if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { return $getMaxListeners(this); }; // These standalone emit* functions are used to optimize calling of event // handlers for fast cases because emit() itself often has a variable number of // arguments and can be deoptimized because of that. These functions always have // the same number of arguments and thus do not get deoptimized, so the code // inside them can execute faster. function emitNone(handler, isFn, self) { if (isFn) handler.call(self); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self); } } function emitOne(handler, isFn, self, arg1) { if (isFn) handler.call(self, arg1); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1); } } function emitTwo(handler, isFn, self, arg1, arg2) { if (isFn) handler.call(self, arg1, arg2); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2); } } function emitThree(handler, isFn, self, arg1, arg2, arg3) { if (isFn) handler.call(self, arg1, arg2, arg3); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].call(self, arg1, arg2, arg3); } } function emitMany(handler, isFn, self, args) { if (isFn) handler.apply(self, args); else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) listeners[i].apply(self, args); } } EventEmitter.prototype.emit = function emit(type) { var er, handler, len, args, i, events; var doError = (type === 'error'); events = this._events; if (events) doError = (doError && events.error == null); else if (!doError) return false; // If there is no 'error' event listener then throw. if (doError) { if (arguments.length > 1) er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } else { // At least give some kind of context to the user var err = new Error('Unhandled "error" event. (' + er + ')'); err.context = er; throw err; } return false; } handler = events[type]; if (!handler) return false; var isFn = typeof handler === 'function'; len = arguments.length; switch (len) { // fast cases case 1: emitNone(handler, isFn, this); break; case 2: emitOne(handler, isFn, this, arguments[1]); break; case 3: emitTwo(handler, isFn, this, arguments[1], arguments[2]); break; case 4: emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); break; // slower default: args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; emitMany(handler, isFn, this, args); } return true; }; function _addListener(target, type, listener, prepend) { var m; var events; var existing; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = target._events; if (!events) { events = target._events = objectCreate(null); target._eventsCount = 0; } else { // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (events.newListener) { target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the // this._events to be assigned to a new object events = target._events; } existing = events[type]; } if (!existing) { // Optimize the case of one listener. Don't need the extra array object. existing = events[type] = listener; ++target._eventsCount; } else { if (typeof existing === 'function') { // Adding the second element, need to change to array. existing = events[type] = prepend ? [listener, existing] : [existing, listener]; } else { // If we've already got an array, just append. if (prepend) { existing.unshift(listener); } else { existing.push(listener); } } // Check for listener leak if (!existing.warned) { m = $getMaxListeners(target); if (m && m > 0 && existing.length > m) { existing.warned = true; var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' "' + String(type) + '" listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit.'); w.name = 'MaxListenersExceededWarning'; w.emitter = target; w.type = type; w.count = existing.length; if (typeof console === 'object' && console.warn) { console.warn('%s: %s', w.name, w.message); } } } } return target; } EventEmitter.prototype.addListener = function addListener(type, listener) { return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.prependListener = function prependListener(type, listener) { return _addListener(this, type, listener, true); }; function onceWrapper() { if (!this.fired) { this.target.removeListener(this.type, this.wrapFn); this.fired = true; switch (arguments.length) { case 0: return this.listener.call(this.target); case 1: return this.listener.call(this.target, arguments[0]); case 2: return this.listener.call(this.target, arguments[0], arguments[1]); case 3: return this.listener.call(this.target, arguments[0], arguments[1], arguments[2]); default: var args = new Array(arguments.length); for (var i = 0; i < args.length; ++i) args[i] = arguments[i]; this.listener.apply(this.target, args); } } } function _onceWrap(target, type, listener) { var state = {fired: false, wrapFn: undefined, target: target, type: type, listener: listener}; var wrapped = bind.call(onceWrapper, state); wrapped.listener = listener; state.wrapFn = wrapped; return wrapped; } EventEmitter.prototype.once = function once(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.on(type, _onceWrap(this, type, listener)); return this; }; EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); this.prependListener(type, _onceWrap(this, type, listener)); return this; }; // Emits a 'removeListener' event if and only if the listener was removed. EventEmitter.prototype.removeListener = function removeListener(type, listener) { var list, events, position, i, originalListener; if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function'); events = this._events; if (!events) return this; list = events[type]; if (!list) return this; if (list === listener || list.listener === listener) { if (--this._eventsCount === 0) this._events = objectCreate(null); else { delete events[type]; if (events.removeListener) this.emit('removeListener', type, list.listener || listener); } } else if (typeof list !== 'function') { position = -1; for (i = list.length - 1; i >= 0; i--) { if (list[i] === listener || list[i].listener === listener) { originalListener = list[i].listener; position = i; break; } } if (position < 0) return this; if (position === 0) list.shift(); else spliceOne(list, position); if (list.length === 1) events[type] = list[0]; if (events.removeListener) this.emit('removeListener', type, originalListener || listener); } return this; }; EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { var listeners, events, i; events = this._events; if (!events) return this; // not listening for removeListener, no need to emit if (!events.removeListener) { if (arguments.length === 0) { this._events = objectCreate(null); this._eventsCount = 0; } else if (events[type]) { if (--this._eventsCount === 0) this._events = objectCreate(null); else delete events[type]; } return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { var keys = objectKeys(events); var key; for (i = 0; i < keys.length; ++i) { key = keys[i]; if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = objectCreate(null); this._eventsCount = 0; return this; } listeners = events[type]; if (typeof listeners === 'function') { this.removeListener(type, listeners); } else if (listeners) { // LIFO order for (i = listeners.length - 1; i >= 0; i--) { this.removeListener(type, listeners[i]); } } return this; }; function _listeners(target, type, unwrap) { var events = target._events; if (!events) return []; var evlistener = events[type]; if (!evlistener) return []; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); } EventEmitter.prototype.listeners = function listeners(type) { return _listeners(this, type, true); }; EventEmitter.prototype.rawListeners = function rawListeners(type) { return _listeners(this, type, false); }; EventEmitter.listenerCount = function (emitter, type) { if (typeof emitter.listenerCount === 'function') { return emitter.listenerCount(type); } else { return listenerCount.call(emitter, type); } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { var events = this._events; if (events) { var evlistener = events[type]; if (typeof evlistener === 'function') { return 1; } else if (evlistener) { return evlistener.length; } } return 0; } EventEmitter.prototype.eventNames = function eventNames() { return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; }; // About 1.5x faster than the two-arg version of Array#splice(). function spliceOne(list, index) { for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) list[i] = list[k]; list.pop(); } function arrayClone(arr, n) { var copy = new Array(n); for (var i = 0; i < n; ++i) copy[i] = arr[i]; return copy; } function unwrapListeners(arr) { var ret = new Array(arr.length); for (var i = 0; i < ret.length; ++i) { ret[i] = arr[i].listener || arr[i]; } return ret; } function objectCreatePolyfill(proto) { var F = function () { }; F.prototype = proto; return new F; } function objectKeysPolyfill(obj) { var keys = []; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { keys.push(k); } return k; } function functionBindPolyfill(context) { var fn = this; return function () { return fn.apply(context, arguments); }; } }, {}], 23: [function (require, module, exports) { exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) { } m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) { } if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = (nBytes * 8) - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) { } e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) { } buffer[offset + i - d] |= s * 128 } }, {}], 24: [function (require, module, exports) { /** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; var w = d * 7; var y = d * 365.25; /** * Parse or format the given `val`. * * Options: * * - `long` verbose formatting [false] * * @param {String|Number} val * @param {Object} [options] * @throws {Error} throw an error if val is not a non-empty string or a number * @return {String|Number} * @api public */ module.exports = function (val, options) { options = options || {}; var type = typeof val; if (type === 'string' && val.length > 0) { return parse(val); } else if (type === 'number' && isFinite(val)) { return options.long ? fmtLong(val) : fmtShort(val); } throw new Error( 'val is not a non-empty string or a valid number. val=' + JSON.stringify(val) ); }; /** * Parse the given `str` and return milliseconds. * * @param {String} str * @return {Number} * @api private */ function parse(str) { str = String(str); if (str.length > 100) { return; } var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( str ); if (!match) { return; } var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { case 'years': case 'year': case 'yrs': case 'yr': case 'y': return n * y; case 'weeks': case 'week': case 'w': return n * w; case 'days': case 'day': case 'd': return n * d; case 'hours': case 'hour': case 'hrs': case 'hr': case 'h': return n * h; case 'minutes': case 'minute': case 'mins': case 'min': case 'm': return n * m; case 'seconds': case 'second': case 'secs': case 'sec': case 's': return n * s; case 'milliseconds': case 'millisecond': case 'msecs': case 'msec': case 'ms': return n; default: return undefined; } } /** * Short format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function fmtShort(ms) { var msAbs = Math.abs(ms); if (msAbs >= d) { return Math.round(ms / d) + 'd'; } if (msAbs >= h) { return Math.round(ms / h) + 'h'; } if (msAbs >= m) { return Math.round(ms / m) + 'm'; } if (msAbs >= s) { return Math.round(ms / s) + 's'; } return ms + 'ms'; } /** * Long format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function fmtLong(ms) { var msAbs = Math.abs(ms); if (msAbs >= d) { return plural(ms, msAbs, d, 'day'); } if (msAbs >= h) { return plural(ms, msAbs, h, 'hour'); } if (msAbs >= m) { return plural(ms, msAbs, m, 'minute'); } if (msAbs >= s) { return plural(ms, msAbs, s, 'second'); } return ms + ' ms'; } /** * Pluralization helper. */ function plural(ms, msAbs, n, name) { var isPlural = msAbs >= n * 1.5; return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); } }, {}], 25: [function (require, module, exports) { exports.endianness = function () { return 'LE' }; exports.hostname = function () { if (typeof location !== 'undefined') { return location.hostname } else return ''; }; exports.loadavg = function () { return [] }; exports.uptime = function () { return 0 }; exports.freemem = function () { return Number.MAX_VALUE; }; exports.totalmem = function () { return Number.MAX_VALUE; }; exports.cpus = function () { return [] }; exports.type = function () { return 'Browser' }; exports.release = function () { if (typeof navigator !== 'undefined') { return navigator.appVersion; } return ''; }; exports.networkInterfaces = exports.getNetworkInterfaces = function () { return {} }; exports.arch = function () { return 'javascript' }; exports.platform = function () { return 'browser' }; exports.tmpdir = exports.tmpDir = function () { return '/tmp'; }; exports.EOL = '\n'; exports.homedir = function () { return '/' }; }, {}], 26: [function (require, module, exports) { (function (process) { // .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, // backported and transplited with Babel, with backwards-compat fixes // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // path.resolve([from ...], to) // posix version exports.resolve = function () { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function (path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function (p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function (path) { return path.charAt(0) === '/'; }; // posix version exports.join = function () { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function (p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function (from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function (path) { if (typeof path !== 'string') path = path + ''; if (path.length === 0) return '.'; var code = path.charCodeAt(0); var hasRoot = code === 47 /*/*/; var end = -1; var matchedSlash = true; for (var i = path.length - 1; i >= 1; --i) { code = path.charCodeAt(i); if (code === 47 /*/*/) { if (!matchedSlash) { end = i; break; } } else { // We saw the first non-path separator matchedSlash = false; } } if (end === -1) return hasRoot ? '/' : '.'; if (hasRoot && end === 1) { // return '//'; // Backwards-compat fix: return '/'; } return path.slice(0, end); }; function basename(path) { if (typeof path !== 'string') path = path + ''; var start = 0; var end = -1; var matchedSlash = true; var i; for (i = path.length - 1; i >= 0; --i) { if (path.charCodeAt(i) === 47 /*/*/) { // If we reached a path separator that was not part of a set of path // separators at the end of the string, stop now if (!matchedSlash) { start = i + 1; break; } } else if (end === -1) { // We saw the first non-path separator, mark this as the end of our // path component matchedSlash = false; end = i + 1; } } if (end === -1) return ''; return path.slice(start, end); } // Uses a mixed approach for backwards-compatibility, as ext behavior changed // in new Node.js versions, so only basename() above is backported here exports.basename = function (path, ext) { var f = basename(path); if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function (path) { if (typeof path !== 'string') path = path + ''; var startDot = -1; var startPart = 0; var end = -1; var matchedSlash = true; // Track the state of characters (if any) we see before our first dot and // after any path separator we find var preDotState = 0; for (var i = path.length - 1; i >= 0; --i) { var code = path.charCodeAt(i); if (code === 47 /*/*/) { // If we reached a path separator that was not part of a set of path // separators at the end of the string, stop now if (!matchedSlash) { startPart = i + 1; break; } continue; } if (end === -1) { // We saw the first non-path separator, mark this as the end of our // extension matchedSlash = false; end = i + 1; } if (code === 46 /*.*/) { // If this is our first dot, mark it as the start of our extension if (startDot === -1) startDot = i; else if (preDotState !== 1) preDotState = 1; } else if (startDot !== -1) { // We saw a non-dot and non-path separator before our dot, so we should // have a good chance at having a non-empty extension preDotState = -1; } } if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot preDotState === 0 || // The (right-most) trimmed path component is exactly '..' preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { return ''; } return path.slice(startDot, end); }; function filter(xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this, require('_process')) }, {"_process": 27}], 27: [function (require, module, exports) { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout() { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } }()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e) { try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e) { // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while (len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() { } process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function () { return 0; }; }, {}], 28: [function (require, module, exports) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () { } TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } }, {}], 29: [function (require, module, exports) { module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } }, {}], 30: [function (require, module, exports) { (function (process, global) { // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function (f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function (x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function (fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function () { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function (set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function () { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function () { }; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold': [1, 22], 'italic': [3, 23], 'underline': [4, 24], 'inverse': [7, 27], 'white': [37, 39], 'grey': [90, 39], 'black': [30, 39], 'blue': [34, 39], 'cyan': [36, 39], 'green': [32, 39], 'magenta': [35, 39], 'red': [31, 39], 'yellow': [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function (val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function (key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function (key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || {value: value[key]}; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function (line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function (line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function (prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function () { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function (origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this, require('_process'), typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) }, {"./support/isBuffer": 29, "_process": 27, "inherits": 28}], "rhea": [function (require, module, exports) { (function (process) { /* * 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 Connection = require('./connection.js'); var log = require('./log.js'); var sasl = require('./sasl.js'); var util = require('./util.js'); var eventTypes = require('./eventTypes.js'); var net = require('net'); var tls = require('tls'); var EventEmitter = require('events').EventEmitter; var Container = function (options) { this.options = options ? Object.create(options) : {}; if (!this.options.id) { this.options.id = util.generate_uuid(); } this.id = this.options.id; this.sasl_server_mechanisms = sasl.server_mechanisms(); }; Container.prototype = Object.create(EventEmitter.prototype); Container.prototype.constructor = Container; Container.prototype.dispatch = function (name) { log.events('[%s] Container got event: ' + name, this.id); EventEmitter.prototype.emit.apply(this, arguments); if (this.listeners(name).length) { return true; } else { return false; } }; Container.prototype.connect = function (options) { return new Connection(options, this).connect(); }; Container.prototype.create_connection = function (options) { return new Connection(options, this); }; Container.prototype.listen = function (options) { var container = this; var server; if (options.transport === undefined || options.transport === 'tcp') { server = net.createServer(); server.on('connection', function (socket) { new Connection(options, container).accept(socket); }); } else if (options.transport === 'tls' || options.transport === 'ssl') { server = tls.createServer(options); server.on('secureConnection', function (socket) { new Connection(options, container).accept(socket); }); } else { throw Error('Unrecognised transport: ' + options.transport); } if (process.version.match(/v0\.10\.\d+/)) { server.listen(options.port, options.host); } else { server.listen(options); } return server; }; Container.prototype.create_container = function (options) { return new Container(options); }; Container.prototype.get_option = function (name, default_value) { if (this.options[name] !== undefined) return this.options[name]; else return default_value; }; Container.prototype.generate_uuid = util.generate_uuid; Container.prototype.string_to_uuid = util.string_to_uuid; Container.prototype.uuid_to_string = util.uuid_to_string; var ws = require('./ws.js'); Container.prototype.websocket_accept = function (socket, options) { new Connection(options, this).accept(ws.wrap(socket)); }; Container.prototype.websocket_connect = ws.connect; Container.prototype.filter = require('./filter.js'); Container.prototype.types = require('./types.js'); Container.prototype.message = require('./message.js'); Container.prototype.sasl = sasl; Container.prototype.ReceiverEvents = eventTypes.ReceiverEvents; Container.prototype.SenderEvents = eventTypes.SenderEvents; Container.prototype.SessionEvents = eventTypes.SessionEvents; Container.prototype.ConnectionEvents = eventTypes.ConnectionEvents; module.exports = new Container(); }).call(this, require('_process')) }, { "./connection.js": 1, "./eventTypes.js": 4, "./filter.js": 5, "./log.js": 8, "./message.js": 9, "./sasl.js": 10, "./types.js": 14, "./util.js": 15, "./ws.js": 16, "_process": 27, "events": 22, "net": 18, "tls": 18 }] }, {}, []); kind: ConfigMap metadata: creationTimestamp: 2020-06-17T04:47:23Z name: rhea-configmap namespace: systemtests-selenium resourceVersion: "237360" selfLink: /api/v1/namespaces/systemtests-selenium/configmaps/rhea-configmap uid: a2caca19-b055-11ea-9897-fa163e222c68 kind: List metadata: resourceVersion: "" selfLink: ""