diff --git a/dist/ripple.js b/dist/ripple.js index 924df57..341cfc2 100644 --- a/dist/ripple.js +++ b/dist/ripple.js @@ -4825,736 +4825,558 @@ function config (name) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],27:[function(require,module,exports){ -'use strict'; +require('utilise');'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = backpressure; - -var _from = require('utilise/from'); - -var _from2 = _interopRequireDefault(_from); +exports.default = create; -var _includes = require('utilise/includes'); +var _rijs = require('rijs.backpressure'); -var _includes2 = _interopRequireDefault(_includes); +var _rijs2 = _interopRequireDefault(_rijs); -var _flatten = require('utilise/flatten'); +var _rijs3 = require('rijs.components'); -var _flatten2 = _interopRequireDefault(_flatten); +var _rijs4 = _interopRequireDefault(_rijs3); -var _unique = require('utilise/unique'); +var _rijs5 = require('rijs.versioned'); -var _unique2 = _interopRequireDefault(_unique); +var _rijs6 = _interopRequireDefault(_rijs5); -var _values = require('utilise/values'); +var _rijs7 = require('rijs.singleton'); -var _values2 = _interopRequireDefault(_values); +var _rijs8 = _interopRequireDefault(_rijs7); +var _rijs9 = require('rijs.sessions'); +var _rijs10 = _interopRequireDefault(_rijs9); -var _ready = require('utilise/ready'); +var _rijs11 = require('rijs.features'); -var _ready2 = _interopRequireDefault(_ready); +var _rijs12 = _interopRequireDefault(_rijs11); -var _group = require('utilise/group'); +var _rijs13 = require('rijs.offline'); -var _group2 = _interopRequireDefault(_group); +var _rijs14 = _interopRequireDefault(_rijs13); -var _split = require('utilise/split'); +var _rijs15 = require('rijs.helpers'); -var _split2 = _interopRequireDefault(_split); +var _rijs16 = _interopRequireDefault(_rijs15); -var _attr = require('utilise/attr'); +var _rijs17 = require('rijs.precss'); -var _attr2 = _interopRequireDefault(_attr); +var _rijs18 = _interopRequireDefault(_rijs17); -var _noop = require('utilise/noop'); +var _rijs19 = require('rijs.shadow'); -var _noop2 = _interopRequireDefault(_noop); +var _rijs20 = _interopRequireDefault(_rijs19); -var _not = require('utilise/not'); +var _rijs21 = require('rijs.resdir'); -var _not2 = _interopRequireDefault(_not); +var _rijs22 = _interopRequireDefault(_rijs21); -var _all = require('utilise/all'); +var _rijs23 = require('rijs.mysql'); -var _all2 = _interopRequireDefault(_all); +var _rijs24 = _interopRequireDefault(_rijs23); -var _key = require('utilise/key'); +var _rijs25 = require('rijs.serve'); -var _key2 = _interopRequireDefault(_key); +var _rijs26 = _interopRequireDefault(_rijs25); -var _is = require('utilise/is'); +var _rijs27 = require('rijs.delay'); -var _is2 = _interopRequireDefault(_is); +var _rijs28 = _interopRequireDefault(_rijs27); -var _by = require('utilise/by'); +var _rijs29 = require('rijs.needs'); -var _by2 = _interopRequireDefault(_by); +var _rijs30 = _interopRequireDefault(_rijs29); -var _lo = require('utilise/lo'); +var _rijs31 = require('rijs.sync'); -var _lo2 = _interopRequireDefault(_lo); +var _rijs32 = _interopRequireDefault(_rijs31); -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _rijs33 = require('rijs.core'); -// ------------------------------------------- -// Applies backpressure on the flow of streams -// ------------------------------------------- -function backpressure(ripple) { - log('creating'); - if (!ripple.io) return ripple; - if (true) return ripple.render = loaded(ripple)(ripple.render), ripple.pull = emit(ripple), ripple.deps = deps, ripple.requested = {}, (0, _ready2.default)(start(ripple)), ripple.io.on('connect', refresh(ripple)), ripple.io.on('reconnect', reconnect(ripple)), ripple; +var _rijs34 = _interopRequireDefault(_rijs33); - ripple.to = limit(ripple.to); - ripple.from = track(ripple)(ripple.from); - ripple.io.use(function (socket, next) { - socket.deps = {}, next(); - }); - return ripple; -} +var _rijs35 = require('rijs.data'); -var start = function start(ripple) { - return function (d) { - return scan(ripple)(document.body); - }; -}; +var _rijs36 = _interopRequireDefault(_rijs35); -var scan = function scan(ripple) { - return function (el) { - return !el ? undefined : ((0, _all2.default)('*', el).filter((0, _by2.default)('nodeName', (0, _includes2.default)('-'))).filter((0, _by2.default)('nodeName', function (d) { - return !_is2.default.in(ripple.requested)((0, _lo2.default)(d)); - })).map(ripple.draw), el); - }; -}; +var _rijs37 = require('rijs.css'); -var track = function track(ripple) { - return function (next) { - return function (req, res) { - var name = req.name; - var type = req.type; - var socket = req.socket; - var send = ripple.send; - var exists = name in socket.deps; +var _rijs38 = _interopRequireDefault(_rijs37); - if (!(name in ripple.resources)) return; - if (type !== 'pull') return (next || identity)(req, res); - socket.deps[name] = 1; - send(socket)(name); - return false; - }; - }; -}; +var _rijs39 = require('rijs.fn'); -var reconnect = function reconnect(_ref) { - var io = _ref.io; - return function (d) { - return io.io.disconnect(), io.io.connect(); - }; -}; +var _rijs40 = _interopRequireDefault(_rijs39); -var refresh = function refresh(ripple) { - return function (d) { - return (0, _group2.default)('refreshing', function (d) { - return (0, _values2.default)(ripple.resources).map(function (_ref2) { - var name = _ref2.name; - return emit(ripple)(name); - }); - }); - }; -}; +var _rijs41 = require('rijs.db'); -var emit = function emit(ripple) { - return function (name) { - log('pulling', name); - ripple.io.emit('change', { name: name, type: 'pull' }); - ripple.requested[name] = 1; - return name; - }; -}; +var _rijs42 = _interopRequireDefault(_rijs41); -var limit = function limit(next) { - return function (req) { - return req.name in req.socket.deps ? (next || identity)(req) : false; - }; -}; -var deps = function deps(el) { - return format([(0, _key2.default)('nodeName'), (0, _attr2.default)('data'), (0, _attr2.default)('css'), (0, _attr2.default)('is')])(el); -}; -var format = function format(arr) { - return function (el) { - return arr.map(function (extract) { - return extract(el); - }).filter(Boolean).map(_lo2.default).map((0, _split2.default)(' ')).reduce(_flatten2.default, []).filter(_unique2.default); - }; -}; +/* istanbul ignore next */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var loaded = function loaded(ripple) { - return function (next) { - return function (el) { - return ripple.deps(el).filter((0, _not2.default)(_is2.default.in(ripple.requested))).map(emit(ripple)).length ? false : scan(ripple)(next(el)); - }; - }; -}; +true && !window.ripple && create(); -var log = require('utilise/log')('[ri/back]'), - err = require('utilise/err')('[ri/back]'); -},{"utilise/all":290,"utilise/attr":293,"utilise/by":295,"utilise/err":307,"utilise/flatten":313,"utilise/from":316,"utilise/group":318,"utilise/includes":324,"utilise/is":326,"utilise/key":328,"utilise/lo":331,"utilise/log":332,"utilise/noop":346,"utilise/not":347,"utilise/ready":361,"utilise/split":368,"utilise/unique":375,"utilise/values":377}],28:[function(require,module,exports){ -'use strict'; +function create(opts) { + var ripple = (0, _rijs34.default)(); // empty base collection of resources -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = components; + // enrich.. + (0, _rijs8.default)(ripple); // exposes a single instance + (0, _rijs36.default)(ripple); // register data types + (0, _rijs38.default)(ripple); // register css types + (0, _rijs40.default)(ripple); // register fn types + (0, _rijs16.default)(ripple); // expose helper functions and constants + (0, _rijs24.default)(ripple); // adds mysql adaptor crud hooks + (0, _rijs42.default)(ripple, opts); // enable external connections + (0, _rijs4.default)(ripple); // invoke web components, fn.call(, data) + (0, _rijs30.default)(ripple); // define default attrs for components + (0, _rijs18.default)(ripple); // preapplies scoped css + (0, _rijs20.default)(ripple); // encapsulates with shadow dom or closes gap + (0, _rijs28.default)(ripple); // async rendering delay + (0, _rijs26.default)(ripple, opts); // serve client libraries + (0, _rijs14.default)(ripple); // loads/saves from/to localstorage + (0, _rijs32.default)(ripple, opts); // syncs resources between server/client + (0, _rijs2.default)(ripple); // restricts broadcast to clients based on need + (0, _rijs12.default)(ripple); // extend components with features + (0, _rijs6.default)(ripple); // versioning info and time travel + (0, _rijs10.default)(ripple, opts); // populates sessionid on each connection + (0, _rijs22.default)(ripple, opts); // loads from resources folder -var _overwrite = require('utilise/overwrite'); + return ripple; +} -var _overwrite2 = _interopRequireDefault(_overwrite); +},{"rijs.backpressure":72,"rijs.components":97,"rijs.core":123,"rijs.css":146,"rijs.data":153,"rijs.db":172,"rijs.delay":173,"rijs.features":181,"rijs.fn":197,"rijs.helpers":205,"rijs.mysql":222,"rijs.needs":223,"rijs.offline":237,"rijs.precss":257,"rijs.resdir":281,"rijs.serve":282,"rijs.sessions":283,"rijs.shadow":284,"rijs.singleton":292,"rijs.sync":298,"rijs.versioned":323,"utilise":393}],28:[function(require,module,exports){ +module.exports = after -var _includes = require('utilise/includes'); +function after(count, callback, err_cb) { + var bail = false + err_cb = err_cb || noop + proxy.count = count -var _includes2 = _interopRequireDefault(_includes); + return (count === 0) ? callback() : proxy -var _header = require('utilise/header'); + function proxy(err, result) { + if (proxy.count <= 0) { + throw new Error('after called too many times') + } + --proxy.count -var _header2 = _interopRequireDefault(_header); + // after first error, rest are passed to err_cb + if (err) { + bail = true + callback(err) + // future error callbacks will go to error handler + callback = err_cb + } else if (proxy.count === 0 && !bail) { + callback(null, result) + } + } +} +function noop() {} +},{}],29:[function(require,module,exports){ +/** + * An abstraction for slicing an arraybuffer even when + * ArrayBuffer.prototype.slice is not supported + * + * @api public + */ -var _values = require('utilise/values'); +module.exports = function(arraybuffer, start, end) { + var bytes = arraybuffer.byteLength; + start = start || 0; + end = end || bytes; -var _values2 = _interopRequireDefault(_values); + if (arraybuffer.slice) { return arraybuffer.slice(start, end); } -var _proxy = require('utilise/proxy'); + if (start < 0) { start += bytes; } + if (end < 0) { end += bytes; } + if (end > bytes) { end = bytes; } -var _proxy2 = _interopRequireDefault(_proxy); + if (start >= bytes || start >= end || bytes === 0) { + return new ArrayBuffer(0); + } -var _attr = require('utilise/attr'); - -var _attr2 = _interopRequireDefault(_attr); + var abv = new Uint8Array(arraybuffer); + var result = new Uint8Array(end - start); + for (var i = start, ii = 0; i < end; i++, ii++) { + result[ii] = abv[i]; + } + return result.buffer; +}; -var _noop = require('utilise/noop'); +},{}],30:[function(require,module,exports){ -var _noop2 = _interopRequireDefault(_noop); +/** + * Expose `Backoff`. + */ -var _time = require('utilise/time'); +module.exports = Backoff; -var _time2 = _interopRequireDefault(_time); +/** + * Initialize backoff timer with `opts`. + * + * - `min` initial timeout in milliseconds [100] + * - `max` max timeout [10000] + * - `jitter` [0] + * - `factor` [2] + * + * @param {Object} opts + * @api public + */ -var _key = require('utilise/key'); +function Backoff(opts) { + opts = opts || {}; + this.ms = opts.min || 100; + this.max = opts.max || 10000; + this.factor = opts.factor || 2; + this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0; + this.attempts = 0; +} -var _key2 = _interopRequireDefault(_key); +/** + * Return the backoff duration. + * + * @return {Number} + * @api public + */ -var _all = require('utilise/all'); +Backoff.prototype.duration = function(){ + var ms = this.ms * Math.pow(this.factor, this.attempts++); + if (this.jitter) { + var rand = Math.random(); + var deviation = Math.floor(rand * this.jitter * ms); + ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation; + } + return Math.min(ms, this.max) | 0; +}; -var _all2 = _interopRequireDefault(_all); +/** + * Reset the number of attempts. + * + * @api public + */ -var _is = require('utilise/is'); +Backoff.prototype.reset = function(){ + this.attempts = 0; +}; -var _is2 = _interopRequireDefault(_is); +/** + * Set the minimum duration + * + * @api public + */ -var _lo = require('utilise/lo'); +Backoff.prototype.setMin = function(min){ + this.ms = min; +}; -var _lo2 = _interopRequireDefault(_lo); +/** + * Set the maximum duration + * + * @api public + */ -var _data = require('./types/data'); +Backoff.prototype.setMax = function(max){ + this.max = max; +}; -var _data2 = _interopRequireDefault(_data); +/** + * Set the jitter + * + * @api public + */ -var _fn = require('./types/fn'); +Backoff.prototype.setJitter = function(jitter){ + this.jitter = jitter; +}; -var _fn2 = _interopRequireDefault(_fn); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +},{}],31:[function(require,module,exports){ +/* + * base64-arraybuffer + * https://github.com/niklasvh/base64-arraybuffer + * + * Copyright (c) 2012 Niklas von Hertzen + * Licensed under the MIT license. + */ +(function(chars){ + "use strict"; -// ------------------------------------------- -// API: Renders specific nodes, resources or everything -// ------------------------------------------- -// ripple.draw() - redraw all components on page -// ripple.draw(element) - redraw specific element -// ripple.draw.call(element) - redraw specific element -// ripple.draw.call(selection) - redraw D3 selection -// ripple.draw('name') - redraw elements that depend on resource -// ripple.draw({ ... }) - redraw elements that depend on resource -// MutationObserver(ripple.draw) - redraws element being observed + exports.encode = function(arraybuffer) { + var bytes = new Uint8Array(arraybuffer), + i, len = bytes.length, base64 = ""; -function components(ripple) { - if (!true) return ripple; - log('creating'); + for (i = 0; i < len; i+=3) { + base64 += chars[bytes[i] >> 2]; + base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; + base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; + base64 += chars[bytes[i + 2] & 63]; + } - (0, _values2.default)(ripple.types).map(function (type) { - return type.parse = (0, _proxy2.default)(type.parse, clean(ripple)); - }); - (0, _key2.default)('types.application/javascript.render', function (d) { - return (0, _fn2.default)(ripple); - })(ripple); - (0, _key2.default)('types.application/data.render', function (d) { - return (0, _data2.default)(ripple); - })(ripple); - ripple.draw = Node.prototype.draw = draw(ripple); - ripple.render = render(ripple); - ripple.on('change.draw', ripple.draw); - (0, _time2.default)(0, ripple.draw); - return ripple; -} + if ((len % 3) === 2) { + base64 = base64.substring(0, base64.length - 1) + "="; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + "=="; + } -// public draw api -function draw(ripple) { - return function (thing) { - return this && this.nodeName ? invoke(ripple)(this) : this && this.node ? invoke(ripple)(this.node()) : !thing ? everything(ripple) : thing instanceof mutation ? invoke(ripple)(thing.target) : thing[0] instanceof mutation ? invoke(ripple)(thing[0].target) : thing.nodeName ? invoke(ripple)(thing) : thing.node ? invoke(ripple)(thing.node()) : thing.name ? resource(ripple)(thing.name) : _is2.default.str(thing) ? resource(ripple)(thing) : err('could not update', thing); + return base64; }; -} -// render all components -var everything = function everything(ripple) { - var selector = (0, _values2.default)(ripple.resources).filter((0, _header2.default)('content-type', 'application/javascript')).map((0, _key2.default)('name')).join(','); + exports.decode = function(base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, i, p = 0, + encoded1, encoded2, encoded3, encoded4; - return !selector ? [] : (0, _all2.default)(selector).map(invoke(ripple)); -}; + if (base64[base64.length - 1] === "=") { + bufferLength--; + if (base64[base64.length - 2] === "=") { + bufferLength--; + } + } -// render all elements that depend on the resource -var resource = function resource(ripple) { - return function (name) { - var res = ripple.resources[name], - type = (0, _header2.default)('content-type')(res); + var arraybuffer = new ArrayBuffer(bufferLength), + bytes = new Uint8Array(arraybuffer); - return (ripple.types[type].render || _noop2.default)(res); - }; -}; + for (i = 0; i < len; i+=4) { + encoded1 = chars.indexOf(base64[i]); + encoded2 = chars.indexOf(base64[i+1]); + encoded3 = chars.indexOf(base64[i+2]); + encoded4 = chars.indexOf(base64[i+3]); -// batch renders on render frames -var batch = function batch(ripple) { - return function (el) { - return el.pending ? el.pending.push(ripple.change) : (el.pending = [ripple.change], requestAnimationFrame(function (d) { - el.change = el.pending; - delete el.pending; - ripple.render(el); - })); - }; -}; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } -// main function to render a particular custom element with any data it needs -var invoke = function invoke(ripple) { - return function (el) { - if (!(0, _includes2.default)('-')(el.nodeName)) return; - if (el.nodeName == '#document-fragment') return invoke(ripple)(el.host); - if (el.nodeName == '#text') return invoke(ripple)(el.parentNode); - if (!el.matches(isAttached)) return; - if ((0, _attr2.default)(el, 'inert') != null) return; - return batch(ripple)(el), el; + return arraybuffer; }; -}; +})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -var render = function render(ripple) { - return function (el) { - var name = (0, _lo2.default)(el.tagName), - deps = (0, _attr2.default)(el, 'data'), - fn = body(ripple)(name), - data = bodies(ripple)(deps), - root = el.shadowRoot || el; +},{}],32:[function(require,module,exports){ +(function (global){ +/** + * Create a blob builder even when vendor prefixes exist + */ - if (!fn) return el; - if (deps && !data) return el; +var BlobBuilder = global.BlobBuilder + || global.WebKitBlobBuilder + || global.MSBlobBuilder + || global.MozBlobBuilder; - try { - fn.call(root, defaults(el, data), index(el), root); - } catch (e) { - err(e, e.stack); - } +/** + * Check if Blob constructor is supported + */ - return el; - }; -}; +var blobSupported = (function() { + try { + var a = new Blob(['hi']); + return a.size === 2; + } catch(e) { + return false; + } +})(); -// clean local headers for transport -var clean = function clean(ripple) { - return function (res) { - return delete res.headers.pending, res; - }; -}; +/** + * Check if Blob constructor supports ArrayBufferViews + * Fails in Safari 6, so we need to map to ArrayBuffers there. + */ -// helpers -var defaults = function defaults(el, data) { - el.state = el.state || {}; - (0, _overwrite2.default)(el.state)(data); - (0, _overwrite2.default)(el.state)(el.__data__); - el.__data__ = el.state; - return el.state; -}; - -var bodies = function bodies(ripple) { - return function (deps) { - var o = {}, - names = deps ? deps.split(' ') : []; - - names.map(function (d) { - return o[d] = body(ripple)(d); - }); - - return !names.length ? undefined : (0, _values2.default)(o).some(_is2.default.falsy) ? undefined : o; - }; -}; - -var body = function body(ripple) { - return function (name) { - return ripple.resources[name] && ripple.resources[name].body; - }; -}; - -var index = function index(el) { - return Array.prototype.indexOf.call((0, _key2.default)('parentNode.children')(el) || [], el); -}; +var blobSupportsArrayBufferView = blobSupported && (function() { + try { + var b = new Blob([new Uint8Array([1,2])]); + return b.size === 2; + } catch(e) { + return false; + } +})(); -var log = require('utilise/log')('[ri/components]'), - err = require('utilise/err')('[ri/components]'), - mutation = true && window.MutationRecord || _noop2.default, - customs = true && !!document.registerElement, - isAttached = customs ? 'html *, :host-context(html) *' : 'html *'; -true && (Element.prototype.matches = Element.prototype.matches || Element.prototype.msMatchesSelector); -},{"./types/data":29,"./types/fn":30,"utilise/all":290,"utilise/attr":293,"utilise/err":307,"utilise/header":321,"utilise/includes":324,"utilise/is":326,"utilise/key":328,"utilise/lo":331,"utilise/log":332,"utilise/noop":346,"utilise/overwrite":350,"utilise/proxy":358,"utilise/time":373,"utilise/values":377}],29:[function(require,module,exports){ -'use strict'; +/** + * Check if BlobBuilder is supported + */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = data; +var blobBuilderSupported = BlobBuilder + && BlobBuilder.prototype.append + && BlobBuilder.prototype.getBlob; -var _all = require('utilise/all'); +/** + * Helper function that maps ArrayBufferViews to ArrayBuffers + * Used by BlobBuilder constructor and old browsers that didn't + * support it in the Blob constructor. + */ -var _all2 = _interopRequireDefault(_all); +function mapArrayBufferViews(ary) { + for (var i = 0; i < ary.length; i++) { + var chunk = ary[i]; + if (chunk.buffer instanceof ArrayBuffer) { + var buf = chunk.buffer; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // if this is a subarray, make a copy so we only + // include the subarray region from the underlying buffer + if (chunk.byteLength !== buf.byteLength) { + var copy = new Uint8Array(chunk.byteLength); + copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength)); + buf = copy.buffer; + } -// render all elements that require the specified data -function data(ripple) { - return function (res) { - return (0, _all2.default)('[data~="' + res.name + '"]:not([inert])').map(ripple.draw); - }; + ary[i] = buf; + } + } } -},{"utilise/all":290}],30:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = fn; - -var _includes = require('utilise/includes'); - -var _includes2 = _interopRequireDefault(_includes); +function BlobBuilderConstructor(ary, options) { + options = options || {}; + var bb = new BlobBuilder(); + mapArrayBufferViews(ary); -var _all = require('utilise/all'); + for (var i = 0; i < ary.length; i++) { + bb.append(ary[i]); + } -var _all2 = _interopRequireDefault(_all); + return (options.type) ? bb.getBlob(options.type) : bb.getBlob(); +}; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function BlobConstructor(ary, options) { + mapArrayBufferViews(ary); + return new Blob(ary, options || {}); +}; -// register custom element prototype (render is automatic) -function fn(ripple) { - return function (res) { - if (!customs || !customEl(res) || registered(res)) return (0, _all2.default)(res.name + ':not([inert])\n ,[is="' + res.name + '"]:not([inert])').map(ripple.draw); +module.exports = (function() { + if (blobSupported) { + return blobSupportsArrayBufferView ? global.Blob : BlobConstructor; + } else if (blobBuilderSupported) { + return BlobBuilderConstructor; + } else { + return undefined; + } +})(); - var proto = Object.create(HTMLElement.prototype), - opts = { prototype: proto }; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],33:[function(require,module,exports){ +/* - proto.attachedCallback = ripple.draw; - document.registerElement(res.name, opts); - }; -} +The MIT License (MIT) -var registered = function registered(res) { - return document.createElement(res.name).attachedCallback; -}; +Original Library + - Copyright (c) Marak Squires -var customs = true && !!document.registerElement, - customEl = function customEl(d) { - return (0, _includes2.default)('-')(d.name); -}; -},{"utilise/all":290,"utilise/includes":324}],31:[function(require,module,exports){ -'use strict'; +Additional functionality + - Copyright (c) Sindre Sorhus (sindresorhus.com) -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = core; +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: -var _emitterify = require('utilise/emitterify'); +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -var _emitterify2 = _interopRequireDefault(_emitterify); +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 _colorfill = require('utilise/colorfill'); +*/ -var _colorfill2 = _interopRequireDefault(_colorfill); +var colors = {}; +module['exports'] = colors; -var _identity = require('utilise/identity'); +colors.themes = {}; -var _identity2 = _interopRequireDefault(_identity); +var ansiStyles = colors.styles = require('./styles'); +var defineProps = Object.defineProperties; -var _header = require('utilise/header'); +colors.supportsColor = require('./system/supports-colors'); -var _header2 = _interopRequireDefault(_header); +if (typeof colors.enabled === "undefined") { + colors.enabled = colors.supportsColor; +} -var _values = require('utilise/values'); +colors.stripColors = colors.strip = function(str){ + return ("" + str).replace(/\x1B\[\d+m/g, ''); +}; -var _values2 = _interopRequireDefault(_values); -var _key = require('utilise/key'); +var stylize = colors.stylize = function stylize (str, style) { + if (!colors.enabled) { + return str+''; + } -var _key2 = _interopRequireDefault(_key); + return ansiStyles[style].open + str + ansiStyles[style].close; +} -var _is = require('utilise/is'); +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +var escapeStringRegexp = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + return str.replace(matchOperatorsRe, '\\$&'); +} -var _is2 = _interopRequireDefault(_is); +function build(_styles) { + var builder = function builder() { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + // __proto__ is used because we must return a function, but there is + // no way to create a function with a different prototype. + builder.__proto__ = proto; + return builder; +} -var _to = require('utilise/to'); +var styles = (function () { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function (key) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + ret[key] = { + get: function () { + return build(this._styles.concat(key)); + } + }; + }); + return ret; +})(); -var _to2 = _interopRequireDefault(_to); +var proto = defineProps(function colors() {}, styles); -var _za = require('utilise/za'); +function applyStyle() { + var args = arguments; + var argsLen = args.length; + var str = argsLen !== 0 && String(arguments[0]); + if (argsLen > 1) { + for (var a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } -var _za2 = _interopRequireDefault(_za); + if (!colors.enabled || !str) { + return str; + } -var _text = require('./types/text'); + var nestedStyles = this._styles; -var _text2 = _interopRequireDefault(_text); + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + } -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// ------------------------------------------- -// API: Gets or sets a resource -// ------------------------------------------- -// ripple('name') - returns the resource body if it exists -// ripple('name') - creates & returns resource if it doesn't exist -// ripple('name', {}) - creates & returns resource, with specified name and body -// ripple({ ... }) - creates & returns resource, with specified name, body and headers -// ripple.resources - returns raw resources -// ripple.resource - alias for ripple, returns ripple instead of resource for method chaining -// ripple.register - alias for ripple -// ripple.on - event listener for changes - all resources -// ripple('name').on - event listener for changes - resource-specific - -function core() { - log('creating'); - - var resources = {}; - ripple.resources = resources; - ripple.resource = chainable(ripple); - ripple.register = ripple; - ripple.types = types(); - return (0, _emitterify2.default)(ripple); - - function ripple(name, body, headers) { - return !name ? ripple : _is2.default.arr(name) ? name.map(ripple) : _is2.default.obj(name) && !name.name ? ripple((0, _values2.default)(name)) : _is2.default.fn(name) && name.resources ? ripple((0, _values2.default)(name.resources)) : _is2.default.str(name) && !body && resources[name] ? resources[name].body : _is2.default.str(name) && !body && !resources[name] ? register(ripple)({ name: name }) : _is2.default.str(name) && body ? register(ripple)({ name: name, body: body, headers: headers }) : _is2.default.obj(name) && !_is2.default.arr(name) ? register(ripple)(name) : (err('could not find or create resource', name), false); - } -} - -var register = function register(ripple) { - return function (_ref) { - var name = _ref.name; - var body = _ref.body; - var _ref$headers = _ref.headers; - var headers = _ref$headers === undefined ? {} : _ref$headers; - - log('registering', name); - var res = normalise(ripple)({ name: name, body: body, headers: headers }); - - if (!res) return err('failed to register', name), false; - ripple.resources[name] = res; - ripple.emit('change', [name, { - type: 'update', - value: res.body, - time: now(res) - }]); - return ripple.resources[name].body; - }; -}; - -var normalise = function normalise(ripple) { - return function (res) { - if (!(0, _header2.default)('content-type')(res)) (0, _values2.default)(ripple.types).sort((0, _za2.default)('priority')).some(contentType(res)); - if (!(0, _header2.default)('content-type')(res)) return err('could not understand resource', res), false; - return parse(ripple)(res); - }; -}; - -var parse = function parse(ripple) { - return function (res) { - var type = (0, _header2.default)('content-type')(res); - if (!ripple.types[type]) return err('could not understand type', type), false; - return (ripple.types[type].parse || _identity2.default)(res); - }; -}; - -var contentType = function contentType(res) { - return function (type) { - return type.check(res) && (res.headers['content-type'] = type.header); - }; -}; - -var types = function types() { - return [_text2.default].reduce(_to2.default.obj('header'), 1); -}; - -var chainable = function chainable(fn) { - return function () { - return fn.apply(this, arguments), fn; - }; -}; - -var err = require('utilise/err')('[ri/core]'), - log = require('utilise/log')('[ri/core]'), - now = function now(d, t) { - return t = (0, _key2.default)('body.log.length')(d), _is2.default.num(t) ? t - 1 : t; -}; -},{"./types/text":32,"utilise/colorfill":44,"utilise/emitterify":47,"utilise/err":48,"utilise/header":51,"utilise/identity":52,"utilise/is":54,"utilise/key":55,"utilise/log":57,"utilise/to":61,"utilise/values":62,"utilise/za":63}],32:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _includes = require('utilise/includes'); - -var _includes2 = _interopRequireDefault(_includes); - -var _is = require('utilise/is'); - -var _is2 = _interopRequireDefault(_is); - -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = { - header: 'text/plain', - check: function check(res) { - return !(0, _includes2.default)('.html')(res.name) && !(0, _includes2.default)('.css')(res.name) && _is2.default.str(res.body); - } -}; -},{"utilise/includes":53,"utilise/is":54}],33:[function(require,module,exports){ -/* - -The MIT License (MIT) - -Original Library - - Copyright (c) Marak Squires - -Additional functionality - - Copyright (c) Sindre Sorhus (sindresorhus.com) - -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 colors = {}; -module['exports'] = colors; - -colors.themes = {}; - -var ansiStyles = colors.styles = require('./styles'); -var defineProps = Object.defineProperties; - -colors.supportsColor = require('./system/supports-colors'); - -if (typeof colors.enabled === "undefined") { - colors.enabled = colors.supportsColor; -} - -colors.stripColors = colors.strip = function(str){ - return ("" + str).replace(/\x1B\[\d+m/g, ''); -}; - - -var stylize = colors.stylize = function stylize (str, style) { - if (!colors.enabled) { - return str+''; - } - - return ansiStyles[style].open + str + ansiStyles[style].close; -} - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; -var escapeStringRegexp = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - return str.replace(matchOperatorsRe, '\\$&'); -} - -function build(_styles) { - var builder = function builder() { - return applyStyle.apply(builder, arguments); - }; - builder._styles = _styles; - // __proto__ is used because we must return a function, but there is - // no way to create a function with a different prototype. - builder.__proto__ = proto; - return builder; -} - -var styles = (function () { - var ret = {}; - ansiStyles.grey = ansiStyles.gray; - Object.keys(ansiStyles).forEach(function (key) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - ret[key] = { - get: function () { - return build(this._styles.concat(key)); - } - }; - }); - return ret; -})(); - -var proto = defineProps(function colors() {}, styles); - -function applyStyle() { - var args = arguments; - var argsLen = args.length; - var str = argsLen !== 0 && String(arguments[0]); - if (argsLen > 1) { - for (var a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } - - if (!colors.enabled || !str) { - return str; - } - - var nestedStyles = this._styles; - - var i = nestedStyles.length; - while (i--) { - var code = ansiStyles[nestedStyles[i]]; - str = code.open + str.replace(code.closeRe, code.open) + code.close; - } - - return str; -} + return str; +} function applyTheme (theme) { for (var style in theme) { @@ -6092,6096 +5914,6629 @@ module.exports = (function () { })(); }).call(this,require('_process')) },{"_process":13}],44:[function(require,module,exports){ -var client = true - , colors = !client && require('colors') - , has = require('utilise/has') - , is = require('utilise/is') +/** + * Slice reference. + */ -module.exports = colorfill() +var slice = [].slice; -function colorfill(){ - /* istanbul ignore next */ - ['red', 'green', 'bold', 'grey', 'strip'].forEach(function(color) { - !is.str(String.prototype[color]) && Object.defineProperty(String.prototype, color, { - get: function() { - return String(this) - } - }) - }) -} +/** + * Bind `obj` to `fn`. + * + * @param {Object} obj + * @param {Function|String} fn or string + * @return {Function} + * @api public + */ +module.exports = function(obj, fn){ + if ('string' == typeof fn) fn = obj[fn]; + if ('function' != typeof fn) throw new Error('bind() requires a function'); + var args = slice.call(arguments, 2); + return function(){ + return fn.apply(obj, args.concat(slice.call(arguments))); + } +}; -},{"colors":37,"utilise/has":50,"utilise/is":54}],45:[function(require,module,exports){ -module.exports = function datum(node){ - return node.__data__ -} -},{}],46:[function(require,module,exports){ -var has = require('utilise/has') - -module.exports = function def(o, p, v, w){ - if (o.host && o.host.nodeName) o = o.host - if (p.name) v = p, p = p.name - !has(o, p) && Object.defineProperty(o, p, { value: v, writable: w }) - return o[p] -} +},{}],45:[function(require,module,exports){ -},{"utilise/has":50}],47:[function(require,module,exports){ -var err = require('utilise/err')('[emitterify]') - , keys = require('utilise/keys') - , def = require('utilise/def') - , not = require('utilise/not') - , is = require('utilise/is') - -module.exports = function emitterify(body, dparam) { - return def(body, 'emit', emit, 1) - , def(body, 'once', once, 1) - , def(body, 'on', on, 1) - , body +/** + * Expose `Emitter`. + */ - function emit(type, param, filter) { - var ns = type.split('.')[1] - , id = type.split('.')[0] - , li = body.on[id] || [] - , tt = li.length - 1 - , tp = is.def(param) ? param - : is.def(dparam) ? dparam - : [body] - , pm = is.arr(tp) ? tp : [tp] +module.exports = Emitter; - if (ns) return invoke(li, ns, pm), body +/** + * Initialize a new `Emitter`. + * + * @api public + */ - for (var i = li.length; i >=0; i--) - invoke(li, i, pm) +function Emitter(obj) { + if (obj) return mixin(obj); +}; - keys(li) - .filter(not(isFinite)) - .filter(filter || Boolean) - .map(function(n){ return invoke(li, n, pm) }) +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ - return body +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; } + return obj; +} - function invoke(o, k, p){ - if (!o[k]) return - var fn = o[k] - o[k].once && (isFinite(k) ? o.splice(k, 1) : delete o[k]) - try { fn.apply(body, p) } catch(e) { err(e, e.stack) } - } +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - function on(type, callback) { - var ns = type.split('.')[1] - , id = type.split('.')[0] +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks[event] = this._callbacks[event] || []) + .push(fn); + return this; +}; - body.on[id] = body.on[id] || [] - return !callback && !ns ? (body.on[id]) - : !callback && ns ? (body.on[id][ns]) - : ns ? (body.on[id][ns] = callback, body) - : (body.on[id].push(callback), body) - } +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ - function once(type, callback){ - return callback.once = true, body.on(type, callback), body - } -} -},{"utilise/def":46,"utilise/err":48,"utilise/is":54,"utilise/keys":56,"utilise/not":58}],48:[function(require,module,exports){ -var owner = require('utilise/owner') - , to = require('utilise/to') +Emitter.prototype.once = function(event, fn){ + var self = this; + this._callbacks = this._callbacks || {}; -module.exports = function err(prefix){ - return function(d){ - if (!owner.console || !console.error.apply) return d; - var args = to.arr(arguments) - args.unshift(prefix.red ? prefix.red : prefix) - return console.error.apply(console, args), d + function on() { + self.off(event, on); + fn.apply(this, arguments); } -} -},{"utilise/owner":59,"utilise/to":61}],49:[function(require,module,exports){ -var datum = require('utilise/datum') - , key = require('utilise/key') -module.exports = from -from.parent = fromParent + on.fn = fn; + this.on(event, on); + return this; +}; -function from(o){ - return function(k){ - return key(k)(o) - } -} +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ -function fromParent(k){ - return datum(this.parentNode)[k] -} -},{"utilise/datum":45,"utilise/key":55}],50:[function(require,module,exports){ -module.exports = function has(o, k) { - return k in o -} -},{}],51:[function(require,module,exports){ -var key = require('utilise/key') +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; -module.exports = function header(header, value) { - var getter = arguments.length == 1 - return function(d){ - return !d || !d.headers ? null - : getter ? key(header)(d.headers) - : key(header)(d.headers) == value - } -} -},{"utilise/key":55}],52:[function(require,module,exports){ -module.exports = function identity(d) { - return d -} -},{}],53:[function(require,module,exports){ -module.exports = function includes(pattern){ - return function(d){ - return d && d.indexOf && ~d.indexOf(pattern) + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; } -} -},{}],54:[function(require,module,exports){ -module.exports = is -is.fn = isFunction -is.str = isString -is.num = isNumber -is.obj = isObject -is.lit = isLiteral -is.bol = isBoolean -is.truthy = isTruthy -is.falsy = isFalsy -is.arr = isArray -is.null = isNull -is.def = isDef -is.in = isIn -function is(v){ - return function(d){ - return d == v - } -} + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) return this; -function isFunction(d) { - return typeof d == 'function' -} + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks[event]; + return this; + } -function isBoolean(d) { - return typeof d == 'boolean' -} + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; +}; -function isString(d) { - return typeof d == 'string' -} +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ -function isNumber(d) { - return typeof d == 'number' -} +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks[event]; -function isObject(d) { - return typeof d == 'object' -} + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } -function isLiteral(d) { - return typeof d == 'object' - && !(d instanceof Array) -} + return this; +}; -function isTruthy(d) { - return !!d == true -} +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ -function isFalsy(d) { - return !!d == false -} +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks[event] || []; +}; -function isArray(d) { - return d instanceof Array -} - -function isNull(d) { - return d === null -} - -function isDef(d) { - return typeof d !== 'undefined' -} - -function isIn(set) { - return function(d){ - return !set ? false - : set.indexOf ? ~set.indexOf(d) - : d in set - } -} -},{}],55:[function(require,module,exports){ -var str = require('utilise/str') - , is = require('utilise/is') - -module.exports = function key(k, v){ - var set = arguments.length > 1 - , keys = is.fn(k) ? [] : str(k).split('.') - , root = keys.shift() +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ - return function deep(o, i){ - var masked = {} - - return !o ? undefined - : !is.num(k) && !k ? o - : is.arr(k) ? (k.map(copy), masked) - : o[k] || !keys.length ? (set ? ((o[k] = is.fn(v) ? v(o[k], i) : v), o) - : (is.fn(k) ? k(o) : o[k])) - : (set ? (key(keys.join('.'), v)(o[root] ? o[root] : (o[root] = {})), o) - : key(keys.join('.'))(o[root])) +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; - function copy(k){ - var val = key(k)(o) - ;(val != undefined) && key(k, val)(masked) - } - } -} -},{"utilise/is":54,"utilise/str":60}],56:[function(require,module,exports){ -var is = require('utilise/is') +},{}],46:[function(require,module,exports){ -module.exports = function keys(o) { - return Object.keys(is.obj(o) || is.fn(o) ? o : {}) +module.exports = function(a, b){ + var fn = function(){}; + fn.prototype = b.prototype; + a.prototype = new fn; + a.prototype.constructor = a; +}; +},{}],47:[function(require,module,exports){ +module.exports = function scope(styles, prefix) { + return styles + .replace(/^(?!.*:host)([^@%\n]*){/gim, function($1){ return prefix+' '+$1 }) // ... { -> tag ... { + .replace(/^(?!.*:host)(.*?),\s*$/gim, function($1){ return prefix+' '+$1 }) // ... , -> tag ... , + .replace(/:host\((.*?)\)/gi, function($1, $2){ return prefix+$2 }) // :host(...) -> tag... + .replace(/:host /gi, prefix + ' ') // :host ... -> tag ... + .replace(/^.*:host-context\((.*)\)/gim, function($1, $2){ return $2+' ' +prefix }) // ... :host-context(..) -> ... tag.. } -},{"utilise/is":54}],57:[function(require,module,exports){ -var is = require('utilise/is') - , to = require('utilise/to') - , owner = require('utilise/owner') +},{}],48:[function(require,module,exports){ -module.exports = function log(prefix){ - return function(d){ - if (!owner.console || !console.log.apply) return d; - is.arr(arguments[2]) && (arguments[2] = arguments[2].length) - var args = to.arr(arguments) - args.unshift(prefix.grey ? prefix.grey : prefix) - return console.log.apply(console, args), d - } -} -},{"utilise/is":54,"utilise/owner":59,"utilise/to":61}],58:[function(require,module,exports){ -module.exports = function not(fn){ - return function(){ - return !fn.apply(this, arguments) - } -} -},{}],59:[function(require,module,exports){ -(function (global){ -module.exports = true ? /* istanbul ignore next */ window : global -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],60:[function(require,module,exports){ -var is = require('utilise/is') +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ -module.exports = function str(d){ - return d === 0 ? '0' - : !d ? '' - : is.fn(d) ? '' + d - : is.obj(d) ? JSON.stringify(d) - : String(d) -} -},{"utilise/is":54}],61:[function(require,module,exports){ -module.exports = { - arr: toArray -, obj: toObject -} +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); -function toArray(d){ - return Array.prototype.slice.call(d, 0) -} +/** + * Colors. + */ -function toObject(d) { - var by = 'id' - , o = {} +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; - return arguments.length == 1 - ? (by = d, reduce) - : reduce.apply(this, arguments) +/** + * 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 + */ - function reduce(p,v,i){ - if (i === 0) p = {} - p[v[by]] = v - return p - } +function useColors() { + // is webkit? http://stackoverflow.com/a/16459606/376773 + return ('WebkitAppearance' in document.documentElement.style) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (window.console && (console.firebug || (console.exception && console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); } -},{}],62:[function(require,module,exports){ -var keys = require('utilise/keys') - , from = require('utilise/from') -module.exports = function values(o) { - return !o ? [] : keys(o).map(from(o)) -} -},{"utilise/from":49,"utilise/keys":56}],63:[function(require,module,exports){ -var key = require('utilise/key') +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ -module.exports = function za(k) { - return function(a, b){ - var ka = key(k)(a) || '' - , kb = key(k)(b) || '' +exports.formatters.j = function(v) { + return JSON.stringify(v); +}; - return ka > kb ? -1 - : ka < kb ? 1 - : 0 - } -} -},{"utilise/key":55}],64:[function(require,module,exports){ -'use strict'; +/** + * Colorize log arguments if enabled. + * + * @api public + */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = css; +function formatArgs() { + var args = arguments; + var useColors = this.useColors; -var _includes = require('utilise/includes'); + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); -var _includes2 = _interopRequireDefault(_includes); + if (!useColors) return args; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var c = 'color: ' + this.color; + args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); -// ------------------------------------------- -// Exposes a convenient global instance -// ------------------------------------------- -function css(ripple) { - log('creating'); - ripple.types['text/css'] = { - header: 'text/css', - check: function check(res) { - return (0, _includes2.default)('.css')(res.name); + // 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-z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; } - }; + }); - return ripple; + args.splice(lastC, 0, c); + return args; } -var log = require('utilise/log')('[ri/types/css]'); -},{"utilise/includes":65,"utilise/log":67}],65:[function(require,module,exports){ -arguments[4][53][0].apply(exports,arguments) -},{"dup":53}],66:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],67:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":66,"utilise/owner":68,"utilise/to":69}],68:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],69:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],70:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = data; +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ -var _overwrite = require('utilise/overwrite'); +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} -var _overwrite2 = _interopRequireDefault(_overwrite); +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ -var _header = require('utilise/header'); +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} -var _header2 = _interopRequireDefault(_header); +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ -var _extend = require('utilise/extend'); +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + return r; +} -var _extend2 = _interopRequireDefault(_extend); +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ -var _not = require('utilise/not'); +exports.enable(load()); -var _not2 = _interopRequireDefault(_not); +/** + * 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 + */ -var _key = require('utilise/key'); +function localstorage(){ + try { + return window.localStorage; + } catch (e) {} +} -var _key2 = _interopRequireDefault(_key); +},{"./debug":49}],49:[function(require,module,exports){ -var _set = require('utilise/set'); +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ -var _set2 = _interopRequireDefault(_set); +exports = module.exports = debug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); -var _is = require('utilise/is'); +/** + * The currently active debug mode names, and names to skip. + */ -var _is2 = _interopRequireDefault(_is); +exports.names = []; +exports.skips = []; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lowercased letter, i.e. "n". + */ -// ------------------------------------------- -// Adds support for data resources -// ------------------------------------------- -function data(ripple) { - log('creating'); - ripple.on('change.data', trickle(ripple)); - ripple.types['application/data'] = { - header: 'application/data', - check: function check(res) { - return _is2.default.obj(res.body) || !res.body ? true : false; - }, - parse: function parse(res) { - var existing = ripple.resources[res.name] || {}; +exports.formatters = {}; - (0, _extend2.default)(res.headers)(existing.headers); - res.body = (0, _set2.default)()(res.body || [], existing.body && existing.body.log, _is2.default.num(res.headers.log) ? res.headers.log : -1); - (0, _overwrite2.default)(res.body.on)(listeners(existing)); - res.body.on('change.bubble', function (change) { - ripple.emit('change', ripple.change = [res.name, change], (0, _not2.default)(_is2.default.in(['data']))); - delete ripple.change; - }); +/** + * Previously assigned color. + */ - return res; - } - }; +var prevColor = 0; - return ripple; -} +/** + * Previous log timestamp. + */ -var trickle = function trickle(ripple) { - return function (name, change) { - return (0, _header2.default)('content-type', 'application/data')(ripple.resources[name]) && ripple.resources[name].body.emit('change', [change || null], (0, _not2.default)(_is2.default.in(['bubble']))); - }; -}; +var prevTime; -var log = require('utilise/log')('[ri/types/data]'), - listeners = (0, _key2.default)('body.on'); -},{"utilise/extend":75,"utilise/header":77,"utilise/is":78,"utilise/key":79,"utilise/log":81,"utilise/not":82,"utilise/overwrite":83,"utilise/set":85}],71:[function(require,module,exports){ -module.exports = function copy(from, to){ - return function(d){ - return to[d] = from[d], d - } +/** + * Select a color. + * + * @return {Number} + * @api private + */ + +function selectColor() { + return exports.colors[prevColor++ % exports.colors.length]; } -},{}],72:[function(require,module,exports){ -arguments[4][46][0].apply(exports,arguments) -},{"dup":46,"utilise/has":76}],73:[function(require,module,exports){ -arguments[4][47][0].apply(exports,arguments) -},{"dup":47,"utilise/def":72,"utilise/err":74,"utilise/is":78,"utilise/keys":80,"utilise/not":82}],74:[function(require,module,exports){ -arguments[4][48][0].apply(exports,arguments) -},{"dup":48,"utilise/owner":84,"utilise/to":87}],75:[function(require,module,exports){ -var is = require('utilise/is') - , not = require('utilise/not') - , keys = require('utilise/keys') - , copy = require('utilise/copy') -module.exports = function extend(to){ - return function(from){ - keys(from) - .filter(not(is.in(to))) - .map(copy(from, to)) +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ - return to - } -} -},{"utilise/copy":71,"utilise/is":78,"utilise/keys":80,"utilise/not":82}],76:[function(require,module,exports){ -arguments[4][50][0].apply(exports,arguments) -},{"dup":50}],77:[function(require,module,exports){ -arguments[4][51][0].apply(exports,arguments) -},{"dup":51,"utilise/key":79}],78:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],79:[function(require,module,exports){ -arguments[4][55][0].apply(exports,arguments) -},{"dup":55,"utilise/is":78,"utilise/str":86}],80:[function(require,module,exports){ -arguments[4][56][0].apply(exports,arguments) -},{"dup":56,"utilise/is":78}],81:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":78,"utilise/owner":84,"utilise/to":87}],82:[function(require,module,exports){ -arguments[4][58][0].apply(exports,arguments) -},{"dup":58}],83:[function(require,module,exports){ -var is = require('utilise/is') - , keys = require('utilise/keys') - , copy = require('utilise/copy') +function debug(namespace) { -module.exports = function overwrite(to){ - return function(from){ - keys(from) - .map(copy(from, to)) - - return to + // define the `disabled` version + function disabled() { } -} -},{"utilise/copy":71,"utilise/is":78,"utilise/keys":80}],84:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],85:[function(require,module,exports){ -var act = { add: add, update: update, remove: remove } - , emitterify = require('utilise/emitterify') - , def = require('utilise/def') - , is = require('utilise/is') - , str = JSON.stringify - , parse = JSON.parse - -module.exports = function set(d) { - return function(o, existing, max) { - if (!is.obj(o)) - return o + disabled.enabled = false; - if (!is.obj(d)) { - var log = existing || o.log || [] - , root = o + // define the `enabled` version + function enabled() { - if (!is.def(max)) max = log.max || 0 - if (!max) log = [] - if (max < 0) log = log.concat(null) - if (max > 0) { - var s = str(o) - root = parse(s) - log = log.concat({ type: 'update', value: parse(s), time: log.length }) - } + var self = enabled; - def(log, 'max', max) - - root.log - ? (root.log = log) - : def(emitterify(root, null), 'log', log, 1) + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; - return root - } + // add the `color` if not set + if (null == self.useColors) self.useColors = exports.useColors(); + if (null == self.color && self.useColors) self.color = selectColor(); - if (is.def(d.key)) - apply(o, d.type, (d.key = '' + d.key).split('.'), d.value) + var args = Array.prototype.slice.call(arguments); - if (o.log && o.log.max) - o.log.push((d.time = o.log.length, o.log.max > 0 ? d : null)) + args[0] = exports.coerce(args[0]); - if (o.emit) - o.emit('change', d) + if ('string' !== typeof args[0]) { + // anything else let's inspect with %o + args = ['%o'].concat(args); + } - return o - } -} + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); -function apply(body, type, path, value) { - var next = path.shift() + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); - if (path.length) { - if (!(next in body)) - if (type == 'remove') return - else body[next] = {} - apply(body[next], type, path, value) + if ('function' === typeof exports.formatArgs) { + args = exports.formatArgs.apply(self, args); + } + var logFn = enabled.log || exports.log || console.log.bind(console); + logFn.apply(self, args); } - else - act[type](body, next, value) -} + enabled.enabled = true; -function add(o, k, v) { - is.arr(o) - ? o.splice(k, 0, v) - : (o[k] = v) -} + var fn = exports.enabled(namespace) ? enabled : disabled; -function update(o, k, v) { - o[k] = v -} + fn.namespace = namespace; -function remove(o, k, v) { - is.arr(o) - ? o.splice(k, 1) - : delete o[k] + return fn; } -},{"utilise/def":72,"utilise/emitterify":73,"utilise/is":78}],86:[function(require,module,exports){ -arguments[4][60][0].apply(exports,arguments) -},{"dup":60,"utilise/is":78}],87:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],88:[function(require,module,exports){ -arguments[4][52][0].apply(exports,arguments) -},{"dup":52}],89:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = delay; - +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ -var _attr = require('utilise/attr'); - -var _attr2 = _interopRequireDefault(_attr); +function enable(namespaces) { + exports.save(namespaces); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var split = (namespaces || '').split(/[\s,]+/); + var len = split.length; -// ------------------------------------------- -// API: Delays the rendering of a component [delay=ms] -// ------------------------------------------- -function delay(ripple) { - if (!true) return ripple; - log('creating'); - ripple.render = render(ripple.render); - return ripple; + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } } -var render = function render(next) { - return function (el) { - var delay = (0, _attr2.default)('delay')(el); - delay != null ? ((0, _attr2.default)('inert', '')(el), (0, _attr2.default)('delay', false)(el), time(+delay, function (d) { - return (0, _attr2.default)('inert', false)(el), el.draw(); - })) : next(el); - }; -}; +/** + * Disable debug output. + * + * @api public + */ -var log = require('utilise/log')('[ri/delay]'), - err = require('utilise/err')('[ri/delay]'); -},{"utilise/attr":90,"utilise/err":91,"utilise/log":93}],90:[function(require,module,exports){ -var is = require('utilise/is') +function disable() { + exports.enable(''); +} -module.exports = function attr(name, value) { - var args = arguments.length - - return !is.str(name) && args == 2 ? attr(arguments[1]).call(this, arguments[0]) - : !is.str(name) && args == 3 ? attr(arguments[1], arguments[2]).call(this, arguments[0]) - : function(el){ - el = this.nodeName || is.fn(this.node) ? this : el - el = el.node ? el.node() : el - el = el.host || el +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ - return args > 1 && value === false ? el.removeAttribute(name) - : args > 1 ? (el.setAttribute(name, value), value) - : el.attributes.getNamedItem(name) - && el.attributes.getNamedItem(name).value - } +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; } -},{"utilise/is":92}],91:[function(require,module,exports){ -arguments[4][48][0].apply(exports,arguments) -},{"dup":48,"utilise/owner":94,"utilise/to":95}],92:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],93:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":92,"utilise/owner":94,"utilise/to":95}],94:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],95:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],96:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = features; +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ -var _includes = require('utilise/includes'); +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} -var _includes2 = _interopRequireDefault(_includes); +},{"ms":68}],50:[function(require,module,exports){ +module.exports = require('./lib/'); +},{"./lib/":51}],51:[function(require,module,exports){ -var _header = require('utilise/header'); +module.exports = require('./socket'); -var _header2 = _interopRequireDefault(_header); +/** + * Exports parser + * + * @api public + * + */ +module.exports.parser = require('engine.io-parser'); -var _append = require('utilise/append'); +},{"./socket":52,"engine.io-parser":60}],52:[function(require,module,exports){ +(function (global){ +/** + * Module dependencies. + */ -var _append2 = _interopRequireDefault(_append); +var transports = require('./transports'); +var Emitter = require('component-emitter'); +var debug = require('debug')('engine.io-client:socket'); +var index = require('indexof'); +var parser = require('engine.io-parser'); +var parseuri = require('parseuri'); +var parsejson = require('parsejson'); +var parseqs = require('parseqs'); -var _attr = require('utilise/attr'); +/** + * Module exports. + */ -var _attr2 = _interopRequireDefault(_attr); +module.exports = Socket; -var _from = require('utilise/from'); +/** + * Noop function. + * + * @api private + */ -var _from2 = _interopRequireDefault(_from); +function noop(){} -var _not = require('utilise/not'); +/** + * Socket constructor. + * + * @param {String|Object} uri or options + * @param {Object} options + * @api public + */ -var _not2 = _interopRequireDefault(_not); +function Socket(uri, opts){ + if (!(this instanceof Socket)) return new Socket(uri, opts); -var _str = require('utilise/str'); + opts = opts || {}; -var _str2 = _interopRequireDefault(_str); + if (uri && 'object' == typeof uri) { + opts = uri; + uri = null; + } -var _key = require('utilise/key'); + if (uri) { + uri = parseuri(uri); + opts.hostname = uri.host; + opts.secure = uri.protocol == 'https' || uri.protocol == 'wss'; + opts.port = uri.port; + if (uri.query) opts.query = uri.query; + } else if (opts.host) { + opts.hostname = parseuri(opts.host).host; + } -var _key2 = _interopRequireDefault(_key); + this.secure = null != opts.secure ? opts.secure : + (global.location && 'https:' == location.protocol); -var _by = require('utilise/by'); + if (opts.hostname && !opts.port) { + // if no port is specified manually, use the protocol default + opts.port = this.secure ? '443' : '80'; + } -var _by2 = _interopRequireDefault(_by); + this.agent = opts.agent || false; + this.hostname = opts.hostname || + (global.location ? location.hostname : 'localhost'); + this.port = opts.port || (global.location && location.port ? + location.port : + (this.secure ? 443 : 80)); + this.query = opts.query || {}; + if ('string' == typeof this.query) this.query = parseqs.decode(this.query); + this.upgrade = false !== opts.upgrade; + this.path = (opts.path || '/engine.io').replace(/\/$/, '') + '/'; + this.forceJSONP = !!opts.forceJSONP; + this.jsonp = false !== opts.jsonp; + this.forceBase64 = !!opts.forceBase64; + this.enablesXDR = !!opts.enablesXDR; + this.timestampParam = opts.timestampParam || 't'; + this.timestampRequests = opts.timestampRequests; + this.transports = opts.transports || ['polling', 'websocket']; + this.readyState = ''; + this.writeBuffer = []; + this.policyPort = opts.policyPort || 843; + this.rememberUpgrade = opts.rememberUpgrade || false; + this.binaryType = null; + this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades; + this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false; -var _is = require('utilise/is'); + if (true === this.perMessageDeflate) this.perMessageDeflate = {}; + if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) { + this.perMessageDeflate.threshold = 1024; + } -var _is2 = _interopRequireDefault(_is); + // SSL options for Node.js client + this.pfx = opts.pfx || null; + this.key = opts.key || null; + this.passphrase = opts.passphrase || null; + this.cert = opts.cert || null; + this.ca = opts.ca || null; + this.ciphers = opts.ciphers || null; + this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // other options for Node.js client + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal) { + if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) { + this.extraHeaders = opts.extraHeaders; + } + } -// ------------------------------------------- -// Extend Components with Features -// ------------------------------------------- -function features(ripple) { - if (!true) return; - log('creating'); - ripple.render = render(ripple)(ripple.render); - return ripple; + this.open(); } -var render = function render(ripple) { - return function (next) { - return function (el) { - var features = (0, _str2.default)((0, _attr2.default)(el, 'is')).split(' ').map((0, _from2.default)(ripple.resources)).filter((0, _header2.default)('content-type', 'application/javascript')), - css = (0, _str2.default)((0, _attr2.default)('css')(el)).split(' '); - - features.filter((0, _by2.default)('headers.needs', (0, _includes2.default)('[css]'))).map((0, _key2.default)('name')).map((0, _append2.default)('.css')).filter((0, _not2.default)(_is2.default.in(css))).map(function (d) { - return (0, _attr2.default)('css', ((0, _str2.default)((0, _attr2.default)('css')(el)) + ' ' + d).trim())(el); - }); +Socket.priorWebsocketSuccess = false; - var node = next(el); +/** + * Mix in `Emitter`. + */ - return !node || !node.state ? undefined : (features.map((0, _key2.default)('body')).map(function (d) { - return d.call(node.shadowRoot || node, node.state); - }), node); - }; - }; -}; +Emitter(Socket.prototype); -var log = require('utilise/log')('[ri/features]'); -},{"utilise/append":97,"utilise/attr":98,"utilise/by":99,"utilise/from":101,"utilise/header":102,"utilise/includes":103,"utilise/is":104,"utilise/key":105,"utilise/log":106,"utilise/not":107,"utilise/str":109}],97:[function(require,module,exports){ -module.exports = function append(v) { - return function(d){ - return d+v - } -} -},{}],98:[function(require,module,exports){ -arguments[4][90][0].apply(exports,arguments) -},{"dup":90,"utilise/is":104}],99:[function(require,module,exports){ -var key = require('utilise/key') - , is = require('utilise/is') - -module.exports = function by(k, v){ - var exists = arguments.length == 1 - return function(o){ - var d = is.fn(k) ? k(o) : key(k)(o) - - return d && v && d.toLowerCase && v.toLowerCase ? d.toLowerCase() === v.toLowerCase() - : exists ? Boolean(d) - : is.fn(v) ? v(d) - : d == v - } -} -},{"utilise/is":104,"utilise/key":105}],100:[function(require,module,exports){ -arguments[4][45][0].apply(exports,arguments) -},{"dup":45}],101:[function(require,module,exports){ -arguments[4][49][0].apply(exports,arguments) -},{"dup":49,"utilise/datum":100,"utilise/key":105}],102:[function(require,module,exports){ -arguments[4][51][0].apply(exports,arguments) -},{"dup":51,"utilise/key":105}],103:[function(require,module,exports){ -arguments[4][53][0].apply(exports,arguments) -},{"dup":53}],104:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],105:[function(require,module,exports){ -arguments[4][55][0].apply(exports,arguments) -},{"dup":55,"utilise/is":104,"utilise/str":109}],106:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":104,"utilise/owner":108,"utilise/to":110}],107:[function(require,module,exports){ -arguments[4][58][0].apply(exports,arguments) -},{"dup":58}],108:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],109:[function(require,module,exports){ -arguments[4][60][0].apply(exports,arguments) -},{"dup":60,"utilise/is":104}],110:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],111:[function(require,module,exports){ -'use strict'; +/** + * Protocol version. + * + * @api public + */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = fnc; +Socket.protocol = parser.protocol; // this is an int -var _str = require('utilise/str'); +/** + * Expose deps for legacy compatibility + * and standalone browser access. + */ -var _str2 = _interopRequireDefault(_str); +Socket.Socket = Socket; +Socket.Transport = require('./transport'); +Socket.transports = require('./transports'); +Socket.parser = require('engine.io-parser'); -var _is = require('utilise/is'); +/** + * Creates transport of the given type. + * + * @param {String} transport name + * @return {Transport} + * @api private + */ -var _is2 = _interopRequireDefault(_is); +Socket.prototype.createTransport = function (name) { + debug('creating transport "%s"', name); + var query = clone(this.query); -var _fn = require('utilise/fn'); + // append engine.io protocol identifier + query.EIO = parser.protocol; -var _fn2 = _interopRequireDefault(_fn); + // transport name + query.transport = name; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + // session id if we already have one + if (this.id) query.sid = this.id; -// ------------------------------------------- -// Adds support for function resources -// ------------------------------------------- -function fnc(ripple) { - log('creating'); - ripple.types['application/javascript'] = { header: header, check: check, parse: parse, to: to }; - return ripple; -} + var transport = new transports[name]({ + agent: this.agent, + hostname: this.hostname, + port: this.port, + secure: this.secure, + path: this.path, + query: query, + forceJSONP: this.forceJSONP, + jsonp: this.jsonp, + forceBase64: this.forceBase64, + enablesXDR: this.enablesXDR, + timestampRequests: this.timestampRequests, + timestampParam: this.timestampParam, + policyPort: this.policyPort, + socket: this, + pfx: this.pfx, + key: this.key, + passphrase: this.passphrase, + cert: this.cert, + ca: this.ca, + ciphers: this.ciphers, + rejectUnauthorized: this.rejectUnauthorized, + perMessageDeflate: this.perMessageDeflate, + extraHeaders: this.extraHeaders + }); -var header = 'application/javascript'; -var check = function check(res) { - return _is2.default.fn(res.body); -}; -var parse = function parse(res) { - return res.body = (0, _fn2.default)(res.body), res; -}; -var log = require('utilise/log')('[ri/types/fn]'); -var to = function to(res) { - return res.value = (0, _str2.default)(res.value), res; + return transport; }; -},{"utilise/fn":314,"utilise/is":326,"utilise/log":332,"utilise/str":369}],112:[function(require,module,exports){ -require('utilise');'use strict'; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = create; +function clone (obj) { + var o = {}; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + o[i] = obj[i]; + } + } + return o; +} -var _rijs = require('rijs.backpressure'); +/** + * Initializes transport to use and starts probe. + * + * @api private + */ +Socket.prototype.open = function () { + var transport; + if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) { + transport = 'websocket'; + } else if (0 === this.transports.length) { + // Emit error on next tick so it can be listened to + var self = this; + setTimeout(function() { + self.emit('error', 'No transports available'); + }, 0); + return; + } else { + transport = this.transports[0]; + } + this.readyState = 'opening'; -var _rijs2 = _interopRequireDefault(_rijs); + // Retry with the next transport if the transport is disabled (jsonp: false) + try { + transport = this.createTransport(transport); + } catch (e) { + this.transports.shift(); + this.open(); + return; + } -var _rijs3 = require('rijs.components'); + transport.open(); + this.setTransport(transport); +}; -var _rijs4 = _interopRequireDefault(_rijs3); +/** + * Sets the current transport. Disables the existing one (if any). + * + * @api private + */ -var _rijs5 = require('rijs.versioned'); +Socket.prototype.setTransport = function(transport){ + debug('setting transport %s', transport.name); + var self = this; -var _rijs6 = _interopRequireDefault(_rijs5); + if (this.transport) { + debug('clearing existing transport %s', this.transport.name); + this.transport.removeAllListeners(); + } -var _rijs7 = require('rijs.singleton'); + // set up transport + this.transport = transport; -var _rijs8 = _interopRequireDefault(_rijs7); + // set up transport listeners + transport + .on('drain', function(){ + self.onDrain(); + }) + .on('packet', function(packet){ + self.onPacket(packet); + }) + .on('error', function(e){ + self.onError(e); + }) + .on('close', function(){ + self.onClose('transport close'); + }); +}; -var _rijs9 = require('rijs.sessions'); +/** + * Probes a transport. + * + * @param {String} transport name + * @api private + */ -var _rijs10 = _interopRequireDefault(_rijs9); +Socket.prototype.probe = function (name) { + debug('probing transport "%s"', name); + var transport = this.createTransport(name, { probe: 1 }) + , failed = false + , self = this; -var _rijs11 = require('rijs.features'); + Socket.priorWebsocketSuccess = false; -var _rijs12 = _interopRequireDefault(_rijs11); + function onTransportOpen(){ + if (self.onlyBinaryUpgrades) { + var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; + failed = failed || upgradeLosesBinary; + } + if (failed) return; -var _rijs13 = require('rijs.offline'); + debug('probe transport "%s" opened', name); + transport.send([{ type: 'ping', data: 'probe' }]); + transport.once('packet', function (msg) { + if (failed) return; + if ('pong' == msg.type && 'probe' == msg.data) { + debug('probe transport "%s" pong', name); + self.upgrading = true; + self.emit('upgrading', transport); + if (!transport) return; + Socket.priorWebsocketSuccess = 'websocket' == transport.name; -var _rijs14 = _interopRequireDefault(_rijs13); + debug('pausing current transport "%s"', self.transport.name); + self.transport.pause(function () { + if (failed) return; + if ('closed' == self.readyState) return; + debug('changing transport and sending upgrade packet'); -var _rijs15 = require('rijs.helpers'); + cleanup(); -var _rijs16 = _interopRequireDefault(_rijs15); + self.setTransport(transport); + transport.send([{ type: 'upgrade' }]); + self.emit('upgrade', transport); + transport = null; + self.upgrading = false; + self.flush(); + }); + } else { + debug('probe transport "%s" failed', name); + var err = new Error('probe error'); + err.transport = transport.name; + self.emit('upgradeError', err); + } + }); + } -var _rijs17 = require('rijs.precss'); + function freezeTransport() { + if (failed) return; -var _rijs18 = _interopRequireDefault(_rijs17); + // Any callback called by transport should be ignored since now + failed = true; -var _rijs19 = require('rijs.shadow'); + cleanup(); -var _rijs20 = _interopRequireDefault(_rijs19); + transport.close(); + transport = null; + } -var _rijs21 = require('rijs.resdir'); - -var _rijs22 = _interopRequireDefault(_rijs21); + //Handle any error that happens while probing + function onerror(err) { + var error = new Error('probe error: ' + err); + error.transport = transport.name; -var _rijs23 = require('rijs.mysql'); + freezeTransport(); -var _rijs24 = _interopRequireDefault(_rijs23); + debug('probe transport "%s" failed because of error: %s', name, err); -var _rijs25 = require('rijs.serve'); + self.emit('upgradeError', error); + } -var _rijs26 = _interopRequireDefault(_rijs25); + function onTransportClose(){ + onerror("transport closed"); + } -var _rijs27 = require('rijs.delay'); + //When the socket is closed while we're probing + function onclose(){ + onerror("socket closed"); + } -var _rijs28 = _interopRequireDefault(_rijs27); + //When the socket is upgraded while we're probing + function onupgrade(to){ + if (transport && to.name != transport.name) { + debug('"%s" works - aborting "%s"', to.name, transport.name); + freezeTransport(); + } + } -var _rijs29 = require('rijs.needs'); + //Remove all listeners on the transport and on self + function cleanup(){ + transport.removeListener('open', onTransportOpen); + transport.removeListener('error', onerror); + transport.removeListener('close', onTransportClose); + self.removeListener('close', onclose); + self.removeListener('upgrading', onupgrade); + } -var _rijs30 = _interopRequireDefault(_rijs29); + transport.once('open', onTransportOpen); + transport.once('error', onerror); + transport.once('close', onTransportClose); -var _rijs31 = require('rijs.sync'); + this.once('close', onclose); + this.once('upgrading', onupgrade); -var _rijs32 = _interopRequireDefault(_rijs31); + transport.open(); -var _rijs33 = require('rijs.core'); +}; -var _rijs34 = _interopRequireDefault(_rijs33); +/** + * Called when connection is deemed open. + * + * @api public + */ -var _rijs35 = require('rijs.data'); +Socket.prototype.onOpen = function () { + debug('socket open'); + this.readyState = 'open'; + Socket.priorWebsocketSuccess = 'websocket' == this.transport.name; + this.emit('open'); + this.flush(); -var _rijs36 = _interopRequireDefault(_rijs35); + // we check for `readyState` in case an `open` + // listener already closed the socket + if ('open' == this.readyState && this.upgrade && this.transport.pause) { + debug('starting upgrade probes'); + for (var i = 0, l = this.upgrades.length; i < l; i++) { + this.probe(this.upgrades[i]); + } + } +}; -var _rijs37 = require('rijs.css'); +/** + * Handles a packet. + * + * @api private + */ -var _rijs38 = _interopRequireDefault(_rijs37); +Socket.prototype.onPacket = function (packet) { + if ('opening' == this.readyState || 'open' == this.readyState) { + debug('socket receive: type "%s", data "%s"', packet.type, packet.data); -var _rijs39 = require('rijs.fn'); + this.emit('packet', packet); -var _rijs40 = _interopRequireDefault(_rijs39); + // Socket is live - any packet counts + this.emit('heartbeat'); -var _rijs41 = require('rijs.db'); + switch (packet.type) { + case 'open': + this.onHandshake(parsejson(packet.data)); + break; -var _rijs42 = _interopRequireDefault(_rijs41); + case 'pong': + this.setPing(); + this.emit('pong'); + break; + case 'error': + var err = new Error('server error'); + err.code = packet.data; + this.onError(err); + break; + case 'message': + this.emit('data', packet.data); + this.emit('message', packet.data); + break; + } + } else { + debug('packet received with socket readyState "%s"', this.readyState); + } +}; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/** + * Called upon handshake completion. + * + * @param {Object} handshake obj + * @api private + */ -true && !window.ripple && create(); +Socket.prototype.onHandshake = function (data) { + this.emit('handshake', data); + this.id = data.sid; + this.transport.query.sid = data.sid; + this.upgrades = this.filterUpgrades(data.upgrades); + this.pingInterval = data.pingInterval; + this.pingTimeout = data.pingTimeout; + this.onOpen(); + // In case open handler closes socket + if ('closed' == this.readyState) return; + this.setPing(); -function create(opts) { - var ripple = (0, _rijs34.default)(); // empty base collection of resources + // Prolong liveness of socket on heartbeat + this.removeListener('heartbeat', this.onHeartbeat); + this.on('heartbeat', this.onHeartbeat); +}; - // enrich.. - (0, _rijs8.default)(ripple); // exposes a single instance - (0, _rijs36.default)(ripple); // register data types - (0, _rijs38.default)(ripple); // register css types - (0, _rijs40.default)(ripple); // register fn types - (0, _rijs16.default)(ripple); // expose helper functions and constants - (0, _rijs24.default)(ripple); // adds mysql adaptor crud hooks - (0, _rijs42.default)(ripple, opts); // enable external connections - (0, _rijs4.default)(ripple); // invoke web components, fn.call(, data) - (0, _rijs30.default)(ripple); // define default attrs for components - (0, _rijs18.default)(ripple); // preapplies scoped css - (0, _rijs20.default)(ripple); // encapsulates with shadow dom or closes gap - (0, _rijs28.default)(ripple); // async rendering delay - (0, _rijs26.default)(ripple, opts); // serve client libraries - (0, _rijs14.default)(ripple); // loads/saves from/to localstorage - (0, _rijs32.default)(ripple, opts); // syncs resources between server/client - (0, _rijs2.default)(ripple); // restricts broadcast to clients based on need - (0, _rijs12.default)(ripple); // extend components with features - (0, _rijs6.default)(ripple); // versioning info and time travel - (0, _rijs10.default)(ripple, opts); // populates sessionid on each connection - (0, _rijs22.default)(ripple, opts); // loads from resources folder +/** + * Resets ping timeout. + * + * @api private + */ - return ripple; -} +Socket.prototype.onHeartbeat = function (timeout) { + clearTimeout(this.pingTimeoutTimer); + var self = this; + self.pingTimeoutTimer = setTimeout(function () { + if ('closed' == self.readyState) return; + self.onClose('ping timeout'); + }, timeout || (self.pingInterval + self.pingTimeout)); +}; -},{"rijs.backpressure":27,"rijs.components":28,"rijs.core":31,"rijs.css":64,"rijs.data":70,"rijs.db":88,"rijs.delay":89,"rijs.features":96,"rijs.fn":111,"rijs.helpers":113,"rijs.mysql":129,"rijs.needs":130,"rijs.offline":143,"rijs.precss":162,"rijs.resdir":186,"rijs.serve":187,"rijs.sessions":188,"rijs.shadow":189,"rijs.singleton":196,"rijs.sync":201,"rijs.versioned":269,"utilise":325}],113:[function(require,module,exports){ -'use strict'; +/** + * Pings server every `this.pingInterval` and expects response + * within `this.pingTimeout` or closes connection. + * + * @api private + */ -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = helpers; +Socket.prototype.setPing = function () { + var self = this; + clearTimeout(self.pingIntervalTimer); + self.pingIntervalTimer = setTimeout(function () { + debug('writing ping packet - expecting pong within %sms', self.pingTimeout); + self.ping(); + self.onHeartbeat(self.pingTimeout); + }, self.pingInterval); +}; -var _identity = require('utilise/identity'); +/** +* Sends a ping packet. +* +* @api private +*/ -var _identity2 = _interopRequireDefault(_identity); +Socket.prototype.ping = function () { + var self = this; + this.sendPacket('ping', function(){ + self.emit('ping'); + }); +}; +/** + * Called on `drain` event + * + * @api private + */ +Socket.prototype.onDrain = function() { + this.writeBuffer.splice(0, this.prevBufferLen); -var _values = require('utilise/values'); + // setting prevBufferLen = 0 is very important + // for example, when upgrading, upgrade packet is sent over, + // and a nonzero prevBufferLen could cause problems on `drain` + this.prevBufferLen = 0; -var _values2 = _interopRequireDefault(_values); + if (0 === this.writeBuffer.length) { + this.emit('drain'); + } else { + this.flush(); + } +}; -var _keys = require('utilise/keys'); +/** + * Flush write buffers. + * + * @api private + */ -var _keys2 = _interopRequireDefault(_keys); +Socket.prototype.flush = function () { + if ('closed' != this.readyState && this.transport.writable && + !this.upgrading && this.writeBuffer.length) { + debug('flushing %d packets in socket', this.writeBuffer.length); + this.transport.send(this.writeBuffer); + // keep track of current length of writeBuffer + // splice writeBuffer and callbackBuffer on `drain` + this.prevBufferLen = this.writeBuffer.length; + this.emit('flush'); + } +}; -var _def = require('utilise/def'); +/** + * Sends a message. + * + * @param {String} message. + * @param {Function} callback function. + * @param {Object} options. + * @return {Socket} for chaining. + * @api public + */ -var _def2 = _interopRequireDefault(_def); +Socket.prototype.write = +Socket.prototype.send = function (msg, options, fn) { + this.sendPacket('message', msg, options, fn); + return this; +}; -var _str = require('utilise/str'); +/** + * Sends a packet. + * + * @param {String} packet type. + * @param {String} data. + * @param {Object} options. + * @param {Function} callback function. + * @api private + */ -var _str2 = _interopRequireDefault(_str); +Socket.prototype.sendPacket = function (type, data, options, fn) { + if('function' == typeof data) { + fn = data; + data = undefined; + } -var _by = require('utilise/by'); + if ('function' == typeof options) { + fn = options; + options = null; + } -var _by2 = _interopRequireDefault(_by); + if ('closing' == this.readyState || 'closed' == this.readyState) { + return; + } -var _is = require('utilise/is'); + options = options || {}; + options.compress = false !== options.compress; -var _is2 = _interopRequireDefault(_is); + var packet = { + type: type, + data: data, + options: options + }; + this.emit('packetCreate', packet); + this.writeBuffer.push(packet); + if (fn) this.once('flush', fn); + this.flush(); +}; -var _fn = require('utilise/fn'); +/** + * Closes the connection. + * + * @api private + */ -var _fn2 = _interopRequireDefault(_fn); +Socket.prototype.close = function () { + if ('opening' == this.readyState || 'open' == this.readyState) { + this.readyState = 'closing'; -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var self = this; -// ------------------------------------------- -// Attach Helper Functions for Resources -// ------------------------------------------- -function helpers(ripple) { - log('creating'); + if (this.writeBuffer.length) { + this.once('drain', function() { + if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + }); + } else if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + } - var type = ripple.types['application/data']; - type.parse = attach(type.parse); - if (!true) type.to = serialise(type.to); - return ripple; -} + function close() { + self.onClose('forced close'); + debug('socket closing - telling transport to close'); + self.transport.close(); + } -var attach = function attach(next) { - return function (res) { - if (next) res = next(res); - var helpers = res.headers.helpers; + function cleanupAndClose() { + self.removeListener('upgrade', cleanupAndClose); + self.removeListener('upgradeError', cleanupAndClose); + close(); + } - (0, _keys2.default)(helpers).map(function (name) { - return helpers[name] = (0, _fn2.default)(helpers[name]), name; - }).map(function (name) { - return (0, _def2.default)(res.body, name, helpers[name]); - }); + function waitForUpgrade() { + // wait for upgrade to finish since we can't send packets while pausing a transport + self.once('upgrade', cleanupAndClose); + self.once('upgradeError', cleanupAndClose); + } - return res; - }; + return this; }; -var serialise = function serialise(next) { - return function (req) { - var helpers = req.headers.helpers; - - (0, _keys2.default)(helpers).filter(function (name) { - return _is2.default.fn(helpers[name]); - }).map(function (name) { - return helpers[name] = (0, _str2.default)(helpers[name]); - }); +/** + * Called upon transport error + * + * @api private + */ - return (next || _identity2.default)(req); - }; +Socket.prototype.onError = function (err) { + debug('socket error %j', err); + Socket.priorWebsocketSuccess = false; + this.emit('error', err); + this.onClose('transport error', err); }; -var log = require('utilise/log')('[ri/helpers]'); -},{"utilise/by":114,"utilise/def":116,"utilise/fn":117,"utilise/identity":120,"utilise/is":121,"utilise/keys":123,"utilise/log":124,"utilise/str":126,"utilise/values":128}],114:[function(require,module,exports){ -arguments[4][99][0].apply(exports,arguments) -},{"dup":99,"utilise/is":121,"utilise/key":122}],115:[function(require,module,exports){ -arguments[4][45][0].apply(exports,arguments) -},{"dup":45}],116:[function(require,module,exports){ -arguments[4][46][0].apply(exports,arguments) -},{"dup":46,"utilise/has":119}],117:[function(require,module,exports){ -var is = require('utilise/is') +/** + * Called upon transport close. + * + * @api private + */ -module.exports = function fn(candid){ - return is.fn(candid) ? candid - : (new Function("return " + candid))() -} -},{"utilise/is":121}],118:[function(require,module,exports){ -arguments[4][49][0].apply(exports,arguments) -},{"dup":49,"utilise/datum":115,"utilise/key":122}],119:[function(require,module,exports){ -arguments[4][50][0].apply(exports,arguments) -},{"dup":50}],120:[function(require,module,exports){ -arguments[4][52][0].apply(exports,arguments) -},{"dup":52}],121:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],122:[function(require,module,exports){ -arguments[4][55][0].apply(exports,arguments) -},{"dup":55,"utilise/is":121,"utilise/str":126}],123:[function(require,module,exports){ -arguments[4][56][0].apply(exports,arguments) -},{"dup":56,"utilise/is":121}],124:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":121,"utilise/owner":125,"utilise/to":127}],125:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],126:[function(require,module,exports){ -arguments[4][60][0].apply(exports,arguments) -},{"dup":60,"utilise/is":121}],127:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],128:[function(require,module,exports){ -arguments[4][62][0].apply(exports,arguments) -},{"dup":62,"utilise/from":118,"utilise/keys":123}],129:[function(require,module,exports){ -arguments[4][52][0].apply(exports,arguments) -},{"dup":52}],130:[function(require,module,exports){ -'use strict'; +Socket.prototype.onClose = function (reason, desc) { + if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) { + debug('socket close with reason: "%s"', reason); + var self = this; -var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); + // clear timers + clearTimeout(this.pingIntervalTimer); + clearTimeout(this.pingTimeoutTimer); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = needs; + // stop event from firing again for transport + this.transport.removeAllListeners('close'); -var _includes = require('utilise/includes'); + // ensure transport won't stay open + this.transport.close(); -var _includes2 = _interopRequireDefault(_includes); + // ignore further transport communication + this.transport.removeAllListeners(); -var _replace = require('utilise/replace'); + // set ready state + this.readyState = 'closed'; -var _replace2 = _interopRequireDefault(_replace); + // clear session id + this.id = null; + // emit close event + this.emit('close', reason, desc); + // clean buffers after, so users can still + // grab the buffers on `close` event + self.writeBuffer = []; + self.prevBufferLen = 0; + } +}; -var _split = require('utilise/split'); +/** + * Filters upgrades, returning only those matching client transports. + * + * @param {Array} server upgrades + * @api private + * + */ -var _split2 = _interopRequireDefault(_split); +Socket.prototype.filterUpgrades = function (upgrades) { + var filteredUpgrades = []; + for (var i = 0, j = upgrades.length; i 1 ? [node, d, name] : [node, d]) +Transport.prototype.close = function () { + if ('opening' == this.readyState || 'open' == this.readyState) { + this.doClose(); + this.onClose(); } - return args > 2 && value === false ? d.removeAttribute(name) - : args > 2 ? (d.setAttribute(name, value), value) - : d.attributes.getNamedItem(name) - && d.attributes.getNamedItem(name).value -} + return this; +}; -},{"utilise/is":134}],132:[function(require,module,exports){ -arguments[4][48][0].apply(exports,arguments) -},{"dup":48,"utilise/owner":138,"utilise/to":142}],133:[function(require,module,exports){ -arguments[4][53][0].apply(exports,arguments) -},{"dup":53}],134:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],135:[function(require,module,exports){ -var is = require('utilise/is') - , str = require('utilise/str') +/** + * Sends multiple packets. + * + * @param {Array} packets + * @api private + */ -module.exports = function key(k, v){ - var set = arguments.length > 1 - , keys = str(k).split('.') - , root = keys.shift() +Transport.prototype.send = function(packets){ + if ('open' == this.readyState) { + this.write(packets); + } else { + throw new Error('Transport not open'); + } +}; - return function deep(o, i){ - var masked = {} - return !o ? undefined - : !k ? o - : is.arr(k) ? (k.map(copy), masked) - : o[k] || !keys.length ? (set ? ((o[k] = is.fn(v) ? v(o[k], i) : v), o) - : o[k]) - : (set ? (key(keys.join('.'), v)(o[root] ? o[root] : (o[root] = {})), o) - : key(keys.join('.'))(o[root])) +/** + * Called upon open + * + * @api private + */ - function copy(k){ - var val = key(k)(o) - ;(val != undefined) && key(k, val)(masked) - } - } -} -},{"utilise/is":134,"utilise/str":141}],136:[function(require,module,exports){ -module.exports = function lo(d){ - return (d || '').toLowerCase() -} +Transport.prototype.onOpen = function () { + this.readyState = 'open'; + this.writable = true; + this.emit('open'); +}; -},{}],137:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":134,"utilise/owner":138,"utilise/to":142}],138:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],139:[function(require,module,exports){ -module.exports = function replace(from, to){ - return function(d){ - return d.replace(from, to) - } -} -},{}],140:[function(require,module,exports){ -module.exports = function split(delimiter){ - return function(d){ - return d.split(delimiter) - } -} +/** + * Called with data. + * + * @param {String} data + * @api private + */ -},{}],141:[function(require,module,exports){ -arguments[4][60][0].apply(exports,arguments) -},{"dup":60,"utilise/is":134}],142:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],143:[function(require,module,exports){ -'use strict'; +Transport.prototype.onData = function(data){ + var packet = parser.decodePacket(data, this.socket.binaryType); + this.onPacket(packet); +}; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = offline; +/** + * Called with a decoded packet. + */ -var _debounce = require('utilise/debounce'); +Transport.prototype.onPacket = function (packet) { + this.emit('packet', packet); +}; -var _debounce2 = _interopRequireDefault(_debounce); +/** + * Called upon close. + * + * @api private + */ -var _header = require('utilise/header'); +Transport.prototype.onClose = function () { + this.readyState = 'closed'; + this.emit('close'); +}; -var _header2 = _interopRequireDefault(_header); +},{"component-emitter":45,"engine.io-parser":60}],54:[function(require,module,exports){ +(function (global){ +/** + * Module dependencies + */ +var XMLHttpRequest = require('xmlhttprequest-ssl'); +var XHR = require('./polling-xhr'); +var JSONP = require('./polling-jsonp'); +var websocket = require('./websocket'); +/** + * Export transports. + */ -var _values = require('utilise/values'); +exports.polling = polling; +exports.websocket = websocket; -var _values2 = _interopRequireDefault(_values); +/** + * Polling transport polymorphic constructor. + * Decides on xhr vs jsonp based on feature detection. + * + * @api private + */ -var _clone = require('utilise/clone'); +function polling(opts){ + var xhr; + var xd = false; + var xs = false; + var jsonp = false !== opts.jsonp; -var _clone2 = _interopRequireDefault(_clone); + if (global.location) { + var isSSL = 'https:' == location.protocol; + var port = location.port; -var _parse = require('utilise/parse'); + // some user agents have empty `location.port` + if (!port) { + port = isSSL ? 443 : 80; + } -var _parse2 = _interopRequireDefault(_parse); + xd = opts.hostname != location.hostname || port != opts.port; + xs = opts.secure != isSSL; + } -var _group = require('utilise/group'); + opts.xdomain = xd; + opts.xscheme = xs; + xhr = new XMLHttpRequest(opts); -var _group2 = _interopRequireDefault(_group); + if ('open' in xhr && !opts.forceJSONP) { + return new XHR(opts); + } else { + if (!jsonp) throw new Error('JSONP disabled'); + return new JSONP(opts); + } +} -var _not = require('utilise/not'); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./polling-jsonp":55,"./polling-xhr":56,"./websocket":58,"xmlhttprequest-ssl":59}],55:[function(require,module,exports){ +(function (global){ -var _not2 = _interopRequireDefault(_not); +/** + * Module requirements. + */ -var _str = require('utilise/str'); +var Polling = require('./polling'); +var inherit = require('component-inherit'); -var _str2 = _interopRequireDefault(_str); +/** + * Module exports. + */ -/* istanbul ignore next */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +module.exports = JSONPPolling; -// ------------------------------------------- -// API: Cache to and Restore from localStorage -// ------------------------------------------- -function offline(ripple) { - if (!true || !window.localStorage) return; - log('creating'); - load(ripple); - ripple.on('change.cache', (0, _debounce2.default)(1000)(cache(ripple))); - return ripple; -} +/** + * Cached regular expressions. + */ -var load = function load(ripple) { - return (0, _group2.default)('loading cache', function (d) { - return ((0, _parse2.default)(localStorage.ripple) || []).map(ripple); - }); -}; +var rNewline = /\n/g; +var rEscapedNewline = /\\n/g; -var cache = function cache(ripple) { - return function (res) { - log('cached'); - var cachable = (0, _values2.default)((0, _clone2.default)(ripple.resources)).filter((0, _not2.default)((0, _header2.default)('cache', 'no-store'))); +/** + * Global JSONP callbacks. + */ - cachable.filter((0, _header2.default)('content-type', 'application/javascript')).map(function (d) { - return d.body = (0, _str2.default)(ripple.resources[d.name].body); - }); +var callbacks; - localStorage.ripple = (0, _str2.default)(cachable); - }; -}; +/** + * Callbacks count. + */ -var log = require('utilise/log')('[ri/offline]'), - err = require('utilise/err')('[ri/offline]'); -},{"utilise/clone":144,"utilise/debounce":146,"utilise/err":147,"utilise/group":149,"utilise/header":150,"utilise/log":154,"utilise/not":156,"utilise/parse":158,"utilise/str":159,"utilise/values":161}],144:[function(require,module,exports){ -var parse = require('utilise/parse') - , str = require('utilise/str') - , is = require('utilise/is') +var index = 0; -module.exports = function clone(d) { - return !is.fn(d) && !is.str(d) - ? parse(str(d)) - : d -} +/** + * Noop. + */ -},{"utilise/is":151,"utilise/parse":158,"utilise/str":159}],145:[function(require,module,exports){ -arguments[4][45][0].apply(exports,arguments) -},{"dup":45}],146:[function(require,module,exports){ -var is = require('utilise/is') +function empty () { } -module.exports = function debounce(d){ - var pending, wait = is.num(d) ? d : 100 +/** + * JSONP Polling constructor. + * + * @param {Object} opts. + * @api public + */ - return is.fn(d) - ? next(d) - : next +function JSONPPolling (opts) { + Polling.call(this, opts); - function next(fn){ - return function(){ - var ctx = this, args = arguments - pending && clearTimeout(pending) - pending = setTimeout(function(){ fn.apply(ctx, args) }, wait) - } + this.query = this.query || {}; + + // define global callbacks array if not present + // we do this here (lazily) to avoid unneeded global pollution + if (!callbacks) { + // we need to consider multiple engines in the same page + if (!global.___eio) global.___eio = []; + callbacks = global.___eio; } - -} -},{"utilise/is":151}],147:[function(require,module,exports){ -arguments[4][48][0].apply(exports,arguments) -},{"dup":48,"utilise/owner":157,"utilise/to":160}],148:[function(require,module,exports){ -arguments[4][49][0].apply(exports,arguments) -},{"dup":49,"utilise/datum":145,"utilise/key":152}],149:[function(require,module,exports){ -var client = true - , owner = require('utilise/owner') - , noop = require('utilise/noop') -module.exports = function group(prefix, fn){ - if (!owner.console) return fn() - if (!console.groupCollapsed) polyfill() - console.groupCollapsed(prefix) - var ret = fn() - console.groupEnd(prefix) - return ret -} + // callback identifier + this.index = callbacks.length; -function polyfill() { - console.groupCollapsed = console.groupEnd = function(d){ - (console.log || noop)('*****', d, '*****') + // add callback to jsonp global + var self = this; + callbacks.push(function (msg) { + self.onData(msg); + }); + + // append to query string + this.query.j = this.index; + + // prevent spurious errors from being emitted when the window is unloaded + if (global.document && global.addEventListener) { + global.addEventListener('beforeunload', function () { + if (self.script) self.script.onerror = empty; + }, false); } } -},{"utilise/noop":155,"utilise/owner":157}],150:[function(require,module,exports){ -arguments[4][51][0].apply(exports,arguments) -},{"dup":51,"utilise/key":152}],151:[function(require,module,exports){ -arguments[4][54][0].apply(exports,arguments) -},{"dup":54}],152:[function(require,module,exports){ -arguments[4][55][0].apply(exports,arguments) -},{"dup":55,"utilise/is":151,"utilise/str":159}],153:[function(require,module,exports){ -arguments[4][56][0].apply(exports,arguments) -},{"dup":56,"utilise/is":151}],154:[function(require,module,exports){ -arguments[4][57][0].apply(exports,arguments) -},{"dup":57,"utilise/is":151,"utilise/owner":157,"utilise/to":160}],155:[function(require,module,exports){ -module.exports = function noop(){} -},{}],156:[function(require,module,exports){ -arguments[4][58][0].apply(exports,arguments) -},{"dup":58}],157:[function(require,module,exports){ -arguments[4][59][0].apply(exports,arguments) -},{"dup":59}],158:[function(require,module,exports){ -module.exports = function parse(d){ - return d && JSON.parse(d) -} -},{}],159:[function(require,module,exports){ -arguments[4][60][0].apply(exports,arguments) -},{"dup":60,"utilise/is":151}],160:[function(require,module,exports){ -arguments[4][61][0].apply(exports,arguments) -},{"dup":61}],161:[function(require,module,exports){ -arguments[4][62][0].apply(exports,arguments) -},{"dup":62,"utilise/from":148,"utilise/keys":153}],162:[function(require,module,exports){ -'use strict'; -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = precss; +/** + * Inherits from Polling. + */ -var _identity = require('utilise/identity'); +inherit(JSONPPolling, Polling); -var _identity2 = _interopRequireDefault(_identity); +/* + * JSONP only supports binary as base64 encoded strings + */ +JSONPPolling.prototype.supportsBinary = false; +/** + * Closes the socket. + * + * @api private + */ -var _values = require('utilise/values'); +JSONPPolling.prototype.doClose = function () { + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } -var _values2 = _interopRequireDefault(_values); + if (this.form) { + this.form.parentNode.removeChild(this.form); + this.form = null; + this.iframe = null; + } -var _proxy = require('utilise/proxy'); + Polling.prototype.doClose.call(this); +}; -var _proxy2 = _interopRequireDefault(_proxy); +/** + * Starts a poll cycle. + * + * @api private + */ -var _attr = require('utilise/attr'); +JSONPPolling.prototype.doPoll = function () { + var self = this; + var script = document.createElement('script'); -var _attr2 = _interopRequireDefault(_attr); + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } -var _from = require('utilise/from'); + script.async = true; + script.src = this.uri(); + script.onerror = function(e){ + self.onError('jsonp poll error',e); + }; -var _from2 = _interopRequireDefault(_from); + var insertAt = document.getElementsByTagName('script')[0]; + if (insertAt) { + insertAt.parentNode.insertBefore(script, insertAt); + } + else { + (document.head || document.body).appendChild(script); + } + this.script = script; -var _all = require('utilise/all'); + var isUAgecko = 'undefined' != typeof navigator && /gecko/i.test(navigator.userAgent); + + if (isUAgecko) { + setTimeout(function () { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } +}; -var _all2 = _interopRequireDefault(_all); +/** + * Writes with a hidden iframe. + * + * @param {String} data to send + * @param {Function} called upon flush. + * @api private + */ -var _raw = require('utilise/raw'); +JSONPPolling.prototype.doWrite = function (data, fn) { + var self = this; -var _raw2 = _interopRequireDefault(_raw); + if (!this.form) { + var form = document.createElement('form'); + var area = document.createElement('textarea'); + var id = this.iframeId = 'eio_iframe_' + this.index; + var iframe; -var _str = require('utilise/str'); + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '-1000px'; + form.style.left = '-1000px'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); -var _str2 = _interopRequireDefault(_str); + this.form = form; + this.area = area; + } -var _not = require('utilise/not'); + this.form.action = this.uri(); -var _not2 = _interopRequireDefault(_not); + function complete () { + initIframe(); + fn(); + } -var _by = require('utilise/by'); + function initIframe () { + if (self.iframe) { + try { + self.form.removeChild(self.iframe); + } catch (e) { + self.onError('jsonp polling iframe removal error', e); + } + } -var _by2 = _interopRequireDefault(_by); + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + var html = '