mirror of
https://github.com/billz/raspap-webgui.git
synced 2023-10-10 13:37:24 +02:00
10250 lines
248 KiB
JavaScript
Executable File
10250 lines
248 KiB
JavaScript
Executable File
/******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId]) {
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ i: moduleId,
|
||
/******/ l: false,
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.l = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // define getter function for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||
/******/ Object.defineProperty(exports, name, {
|
||
/******/ configurable: false,
|
||
/******/ enumerable: true,
|
||
/******/ get: getter
|
||
/******/ });
|
||
/******/ }
|
||
/******/ };
|
||
/******/
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function getDefault() { return module['default']; } :
|
||
/******/ function getModuleExports() { return module; };
|
||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/
|
||
/******/ // Object.prototype.hasOwnProperty.call
|
||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(__webpack_require__.s = 33);
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ([
|
||
/* 0 */
|
||
/***/ (function(module, exports) {
|
||
|
||
var g;
|
||
|
||
// This works in non-strict mode
|
||
g = (function() {
|
||
return this;
|
||
})();
|
||
|
||
try {
|
||
// This works if eval is allowed (see CSP)
|
||
g = g || Function("return this")() || (1,eval)("this");
|
||
} catch(e) {
|
||
// This works if the window reference is available
|
||
if(typeof window === "object")
|
||
g = window;
|
||
}
|
||
|
||
// g can still be undefined, but nothing to do about it...
|
||
// We return undefined, instead of nothing here, so it's
|
||
// easier to handle this case. if(!global) { ...}
|
||
|
||
module.exports = g;
|
||
|
||
|
||
/***/ }),
|
||
/* 1 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(process) {/**
|
||
* This is the web browser implementation of `debug()`.
|
||
*
|
||
* Expose `debug()` as the module.
|
||
*/
|
||
|
||
exports = module.exports = __webpack_require__(37);
|
||
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();
|
||
|
||
/**
|
||
* Colors.
|
||
*/
|
||
|
||
exports.colors = [
|
||
'lightseagreen',
|
||
'forestgreen',
|
||
'goldenrod',
|
||
'dodgerblue',
|
||
'darkorchid',
|
||
'crimson'
|
||
];
|
||
|
||
/**
|
||
* 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 useColors() {
|
||
// NB: In an Electron preload script, document will be defined but not fully
|
||
// initialized. Since we know we're in Chrome, we'll just detect this case
|
||
// explicitly
|
||
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
|
||
return true;
|
||
}
|
||
|
||
// is webkit? http://stackoverflow.com/a/16459606/376773
|
||
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
||
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
||
// is firebug? http://stackoverflow.com/a/398120/376773
|
||
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
||
// is firefox >= v31?
|
||
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
||
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
||
// double check webkit in userAgent just in case we are in a worker
|
||
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
||
}
|
||
|
||
/**
|
||
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
||
*/
|
||
|
||
exports.formatters.j = function(v) {
|
||
try {
|
||
return JSON.stringify(v);
|
||
} catch (err) {
|
||
return '[UnexpectedJSONParseError]: ' + err.message;
|
||
}
|
||
};
|
||
|
||
|
||
/**
|
||
* Colorize log arguments if enabled.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function formatArgs(args) {
|
||
var useColors = this.useColors;
|
||
|
||
args[0] = (useColors ? '%c' : '')
|
||
+ this.namespace
|
||
+ (useColors ? ' %c' : ' ')
|
||
+ args[0]
|
||
+ (useColors ? '%c ' : ' ')
|
||
+ '+' + exports.humanize(this.diff);
|
||
|
||
if (!useColors) return;
|
||
|
||
var c = 'color: ' + this.color;
|
||
args.splice(1, 0, c, 'color: inherit')
|
||
|
||
// the final "%c" is somewhat tricky, because there could be other
|
||
// arguments passed either before or after the %c, so we need to
|
||
// figure out the correct index to insert the CSS into
|
||
var index = 0;
|
||
var lastC = 0;
|
||
args[0].replace(/%[a-zA-Z%]/g, function(match) {
|
||
if ('%%' === match) return;
|
||
index++;
|
||
if ('%c' === match) {
|
||
// we only are interested in the *last* %c
|
||
// (the user may have provided their own)
|
||
lastC = index;
|
||
}
|
||
});
|
||
|
||
args.splice(lastC, 0, c);
|
||
}
|
||
|
||
/**
|
||
* Invokes `console.log()` when available.
|
||
* No-op when `console.log` is not a "function".
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function log() {
|
||
// 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);
|
||
}
|
||
|
||
/**
|
||
* Save `namespaces`.
|
||
*
|
||
* @param {String} namespaces
|
||
* @api private
|
||
*/
|
||
|
||
function save(namespaces) {
|
||
try {
|
||
if (null == namespaces) {
|
||
exports.storage.removeItem('debug');
|
||
} else {
|
||
exports.storage.debug = namespaces;
|
||
}
|
||
} catch(e) {}
|
||
}
|
||
|
||
/**
|
||
* Load `namespaces`.
|
||
*
|
||
* @return {String} returns the previously persisted debug modes
|
||
* @api private
|
||
*/
|
||
|
||
function load() {
|
||
var r;
|
||
try {
|
||
r = exports.storage.debug;
|
||
} catch(e) {}
|
||
|
||
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
||
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
||
r = process.env.DEBUG;
|
||
}
|
||
|
||
return r;
|
||
}
|
||
|
||
/**
|
||
* Enable namespaces listed in `localStorage.debug` initially.
|
||
*/
|
||
|
||
exports.enable(load());
|
||
|
||
/**
|
||
* Localstorage attempts to return the localstorage.
|
||
*
|
||
* This is necessary because safari throws
|
||
* when a user disables cookies/localstorage
|
||
* and you attempt to access it.
|
||
*
|
||
* @return {LocalStorage}
|
||
* @api private
|
||
*/
|
||
|
||
function localstorage() {
|
||
try {
|
||
return window.localStorage;
|
||
} catch (e) {}
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(15)))
|
||
|
||
/***/ }),
|
||
/* 2 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* Expose `Emitter`.
|
||
*/
|
||
|
||
if (true) {
|
||
module.exports = Emitter;
|
||
}
|
||
|
||
/**
|
||
* Initialize a new `Emitter`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function Emitter(obj) {
|
||
if (obj) return mixin(obj);
|
||
};
|
||
|
||
/**
|
||
* Mixin the emitter properties.
|
||
*
|
||
* @param {Object} obj
|
||
* @return {Object}
|
||
* @api private
|
||
*/
|
||
|
||
function mixin(obj) {
|
||
for (var key in Emitter.prototype) {
|
||
obj[key] = Emitter.prototype[key];
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
/**
|
||
* Listen on the given `event` with `fn`.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
* @return {Emitter}
|
||
* @api public
|
||
*/
|
||
|
||
Emitter.prototype.on =
|
||
Emitter.prototype.addEventListener = function(event, fn){
|
||
this._callbacks = this._callbacks || {};
|
||
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
|
||
.push(fn);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Adds an `event` listener that will be invoked a single
|
||
* time then automatically removed.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
* @return {Emitter}
|
||
* @api public
|
||
*/
|
||
|
||
Emitter.prototype.once = function(event, fn){
|
||
function on() {
|
||
this.off(event, on);
|
||
fn.apply(this, arguments);
|
||
}
|
||
|
||
on.fn = fn;
|
||
this.on(event, on);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Remove the given callback for `event` or all
|
||
* registered callbacks.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
* @return {Emitter}
|
||
* @api public
|
||
*/
|
||
|
||
Emitter.prototype.off =
|
||
Emitter.prototype.removeListener =
|
||
Emitter.prototype.removeAllListeners =
|
||
Emitter.prototype.removeEventListener = function(event, fn){
|
||
this._callbacks = this._callbacks || {};
|
||
|
||
// all
|
||
if (0 == arguments.length) {
|
||
this._callbacks = {};
|
||
return this;
|
||
}
|
||
|
||
// specific event
|
||
var callbacks = this._callbacks['$' + event];
|
||
if (!callbacks) return this;
|
||
|
||
// remove all handlers
|
||
if (1 == arguments.length) {
|
||
delete this._callbacks['$' + event];
|
||
return this;
|
||
}
|
||
|
||
// 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;
|
||
};
|
||
|
||
/**
|
||
* Emit `event` with the given args.
|
||
*
|
||
* @param {String} event
|
||
* @param {Mixed} ...
|
||
* @return {Emitter}
|
||
*/
|
||
|
||
Emitter.prototype.emit = function(event){
|
||
this._callbacks = this._callbacks || {};
|
||
var args = [].slice.call(arguments, 1)
|
||
, callbacks = this._callbacks['$' + event];
|
||
|
||
if (callbacks) {
|
||
callbacks = callbacks.slice(0);
|
||
for (var i = 0, len = callbacks.length; i < len; ++i) {
|
||
callbacks[i].apply(this, args);
|
||
}
|
||
}
|
||
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Return array of callbacks for `event`.
|
||
*
|
||
* @param {String} event
|
||
* @return {Array}
|
||
* @api public
|
||
*/
|
||
|
||
Emitter.prototype.listeners = function(event){
|
||
this._callbacks = this._callbacks || {};
|
||
return this._callbacks['$' + event] || [];
|
||
};
|
||
|
||
/**
|
||
* Check if this emitter has `event` handlers.
|
||
*
|
||
* @param {String} event
|
||
* @return {Boolean}
|
||
* @api public
|
||
*/
|
||
|
||
Emitter.prototype.hasListeners = function(event){
|
||
return !! this.listeners(event).length;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 3 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var keys = __webpack_require__(46);
|
||
var hasBinary = __webpack_require__(16);
|
||
var sliceBuffer = __webpack_require__(47);
|
||
var after = __webpack_require__(48);
|
||
var utf8 = __webpack_require__(49);
|
||
|
||
var base64encoder;
|
||
if (global && global.ArrayBuffer) {
|
||
base64encoder = __webpack_require__(51);
|
||
}
|
||
|
||
/**
|
||
* Check if we are running an android browser. That requires us to use
|
||
* ArrayBuffer with polling transports...
|
||
*
|
||
* http://ghinda.net/jpeg-blob-ajax-android/
|
||
*/
|
||
|
||
var isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);
|
||
|
||
/**
|
||
* Check if we are running in PhantomJS.
|
||
* Uploading a Blob with PhantomJS does not work correctly, as reported here:
|
||
* https://github.com/ariya/phantomjs/issues/11395
|
||
* @type boolean
|
||
*/
|
||
var isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);
|
||
|
||
/**
|
||
* When true, avoids using Blobs to encode payloads.
|
||
* @type boolean
|
||
*/
|
||
var dontSendBlobs = isAndroid || isPhantomJS;
|
||
|
||
/**
|
||
* Current protocol version.
|
||
*/
|
||
|
||
exports.protocol = 3;
|
||
|
||
/**
|
||
* Packet types.
|
||
*/
|
||
|
||
var packets = exports.packets = {
|
||
open: 0 // non-ws
|
||
, close: 1 // non-ws
|
||
, ping: 2
|
||
, pong: 3
|
||
, message: 4
|
||
, upgrade: 5
|
||
, noop: 6
|
||
};
|
||
|
||
var packetslist = keys(packets);
|
||
|
||
/**
|
||
* Premade error packet.
|
||
*/
|
||
|
||
var err = { type: 'error', data: 'parser error' };
|
||
|
||
/**
|
||
* Create a blob api even for blob builder when vendor prefixes exist
|
||
*/
|
||
|
||
var Blob = __webpack_require__(52);
|
||
|
||
/**
|
||
* Encodes a packet.
|
||
*
|
||
* <packet type id> [ <data> ]
|
||
*
|
||
* Example:
|
||
*
|
||
* 5hello world
|
||
* 3
|
||
* 4
|
||
*
|
||
* Binary is encoded in an identical principle
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
exports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {
|
||
if (typeof supportsBinary === 'function') {
|
||
callback = supportsBinary;
|
||
supportsBinary = false;
|
||
}
|
||
|
||
if (typeof utf8encode === 'function') {
|
||
callback = utf8encode;
|
||
utf8encode = null;
|
||
}
|
||
|
||
var data = (packet.data === undefined)
|
||
? undefined
|
||
: packet.data.buffer || packet.data;
|
||
|
||
if (global.ArrayBuffer && data instanceof ArrayBuffer) {
|
||
return encodeArrayBuffer(packet, supportsBinary, callback);
|
||
} else if (Blob && data instanceof global.Blob) {
|
||
return encodeBlob(packet, supportsBinary, callback);
|
||
}
|
||
|
||
// might be an object with { base64: true, data: dataAsBase64String }
|
||
if (data && data.base64) {
|
||
return encodeBase64Object(packet, callback);
|
||
}
|
||
|
||
// Sending data as a utf-8 string
|
||
var encoded = packets[packet.type];
|
||
|
||
// data fragment is optional
|
||
if (undefined !== packet.data) {
|
||
encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);
|
||
}
|
||
|
||
return callback('' + encoded);
|
||
|
||
};
|
||
|
||
function encodeBase64Object(packet, callback) {
|
||
// packet data is an object { base64: true, data: dataAsBase64String }
|
||
var message = 'b' + exports.packets[packet.type] + packet.data.data;
|
||
return callback(message);
|
||
}
|
||
|
||
/**
|
||
* Encode packet helpers for binary types
|
||
*/
|
||
|
||
function encodeArrayBuffer(packet, supportsBinary, callback) {
|
||
if (!supportsBinary) {
|
||
return exports.encodeBase64Packet(packet, callback);
|
||
}
|
||
|
||
var data = packet.data;
|
||
var contentArray = new Uint8Array(data);
|
||
var resultBuffer = new Uint8Array(1 + data.byteLength);
|
||
|
||
resultBuffer[0] = packets[packet.type];
|
||
for (var i = 0; i < contentArray.length; i++) {
|
||
resultBuffer[i+1] = contentArray[i];
|
||
}
|
||
|
||
return callback(resultBuffer.buffer);
|
||
}
|
||
|
||
function encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {
|
||
if (!supportsBinary) {
|
||
return exports.encodeBase64Packet(packet, callback);
|
||
}
|
||
|
||
var fr = new FileReader();
|
||
fr.onload = function() {
|
||
packet.data = fr.result;
|
||
exports.encodePacket(packet, supportsBinary, true, callback);
|
||
};
|
||
return fr.readAsArrayBuffer(packet.data);
|
||
}
|
||
|
||
function encodeBlob(packet, supportsBinary, callback) {
|
||
if (!supportsBinary) {
|
||
return exports.encodeBase64Packet(packet, callback);
|
||
}
|
||
|
||
if (dontSendBlobs) {
|
||
return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);
|
||
}
|
||
|
||
var length = new Uint8Array(1);
|
||
length[0] = packets[packet.type];
|
||
var blob = new Blob([length.buffer, packet.data]);
|
||
|
||
return callback(blob);
|
||
}
|
||
|
||
/**
|
||
* Encodes a packet with binary data in a base64 string
|
||
*
|
||
* @param {Object} packet, has `type` and `data`
|
||
* @return {String} base64 encoded message
|
||
*/
|
||
|
||
exports.encodeBase64Packet = function(packet, callback) {
|
||
var message = 'b' + exports.packets[packet.type];
|
||
if (Blob && packet.data instanceof global.Blob) {
|
||
var fr = new FileReader();
|
||
fr.onload = function() {
|
||
var b64 = fr.result.split(',')[1];
|
||
callback(message + b64);
|
||
};
|
||
return fr.readAsDataURL(packet.data);
|
||
}
|
||
|
||
var b64data;
|
||
try {
|
||
b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));
|
||
} catch (e) {
|
||
// iPhone Safari doesn't let you apply with typed arrays
|
||
var typed = new Uint8Array(packet.data);
|
||
var basic = new Array(typed.length);
|
||
for (var i = 0; i < typed.length; i++) {
|
||
basic[i] = typed[i];
|
||
}
|
||
b64data = String.fromCharCode.apply(null, basic);
|
||
}
|
||
message += global.btoa(b64data);
|
||
return callback(message);
|
||
};
|
||
|
||
/**
|
||
* Decodes a packet. Changes format to Blob if requested.
|
||
*
|
||
* @return {Object} with `type` and `data` (if any)
|
||
* @api private
|
||
*/
|
||
|
||
exports.decodePacket = function (data, binaryType, utf8decode) {
|
||
if (data === undefined) {
|
||
return err;
|
||
}
|
||
// String data
|
||
if (typeof data === 'string') {
|
||
if (data.charAt(0) === 'b') {
|
||
return exports.decodeBase64Packet(data.substr(1), binaryType);
|
||
}
|
||
|
||
if (utf8decode) {
|
||
data = tryDecode(data);
|
||
if (data === false) {
|
||
return err;
|
||
}
|
||
}
|
||
var type = data.charAt(0);
|
||
|
||
if (Number(type) != type || !packetslist[type]) {
|
||
return err;
|
||
}
|
||
|
||
if (data.length > 1) {
|
||
return { type: packetslist[type], data: data.substring(1) };
|
||
} else {
|
||
return { type: packetslist[type] };
|
||
}
|
||
}
|
||
|
||
var asArray = new Uint8Array(data);
|
||
var type = asArray[0];
|
||
var rest = sliceBuffer(data, 1);
|
||
if (Blob && binaryType === 'blob') {
|
||
rest = new Blob([rest]);
|
||
}
|
||
return { type: packetslist[type], data: rest };
|
||
};
|
||
|
||
function tryDecode(data) {
|
||
try {
|
||
data = utf8.decode(data, { strict: false });
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* Decodes a packet encoded in a base64 string
|
||
*
|
||
* @param {String} base64 encoded message
|
||
* @return {Object} with `type` and `data` (if any)
|
||
*/
|
||
|
||
exports.decodeBase64Packet = function(msg, binaryType) {
|
||
var type = packetslist[msg.charAt(0)];
|
||
if (!base64encoder) {
|
||
return { type: type, data: { base64: true, data: msg.substr(1) } };
|
||
}
|
||
|
||
var data = base64encoder.decode(msg.substr(1));
|
||
|
||
if (binaryType === 'blob' && Blob) {
|
||
data = new Blob([data]);
|
||
}
|
||
|
||
return { type: type, data: data };
|
||
};
|
||
|
||
/**
|
||
* Encodes multiple messages (payload).
|
||
*
|
||
* <length>:data
|
||
*
|
||
* Example:
|
||
*
|
||
* 11:hello world2:hi
|
||
*
|
||
* If any contents are binary, they will be encoded as base64 strings. Base64
|
||
* encoded strings are marked with a b before the length specifier
|
||
*
|
||
* @param {Array} packets
|
||
* @api private
|
||
*/
|
||
|
||
exports.encodePayload = function (packets, supportsBinary, callback) {
|
||
if (typeof supportsBinary === 'function') {
|
||
callback = supportsBinary;
|
||
supportsBinary = null;
|
||
}
|
||
|
||
var isBinary = hasBinary(packets);
|
||
|
||
if (supportsBinary && isBinary) {
|
||
if (Blob && !dontSendBlobs) {
|
||
return exports.encodePayloadAsBlob(packets, callback);
|
||
}
|
||
|
||
return exports.encodePayloadAsArrayBuffer(packets, callback);
|
||
}
|
||
|
||
if (!packets.length) {
|
||
return callback('0:');
|
||
}
|
||
|
||
function setLengthHeader(message) {
|
||
return message.length + ':' + message;
|
||
}
|
||
|
||
function encodeOne(packet, doneCallback) {
|
||
exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {
|
||
doneCallback(null, setLengthHeader(message));
|
||
});
|
||
}
|
||
|
||
map(packets, encodeOne, function(err, results) {
|
||
return callback(results.join(''));
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Async array map using after
|
||
*/
|
||
|
||
function map(ary, each, done) {
|
||
var result = new Array(ary.length);
|
||
var next = after(ary.length, done);
|
||
|
||
var eachWithIndex = function(i, el, cb) {
|
||
each(el, function(error, msg) {
|
||
result[i] = msg;
|
||
cb(error, result);
|
||
});
|
||
};
|
||
|
||
for (var i = 0; i < ary.length; i++) {
|
||
eachWithIndex(i, ary[i], next);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* Decodes data when a payload is maybe expected. Possible binary contents are
|
||
* decoded from their base64 representation
|
||
*
|
||
* @param {String} data, callback method
|
||
* @api public
|
||
*/
|
||
|
||
exports.decodePayload = function (data, binaryType, callback) {
|
||
if (typeof data !== 'string') {
|
||
return exports.decodePayloadAsBinary(data, binaryType, callback);
|
||
}
|
||
|
||
if (typeof binaryType === 'function') {
|
||
callback = binaryType;
|
||
binaryType = null;
|
||
}
|
||
|
||
var packet;
|
||
if (data === '') {
|
||
// parser error - ignoring payload
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
var length = '', n, msg;
|
||
|
||
for (var i = 0, l = data.length; i < l; i++) {
|
||
var chr = data.charAt(i);
|
||
|
||
if (chr !== ':') {
|
||
length += chr;
|
||
continue;
|
||
}
|
||
|
||
if (length === '' || (length != (n = Number(length)))) {
|
||
// parser error - ignoring payload
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
msg = data.substr(i + 1, n);
|
||
|
||
if (length != msg.length) {
|
||
// parser error - ignoring payload
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
if (msg.length) {
|
||
packet = exports.decodePacket(msg, binaryType, false);
|
||
|
||
if (err.type === packet.type && err.data === packet.data) {
|
||
// parser error in individual packet - ignoring payload
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
var ret = callback(packet, i + n, l);
|
||
if (false === ret) return;
|
||
}
|
||
|
||
// advance cursor
|
||
i += n;
|
||
length = '';
|
||
}
|
||
|
||
if (length !== '') {
|
||
// parser error - ignoring payload
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
};
|
||
|
||
/**
|
||
* Encodes multiple messages (payload) as binary.
|
||
*
|
||
* <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number
|
||
* 255><data>
|
||
*
|
||
* Example:
|
||
* 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers
|
||
*
|
||
* @param {Array} packets
|
||
* @return {ArrayBuffer} encoded payload
|
||
* @api private
|
||
*/
|
||
|
||
exports.encodePayloadAsArrayBuffer = function(packets, callback) {
|
||
if (!packets.length) {
|
||
return callback(new ArrayBuffer(0));
|
||
}
|
||
|
||
function encodeOne(packet, doneCallback) {
|
||
exports.encodePacket(packet, true, true, function(data) {
|
||
return doneCallback(null, data);
|
||
});
|
||
}
|
||
|
||
map(packets, encodeOne, function(err, encodedPackets) {
|
||
var totalLength = encodedPackets.reduce(function(acc, p) {
|
||
var len;
|
||
if (typeof p === 'string'){
|
||
len = p.length;
|
||
} else {
|
||
len = p.byteLength;
|
||
}
|
||
return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2
|
||
}, 0);
|
||
|
||
var resultArray = new Uint8Array(totalLength);
|
||
|
||
var bufferIndex = 0;
|
||
encodedPackets.forEach(function(p) {
|
||
var isString = typeof p === 'string';
|
||
var ab = p;
|
||
if (isString) {
|
||
var view = new Uint8Array(p.length);
|
||
for (var i = 0; i < p.length; i++) {
|
||
view[i] = p.charCodeAt(i);
|
||
}
|
||
ab = view.buffer;
|
||
}
|
||
|
||
if (isString) { // not true binary
|
||
resultArray[bufferIndex++] = 0;
|
||
} else { // true binary
|
||
resultArray[bufferIndex++] = 1;
|
||
}
|
||
|
||
var lenStr = ab.byteLength.toString();
|
||
for (var i = 0; i < lenStr.length; i++) {
|
||
resultArray[bufferIndex++] = parseInt(lenStr[i]);
|
||
}
|
||
resultArray[bufferIndex++] = 255;
|
||
|
||
var view = new Uint8Array(ab);
|
||
for (var i = 0; i < view.length; i++) {
|
||
resultArray[bufferIndex++] = view[i];
|
||
}
|
||
});
|
||
|
||
return callback(resultArray.buffer);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Encode as Blob
|
||
*/
|
||
|
||
exports.encodePayloadAsBlob = function(packets, callback) {
|
||
function encodeOne(packet, doneCallback) {
|
||
exports.encodePacket(packet, true, true, function(encoded) {
|
||
var binaryIdentifier = new Uint8Array(1);
|
||
binaryIdentifier[0] = 1;
|
||
if (typeof encoded === 'string') {
|
||
var view = new Uint8Array(encoded.length);
|
||
for (var i = 0; i < encoded.length; i++) {
|
||
view[i] = encoded.charCodeAt(i);
|
||
}
|
||
encoded = view.buffer;
|
||
binaryIdentifier[0] = 0;
|
||
}
|
||
|
||
var len = (encoded instanceof ArrayBuffer)
|
||
? encoded.byteLength
|
||
: encoded.size;
|
||
|
||
var lenStr = len.toString();
|
||
var lengthAry = new Uint8Array(lenStr.length + 1);
|
||
for (var i = 0; i < lenStr.length; i++) {
|
||
lengthAry[i] = parseInt(lenStr[i]);
|
||
}
|
||
lengthAry[lenStr.length] = 255;
|
||
|
||
if (Blob) {
|
||
var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);
|
||
doneCallback(null, blob);
|
||
}
|
||
});
|
||
}
|
||
|
||
map(packets, encodeOne, function(err, results) {
|
||
return callback(new Blob(results));
|
||
});
|
||
};
|
||
|
||
/*
|
||
* Decodes data when a payload is maybe expected. Strings are decoded by
|
||
* interpreting each byte as a key code for entries marked to start with 0. See
|
||
* description of encodePayloadAsBinary
|
||
*
|
||
* @param {ArrayBuffer} data, callback method
|
||
* @api public
|
||
*/
|
||
|
||
exports.decodePayloadAsBinary = function (data, binaryType, callback) {
|
||
if (typeof binaryType === 'function') {
|
||
callback = binaryType;
|
||
binaryType = null;
|
||
}
|
||
|
||
var bufferTail = data;
|
||
var buffers = [];
|
||
|
||
while (bufferTail.byteLength > 0) {
|
||
var tailArray = new Uint8Array(bufferTail);
|
||
var isString = tailArray[0] === 0;
|
||
var msgLength = '';
|
||
|
||
for (var i = 1; ; i++) {
|
||
if (tailArray[i] === 255) break;
|
||
|
||
// 310 = char length of Number.MAX_VALUE
|
||
if (msgLength.length > 310) {
|
||
return callback(err, 0, 1);
|
||
}
|
||
|
||
msgLength += tailArray[i];
|
||
}
|
||
|
||
bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);
|
||
msgLength = parseInt(msgLength);
|
||
|
||
var msg = sliceBuffer(bufferTail, 0, msgLength);
|
||
if (isString) {
|
||
try {
|
||
msg = String.fromCharCode.apply(null, new Uint8Array(msg));
|
||
} catch (e) {
|
||
// iPhone Safari doesn't let you apply to typed arrays
|
||
var typed = new Uint8Array(msg);
|
||
msg = '';
|
||
for (var i = 0; i < typed.length; i++) {
|
||
msg += String.fromCharCode(typed[i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
buffers.push(msg);
|
||
bufferTail = sliceBuffer(bufferTail, msgLength);
|
||
}
|
||
|
||
var total = buffers.length;
|
||
buffers.forEach(function(buffer, i) {
|
||
callback(exports.decodePacket(buffer, binaryType, true), i, total);
|
||
});
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 4 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var utils = exports;
|
||
/**
|
||
* @returns {window}
|
||
*/
|
||
utils.getWindow = function () {
|
||
return window;
|
||
};
|
||
/**
|
||
* @returns {HTMLDocument}
|
||
*/
|
||
utils.getDocument = function () {
|
||
return document;
|
||
};
|
||
/**
|
||
* @returns {HTMLElement}
|
||
*/
|
||
utils.getBody = function () {
|
||
return document.getElementsByTagName("body")[0];
|
||
};
|
||
/**
|
||
* Get the current x/y position crossbow
|
||
* @returns {{x: *, y: *}}
|
||
*/
|
||
utils.getBrowserScrollPosition = function () {
|
||
var $window = exports.getWindow();
|
||
var $document = exports.getDocument();
|
||
var scrollX;
|
||
var scrollY;
|
||
var dElement = $document.documentElement;
|
||
var dBody = $document.body;
|
||
if ($window.pageYOffset !== undefined) {
|
||
scrollX = $window.pageXOffset;
|
||
scrollY = $window.pageYOffset;
|
||
}
|
||
else {
|
||
scrollX = dElement.scrollLeft || dBody.scrollLeft || 0;
|
||
scrollY = dElement.scrollTop || dBody.scrollTop || 0;
|
||
}
|
||
return {
|
||
x: scrollX,
|
||
y: scrollY
|
||
};
|
||
};
|
||
/**
|
||
* @returns {{x: number, y: number}}
|
||
*/
|
||
utils.getScrollSpace = function () {
|
||
var $document = exports.getDocument();
|
||
var dElement = $document.documentElement;
|
||
var dBody = $document.body;
|
||
return {
|
||
x: dBody.scrollHeight - dElement.clientWidth,
|
||
y: dBody.scrollHeight - dElement.clientHeight
|
||
};
|
||
};
|
||
/**
|
||
* Saves scroll position into cookies
|
||
*/
|
||
utils.saveScrollPosition = function () {
|
||
var pos = utils.getBrowserScrollPosition();
|
||
pos = [pos.x, pos.y];
|
||
utils.getDocument.cookie = "bs_scroll_pos=" + pos.join(",");
|
||
};
|
||
/**
|
||
* Restores scroll position from cookies
|
||
*/
|
||
utils.restoreScrollPosition = function () {
|
||
var pos = utils
|
||
.getDocument()
|
||
.cookie.replace(/(?:(?:^|.*;\s*)bs_scroll_pos\s*\=\s*([^;]*).*$)|^.*$/, "$1")
|
||
.split(",");
|
||
utils.getWindow().scrollTo(pos[0], pos[1]);
|
||
};
|
||
/**
|
||
* @param tagName
|
||
* @param elem
|
||
* @returns {*|number}
|
||
*/
|
||
utils.getElementIndex = function (tagName, elem) {
|
||
var allElems = utils.getDocument().getElementsByTagName(tagName);
|
||
return Array.prototype.indexOf.call(allElems, elem);
|
||
};
|
||
/**
|
||
* Force Change event on radio & checkboxes (IE)
|
||
*/
|
||
utils.forceChange = function (elem) {
|
||
elem.blur();
|
||
elem.focus();
|
||
};
|
||
/**
|
||
* @param elem
|
||
* @returns {{tagName: (elem.tagName|*), index: *}}
|
||
*/
|
||
utils.getElementData = function (elem) {
|
||
var tagName = elem.tagName;
|
||
var index = utils.getElementIndex(tagName, elem);
|
||
return {
|
||
tagName: tagName,
|
||
index: index
|
||
};
|
||
};
|
||
/**
|
||
* @param {string} tagName
|
||
* @param {number} index
|
||
*/
|
||
utils.getSingleElement = function (tagName, index) {
|
||
var elems = utils.getDocument().getElementsByTagName(tagName);
|
||
return elems[index];
|
||
};
|
||
/**
|
||
* Get the body element
|
||
*/
|
||
utils.getBody = function () {
|
||
return utils.getDocument().getElementsByTagName("body")[0];
|
||
};
|
||
/**
|
||
* @param {{x: number, y: number}} pos
|
||
*/
|
||
utils.setScroll = function (pos) {
|
||
utils.getWindow().scrollTo(pos.x, pos.y);
|
||
};
|
||
/**
|
||
* Hard reload
|
||
*/
|
||
utils.reloadBrowser = function () {
|
||
utils.getWindow().location.reload(true);
|
||
};
|
||
/**
|
||
* Foreach polyfill
|
||
* @param coll
|
||
* @param fn
|
||
*/
|
||
utils.forEach = function (coll, fn) {
|
||
for (var i = 0, n = coll.length; i < n; i += 1) {
|
||
fn(coll[i], i, coll);
|
||
}
|
||
};
|
||
/**
|
||
* Are we dealing with old IE?
|
||
* @returns {boolean}
|
||
*/
|
||
utils.isOldIe = function () {
|
||
return typeof utils.getWindow().attachEvent !== "undefined";
|
||
};
|
||
/**
|
||
* Split the URL information
|
||
* @returns {object}
|
||
*/
|
||
utils.getLocation = function (url) {
|
||
var location = utils.getDocument().createElement("a");
|
||
location.href = url;
|
||
if (location.host === "") {
|
||
location.href = location.href;
|
||
}
|
||
return location;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 5 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/**
|
||
* Compiles a querystring
|
||
* Returns string representation of the object
|
||
*
|
||
* @param {Object}
|
||
* @api private
|
||
*/
|
||
|
||
exports.encode = function (obj) {
|
||
var str = '';
|
||
|
||
for (var i in obj) {
|
||
if (obj.hasOwnProperty(i)) {
|
||
if (str.length) str += '&';
|
||
str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);
|
||
}
|
||
}
|
||
|
||
return str;
|
||
};
|
||
|
||
/**
|
||
* Parses a simple querystring into an object
|
||
*
|
||
* @param {String} qs
|
||
* @api private
|
||
*/
|
||
|
||
exports.decode = function(qs){
|
||
var qry = {};
|
||
var pairs = qs.split('&');
|
||
for (var i = 0, l = pairs.length; i < l; i++) {
|
||
var pair = pairs[i].split('=');
|
||
qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
|
||
}
|
||
return qry;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 6 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
module.exports = function(a, b){
|
||
var fn = function(){};
|
||
fn.prototype = b.prototype;
|
||
a.prototype = new fn;
|
||
a.prototype.constructor = a;
|
||
};
|
||
|
||
/***/ }),
|
||
/* 7 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
exports.events = {};
|
||
/**
|
||
* @param name
|
||
* @param data
|
||
*/
|
||
exports.emit = function (name, data) {
|
||
var event = exports.events[name];
|
||
var listeners;
|
||
if (event && event.listeners) {
|
||
listeners = event.listeners;
|
||
for (var i = 0, n = listeners.length; i < n; i += 1) {
|
||
listeners[i](data);
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* @param name
|
||
* @param func
|
||
*/
|
||
exports.on = function (name, func) {
|
||
var events = exports.events;
|
||
if (!events[name]) {
|
||
events[name] = {
|
||
listeners: [func]
|
||
};
|
||
}
|
||
else {
|
||
events[name].listeners.push(func);
|
||
}
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 8 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var debug = __webpack_require__(1)('socket.io-parser');
|
||
var Emitter = __webpack_require__(2);
|
||
var hasBin = __webpack_require__(16);
|
||
var binary = __webpack_require__(40);
|
||
var isBuf = __webpack_require__(17);
|
||
|
||
/**
|
||
* Protocol version.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.protocol = 4;
|
||
|
||
/**
|
||
* Packet types.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.types = [
|
||
'CONNECT',
|
||
'DISCONNECT',
|
||
'EVENT',
|
||
'ACK',
|
||
'ERROR',
|
||
'BINARY_EVENT',
|
||
'BINARY_ACK'
|
||
];
|
||
|
||
/**
|
||
* Packet type `connect`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.CONNECT = 0;
|
||
|
||
/**
|
||
* Packet type `disconnect`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.DISCONNECT = 1;
|
||
|
||
/**
|
||
* Packet type `event`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.EVENT = 2;
|
||
|
||
/**
|
||
* Packet type `ack`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.ACK = 3;
|
||
|
||
/**
|
||
* Packet type `error`.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.ERROR = 4;
|
||
|
||
/**
|
||
* Packet type 'binary event'
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.BINARY_EVENT = 5;
|
||
|
||
/**
|
||
* Packet type `binary ack`. For acks with binary arguments.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.BINARY_ACK = 6;
|
||
|
||
/**
|
||
* Encoder constructor.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.Encoder = Encoder;
|
||
|
||
/**
|
||
* Decoder constructor.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.Decoder = Decoder;
|
||
|
||
/**
|
||
* A socket.io Encoder instance
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function Encoder() {}
|
||
|
||
/**
|
||
* Encode a packet as a single string if non-binary, or as a
|
||
* buffer sequence, depending on packet type.
|
||
*
|
||
* @param {Object} obj - packet object
|
||
* @param {Function} callback - function to handle encodings (likely engine.write)
|
||
* @return Calls callback with Array of encodings
|
||
* @api public
|
||
*/
|
||
|
||
Encoder.prototype.encode = function(obj, callback){
|
||
if ((obj.type === exports.EVENT || obj.type === exports.ACK) && hasBin(obj.data)) {
|
||
obj.type = obj.type === exports.EVENT ? exports.BINARY_EVENT : exports.BINARY_ACK;
|
||
}
|
||
|
||
debug('encoding packet %j', obj);
|
||
|
||
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
|
||
encodeAsBinary(obj, callback);
|
||
}
|
||
else {
|
||
var encoding = encodeAsString(obj);
|
||
callback([encoding]);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Encode packet as string.
|
||
*
|
||
* @param {Object} packet
|
||
* @return {String} encoded
|
||
* @api private
|
||
*/
|
||
|
||
function encodeAsString(obj) {
|
||
|
||
// first is type
|
||
var str = '' + obj.type;
|
||
|
||
// attachments if we have them
|
||
if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {
|
||
str += obj.attachments + '-';
|
||
}
|
||
|
||
// if we have a namespace other than `/`
|
||
// we append it followed by a comma `,`
|
||
if (obj.nsp && '/' !== obj.nsp) {
|
||
str += obj.nsp + ',';
|
||
}
|
||
|
||
// immediately followed by the id
|
||
if (null != obj.id) {
|
||
str += obj.id;
|
||
}
|
||
|
||
// json data
|
||
if (null != obj.data) {
|
||
str += JSON.stringify(obj.data);
|
||
}
|
||
|
||
debug('encoded %j as %s', obj, str);
|
||
return str;
|
||
}
|
||
|
||
/**
|
||
* Encode packet as 'buffer sequence' by removing blobs, and
|
||
* deconstructing packet into object with placeholders and
|
||
* a list of buffers.
|
||
*
|
||
* @param {Object} packet
|
||
* @return {Buffer} encoded
|
||
* @api private
|
||
*/
|
||
|
||
function encodeAsBinary(obj, callback) {
|
||
|
||
function writeEncoding(bloblessData) {
|
||
var deconstruction = binary.deconstructPacket(bloblessData);
|
||
var pack = encodeAsString(deconstruction.packet);
|
||
var buffers = deconstruction.buffers;
|
||
|
||
buffers.unshift(pack); // add packet info to beginning of data list
|
||
callback(buffers); // write all the buffers
|
||
}
|
||
|
||
binary.removeBlobs(obj, writeEncoding);
|
||
}
|
||
|
||
/**
|
||
* A socket.io Decoder instance
|
||
*
|
||
* @return {Object} decoder
|
||
* @api public
|
||
*/
|
||
|
||
function Decoder() {
|
||
this.reconstructor = null;
|
||
}
|
||
|
||
/**
|
||
* Mix in `Emitter` with Decoder.
|
||
*/
|
||
|
||
Emitter(Decoder.prototype);
|
||
|
||
/**
|
||
* Decodes an ecoded packet string into packet JSON.
|
||
*
|
||
* @param {String} obj - encoded packet
|
||
* @return {Object} packet
|
||
* @api public
|
||
*/
|
||
|
||
Decoder.prototype.add = function(obj) {
|
||
var packet;
|
||
if (typeof obj === 'string') {
|
||
packet = decodeString(obj);
|
||
if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json
|
||
this.reconstructor = new BinaryReconstructor(packet);
|
||
|
||
// no attachments, labeled binary but no binary data to follow
|
||
if (this.reconstructor.reconPack.attachments === 0) {
|
||
this.emit('decoded', packet);
|
||
}
|
||
} else { // non-binary full packet
|
||
this.emit('decoded', packet);
|
||
}
|
||
}
|
||
else if (isBuf(obj) || obj.base64) { // raw binary data
|
||
if (!this.reconstructor) {
|
||
throw new Error('got binary data when not reconstructing a packet');
|
||
} else {
|
||
packet = this.reconstructor.takeBinaryData(obj);
|
||
if (packet) { // received final buffer
|
||
this.reconstructor = null;
|
||
this.emit('decoded', packet);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
throw new Error('Unknown type: ' + obj);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Decode a packet String (JSON data)
|
||
*
|
||
* @param {String} str
|
||
* @return {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
function decodeString(str) {
|
||
var i = 0;
|
||
// look up type
|
||
var p = {
|
||
type: Number(str.charAt(0))
|
||
};
|
||
|
||
if (null == exports.types[p.type]) return error();
|
||
|
||
// look up attachments if type binary
|
||
if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {
|
||
var buf = '';
|
||
while (str.charAt(++i) !== '-') {
|
||
buf += str.charAt(i);
|
||
if (i == str.length) break;
|
||
}
|
||
if (buf != Number(buf) || str.charAt(i) !== '-') {
|
||
throw new Error('Illegal attachments');
|
||
}
|
||
p.attachments = Number(buf);
|
||
}
|
||
|
||
// look up namespace (if any)
|
||
if ('/' === str.charAt(i + 1)) {
|
||
p.nsp = '';
|
||
while (++i) {
|
||
var c = str.charAt(i);
|
||
if (',' === c) break;
|
||
p.nsp += c;
|
||
if (i === str.length) break;
|
||
}
|
||
} else {
|
||
p.nsp = '/';
|
||
}
|
||
|
||
// look up id
|
||
var next = str.charAt(i + 1);
|
||
if ('' !== next && Number(next) == next) {
|
||
p.id = '';
|
||
while (++i) {
|
||
var c = str.charAt(i);
|
||
if (null == c || Number(c) != c) {
|
||
--i;
|
||
break;
|
||
}
|
||
p.id += str.charAt(i);
|
||
if (i === str.length) break;
|
||
}
|
||
p.id = Number(p.id);
|
||
}
|
||
|
||
// look up json data
|
||
if (str.charAt(++i)) {
|
||
p = tryParse(p, str.substr(i));
|
||
}
|
||
|
||
debug('decoded %s as %j', str, p);
|
||
return p;
|
||
}
|
||
|
||
function tryParse(p, str) {
|
||
try {
|
||
p.data = JSON.parse(str);
|
||
} catch(e){
|
||
return error();
|
||
}
|
||
return p;
|
||
}
|
||
|
||
/**
|
||
* Deallocates a parser's resources
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Decoder.prototype.destroy = function() {
|
||
if (this.reconstructor) {
|
||
this.reconstructor.finishedReconstruction();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* A manager of a binary event's 'buffer sequence'. Should
|
||
* be constructed whenever a packet of type BINARY_EVENT is
|
||
* decoded.
|
||
*
|
||
* @param {Object} packet
|
||
* @return {BinaryReconstructor} initialized reconstructor
|
||
* @api private
|
||
*/
|
||
|
||
function BinaryReconstructor(packet) {
|
||
this.reconPack = packet;
|
||
this.buffers = [];
|
||
}
|
||
|
||
/**
|
||
* Method to be called when binary data received from connection
|
||
* after a BINARY_EVENT packet.
|
||
*
|
||
* @param {Buffer | ArrayBuffer} binData - the raw binary data received
|
||
* @return {null | Object} returns null if more binary data is expected or
|
||
* a reconstructed packet object if all buffers have been received.
|
||
* @api private
|
||
*/
|
||
|
||
BinaryReconstructor.prototype.takeBinaryData = function(binData) {
|
||
this.buffers.push(binData);
|
||
if (this.buffers.length === this.reconPack.attachments) { // done with buffer list
|
||
var packet = binary.reconstructPacket(this.reconPack, this.buffers);
|
||
this.finishedReconstruction();
|
||
return packet;
|
||
}
|
||
return null;
|
||
};
|
||
|
||
/**
|
||
* Cleans up binary packet reconstruction variables.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
BinaryReconstructor.prototype.finishedReconstruction = function() {
|
||
this.reconPack = null;
|
||
this.buffers = [];
|
||
};
|
||
|
||
function error() {
|
||
return {
|
||
type: exports.ERROR,
|
||
data: 'parser error'
|
||
};
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 9 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {// browser shim for xmlhttprequest module
|
||
|
||
var hasCORS = __webpack_require__(44);
|
||
|
||
module.exports = function (opts) {
|
||
var xdomain = opts.xdomain;
|
||
|
||
// scheme must be same when usign XDomainRequest
|
||
// http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
|
||
var xscheme = opts.xscheme;
|
||
|
||
// XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.
|
||
// https://github.com/Automattic/engine.io-client/pull/217
|
||
var enablesXDR = opts.enablesXDR;
|
||
|
||
// XMLHttpRequest can be disabled on IE
|
||
try {
|
||
if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {
|
||
return new XMLHttpRequest();
|
||
}
|
||
} catch (e) { }
|
||
|
||
// Use XDomainRequest for IE8 if enablesXDR is true
|
||
// because loading bar keeps flashing when using jsonp-polling
|
||
// https://github.com/yujiosaka/socke.io-ie8-loading-example
|
||
try {
|
||
if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {
|
||
return new XDomainRequest();
|
||
}
|
||
} catch (e) { }
|
||
|
||
if (!xdomain) {
|
||
try {
|
||
return new global[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');
|
||
} catch (e) { }
|
||
}
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 10 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var parser = __webpack_require__(3);
|
||
var Emitter = __webpack_require__(2);
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = Transport;
|
||
|
||
/**
|
||
* Transport abstract constructor.
|
||
*
|
||
* @param {Object} options.
|
||
* @api private
|
||
*/
|
||
|
||
function Transport (opts) {
|
||
this.path = opts.path;
|
||
this.hostname = opts.hostname;
|
||
this.port = opts.port;
|
||
this.secure = opts.secure;
|
||
this.query = opts.query;
|
||
this.timestampParam = opts.timestampParam;
|
||
this.timestampRequests = opts.timestampRequests;
|
||
this.readyState = '';
|
||
this.agent = opts.agent || false;
|
||
this.socket = opts.socket;
|
||
this.enablesXDR = opts.enablesXDR;
|
||
|
||
// SSL options for Node.js client
|
||
this.pfx = opts.pfx;
|
||
this.key = opts.key;
|
||
this.passphrase = opts.passphrase;
|
||
this.cert = opts.cert;
|
||
this.ca = opts.ca;
|
||
this.ciphers = opts.ciphers;
|
||
this.rejectUnauthorized = opts.rejectUnauthorized;
|
||
this.forceNode = opts.forceNode;
|
||
|
||
// other options for Node.js client
|
||
this.extraHeaders = opts.extraHeaders;
|
||
this.localAddress = opts.localAddress;
|
||
}
|
||
|
||
/**
|
||
* Mix in `Emitter`.
|
||
*/
|
||
|
||
Emitter(Transport.prototype);
|
||
|
||
/**
|
||
* Emits an error.
|
||
*
|
||
* @param {String} str
|
||
* @return {Transport} for chaining
|
||
* @api public
|
||
*/
|
||
|
||
Transport.prototype.onError = function (msg, desc) {
|
||
var err = new Error(msg);
|
||
err.type = 'TransportError';
|
||
err.description = desc;
|
||
this.emit('error', err);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Opens the transport.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Transport.prototype.open = function () {
|
||
if ('closed' === this.readyState || '' === this.readyState) {
|
||
this.readyState = 'opening';
|
||
this.doOpen();
|
||
}
|
||
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Closes the transport.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Transport.prototype.close = function () {
|
||
if ('opening' === this.readyState || 'open' === this.readyState) {
|
||
this.doClose();
|
||
this.onClose();
|
||
}
|
||
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sends multiple packets.
|
||
*
|
||
* @param {Array} packets
|
||
* @api private
|
||
*/
|
||
|
||
Transport.prototype.send = function (packets) {
|
||
if ('open' === this.readyState) {
|
||
this.write(packets);
|
||
} else {
|
||
throw new Error('Transport not open');
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon open
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Transport.prototype.onOpen = function () {
|
||
this.readyState = 'open';
|
||
this.writable = true;
|
||
this.emit('open');
|
||
};
|
||
|
||
/**
|
||
* Called with data.
|
||
*
|
||
* @param {String} data
|
||
* @api private
|
||
*/
|
||
|
||
Transport.prototype.onData = function (data) {
|
||
var packet = parser.decodePacket(data, this.socket.binaryType);
|
||
this.onPacket(packet);
|
||
};
|
||
|
||
/**
|
||
* Called with a decoded packet.
|
||
*/
|
||
|
||
Transport.prototype.onPacket = function (packet) {
|
||
this.emit('packet', packet);
|
||
};
|
||
|
||
/**
|
||
* Called upon close.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Transport.prototype.onClose = function () {
|
||
this.readyState = 'closed';
|
||
this.emit('close');
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 11 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing scroll between devices
|
||
* @type {string}
|
||
*/
|
||
var WINDOW_EVENT_NAME = "scroll";
|
||
var ELEMENT_EVENT_NAME = "scroll:element";
|
||
var OPT_PATH = "ghostMode.scroll";
|
||
var utils;
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param eventManager
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
utils = bs.utils;
|
||
var opts = bs.options;
|
||
/**
|
||
* Window Scroll events
|
||
*/
|
||
eventManager.addEvent(window, WINDOW_EVENT_NAME, exports.browserEvent(bs));
|
||
bs.socket.on(WINDOW_EVENT_NAME, exports.socketEvent(bs));
|
||
/**
|
||
* element Scroll Events
|
||
*/
|
||
var cache = {};
|
||
addElementScrollEvents("scrollElements", false);
|
||
addElementScrollEvents("scrollElementMapping", true);
|
||
bs.socket.on(ELEMENT_EVENT_NAME, exports.socketEventForElement(bs, cache));
|
||
function addElementScrollEvents(key, map) {
|
||
if (!opts[key] ||
|
||
!opts[key].length ||
|
||
!("querySelectorAll" in document)) {
|
||
return;
|
||
}
|
||
utils.forEach(opts[key], function (selector) {
|
||
var elems = document.querySelectorAll(selector) || [];
|
||
utils.forEach(elems, function (elem) {
|
||
var data = utils.getElementData(elem);
|
||
data.cacheSelector = data.tagName + ":" + data.index;
|
||
data.map = map;
|
||
cache[data.cacheSelector] = elem;
|
||
eventManager.addEvent(elem, WINDOW_EVENT_NAME, exports.browserEventForElement(bs, elem, data));
|
||
});
|
||
});
|
||
}
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
*/
|
||
exports.socketEvent = function (bs) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
var scrollSpace = utils.getScrollSpace();
|
||
exports.canEmitEvents = false;
|
||
if (bs.options && bs.options.scrollProportionally) {
|
||
return window.scrollTo(0, scrollSpace.y * data.position.proportional); // % of y axis of scroll to px
|
||
}
|
||
else {
|
||
return window.scrollTo(0, data.position.raw.y);
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param bs
|
||
*/
|
||
exports.socketEventForElement = function (bs, cache) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
exports.canEmitEvents = false;
|
||
function scrollOne(selector, pos) {
|
||
if (cache[selector]) {
|
||
cache[selector].scrollTop = pos;
|
||
}
|
||
}
|
||
if (data.map) {
|
||
return Object.keys(cache).forEach(function (key) {
|
||
scrollOne(key, data.position);
|
||
});
|
||
}
|
||
scrollOne(data.elem.cacheSelector, data.position);
|
||
};
|
||
};
|
||
/**
|
||
* @param bs
|
||
*/
|
||
exports.browserEventForElement = function (bs, elem, data) {
|
||
return function () {
|
||
var canSync = exports.canEmitEvents;
|
||
if (canSync) {
|
||
bs.socket.emit(ELEMENT_EVENT_NAME, {
|
||
position: elem.scrollTop,
|
||
elem: data,
|
||
map: data.map
|
||
});
|
||
}
|
||
exports.canEmitEvents = true;
|
||
};
|
||
};
|
||
exports.browserEvent = function (bs) {
|
||
return function () {
|
||
var canSync = exports.canEmitEvents;
|
||
if (canSync) {
|
||
bs.socket.emit(WINDOW_EVENT_NAME, {
|
||
position: exports.getScrollPosition()
|
||
});
|
||
}
|
||
exports.canEmitEvents = true;
|
||
};
|
||
};
|
||
/**
|
||
* @returns {{raw: number, proportional: number}}
|
||
*/
|
||
exports.getScrollPosition = function () {
|
||
var pos = utils.getBrowserScrollPosition();
|
||
return {
|
||
raw: pos,
|
||
proportional: exports.getScrollTopPercentage(pos) // Get % of y axis of scroll
|
||
};
|
||
};
|
||
/**
|
||
* @param {{x: number, y: number}} scrollSpace
|
||
* @param scrollPosition
|
||
* @returns {{x: number, y: number}}
|
||
*/
|
||
exports.getScrollPercentage = function (scrollSpace, scrollPosition) {
|
||
var x = scrollPosition.x / scrollSpace.x;
|
||
var y = scrollPosition.y / scrollSpace.y;
|
||
return {
|
||
x: x || 0,
|
||
y: y
|
||
};
|
||
};
|
||
/**
|
||
* Get just the percentage of Y axis of scroll
|
||
* @returns {number}
|
||
*/
|
||
exports.getScrollTopPercentage = function (pos) {
|
||
var scrollSpace = utils.getScrollSpace();
|
||
var percentage = exports.getScrollPercentage(scrollSpace, pos);
|
||
return percentage.y;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 12 */
|
||
/***/ (function(module, exports) {
|
||
|
||
exports._ElementCache = function () {
|
||
var cache = {}, guidCounter = 1, expando = "data" + new Date().getTime();
|
||
this.getData = function (elem) {
|
||
var guid = elem[expando];
|
||
if (!guid) {
|
||
guid = elem[expando] = guidCounter++;
|
||
cache[guid] = {};
|
||
}
|
||
return cache[guid];
|
||
};
|
||
this.removeData = function (elem) {
|
||
var guid = elem[expando];
|
||
if (!guid)
|
||
return;
|
||
delete cache[guid];
|
||
try {
|
||
delete elem[expando];
|
||
}
|
||
catch (e) {
|
||
if (elem.removeAttribute) {
|
||
elem.removeAttribute(expando);
|
||
}
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* Fix an event
|
||
* @param event
|
||
* @returns {*}
|
||
*/
|
||
exports._fixEvent = function (event) {
|
||
function returnTrue() {
|
||
return true;
|
||
}
|
||
function returnFalse() {
|
||
return false;
|
||
}
|
||
if (!event || !event.stopPropagation) {
|
||
var old = event || window.event;
|
||
// Clone the old object so that we can modify the values
|
||
event = {};
|
||
for (var prop in old) {
|
||
event[prop] = old[prop];
|
||
}
|
||
// The event occurred on this element
|
||
if (!event.target) {
|
||
event.target = event.srcElement || document;
|
||
}
|
||
// Handle which other element the event is related to
|
||
event.relatedTarget =
|
||
event.fromElement === event.target
|
||
? event.toElement
|
||
: event.fromElement;
|
||
// Stop the default browser action
|
||
event.preventDefault = function () {
|
||
event.returnValue = false;
|
||
event.isDefaultPrevented = returnTrue;
|
||
};
|
||
event.isDefaultPrevented = returnFalse;
|
||
// Stop the event from bubbling
|
||
event.stopPropagation = function () {
|
||
event.cancelBubble = true;
|
||
event.isPropagationStopped = returnTrue;
|
||
};
|
||
event.isPropagationStopped = returnFalse;
|
||
// Stop the event from bubbling and executing other handlers
|
||
event.stopImmediatePropagation = function () {
|
||
this.isImmediatePropagationStopped = returnTrue;
|
||
this.stopPropagation();
|
||
};
|
||
event.isImmediatePropagationStopped = returnFalse;
|
||
// Handle mouse position
|
||
if (event.clientX != null) {
|
||
var doc = document.documentElement, body = document.body;
|
||
event.pageX =
|
||
event.clientX +
|
||
((doc && doc.scrollLeft) || (body && body.scrollLeft) || 0) -
|
||
((doc && doc.clientLeft) || (body && body.clientLeft) || 0);
|
||
event.pageY =
|
||
event.clientY +
|
||
((doc && doc.scrollTop) || (body && body.scrollTop) || 0) -
|
||
((doc && doc.clientTop) || (body && body.clientTop) || 0);
|
||
}
|
||
// Handle key presses
|
||
event.which = event.charCode || event.keyCode;
|
||
// Fix button for mouse clicks:
|
||
// 0 == left; 1 == middle; 2 == right
|
||
if (event.button != null) {
|
||
event.button =
|
||
event.button & 1
|
||
? 0
|
||
: event.button & 4 ? 1 : event.button & 2 ? 2 : 0;
|
||
}
|
||
}
|
||
return event;
|
||
};
|
||
/**
|
||
* @constructor
|
||
*/
|
||
exports._EventManager = function (cache) {
|
||
var nextGuid = 1;
|
||
this.addEvent = function (elem, type, fn) {
|
||
var data = cache.getData(elem);
|
||
if (!data.handlers)
|
||
data.handlers = {};
|
||
if (!data.handlers[type])
|
||
data.handlers[type] = [];
|
||
if (!fn.guid)
|
||
fn.guid = nextGuid++;
|
||
data.handlers[type].push(fn);
|
||
if (!data.dispatcher) {
|
||
data.disabled = false;
|
||
data.dispatcher = function (event) {
|
||
if (data.disabled)
|
||
return;
|
||
event = exports._fixEvent(event);
|
||
var handlers = data.handlers[event.type];
|
||
if (handlers) {
|
||
for (var n = 0; n < handlers.length; n++) {
|
||
handlers[n].call(elem, event);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
if (data.handlers[type].length == 1) {
|
||
if (document.addEventListener) {
|
||
elem.addEventListener(type, data.dispatcher, false);
|
||
}
|
||
else if (document.attachEvent) {
|
||
elem.attachEvent("on" + type, data.dispatcher);
|
||
}
|
||
}
|
||
};
|
||
function tidyUp(elem, type) {
|
||
function isEmpty(object) {
|
||
for (var prop in object) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
var data = cache.getData(elem);
|
||
if (data.handlers[type].length === 0) {
|
||
delete data.handlers[type];
|
||
if (document.removeEventListener) {
|
||
elem.removeEventListener(type, data.dispatcher, false);
|
||
}
|
||
else if (document.detachEvent) {
|
||
elem.detachEvent("on" + type, data.dispatcher);
|
||
}
|
||
}
|
||
if (isEmpty(data.handlers)) {
|
||
delete data.handlers;
|
||
delete data.dispatcher;
|
||
}
|
||
if (isEmpty(data)) {
|
||
cache.removeData(elem);
|
||
}
|
||
}
|
||
this.removeEvent = function (elem, type, fn) {
|
||
var data = cache.getData(elem);
|
||
if (!data.handlers)
|
||
return;
|
||
var removeType = function (t) {
|
||
data.handlers[t] = [];
|
||
tidyUp(elem, t);
|
||
};
|
||
if (!type) {
|
||
for (var t in data.handlers)
|
||
removeType(t);
|
||
return;
|
||
}
|
||
var handlers = data.handlers[type];
|
||
if (!handlers)
|
||
return;
|
||
if (!fn) {
|
||
removeType(type);
|
||
return;
|
||
}
|
||
if (fn.guid) {
|
||
for (var n = 0; n < handlers.length; n++) {
|
||
if (handlers[n].guid === fn.guid) {
|
||
handlers.splice(n--, 1);
|
||
}
|
||
}
|
||
}
|
||
tidyUp(elem, type);
|
||
};
|
||
this.proxy = function (context, fn) {
|
||
if (!fn.guid) {
|
||
fn.guid = nextGuid++;
|
||
}
|
||
var ret = function () {
|
||
return fn.apply(context, arguments);
|
||
};
|
||
ret.guid = fn.guid;
|
||
return ret;
|
||
};
|
||
};
|
||
/**
|
||
* Trigger a click on an element
|
||
* @param elem
|
||
*/
|
||
exports.triggerClick = function (elem) {
|
||
var evObj;
|
||
if (document.createEvent) {
|
||
window.setTimeout(function () {
|
||
evObj = document.createEvent("MouseEvents");
|
||
evObj.initEvent("click", true, true);
|
||
elem.dispatchEvent(evObj);
|
||
}, 0);
|
||
}
|
||
else {
|
||
window.setTimeout(function () {
|
||
if (document.createEventObject) {
|
||
evObj = document.createEventObject();
|
||
evObj.cancelBubble = true;
|
||
elem.fireEvent("on" + "click", evObj);
|
||
}
|
||
}, 0);
|
||
}
|
||
};
|
||
var cache = new exports._ElementCache();
|
||
var eventManager = new exports._EventManager(cache);
|
||
eventManager.triggerClick = exports.triggerClick;
|
||
exports.manager = eventManager;
|
||
|
||
|
||
/***/ }),
|
||
/* 13 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var socket = __webpack_require__(35);
|
||
/**
|
||
* @type {{emit: emit, on: on}}
|
||
*/
|
||
var socketConfig = window.___browserSync___.socketConfig;
|
||
var socketUrl = window.___browserSync___.socketUrl;
|
||
var io = socket(socketUrl, socketConfig);
|
||
/**
|
||
* *****BACK-COMPAT*******
|
||
* Scripts that come after Browsersync may rely on the previous window.___browserSync___.socket
|
||
*/
|
||
window.___browserSync___.socket = io;
|
||
/**
|
||
* @returns {string}
|
||
*/
|
||
exports.getPath = function () {
|
||
return window.location.pathname;
|
||
};
|
||
/**
|
||
* Alias for socket.emit
|
||
* @param name
|
||
* @param data
|
||
*/
|
||
exports.emit = function (name, data) {
|
||
if (io && io.emit) {
|
||
// send relative path of where the event is sent
|
||
data.url = exports.getPath();
|
||
io.emit(name, data);
|
||
}
|
||
};
|
||
/**
|
||
* Alias for socket.on
|
||
* @param name
|
||
* @param func
|
||
*/
|
||
exports.on = function (name, func) {
|
||
io.on(name, func);
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 14 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/**
|
||
* Parses an URI
|
||
*
|
||
* @author Steven Levithan <stevenlevithan.com> (MIT license)
|
||
* @api private
|
||
*/
|
||
|
||
var re = /^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
|
||
|
||
var parts = [
|
||
'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'
|
||
];
|
||
|
||
module.exports = function parseuri(str) {
|
||
var src = str,
|
||
b = str.indexOf('['),
|
||
e = str.indexOf(']');
|
||
|
||
if (b != -1 && e != -1) {
|
||
str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);
|
||
}
|
||
|
||
var m = re.exec(str || ''),
|
||
uri = {},
|
||
i = 14;
|
||
|
||
while (i--) {
|
||
uri[parts[i]] = m[i] || '';
|
||
}
|
||
|
||
if (b != -1 && e != -1) {
|
||
uri.source = src;
|
||
uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');
|
||
uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');
|
||
uri.ipv6uri = true;
|
||
}
|
||
|
||
return uri;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 15 */
|
||
/***/ (function(module, exports) {
|
||
|
||
// shim for using process in browser
|
||
var process = module.exports = {};
|
||
|
||
// cached from whatever global is present so that test runners that stub it
|
||
// don't break things. But we need to wrap it in a try catch in case it is
|
||
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
||
// function because try/catches deoptimize in certain engines.
|
||
|
||
var cachedSetTimeout;
|
||
var cachedClearTimeout;
|
||
|
||
function defaultSetTimout() {
|
||
throw new Error('setTimeout has not been defined');
|
||
}
|
||
function defaultClearTimeout () {
|
||
throw new Error('clearTimeout has not been defined');
|
||
}
|
||
(function () {
|
||
try {
|
||
if (typeof setTimeout === 'function') {
|
||
cachedSetTimeout = setTimeout;
|
||
} else {
|
||
cachedSetTimeout = defaultSetTimout;
|
||
}
|
||
} catch (e) {
|
||
cachedSetTimeout = defaultSetTimout;
|
||
}
|
||
try {
|
||
if (typeof clearTimeout === 'function') {
|
||
cachedClearTimeout = clearTimeout;
|
||
} else {
|
||
cachedClearTimeout = defaultClearTimeout;
|
||
}
|
||
} catch (e) {
|
||
cachedClearTimeout = defaultClearTimeout;
|
||
}
|
||
} ())
|
||
function runTimeout(fun) {
|
||
if (cachedSetTimeout === setTimeout) {
|
||
//normal enviroments in sane situations
|
||
return setTimeout(fun, 0);
|
||
}
|
||
// if setTimeout wasn't available but was latter defined
|
||
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
||
cachedSetTimeout = setTimeout;
|
||
return setTimeout(fun, 0);
|
||
}
|
||
try {
|
||
// when when somebody has screwed with setTimeout but no I.E. maddness
|
||
return cachedSetTimeout(fun, 0);
|
||
} catch(e){
|
||
try {
|
||
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
||
return cachedSetTimeout.call(null, fun, 0);
|
||
} catch(e){
|
||
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
||
return cachedSetTimeout.call(this, fun, 0);
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
function runClearTimeout(marker) {
|
||
if (cachedClearTimeout === clearTimeout) {
|
||
//normal enviroments in sane situations
|
||
return clearTimeout(marker);
|
||
}
|
||
// if clearTimeout wasn't available but was latter defined
|
||
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
||
cachedClearTimeout = clearTimeout;
|
||
return clearTimeout(marker);
|
||
}
|
||
try {
|
||
// when when somebody has screwed with setTimeout but no I.E. maddness
|
||
return cachedClearTimeout(marker);
|
||
} catch (e){
|
||
try {
|
||
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
||
return cachedClearTimeout.call(null, marker);
|
||
} catch (e){
|
||
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
||
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
||
return cachedClearTimeout.call(this, marker);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
var queue = [];
|
||
var draining = false;
|
||
var currentQueue;
|
||
var queueIndex = -1;
|
||
|
||
function cleanUpNextTick() {
|
||
if (!draining || !currentQueue) {
|
||
return;
|
||
}
|
||
draining = false;
|
||
if (currentQueue.length) {
|
||
queue = currentQueue.concat(queue);
|
||
} else {
|
||
queueIndex = -1;
|
||
}
|
||
if (queue.length) {
|
||
drainQueue();
|
||
}
|
||
}
|
||
|
||
function drainQueue() {
|
||
if (draining) {
|
||
return;
|
||
}
|
||
var timeout = runTimeout(cleanUpNextTick);
|
||
draining = true;
|
||
|
||
var len = queue.length;
|
||
while(len) {
|
||
currentQueue = queue;
|
||
queue = [];
|
||
while (++queueIndex < len) {
|
||
if (currentQueue) {
|
||
currentQueue[queueIndex].run();
|
||
}
|
||
}
|
||
queueIndex = -1;
|
||
len = queue.length;
|
||
}
|
||
currentQueue = null;
|
||
draining = false;
|
||
runClearTimeout(timeout);
|
||
}
|
||
|
||
process.nextTick = function (fun) {
|
||
var args = new Array(arguments.length - 1);
|
||
if (arguments.length > 1) {
|
||
for (var i = 1; i < arguments.length; i++) {
|
||
args[i - 1] = arguments[i];
|
||
}
|
||
}
|
||
queue.push(new Item(fun, args));
|
||
if (queue.length === 1 && !draining) {
|
||
runTimeout(drainQueue);
|
||
}
|
||
};
|
||
|
||
// v8 likes predictible objects
|
||
function Item(fun, array) {
|
||
this.fun = fun;
|
||
this.array = array;
|
||
}
|
||
Item.prototype.run = function () {
|
||
this.fun.apply(null, this.array);
|
||
};
|
||
process.title = 'browser';
|
||
process.browser = true;
|
||
process.env = {};
|
||
process.argv = [];
|
||
process.version = ''; // empty string to avoid regexp issues
|
||
process.versions = {};
|
||
|
||
function noop() {}
|
||
|
||
process.on = noop;
|
||
process.addListener = noop;
|
||
process.once = noop;
|
||
process.off = noop;
|
||
process.removeListener = noop;
|
||
process.removeAllListeners = noop;
|
||
process.emit = noop;
|
||
process.prependListener = noop;
|
||
process.prependOnceListener = noop;
|
||
|
||
process.listeners = function (name) { return [] }
|
||
|
||
process.binding = function (name) {
|
||
throw new Error('process.binding is not supported');
|
||
};
|
||
|
||
process.cwd = function () { return '/' };
|
||
process.chdir = function (dir) {
|
||
throw new Error('process.chdir is not supported');
|
||
};
|
||
process.umask = function() { return 0; };
|
||
|
||
|
||
/***/ }),
|
||
/* 16 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/* global Blob File */
|
||
|
||
/*
|
||
* Module requirements.
|
||
*/
|
||
|
||
var isArray = __webpack_require__(39);
|
||
|
||
var toString = Object.prototype.toString;
|
||
var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]';
|
||
var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]';
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = hasBinary;
|
||
|
||
/**
|
||
* Checks for binary data.
|
||
*
|
||
* Supports Buffer, ArrayBuffer, Blob and File.
|
||
*
|
||
* @param {Object} anything
|
||
* @api public
|
||
*/
|
||
|
||
function hasBinary (obj) {
|
||
if (!obj || typeof obj !== 'object') {
|
||
return false;
|
||
}
|
||
|
||
if (isArray(obj)) {
|
||
for (var i = 0, l = obj.length; i < l; i++) {
|
||
if (hasBinary(obj[i])) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
if ((typeof global.Buffer === 'function' && global.Buffer.isBuffer && global.Buffer.isBuffer(obj)) ||
|
||
(typeof global.ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||
|
||
(withNativeBlob && obj instanceof Blob) ||
|
||
(withNativeFile && obj instanceof File)
|
||
) {
|
||
return true;
|
||
}
|
||
|
||
// see: https://github.com/Automattic/has-binary/pull/4
|
||
if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {
|
||
return hasBinary(obj.toJSON(), true);
|
||
}
|
||
|
||
for (var key in obj) {
|
||
if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 17 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {
|
||
module.exports = isBuf;
|
||
|
||
/**
|
||
* Returns true if obj is a buffer or an arraybuffer.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
function isBuf(obj) {
|
||
return (global.Buffer && global.Buffer.isBuffer(obj)) ||
|
||
(global.ArrayBuffer && obj instanceof ArrayBuffer);
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 18 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var eio = __webpack_require__(42);
|
||
var Socket = __webpack_require__(23);
|
||
var Emitter = __webpack_require__(2);
|
||
var parser = __webpack_require__(8);
|
||
var on = __webpack_require__(24);
|
||
var bind = __webpack_require__(25);
|
||
var debug = __webpack_require__(1)('socket.io-client:manager');
|
||
var indexOf = __webpack_require__(22);
|
||
var Backoff = __webpack_require__(57);
|
||
|
||
/**
|
||
* IE6+ hasOwnProperty
|
||
*/
|
||
|
||
var has = Object.prototype.hasOwnProperty;
|
||
|
||
/**
|
||
* Module exports
|
||
*/
|
||
|
||
module.exports = Manager;
|
||
|
||
/**
|
||
* `Manager` constructor.
|
||
*
|
||
* @param {String} engine instance or engine uri/opts
|
||
* @param {Object} options
|
||
* @api public
|
||
*/
|
||
|
||
function Manager (uri, opts) {
|
||
if (!(this instanceof Manager)) return new Manager(uri, opts);
|
||
if (uri && ('object' === typeof uri)) {
|
||
opts = uri;
|
||
uri = undefined;
|
||
}
|
||
opts = opts || {};
|
||
|
||
opts.path = opts.path || '/socket.io';
|
||
this.nsps = {};
|
||
this.subs = [];
|
||
this.opts = opts;
|
||
this.reconnection(opts.reconnection !== false);
|
||
this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);
|
||
this.reconnectionDelay(opts.reconnectionDelay || 1000);
|
||
this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);
|
||
this.randomizationFactor(opts.randomizationFactor || 0.5);
|
||
this.backoff = new Backoff({
|
||
min: this.reconnectionDelay(),
|
||
max: this.reconnectionDelayMax(),
|
||
jitter: this.randomizationFactor()
|
||
});
|
||
this.timeout(null == opts.timeout ? 20000 : opts.timeout);
|
||
this.readyState = 'closed';
|
||
this.uri = uri;
|
||
this.connecting = [];
|
||
this.lastPing = null;
|
||
this.encoding = false;
|
||
this.packetBuffer = [];
|
||
var _parser = opts.parser || parser;
|
||
this.encoder = new _parser.Encoder();
|
||
this.decoder = new _parser.Decoder();
|
||
this.autoConnect = opts.autoConnect !== false;
|
||
if (this.autoConnect) this.open();
|
||
}
|
||
|
||
/**
|
||
* Propagate given event to sockets and emit on `this`
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.emitAll = function () {
|
||
this.emit.apply(this, arguments);
|
||
for (var nsp in this.nsps) {
|
||
if (has.call(this.nsps, nsp)) {
|
||
this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Update `socket.id` of all sockets
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.updateSocketIds = function () {
|
||
for (var nsp in this.nsps) {
|
||
if (has.call(this.nsps, nsp)) {
|
||
this.nsps[nsp].id = this.generateId(nsp);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* generate `socket.id` for the given `nsp`
|
||
*
|
||
* @param {String} nsp
|
||
* @return {String}
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.generateId = function (nsp) {
|
||
return (nsp === '/' ? '' : (nsp + '#')) + this.engine.id;
|
||
};
|
||
|
||
/**
|
||
* Mix in `Emitter`.
|
||
*/
|
||
|
||
Emitter(Manager.prototype);
|
||
|
||
/**
|
||
* Sets the `reconnection` config.
|
||
*
|
||
* @param {Boolean} true/false if it should automatically reconnect
|
||
* @return {Manager} self or value
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.reconnection = function (v) {
|
||
if (!arguments.length) return this._reconnection;
|
||
this._reconnection = !!v;
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sets the reconnection attempts config.
|
||
*
|
||
* @param {Number} max reconnection attempts before giving up
|
||
* @return {Manager} self or value
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.reconnectionAttempts = function (v) {
|
||
if (!arguments.length) return this._reconnectionAttempts;
|
||
this._reconnectionAttempts = v;
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sets the delay between reconnections.
|
||
*
|
||
* @param {Number} delay
|
||
* @return {Manager} self or value
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.reconnectionDelay = function (v) {
|
||
if (!arguments.length) return this._reconnectionDelay;
|
||
this._reconnectionDelay = v;
|
||
this.backoff && this.backoff.setMin(v);
|
||
return this;
|
||
};
|
||
|
||
Manager.prototype.randomizationFactor = function (v) {
|
||
if (!arguments.length) return this._randomizationFactor;
|
||
this._randomizationFactor = v;
|
||
this.backoff && this.backoff.setJitter(v);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sets the maximum delay between reconnections.
|
||
*
|
||
* @param {Number} delay
|
||
* @return {Manager} self or value
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.reconnectionDelayMax = function (v) {
|
||
if (!arguments.length) return this._reconnectionDelayMax;
|
||
this._reconnectionDelayMax = v;
|
||
this.backoff && this.backoff.setMax(v);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sets the connection timeout. `false` to disable
|
||
*
|
||
* @return {Manager} self or value
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.timeout = function (v) {
|
||
if (!arguments.length) return this._timeout;
|
||
this._timeout = v;
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Starts trying to reconnect if reconnection is enabled and we have not
|
||
* started reconnecting yet
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.maybeReconnectOnOpen = function () {
|
||
// Only try to reconnect if it's the first time we're connecting
|
||
if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {
|
||
// keeps reconnection from firing twice for the same reconnection loop
|
||
this.reconnect();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Sets the current transport `socket`.
|
||
*
|
||
* @param {Function} optional, callback
|
||
* @return {Manager} self
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.open =
|
||
Manager.prototype.connect = function (fn, opts) {
|
||
debug('readyState %s', this.readyState);
|
||
if (~this.readyState.indexOf('open')) return this;
|
||
|
||
debug('opening %s', this.uri);
|
||
this.engine = eio(this.uri, this.opts);
|
||
var socket = this.engine;
|
||
var self = this;
|
||
this.readyState = 'opening';
|
||
this.skipReconnect = false;
|
||
|
||
// emit `open`
|
||
var openSub = on(socket, 'open', function () {
|
||
self.onopen();
|
||
fn && fn();
|
||
});
|
||
|
||
// emit `connect_error`
|
||
var errorSub = on(socket, 'error', function (data) {
|
||
debug('connect_error');
|
||
self.cleanup();
|
||
self.readyState = 'closed';
|
||
self.emitAll('connect_error', data);
|
||
if (fn) {
|
||
var err = new Error('Connection error');
|
||
err.data = data;
|
||
fn(err);
|
||
} else {
|
||
// Only do this if there is no fn to handle the error
|
||
self.maybeReconnectOnOpen();
|
||
}
|
||
});
|
||
|
||
// emit `connect_timeout`
|
||
if (false !== this._timeout) {
|
||
var timeout = this._timeout;
|
||
debug('connect attempt will timeout after %d', timeout);
|
||
|
||
// set timer
|
||
var timer = setTimeout(function () {
|
||
debug('connect attempt timed out after %d', timeout);
|
||
openSub.destroy();
|
||
socket.close();
|
||
socket.emit('error', 'timeout');
|
||
self.emitAll('connect_timeout', timeout);
|
||
}, timeout);
|
||
|
||
this.subs.push({
|
||
destroy: function () {
|
||
clearTimeout(timer);
|
||
}
|
||
});
|
||
}
|
||
|
||
this.subs.push(openSub);
|
||
this.subs.push(errorSub);
|
||
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Called upon transport open.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onopen = function () {
|
||
debug('open');
|
||
|
||
// clear old subs
|
||
this.cleanup();
|
||
|
||
// mark as open
|
||
this.readyState = 'open';
|
||
this.emit('open');
|
||
|
||
// add new subs
|
||
var socket = this.engine;
|
||
this.subs.push(on(socket, 'data', bind(this, 'ondata')));
|
||
this.subs.push(on(socket, 'ping', bind(this, 'onping')));
|
||
this.subs.push(on(socket, 'pong', bind(this, 'onpong')));
|
||
this.subs.push(on(socket, 'error', bind(this, 'onerror')));
|
||
this.subs.push(on(socket, 'close', bind(this, 'onclose')));
|
||
this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));
|
||
};
|
||
|
||
/**
|
||
* Called upon a ping.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onping = function () {
|
||
this.lastPing = new Date();
|
||
this.emitAll('ping');
|
||
};
|
||
|
||
/**
|
||
* Called upon a packet.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onpong = function () {
|
||
this.emitAll('pong', new Date() - this.lastPing);
|
||
};
|
||
|
||
/**
|
||
* Called with data.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.ondata = function (data) {
|
||
this.decoder.add(data);
|
||
};
|
||
|
||
/**
|
||
* Called when parser fully decodes a packet.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.ondecoded = function (packet) {
|
||
this.emit('packet', packet);
|
||
};
|
||
|
||
/**
|
||
* Called upon socket error.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onerror = function (err) {
|
||
debug('error', err);
|
||
this.emitAll('error', err);
|
||
};
|
||
|
||
/**
|
||
* Creates a new socket for the given `nsp`.
|
||
*
|
||
* @return {Socket}
|
||
* @api public
|
||
*/
|
||
|
||
Manager.prototype.socket = function (nsp, opts) {
|
||
var socket = this.nsps[nsp];
|
||
if (!socket) {
|
||
socket = new Socket(this, nsp, opts);
|
||
this.nsps[nsp] = socket;
|
||
var self = this;
|
||
socket.on('connecting', onConnecting);
|
||
socket.on('connect', function () {
|
||
socket.id = self.generateId(nsp);
|
||
});
|
||
|
||
if (this.autoConnect) {
|
||
// manually call here since connecting event is fired before listening
|
||
onConnecting();
|
||
}
|
||
}
|
||
|
||
function onConnecting () {
|
||
if (!~indexOf(self.connecting, socket)) {
|
||
self.connecting.push(socket);
|
||
}
|
||
}
|
||
|
||
return socket;
|
||
};
|
||
|
||
/**
|
||
* Called upon a socket close.
|
||
*
|
||
* @param {Socket} socket
|
||
*/
|
||
|
||
Manager.prototype.destroy = function (socket) {
|
||
var index = indexOf(this.connecting, socket);
|
||
if (~index) this.connecting.splice(index, 1);
|
||
if (this.connecting.length) return;
|
||
|
||
this.close();
|
||
};
|
||
|
||
/**
|
||
* Writes a packet.
|
||
*
|
||
* @param {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.packet = function (packet) {
|
||
debug('writing packet %j', packet);
|
||
var self = this;
|
||
if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;
|
||
|
||
if (!self.encoding) {
|
||
// encode, then write to engine with result
|
||
self.encoding = true;
|
||
this.encoder.encode(packet, function (encodedPackets) {
|
||
for (var i = 0; i < encodedPackets.length; i++) {
|
||
self.engine.write(encodedPackets[i], packet.options);
|
||
}
|
||
self.encoding = false;
|
||
self.processPacketQueue();
|
||
});
|
||
} else { // add packet to the queue
|
||
self.packetBuffer.push(packet);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* If packet buffer is non-empty, begins encoding the
|
||
* next packet in line.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.processPacketQueue = function () {
|
||
if (this.packetBuffer.length > 0 && !this.encoding) {
|
||
var pack = this.packetBuffer.shift();
|
||
this.packet(pack);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Clean up transport subscriptions and packet buffer.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.cleanup = function () {
|
||
debug('cleanup');
|
||
|
||
var subsLength = this.subs.length;
|
||
for (var i = 0; i < subsLength; i++) {
|
||
var sub = this.subs.shift();
|
||
sub.destroy();
|
||
}
|
||
|
||
this.packetBuffer = [];
|
||
this.encoding = false;
|
||
this.lastPing = null;
|
||
|
||
this.decoder.destroy();
|
||
};
|
||
|
||
/**
|
||
* Close the current socket.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.close =
|
||
Manager.prototype.disconnect = function () {
|
||
debug('disconnect');
|
||
this.skipReconnect = true;
|
||
this.reconnecting = false;
|
||
if ('opening' === this.readyState) {
|
||
// `onclose` will not fire because
|
||
// an open event never happened
|
||
this.cleanup();
|
||
}
|
||
this.backoff.reset();
|
||
this.readyState = 'closed';
|
||
if (this.engine) this.engine.close();
|
||
};
|
||
|
||
/**
|
||
* Called upon engine close.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onclose = function (reason) {
|
||
debug('onclose');
|
||
|
||
this.cleanup();
|
||
this.backoff.reset();
|
||
this.readyState = 'closed';
|
||
this.emit('close', reason);
|
||
|
||
if (this._reconnection && !this.skipReconnect) {
|
||
this.reconnect();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Attempt a reconnection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.reconnect = function () {
|
||
if (this.reconnecting || this.skipReconnect) return this;
|
||
|
||
var self = this;
|
||
|
||
if (this.backoff.attempts >= this._reconnectionAttempts) {
|
||
debug('reconnect failed');
|
||
this.backoff.reset();
|
||
this.emitAll('reconnect_failed');
|
||
this.reconnecting = false;
|
||
} else {
|
||
var delay = this.backoff.duration();
|
||
debug('will wait %dms before reconnect attempt', delay);
|
||
|
||
this.reconnecting = true;
|
||
var timer = setTimeout(function () {
|
||
if (self.skipReconnect) return;
|
||
|
||
debug('attempting reconnect');
|
||
self.emitAll('reconnect_attempt', self.backoff.attempts);
|
||
self.emitAll('reconnecting', self.backoff.attempts);
|
||
|
||
// check again for the case socket closed in above events
|
||
if (self.skipReconnect) return;
|
||
|
||
self.open(function (err) {
|
||
if (err) {
|
||
debug('reconnect attempt error');
|
||
self.reconnecting = false;
|
||
self.reconnect();
|
||
self.emitAll('reconnect_error', err.data);
|
||
} else {
|
||
debug('reconnect success');
|
||
self.onreconnect();
|
||
}
|
||
});
|
||
}, delay);
|
||
|
||
this.subs.push({
|
||
destroy: function () {
|
||
clearTimeout(timer);
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon successful reconnect.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Manager.prototype.onreconnect = function () {
|
||
var attempt = this.backoff.attempts;
|
||
this.reconnecting = false;
|
||
this.backoff.reset();
|
||
this.updateSocketIds();
|
||
this.emitAll('reconnect', attempt);
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 19 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Module dependencies
|
||
*/
|
||
|
||
var XMLHttpRequest = __webpack_require__(9);
|
||
var XHR = __webpack_require__(45);
|
||
var JSONP = __webpack_require__(53);
|
||
var websocket = __webpack_require__(54);
|
||
|
||
/**
|
||
* Export transports.
|
||
*/
|
||
|
||
exports.polling = polling;
|
||
exports.websocket = websocket;
|
||
|
||
/**
|
||
* Polling transport polymorphic constructor.
|
||
* Decides on xhr vs jsonp based on feature detection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
function polling (opts) {
|
||
var xhr;
|
||
var xd = false;
|
||
var xs = false;
|
||
var jsonp = false !== opts.jsonp;
|
||
|
||
if (global.location) {
|
||
var isSSL = 'https:' === location.protocol;
|
||
var port = location.port;
|
||
|
||
// some user agents have empty `location.port`
|
||
if (!port) {
|
||
port = isSSL ? 443 : 80;
|
||
}
|
||
|
||
xd = opts.hostname !== location.hostname || port !== opts.port;
|
||
xs = opts.secure !== isSSL;
|
||
}
|
||
|
||
opts.xdomain = xd;
|
||
opts.xscheme = xs;
|
||
xhr = new XMLHttpRequest(opts);
|
||
|
||
if ('open' in xhr && !opts.forceJSONP) {
|
||
return new XHR(opts);
|
||
} else {
|
||
if (!jsonp) throw new Error('JSONP disabled');
|
||
return new JSONP(opts);
|
||
}
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 20 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var Transport = __webpack_require__(10);
|
||
var parseqs = __webpack_require__(5);
|
||
var parser = __webpack_require__(3);
|
||
var inherit = __webpack_require__(6);
|
||
var yeast = __webpack_require__(21);
|
||
var debug = __webpack_require__(1)('engine.io-client:polling');
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = Polling;
|
||
|
||
/**
|
||
* Is XHR2 supported?
|
||
*/
|
||
|
||
var hasXHR2 = (function () {
|
||
var XMLHttpRequest = __webpack_require__(9);
|
||
var xhr = new XMLHttpRequest({ xdomain: false });
|
||
return null != xhr.responseType;
|
||
})();
|
||
|
||
/**
|
||
* Polling interface.
|
||
*
|
||
* @param {Object} opts
|
||
* @api private
|
||
*/
|
||
|
||
function Polling (opts) {
|
||
var forceBase64 = (opts && opts.forceBase64);
|
||
if (!hasXHR2 || forceBase64) {
|
||
this.supportsBinary = false;
|
||
}
|
||
Transport.call(this, opts);
|
||
}
|
||
|
||
/**
|
||
* Inherits from Transport.
|
||
*/
|
||
|
||
inherit(Polling, Transport);
|
||
|
||
/**
|
||
* Transport name.
|
||
*/
|
||
|
||
Polling.prototype.name = 'polling';
|
||
|
||
/**
|
||
* Opens the socket (triggers polling). We write a PING message to determine
|
||
* when the transport is open.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.doOpen = function () {
|
||
this.poll();
|
||
};
|
||
|
||
/**
|
||
* Pauses polling.
|
||
*
|
||
* @param {Function} callback upon buffers are flushed and transport is paused
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.pause = function (onPause) {
|
||
var self = this;
|
||
|
||
this.readyState = 'pausing';
|
||
|
||
function pause () {
|
||
debug('paused');
|
||
self.readyState = 'paused';
|
||
onPause();
|
||
}
|
||
|
||
if (this.polling || !this.writable) {
|
||
var total = 0;
|
||
|
||
if (this.polling) {
|
||
debug('we are currently polling - waiting to pause');
|
||
total++;
|
||
this.once('pollComplete', function () {
|
||
debug('pre-pause polling complete');
|
||
--total || pause();
|
||
});
|
||
}
|
||
|
||
if (!this.writable) {
|
||
debug('we are currently writing - waiting to pause');
|
||
total++;
|
||
this.once('drain', function () {
|
||
debug('pre-pause writing complete');
|
||
--total || pause();
|
||
});
|
||
}
|
||
} else {
|
||
pause();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Starts polling cycle.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Polling.prototype.poll = function () {
|
||
debug('polling');
|
||
this.polling = true;
|
||
this.doPoll();
|
||
this.emit('poll');
|
||
};
|
||
|
||
/**
|
||
* Overloads onData to detect payloads.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.onData = function (data) {
|
||
var self = this;
|
||
debug('polling got data %s', data);
|
||
var callback = function (packet, index, total) {
|
||
// if its the first message we consider the transport open
|
||
if ('opening' === self.readyState) {
|
||
self.onOpen();
|
||
}
|
||
|
||
// if its a close packet, we close the ongoing requests
|
||
if ('close' === packet.type) {
|
||
self.onClose();
|
||
return false;
|
||
}
|
||
|
||
// otherwise bypass onData and handle the message
|
||
self.onPacket(packet);
|
||
};
|
||
|
||
// decode payload
|
||
parser.decodePayload(data, this.socket.binaryType, callback);
|
||
|
||
// if an event did not trigger closing
|
||
if ('closed' !== this.readyState) {
|
||
// if we got data we're not polling
|
||
this.polling = false;
|
||
this.emit('pollComplete');
|
||
|
||
if ('open' === this.readyState) {
|
||
this.poll();
|
||
} else {
|
||
debug('ignoring poll - transport state "%s"', this.readyState);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* For polling, send a close packet.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.doClose = function () {
|
||
var self = this;
|
||
|
||
function close () {
|
||
debug('writing close packet');
|
||
self.write([{ type: 'close' }]);
|
||
}
|
||
|
||
if ('open' === this.readyState) {
|
||
debug('transport open - closing');
|
||
close();
|
||
} else {
|
||
// in case we're trying to close while
|
||
// handshaking is in progress (GH-164)
|
||
debug('transport not open - deferring close');
|
||
this.once('open', close);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Writes a packets payload.
|
||
*
|
||
* @param {Array} data packets
|
||
* @param {Function} drain callback
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.write = function (packets) {
|
||
var self = this;
|
||
this.writable = false;
|
||
var callbackfn = function () {
|
||
self.writable = true;
|
||
self.emit('drain');
|
||
};
|
||
|
||
parser.encodePayload(packets, this.supportsBinary, function (data) {
|
||
self.doWrite(data, callbackfn);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Generates uri for connection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Polling.prototype.uri = function () {
|
||
var query = this.query || {};
|
||
var schema = this.secure ? 'https' : 'http';
|
||
var port = '';
|
||
|
||
// cache busting is forced
|
||
if (false !== this.timestampRequests) {
|
||
query[this.timestampParam] = yeast();
|
||
}
|
||
|
||
if (!this.supportsBinary && !query.sid) {
|
||
query.b64 = 1;
|
||
}
|
||
|
||
query = parseqs.encode(query);
|
||
|
||
// avoid port if default for schema
|
||
if (this.port && (('https' === schema && Number(this.port) !== 443) ||
|
||
('http' === schema && Number(this.port) !== 80))) {
|
||
port = ':' + this.port;
|
||
}
|
||
|
||
// prepend ? to query
|
||
if (query.length) {
|
||
query = '?' + query;
|
||
}
|
||
|
||
var ipv6 = this.hostname.indexOf(':') !== -1;
|
||
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 21 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
|
||
var alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')
|
||
, length = 64
|
||
, map = {}
|
||
, seed = 0
|
||
, i = 0
|
||
, prev;
|
||
|
||
/**
|
||
* Return a string representing the specified number.
|
||
*
|
||
* @param {Number} num The number to convert.
|
||
* @returns {String} The string representation of the number.
|
||
* @api public
|
||
*/
|
||
function encode(num) {
|
||
var encoded = '';
|
||
|
||
do {
|
||
encoded = alphabet[num % length] + encoded;
|
||
num = Math.floor(num / length);
|
||
} while (num > 0);
|
||
|
||
return encoded;
|
||
}
|
||
|
||
/**
|
||
* Return the integer value specified by the given string.
|
||
*
|
||
* @param {String} str The string to convert.
|
||
* @returns {Number} The integer value represented by the string.
|
||
* @api public
|
||
*/
|
||
function decode(str) {
|
||
var decoded = 0;
|
||
|
||
for (i = 0; i < str.length; i++) {
|
||
decoded = decoded * length + map[str.charAt(i)];
|
||
}
|
||
|
||
return decoded;
|
||
}
|
||
|
||
/**
|
||
* Yeast: A tiny growing id generator.
|
||
*
|
||
* @returns {String} A unique id.
|
||
* @api public
|
||
*/
|
||
function yeast() {
|
||
var now = encode(+new Date());
|
||
|
||
if (now !== prev) return seed = 0, prev = now;
|
||
return now +'.'+ encode(seed++);
|
||
}
|
||
|
||
//
|
||
// Map each character to its index.
|
||
//
|
||
for (; i < length; i++) map[alphabet[i]] = i;
|
||
|
||
//
|
||
// Expose the `yeast`, `encode` and `decode` functions.
|
||
//
|
||
yeast.encode = encode;
|
||
yeast.decode = decode;
|
||
module.exports = yeast;
|
||
|
||
|
||
/***/ }),
|
||
/* 22 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
var indexOf = [].indexOf;
|
||
|
||
module.exports = function(arr, obj){
|
||
if (indexOf) return arr.indexOf(obj);
|
||
for (var i = 0; i < arr.length; ++i) {
|
||
if (arr[i] === obj) return i;
|
||
}
|
||
return -1;
|
||
};
|
||
|
||
/***/ }),
|
||
/* 23 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var parser = __webpack_require__(8);
|
||
var Emitter = __webpack_require__(2);
|
||
var toArray = __webpack_require__(56);
|
||
var on = __webpack_require__(24);
|
||
var bind = __webpack_require__(25);
|
||
var debug = __webpack_require__(1)('socket.io-client:socket');
|
||
var parseqs = __webpack_require__(5);
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = exports = Socket;
|
||
|
||
/**
|
||
* Internal events (blacklisted).
|
||
* These events can't be emitted by the user.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
var events = {
|
||
connect: 1,
|
||
connect_error: 1,
|
||
connect_timeout: 1,
|
||
connecting: 1,
|
||
disconnect: 1,
|
||
error: 1,
|
||
reconnect: 1,
|
||
reconnect_attempt: 1,
|
||
reconnect_failed: 1,
|
||
reconnect_error: 1,
|
||
reconnecting: 1,
|
||
ping: 1,
|
||
pong: 1
|
||
};
|
||
|
||
/**
|
||
* Shortcut to `Emitter#emit`.
|
||
*/
|
||
|
||
var emit = Emitter.prototype.emit;
|
||
|
||
/**
|
||
* `Socket` constructor.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function Socket (io, nsp, opts) {
|
||
this.io = io;
|
||
this.nsp = nsp;
|
||
this.json = this; // compat
|
||
this.ids = 0;
|
||
this.acks = {};
|
||
this.receiveBuffer = [];
|
||
this.sendBuffer = [];
|
||
this.connected = false;
|
||
this.disconnected = true;
|
||
if (opts && opts.query) {
|
||
this.query = opts.query;
|
||
}
|
||
if (this.io.autoConnect) this.open();
|
||
}
|
||
|
||
/**
|
||
* Mix in `Emitter`.
|
||
*/
|
||
|
||
Emitter(Socket.prototype);
|
||
|
||
/**
|
||
* Subscribe to open, close and packet events
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.subEvents = function () {
|
||
if (this.subs) return;
|
||
|
||
var io = this.io;
|
||
this.subs = [
|
||
on(io, 'open', bind(this, 'onopen')),
|
||
on(io, 'packet', bind(this, 'onpacket')),
|
||
on(io, 'close', bind(this, 'onclose'))
|
||
];
|
||
};
|
||
|
||
/**
|
||
* "Opens" the socket.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.open =
|
||
Socket.prototype.connect = function () {
|
||
if (this.connected) return this;
|
||
|
||
this.subEvents();
|
||
this.io.open(); // ensure open
|
||
if ('open' === this.io.readyState) this.onopen();
|
||
this.emit('connecting');
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sends a `message` event.
|
||
*
|
||
* @return {Socket} self
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.send = function () {
|
||
var args = toArray(arguments);
|
||
args.unshift('message');
|
||
this.emit.apply(this, args);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Override `emit`.
|
||
* If the event is in `events`, it's emitted normally.
|
||
*
|
||
* @param {String} event name
|
||
* @return {Socket} self
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.emit = function (ev) {
|
||
if (events.hasOwnProperty(ev)) {
|
||
emit.apply(this, arguments);
|
||
return this;
|
||
}
|
||
|
||
var args = toArray(arguments);
|
||
var packet = { type: parser.EVENT, data: args };
|
||
|
||
packet.options = {};
|
||
packet.options.compress = !this.flags || false !== this.flags.compress;
|
||
|
||
// event ack callback
|
||
if ('function' === typeof args[args.length - 1]) {
|
||
debug('emitting packet with ack id %d', this.ids);
|
||
this.acks[this.ids] = args.pop();
|
||
packet.id = this.ids++;
|
||
}
|
||
|
||
if (this.connected) {
|
||
this.packet(packet);
|
||
} else {
|
||
this.sendBuffer.push(packet);
|
||
}
|
||
|
||
delete this.flags;
|
||
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sends a packet.
|
||
*
|
||
* @param {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.packet = function (packet) {
|
||
packet.nsp = this.nsp;
|
||
this.io.packet(packet);
|
||
};
|
||
|
||
/**
|
||
* Called upon engine `open`.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onopen = function () {
|
||
debug('transport is open - connecting');
|
||
|
||
// write connect packet if necessary
|
||
if ('/' !== this.nsp) {
|
||
if (this.query) {
|
||
var query = typeof this.query === 'object' ? parseqs.encode(this.query) : this.query;
|
||
debug('sending connect packet with query %s', query);
|
||
this.packet({type: parser.CONNECT, query: query});
|
||
} else {
|
||
this.packet({type: parser.CONNECT});
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon engine `close`.
|
||
*
|
||
* @param {String} reason
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onclose = function (reason) {
|
||
debug('close (%s)', reason);
|
||
this.connected = false;
|
||
this.disconnected = true;
|
||
delete this.id;
|
||
this.emit('disconnect', reason);
|
||
};
|
||
|
||
/**
|
||
* Called with socket packet.
|
||
*
|
||
* @param {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onpacket = function (packet) {
|
||
if (packet.nsp !== this.nsp) return;
|
||
|
||
switch (packet.type) {
|
||
case parser.CONNECT:
|
||
this.onconnect();
|
||
break;
|
||
|
||
case parser.EVENT:
|
||
this.onevent(packet);
|
||
break;
|
||
|
||
case parser.BINARY_EVENT:
|
||
this.onevent(packet);
|
||
break;
|
||
|
||
case parser.ACK:
|
||
this.onack(packet);
|
||
break;
|
||
|
||
case parser.BINARY_ACK:
|
||
this.onack(packet);
|
||
break;
|
||
|
||
case parser.DISCONNECT:
|
||
this.ondisconnect();
|
||
break;
|
||
|
||
case parser.ERROR:
|
||
this.emit('error', packet.data);
|
||
break;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon a server event.
|
||
*
|
||
* @param {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onevent = function (packet) {
|
||
var args = packet.data || [];
|
||
debug('emitting event %j', args);
|
||
|
||
if (null != packet.id) {
|
||
debug('attaching ack callback to event');
|
||
args.push(this.ack(packet.id));
|
||
}
|
||
|
||
if (this.connected) {
|
||
emit.apply(this, args);
|
||
} else {
|
||
this.receiveBuffer.push(args);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Produces an ack callback to emit with an event.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.ack = function (id) {
|
||
var self = this;
|
||
var sent = false;
|
||
return function () {
|
||
// prevent double callbacks
|
||
if (sent) return;
|
||
sent = true;
|
||
var args = toArray(arguments);
|
||
debug('sending ack %j', args);
|
||
|
||
self.packet({
|
||
type: parser.ACK,
|
||
id: id,
|
||
data: args
|
||
});
|
||
};
|
||
};
|
||
|
||
/**
|
||
* Called upon a server acknowlegement.
|
||
*
|
||
* @param {Object} packet
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onack = function (packet) {
|
||
var ack = this.acks[packet.id];
|
||
if ('function' === typeof ack) {
|
||
debug('calling ack %s with %j', packet.id, packet.data);
|
||
ack.apply(this, packet.data);
|
||
delete this.acks[packet.id];
|
||
} else {
|
||
debug('bad ack %s', packet.id);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon server connect.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onconnect = function () {
|
||
this.connected = true;
|
||
this.disconnected = false;
|
||
this.emit('connect');
|
||
this.emitBuffered();
|
||
};
|
||
|
||
/**
|
||
* Emit buffered events (received and emitted).
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.emitBuffered = function () {
|
||
var i;
|
||
for (i = 0; i < this.receiveBuffer.length; i++) {
|
||
emit.apply(this, this.receiveBuffer[i]);
|
||
}
|
||
this.receiveBuffer = [];
|
||
|
||
for (i = 0; i < this.sendBuffer.length; i++) {
|
||
this.packet(this.sendBuffer[i]);
|
||
}
|
||
this.sendBuffer = [];
|
||
};
|
||
|
||
/**
|
||
* Called upon server disconnect.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.ondisconnect = function () {
|
||
debug('server disconnect (%s)', this.nsp);
|
||
this.destroy();
|
||
this.onclose('io server disconnect');
|
||
};
|
||
|
||
/**
|
||
* Called upon forced client/server side disconnections,
|
||
* this method ensures the manager stops tracking us and
|
||
* that reconnections don't get triggered for this.
|
||
*
|
||
* @api private.
|
||
*/
|
||
|
||
Socket.prototype.destroy = function () {
|
||
if (this.subs) {
|
||
// clean subscriptions to avoid reconnections
|
||
for (var i = 0; i < this.subs.length; i++) {
|
||
this.subs[i].destroy();
|
||
}
|
||
this.subs = null;
|
||
}
|
||
|
||
this.io.destroy(this);
|
||
};
|
||
|
||
/**
|
||
* Disconnects the socket manually.
|
||
*
|
||
* @return {Socket} self
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.close =
|
||
Socket.prototype.disconnect = function () {
|
||
if (this.connected) {
|
||
debug('performing disconnect (%s)', this.nsp);
|
||
this.packet({ type: parser.DISCONNECT });
|
||
}
|
||
|
||
// remove socket from pool
|
||
this.destroy();
|
||
|
||
if (this.connected) {
|
||
// fire events
|
||
this.onclose('io client disconnect');
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sets the compress flag.
|
||
*
|
||
* @param {Boolean} if `true`, compresses the sending data
|
||
* @return {Socket} self
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.compress = function (compress) {
|
||
this.flags = this.flags || {};
|
||
this.flags.compress = compress;
|
||
return this;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 24 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = on;
|
||
|
||
/**
|
||
* Helper for subscriptions.
|
||
*
|
||
* @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`
|
||
* @param {String} event name
|
||
* @param {Function} callback
|
||
* @api public
|
||
*/
|
||
|
||
function on (obj, ev, fn) {
|
||
obj.on(ev, fn);
|
||
return {
|
||
destroy: function () {
|
||
obj.removeListener(ev, fn);
|
||
}
|
||
};
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 25 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/**
|
||
* Slice reference.
|
||
*/
|
||
|
||
var slice = [].slice;
|
||
|
||
/**
|
||
* 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)));
|
||
}
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 26 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var scroll = __webpack_require__(11);
|
||
var utils = __webpack_require__(4);
|
||
var styles = {
|
||
display: "none",
|
||
padding: "15px",
|
||
fontFamily: "sans-serif",
|
||
position: "fixed",
|
||
fontSize: "0.9em",
|
||
zIndex: 9999,
|
||
right: 0,
|
||
top: 0,
|
||
borderBottomLeftRadius: "5px",
|
||
backgroundColor: "#1B2032",
|
||
margin: 0,
|
||
color: "white",
|
||
textAlign: "center",
|
||
pointerEvents: "none"
|
||
};
|
||
var elem;
|
||
var options;
|
||
var timeoutInt;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {*}
|
||
*/
|
||
exports.init = function (bs) {
|
||
options = bs.options;
|
||
var cssStyles = styles;
|
||
if (options.notify.styles) {
|
||
if (Object.prototype.toString.call(options.notify.styles) ===
|
||
"[object Array]") {
|
||
// handle original array behavior, replace all styles with a joined copy
|
||
cssStyles = options.notify.styles.join(";");
|
||
}
|
||
else {
|
||
for (var key in options.notify.styles) {
|
||
if (options.notify.styles.hasOwnProperty(key)) {
|
||
cssStyles[key] = options.notify.styles[key];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
elem = document.createElement("DIV");
|
||
elem.id = "__bs_notify__";
|
||
if (typeof cssStyles === "string") {
|
||
elem.style.cssText = cssStyles;
|
||
}
|
||
else {
|
||
for (var rule in cssStyles) {
|
||
elem.style[rule] = cssStyles[rule];
|
||
}
|
||
}
|
||
var flashFn = exports.watchEvent(bs);
|
||
bs.emitter.on("notify", flashFn);
|
||
bs.socket.on("browser:notify", flashFn);
|
||
return elem;
|
||
};
|
||
/**
|
||
* @returns {Function}
|
||
*/
|
||
exports.watchEvent = function (bs) {
|
||
return function (data) {
|
||
if (bs.options.notify || data.override) {
|
||
if (typeof data === "string") {
|
||
return exports.flash(data);
|
||
}
|
||
exports.flash(data.message, data.timeout);
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
*
|
||
*/
|
||
exports.getElem = function () {
|
||
return elem;
|
||
};
|
||
/**
|
||
* @param message
|
||
* @param [timeout]
|
||
* @returns {*}
|
||
*/
|
||
exports.flash = function (message, timeout) {
|
||
var elem = exports.getElem();
|
||
var $body = utils.getBody();
|
||
// return if notify was never initialised
|
||
if (!elem) {
|
||
return false;
|
||
}
|
||
elem.innerHTML = message;
|
||
elem.style.display = "block";
|
||
$body.appendChild(elem);
|
||
if (timeoutInt) {
|
||
clearTimeout(timeoutInt);
|
||
timeoutInt = undefined;
|
||
}
|
||
timeoutInt = window.setTimeout(function () {
|
||
elem.style.display = "none";
|
||
if (elem.parentNode) {
|
||
$body.removeChild(elem);
|
||
}
|
||
}, timeout || 2000);
|
||
return elem;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 27 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing clicks between browsers
|
||
* @type {string}
|
||
*/
|
||
var EVENT_NAME = "click";
|
||
var OPT_PATH = "ghostMode.clicks";
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param eventManager
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
eventManager.addEvent(document.body, EVENT_NAME, exports.browserEvent(bs));
|
||
bs.socket.on(EVENT_NAME, exports.socketEvent(bs, eventManager));
|
||
};
|
||
/**
|
||
* Uses event delegation to determine the clicked element
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.browserEvent = function (bs) {
|
||
return function (event) {
|
||
if (exports.canEmitEvents) {
|
||
var elem = event.target || event.srcElement;
|
||
if (elem.type === "checkbox" || elem.type === "radio") {
|
||
bs.utils.forceChange(elem);
|
||
return;
|
||
}
|
||
bs.socket.emit(EVENT_NAME, bs.utils.getElementData(elem));
|
||
}
|
||
else {
|
||
exports.canEmitEvents = true;
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param {manager} eventManager
|
||
* @returns {Function}
|
||
*/
|
||
exports.socketEvent = function (bs, eventManager) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH) || bs.tabHidden) {
|
||
return false;
|
||
}
|
||
var elem = bs.utils.getSingleElement(data.tagName, data.index);
|
||
if (elem) {
|
||
exports.canEmitEvents = false;
|
||
eventManager.triggerClick(elem);
|
||
}
|
||
};
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 28 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
exports.plugins = {
|
||
inputs: __webpack_require__(29),
|
||
toggles: __webpack_require__(30),
|
||
submit: __webpack_require__(31)
|
||
};
|
||
/**
|
||
* Load plugins for enabled options
|
||
* @param bs
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
var checkOpt = true;
|
||
var options = bs.options.ghostMode.forms;
|
||
if (options === true) {
|
||
checkOpt = false;
|
||
}
|
||
function init(name) {
|
||
exports.plugins[name].init(bs, eventManager);
|
||
}
|
||
for (var name in exports.plugins) {
|
||
if (!checkOpt) {
|
||
init(name);
|
||
}
|
||
else {
|
||
if (options[name]) {
|
||
init(name);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 29 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing clicks between browsers
|
||
* @type {string}
|
||
*/
|
||
var EVENT_NAME = "input:text";
|
||
var OPT_PATH = "ghostMode.forms.inputs";
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param eventManager
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
eventManager.addEvent(document.body, "keyup", exports.browserEvent(bs));
|
||
bs.socket.on(EVENT_NAME, exports.socketEvent(bs, eventManager));
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.browserEvent = function (bs) {
|
||
return function (event) {
|
||
var elem = event.target || event.srcElement;
|
||
var data;
|
||
if (exports.canEmitEvents) {
|
||
if (elem.tagName === "INPUT" || elem.tagName === "TEXTAREA") {
|
||
data = bs.utils.getElementData(elem);
|
||
data.value = elem.value;
|
||
bs.socket.emit(EVENT_NAME, data);
|
||
}
|
||
}
|
||
else {
|
||
exports.canEmitEvents = true;
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.socketEvent = function (bs) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
var elem = bs.utils.getSingleElement(data.tagName, data.index);
|
||
if (elem) {
|
||
elem.value = data.value;
|
||
return elem;
|
||
}
|
||
return false;
|
||
};
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 30 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing clicks between browsers
|
||
* @type {string}
|
||
*/
|
||
var EVENT_NAME = "input:toggles";
|
||
var OPT_PATH = "ghostMode.forms.toggles";
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param eventManager
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
var browserEvent = exports.browserEvent(bs);
|
||
exports.addEvents(eventManager, browserEvent);
|
||
bs.socket.on(EVENT_NAME, exports.socketEvent(bs, eventManager));
|
||
};
|
||
/**
|
||
* @param eventManager
|
||
* @param event
|
||
*/
|
||
exports.addEvents = function (eventManager, event) {
|
||
var elems = document.getElementsByTagName("select");
|
||
var inputs = document.getElementsByTagName("input");
|
||
addEvents(elems);
|
||
addEvents(inputs);
|
||
function addEvents(domElems) {
|
||
for (var i = 0, n = domElems.length; i < n; i += 1) {
|
||
eventManager.addEvent(domElems[i], "change", event);
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.browserEvent = function (bs) {
|
||
return function (event) {
|
||
if (exports.canEmitEvents) {
|
||
var elem = event.target || event.srcElement;
|
||
var data;
|
||
if (elem.type === "radio" ||
|
||
elem.type === "checkbox" ||
|
||
elem.tagName === "SELECT") {
|
||
data = bs.utils.getElementData(elem);
|
||
data.type = elem.type;
|
||
data.value = elem.value;
|
||
data.checked = elem.checked;
|
||
bs.socket.emit(EVENT_NAME, data);
|
||
}
|
||
}
|
||
else {
|
||
exports.canEmitEvents = true;
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.socketEvent = function (bs) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
exports.canEmitEvents = false;
|
||
var elem = bs.utils.getSingleElement(data.tagName, data.index);
|
||
if (elem) {
|
||
if (data.type === "radio") {
|
||
elem.checked = true;
|
||
}
|
||
if (data.type === "checkbox") {
|
||
elem.checked = data.checked;
|
||
}
|
||
if (data.tagName === "SELECT") {
|
||
elem.value = data.value;
|
||
}
|
||
return elem;
|
||
}
|
||
return false;
|
||
};
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 31 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing clicks between browsers
|
||
* @type {string}
|
||
*/
|
||
var EVENT_NAME = "form:submit";
|
||
var OPT_PATH = "ghostMode.forms.submit";
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @param eventManager
|
||
*/
|
||
exports.init = function (bs, eventManager) {
|
||
var browserEvent = exports.browserEvent(bs);
|
||
eventManager.addEvent(document.body, "submit", browserEvent);
|
||
eventManager.addEvent(document.body, "reset", browserEvent);
|
||
bs.socket.on(EVENT_NAME, exports.socketEvent(bs, eventManager));
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.browserEvent = function (bs) {
|
||
return function (event) {
|
||
if (exports.canEmitEvents) {
|
||
var elem = event.target || event.srcElement;
|
||
var data = bs.utils.getElementData(elem);
|
||
data.type = event.type;
|
||
bs.socket.emit(EVENT_NAME, data);
|
||
}
|
||
else {
|
||
exports.canEmitEvents = true;
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {Function}
|
||
*/
|
||
exports.socketEvent = function (bs) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
var elem = bs.utils.getSingleElement(data.tagName, data.index);
|
||
exports.canEmitEvents = false;
|
||
if (elem && data.type === "submit") {
|
||
elem.submit();
|
||
}
|
||
if (elem && data.type === "reset") {
|
||
elem.reset();
|
||
}
|
||
return false;
|
||
};
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 32 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
/**
|
||
* This is the plugin for syncing location
|
||
* @type {string}
|
||
*/
|
||
var EVENT_NAME = "browser:location";
|
||
var OPT_PATH = "ghostMode.location";
|
||
exports.canEmitEvents = true;
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
*/
|
||
exports.init = function (bs) {
|
||
bs.socket.on(EVENT_NAME, exports.socketEvent(bs));
|
||
};
|
||
/**
|
||
* Respond to socket event
|
||
*/
|
||
exports.socketEvent = function (bs) {
|
||
return function (data) {
|
||
if (!bs.canSync(data, OPT_PATH)) {
|
||
return false;
|
||
}
|
||
if (data.path) {
|
||
exports.setPath(data.path);
|
||
}
|
||
else {
|
||
exports.setUrl(data.url);
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param url
|
||
*/
|
||
exports.setUrl = function (url) {
|
||
window.location = url;
|
||
};
|
||
/**
|
||
* @param path
|
||
*/
|
||
exports.setPath = function (path) {
|
||
window.location =
|
||
window.location.protocol + "//" + window.location.host + path;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 33 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(34);
|
||
|
||
|
||
/***/ }),
|
||
/* 34 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var socket = __webpack_require__(13);
|
||
var shims = __webpack_require__(58);
|
||
var notify = __webpack_require__(26);
|
||
var codeSync = __webpack_require__(59);
|
||
var BrowserSync = __webpack_require__(69);
|
||
var ghostMode = __webpack_require__(71);
|
||
var emitter = __webpack_require__(7);
|
||
var events = __webpack_require__(12);
|
||
var utils = __webpack_require__(4);
|
||
var shouldReload = false;
|
||
var initialised = false;
|
||
/**
|
||
* @param options
|
||
*/
|
||
exports.init = function (options) {
|
||
if (shouldReload && options.reloadOnRestart) {
|
||
utils.reloadBrowser();
|
||
}
|
||
var BS = window.___browserSync___ || {};
|
||
if (!BS.client) {
|
||
BS.client = true;
|
||
var browserSync = new BrowserSync(options);
|
||
// Always init on page load
|
||
ghostMode.init(browserSync);
|
||
codeSync.init(browserSync);
|
||
notify.init(browserSync);
|
||
if (options.notify) {
|
||
notify.flash("Connected to BrowserSync");
|
||
}
|
||
}
|
||
if (!initialised) {
|
||
socket.on("disconnect", function () {
|
||
if (options.notify) {
|
||
notify.flash("Disconnected from BrowserSync");
|
||
}
|
||
shouldReload = true;
|
||
});
|
||
initialised = true;
|
||
}
|
||
};
|
||
/**
|
||
* Handle individual socket connections
|
||
*/
|
||
socket.on("connection", exports.init);
|
||
/**debug:start**/
|
||
if (window.__karma__) {
|
||
window.__bs_scroll__ = __webpack_require__(11);
|
||
window.__bs_clicks__ = __webpack_require__(27);
|
||
window.__bs_location__ = __webpack_require__(32);
|
||
window.__bs_inputs__ = __webpack_require__(29);
|
||
window.__bs_toggles__ = __webpack_require__(30);
|
||
window.__bs_submit__ = __webpack_require__(31);
|
||
window.__bs_forms__ = __webpack_require__(28);
|
||
window.__bs_utils__ = __webpack_require__(4);
|
||
window.__bs_emitter__ = emitter;
|
||
window.__bs = BrowserSync;
|
||
window.__bs_notify__ = notify;
|
||
window.__bs_code_sync__ = codeSync;
|
||
window.__bs_ghost_mode__ = ghostMode;
|
||
window.__bs_socket__ = socket;
|
||
window.__bs_index__ = exports;
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 35 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var url = __webpack_require__(36);
|
||
var parser = __webpack_require__(8);
|
||
var Manager = __webpack_require__(18);
|
||
var debug = __webpack_require__(1)('socket.io-client');
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = exports = lookup;
|
||
|
||
/**
|
||
* Managers cache.
|
||
*/
|
||
|
||
var cache = exports.managers = {};
|
||
|
||
/**
|
||
* Looks up an existing `Manager` for multiplexing.
|
||
* If the user summons:
|
||
*
|
||
* `io('http://localhost/a');`
|
||
* `io('http://localhost/b');`
|
||
*
|
||
* We reuse the existing instance based on same scheme/port/host,
|
||
* and we initialize sockets for each namespace.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function lookup (uri, opts) {
|
||
if (typeof uri === 'object') {
|
||
opts = uri;
|
||
uri = undefined;
|
||
}
|
||
|
||
opts = opts || {};
|
||
|
||
var parsed = url(uri);
|
||
var source = parsed.source;
|
||
var id = parsed.id;
|
||
var path = parsed.path;
|
||
var sameNamespace = cache[id] && path in cache[id].nsps;
|
||
var newConnection = opts.forceNew || opts['force new connection'] ||
|
||
false === opts.multiplex || sameNamespace;
|
||
|
||
var io;
|
||
|
||
if (newConnection) {
|
||
debug('ignoring socket cache for %s', source);
|
||
io = Manager(source, opts);
|
||
} else {
|
||
if (!cache[id]) {
|
||
debug('new io instance for %s', source);
|
||
cache[id] = Manager(source, opts);
|
||
}
|
||
io = cache[id];
|
||
}
|
||
if (parsed.query && !opts.query) {
|
||
opts.query = parsed.query;
|
||
}
|
||
return io.socket(parsed.path, opts);
|
||
}
|
||
|
||
/**
|
||
* Protocol version.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.protocol = parser.protocol;
|
||
|
||
/**
|
||
* `connect`.
|
||
*
|
||
* @param {String} uri
|
||
* @api public
|
||
*/
|
||
|
||
exports.connect = lookup;
|
||
|
||
/**
|
||
* Expose constructors for standalone build.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
exports.Manager = __webpack_require__(18);
|
||
exports.Socket = __webpack_require__(23);
|
||
|
||
|
||
/***/ }),
|
||
/* 36 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var parseuri = __webpack_require__(14);
|
||
var debug = __webpack_require__(1)('socket.io-client:url');
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = url;
|
||
|
||
/**
|
||
* URL parser.
|
||
*
|
||
* @param {String} url
|
||
* @param {Object} An object meant to mimic window.location.
|
||
* Defaults to window.location.
|
||
* @api public
|
||
*/
|
||
|
||
function url (uri, loc) {
|
||
var obj = uri;
|
||
|
||
// default to window.location
|
||
loc = loc || global.location;
|
||
if (null == uri) uri = loc.protocol + '//' + loc.host;
|
||
|
||
// relative path support
|
||
if ('string' === typeof uri) {
|
||
if ('/' === uri.charAt(0)) {
|
||
if ('/' === uri.charAt(1)) {
|
||
uri = loc.protocol + uri;
|
||
} else {
|
||
uri = loc.host + uri;
|
||
}
|
||
}
|
||
|
||
if (!/^(https?|wss?):\/\//.test(uri)) {
|
||
debug('protocol-less url %s', uri);
|
||
if ('undefined' !== typeof loc) {
|
||
uri = loc.protocol + '//' + uri;
|
||
} else {
|
||
uri = 'https://' + uri;
|
||
}
|
||
}
|
||
|
||
// parse
|
||
debug('parse %s', uri);
|
||
obj = parseuri(uri);
|
||
}
|
||
|
||
// make sure we treat `localhost:80` and `localhost` equally
|
||
if (!obj.port) {
|
||
if (/^(http|ws)$/.test(obj.protocol)) {
|
||
obj.port = '80';
|
||
} else if (/^(http|ws)s$/.test(obj.protocol)) {
|
||
obj.port = '443';
|
||
}
|
||
}
|
||
|
||
obj.path = obj.path || '/';
|
||
|
||
var ipv6 = obj.host.indexOf(':') !== -1;
|
||
var host = ipv6 ? '[' + obj.host + ']' : obj.host;
|
||
|
||
// define unique id
|
||
obj.id = obj.protocol + '://' + host + ':' + obj.port;
|
||
// define href
|
||
obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));
|
||
|
||
return obj;
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 37 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
/**
|
||
* This is the common logic for both the Node.js and web browser
|
||
* implementations of `debug()`.
|
||
*
|
||
* Expose `debug()` as the module.
|
||
*/
|
||
|
||
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
|
||
exports.coerce = coerce;
|
||
exports.disable = disable;
|
||
exports.enable = enable;
|
||
exports.enabled = enabled;
|
||
exports.humanize = __webpack_require__(38);
|
||
|
||
/**
|
||
* The currently active debug mode names, and names to skip.
|
||
*/
|
||
|
||
exports.names = [];
|
||
exports.skips = [];
|
||
|
||
/**
|
||
* Map of special "%n" handling functions, for the debug "format" argument.
|
||
*
|
||
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
||
*/
|
||
|
||
exports.formatters = {};
|
||
|
||
/**
|
||
* Previous log timestamp.
|
||
*/
|
||
|
||
var prevTime;
|
||
|
||
/**
|
||
* Select a color.
|
||
* @param {String} namespace
|
||
* @return {Number}
|
||
* @api private
|
||
*/
|
||
|
||
function selectColor(namespace) {
|
||
var hash = 0, i;
|
||
|
||
for (i in namespace) {
|
||
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
||
hash |= 0; // Convert to 32bit integer
|
||
}
|
||
|
||
return exports.colors[Math.abs(hash) % exports.colors.length];
|
||
}
|
||
|
||
/**
|
||
* Create a debugger with the given `namespace`.
|
||
*
|
||
* @param {String} namespace
|
||
* @return {Function}
|
||
* @api public
|
||
*/
|
||
|
||
function createDebug(namespace) {
|
||
|
||
function debug() {
|
||
// disabled?
|
||
if (!debug.enabled) return;
|
||
|
||
var self = debug;
|
||
|
||
// set `diff` timestamp
|
||
var curr = +new Date();
|
||
var ms = curr - (prevTime || curr);
|
||
self.diff = ms;
|
||
self.prev = prevTime;
|
||
self.curr = curr;
|
||
prevTime = curr;
|
||
|
||
// turn the `arguments` into a proper Array
|
||
var args = new Array(arguments.length);
|
||
for (var i = 0; i < args.length; i++) {
|
||
args[i] = arguments[i];
|
||
}
|
||
|
||
args[0] = exports.coerce(args[0]);
|
||
|
||
if ('string' !== typeof args[0]) {
|
||
// anything else let's inspect with %O
|
||
args.unshift('%O');
|
||
}
|
||
|
||
// apply any `formatters` transformations
|
||
var index = 0;
|
||
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
|
||
// if we encounter an escaped % then don't increase the array index
|
||
if (match === '%%') return match;
|
||
index++;
|
||
var formatter = exports.formatters[format];
|
||
if ('function' === typeof formatter) {
|
||
var val = args[index];
|
||
match = formatter.call(self, val);
|
||
|
||
// now we need to remove `args[index]` since it's inlined in the `format`
|
||
args.splice(index, 1);
|
||
index--;
|
||
}
|
||
return match;
|
||
});
|
||
|
||
// apply env-specific formatting (colors, etc.)
|
||
exports.formatArgs.call(self, args);
|
||
|
||
var logFn = debug.log || exports.log || console.log.bind(console);
|
||
logFn.apply(self, args);
|
||
}
|
||
|
||
debug.namespace = namespace;
|
||
debug.enabled = exports.enabled(namespace);
|
||
debug.useColors = exports.useColors();
|
||
debug.color = selectColor(namespace);
|
||
|
||
// env-specific initialization logic for debug instances
|
||
if ('function' === typeof exports.init) {
|
||
exports.init(debug);
|
||
}
|
||
|
||
return debug;
|
||
}
|
||
|
||
/**
|
||
* Enables a debug mode by namespaces. This can include modes
|
||
* separated by a colon and wildcards.
|
||
*
|
||
* @param {String} namespaces
|
||
* @api public
|
||
*/
|
||
|
||
function enable(namespaces) {
|
||
exports.save(namespaces);
|
||
|
||
exports.names = [];
|
||
exports.skips = [];
|
||
|
||
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
|
||
var len = split.length;
|
||
|
||
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 + '$'));
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Disable debug output.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
function disable() {
|
||
exports.enable('');
|
||
}
|
||
|
||
/**
|
||
* Returns true if the given mode name is enabled, false otherwise.
|
||
*
|
||
* @param {String} name
|
||
* @return {Boolean}
|
||
* @api public
|
||
*/
|
||
|
||
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;
|
||
}
|
||
|
||
/**
|
||
* Coerce `val`.
|
||
*
|
||
* @param {Mixed} val
|
||
* @return {Mixed}
|
||
* @api private
|
||
*/
|
||
|
||
function coerce(val) {
|
||
if (val instanceof Error) return val.stack || val.message;
|
||
return val;
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 38 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/**
|
||
* Helpers.
|
||
*/
|
||
|
||
var s = 1000;
|
||
var m = s * 60;
|
||
var h = m * 60;
|
||
var d = h * 24;
|
||
var y = d * 365.25;
|
||
|
||
/**
|
||
* Parse or format the given `val`.
|
||
*
|
||
* Options:
|
||
*
|
||
* - `long` verbose formatting [false]
|
||
*
|
||
* @param {String|Number} val
|
||
* @param {Object} [options]
|
||
* @throws {Error} throw an error if val is not a non-empty string or a number
|
||
* @return {String|Number}
|
||
* @api public
|
||
*/
|
||
|
||
module.exports = function(val, options) {
|
||
options = options || {};
|
||
var type = typeof val;
|
||
if (type === 'string' && val.length > 0) {
|
||
return parse(val);
|
||
} else if (type === 'number' && isNaN(val) === false) {
|
||
return options.long ? fmtLong(val) : fmtShort(val);
|
||
}
|
||
throw new Error(
|
||
'val is not a non-empty string or a valid number. val=' +
|
||
JSON.stringify(val)
|
||
);
|
||
};
|
||
|
||
/**
|
||
* Parse the given `str` and return milliseconds.
|
||
*
|
||
* @param {String} str
|
||
* @return {Number}
|
||
* @api private
|
||
*/
|
||
|
||
function parse(str) {
|
||
str = String(str);
|
||
if (str.length > 100) {
|
||
return;
|
||
}
|
||
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
|
||
str
|
||
);
|
||
if (!match) {
|
||
return;
|
||
}
|
||
var n = parseFloat(match[1]);
|
||
var type = (match[2] || 'ms').toLowerCase();
|
||
switch (type) {
|
||
case 'years':
|
||
case 'year':
|
||
case 'yrs':
|
||
case 'yr':
|
||
case 'y':
|
||
return n * y;
|
||
case 'days':
|
||
case 'day':
|
||
case 'd':
|
||
return n * d;
|
||
case 'hours':
|
||
case 'hour':
|
||
case 'hrs':
|
||
case 'hr':
|
||
case 'h':
|
||
return n * h;
|
||
case 'minutes':
|
||
case 'minute':
|
||
case 'mins':
|
||
case 'min':
|
||
case 'm':
|
||
return n * m;
|
||
case 'seconds':
|
||
case 'second':
|
||
case 'secs':
|
||
case 'sec':
|
||
case 's':
|
||
return n * s;
|
||
case 'milliseconds':
|
||
case 'millisecond':
|
||
case 'msecs':
|
||
case 'msec':
|
||
case 'ms':
|
||
return n;
|
||
default:
|
||
return undefined;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Short format for `ms`.
|
||
*
|
||
* @param {Number} ms
|
||
* @return {String}
|
||
* @api private
|
||
*/
|
||
|
||
function fmtShort(ms) {
|
||
if (ms >= d) {
|
||
return Math.round(ms / d) + 'd';
|
||
}
|
||
if (ms >= h) {
|
||
return Math.round(ms / h) + 'h';
|
||
}
|
||
if (ms >= m) {
|
||
return Math.round(ms / m) + 'm';
|
||
}
|
||
if (ms >= s) {
|
||
return Math.round(ms / s) + 's';
|
||
}
|
||
return ms + 'ms';
|
||
}
|
||
|
||
/**
|
||
* Long format for `ms`.
|
||
*
|
||
* @param {Number} ms
|
||
* @return {String}
|
||
* @api private
|
||
*/
|
||
|
||
function fmtLong(ms) {
|
||
return plural(ms, d, 'day') ||
|
||
plural(ms, h, 'hour') ||
|
||
plural(ms, m, 'minute') ||
|
||
plural(ms, s, 'second') ||
|
||
ms + ' ms';
|
||
}
|
||
|
||
/**
|
||
* Pluralization helper.
|
||
*/
|
||
|
||
function plural(ms, n, name) {
|
||
if (ms < n) {
|
||
return;
|
||
}
|
||
if (ms < n * 1.5) {
|
||
return Math.floor(ms / n) + ' ' + name;
|
||
}
|
||
return Math.ceil(ms / n) + ' ' + name + 's';
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 39 */
|
||
/***/ (function(module, exports) {
|
||
|
||
var toString = {}.toString;
|
||
|
||
module.exports = Array.isArray || function (arr) {
|
||
return toString.call(arr) == '[object Array]';
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 40 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/*global Blob,File*/
|
||
|
||
/**
|
||
* Module requirements
|
||
*/
|
||
|
||
var isArray = __webpack_require__(41);
|
||
var isBuf = __webpack_require__(17);
|
||
var toString = Object.prototype.toString;
|
||
var withNativeBlob = typeof global.Blob === 'function' || toString.call(global.Blob) === '[object BlobConstructor]';
|
||
var withNativeFile = typeof global.File === 'function' || toString.call(global.File) === '[object FileConstructor]';
|
||
|
||
/**
|
||
* Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.
|
||
* Anything with blobs or files should be fed through removeBlobs before coming
|
||
* here.
|
||
*
|
||
* @param {Object} packet - socket.io event packet
|
||
* @return {Object} with deconstructed packet and list of buffers
|
||
* @api public
|
||
*/
|
||
|
||
exports.deconstructPacket = function(packet) {
|
||
var buffers = [];
|
||
var packetData = packet.data;
|
||
var pack = packet;
|
||
pack.data = _deconstructPacket(packetData, buffers);
|
||
pack.attachments = buffers.length; // number of binary 'attachments'
|
||
return {packet: pack, buffers: buffers};
|
||
};
|
||
|
||
function _deconstructPacket(data, buffers) {
|
||
if (!data) return data;
|
||
|
||
if (isBuf(data)) {
|
||
var placeholder = { _placeholder: true, num: buffers.length };
|
||
buffers.push(data);
|
||
return placeholder;
|
||
} else if (isArray(data)) {
|
||
var newData = new Array(data.length);
|
||
for (var i = 0; i < data.length; i++) {
|
||
newData[i] = _deconstructPacket(data[i], buffers);
|
||
}
|
||
return newData;
|
||
} else if (typeof data === 'object' && !(data instanceof Date)) {
|
||
var newData = {};
|
||
for (var key in data) {
|
||
newData[key] = _deconstructPacket(data[key], buffers);
|
||
}
|
||
return newData;
|
||
}
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* Reconstructs a binary packet from its placeholder packet and buffers
|
||
*
|
||
* @param {Object} packet - event packet with placeholders
|
||
* @param {Array} buffers - binary buffers to put in placeholder positions
|
||
* @return {Object} reconstructed packet
|
||
* @api public
|
||
*/
|
||
|
||
exports.reconstructPacket = function(packet, buffers) {
|
||
packet.data = _reconstructPacket(packet.data, buffers);
|
||
packet.attachments = undefined; // no longer useful
|
||
return packet;
|
||
};
|
||
|
||
function _reconstructPacket(data, buffers) {
|
||
if (!data) return data;
|
||
|
||
if (data && data._placeholder) {
|
||
return buffers[data.num]; // appropriate buffer (should be natural order anyway)
|
||
} else if (isArray(data)) {
|
||
for (var i = 0; i < data.length; i++) {
|
||
data[i] = _reconstructPacket(data[i], buffers);
|
||
}
|
||
} else if (typeof data === 'object') {
|
||
for (var key in data) {
|
||
data[key] = _reconstructPacket(data[key], buffers);
|
||
}
|
||
}
|
||
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* Asynchronously removes Blobs or Files from data via
|
||
* FileReader's readAsArrayBuffer method. Used before encoding
|
||
* data as msgpack. Calls callback with the blobless data.
|
||
*
|
||
* @param {Object} data
|
||
* @param {Function} callback
|
||
* @api private
|
||
*/
|
||
|
||
exports.removeBlobs = function(data, callback) {
|
||
function _removeBlobs(obj, curKey, containingObject) {
|
||
if (!obj) return obj;
|
||
|
||
// convert any blob
|
||
if ((withNativeBlob && obj instanceof Blob) ||
|
||
(withNativeFile && obj instanceof File)) {
|
||
pendingBlobs++;
|
||
|
||
// async filereader
|
||
var fileReader = new FileReader();
|
||
fileReader.onload = function() { // this.result == arraybuffer
|
||
if (containingObject) {
|
||
containingObject[curKey] = this.result;
|
||
}
|
||
else {
|
||
bloblessData = this.result;
|
||
}
|
||
|
||
// if nothing pending its callback time
|
||
if(! --pendingBlobs) {
|
||
callback(bloblessData);
|
||
}
|
||
};
|
||
|
||
fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer
|
||
} else if (isArray(obj)) { // handle array
|
||
for (var i = 0; i < obj.length; i++) {
|
||
_removeBlobs(obj[i], i, obj);
|
||
}
|
||
} else if (typeof obj === 'object' && !isBuf(obj)) { // and object
|
||
for (var key in obj) {
|
||
_removeBlobs(obj[key], key, obj);
|
||
}
|
||
}
|
||
}
|
||
|
||
var pendingBlobs = 0;
|
||
var bloblessData = data;
|
||
_removeBlobs(bloblessData);
|
||
if (!pendingBlobs) {
|
||
callback(bloblessData);
|
||
}
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 41 */
|
||
/***/ (function(module, exports) {
|
||
|
||
var toString = {}.toString;
|
||
|
||
module.exports = Array.isArray || function (arr) {
|
||
return toString.call(arr) == '[object Array]';
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 42 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
|
||
module.exports = __webpack_require__(43);
|
||
|
||
/**
|
||
* Exports parser
|
||
*
|
||
* @api public
|
||
*
|
||
*/
|
||
module.exports.parser = __webpack_require__(3);
|
||
|
||
|
||
/***/ }),
|
||
/* 43 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var transports = __webpack_require__(19);
|
||
var Emitter = __webpack_require__(2);
|
||
var debug = __webpack_require__(1)('engine.io-client:socket');
|
||
var index = __webpack_require__(22);
|
||
var parser = __webpack_require__(3);
|
||
var parseuri = __webpack_require__(14);
|
||
var parseqs = __webpack_require__(5);
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = Socket;
|
||
|
||
/**
|
||
* Socket constructor.
|
||
*
|
||
* @param {String|Object} uri or options
|
||
* @param {Object} options
|
||
* @api public
|
||
*/
|
||
|
||
function Socket (uri, opts) {
|
||
if (!(this instanceof Socket)) return new Socket(uri, opts);
|
||
|
||
opts = opts || {};
|
||
|
||
if (uri && 'object' === typeof uri) {
|
||
opts = uri;
|
||
uri = null;
|
||
}
|
||
|
||
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;
|
||
}
|
||
|
||
this.secure = null != opts.secure ? opts.secure
|
||
: (global.location && 'https:' === location.protocol);
|
||
|
||
if (opts.hostname && !opts.port) {
|
||
// if no port is specified manually, use the protocol default
|
||
opts.port = this.secure ? '443' : '80';
|
||
}
|
||
|
||
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.transportOptions = opts.transportOptions || {};
|
||
this.readyState = '';
|
||
this.writeBuffer = [];
|
||
this.prevBufferLen = 0;
|
||
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;
|
||
|
||
if (true === this.perMessageDeflate) this.perMessageDeflate = {};
|
||
if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {
|
||
this.perMessageDeflate.threshold = 1024;
|
||
}
|
||
|
||
// 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;
|
||
this.forceNode = !!opts.forceNode;
|
||
|
||
// 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;
|
||
}
|
||
|
||
if (opts.localAddress) {
|
||
this.localAddress = opts.localAddress;
|
||
}
|
||
}
|
||
|
||
// set on handshake
|
||
this.id = null;
|
||
this.upgrades = null;
|
||
this.pingInterval = null;
|
||
this.pingTimeout = null;
|
||
|
||
// set on heartbeat
|
||
this.pingIntervalTimer = null;
|
||
this.pingTimeoutTimer = null;
|
||
|
||
this.open();
|
||
}
|
||
|
||
Socket.priorWebsocketSuccess = false;
|
||
|
||
/**
|
||
* Mix in `Emitter`.
|
||
*/
|
||
|
||
Emitter(Socket.prototype);
|
||
|
||
/**
|
||
* Protocol version.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Socket.protocol = parser.protocol; // this is an int
|
||
|
||
/**
|
||
* Expose deps for legacy compatibility
|
||
* and standalone browser access.
|
||
*/
|
||
|
||
Socket.Socket = Socket;
|
||
Socket.Transport = __webpack_require__(10);
|
||
Socket.transports = __webpack_require__(19);
|
||
Socket.parser = __webpack_require__(3);
|
||
|
||
/**
|
||
* Creates transport of the given type.
|
||
*
|
||
* @param {String} transport name
|
||
* @return {Transport}
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.createTransport = function (name) {
|
||
debug('creating transport "%s"', name);
|
||
var query = clone(this.query);
|
||
|
||
// append engine.io protocol identifier
|
||
query.EIO = parser.protocol;
|
||
|
||
// transport name
|
||
query.transport = name;
|
||
|
||
// per-transport options
|
||
var options = this.transportOptions[name] || {};
|
||
|
||
// session id if we already have one
|
||
if (this.id) query.sid = this.id;
|
||
|
||
var transport = new transports[name]({
|
||
query: query,
|
||
socket: this,
|
||
agent: options.agent || this.agent,
|
||
hostname: options.hostname || this.hostname,
|
||
port: options.port || this.port,
|
||
secure: options.secure || this.secure,
|
||
path: options.path || this.path,
|
||
forceJSONP: options.forceJSONP || this.forceJSONP,
|
||
jsonp: options.jsonp || this.jsonp,
|
||
forceBase64: options.forceBase64 || this.forceBase64,
|
||
enablesXDR: options.enablesXDR || this.enablesXDR,
|
||
timestampRequests: options.timestampRequests || this.timestampRequests,
|
||
timestampParam: options.timestampParam || this.timestampParam,
|
||
policyPort: options.policyPort || this.policyPort,
|
||
pfx: options.pfx || this.pfx,
|
||
key: options.key || this.key,
|
||
passphrase: options.passphrase || this.passphrase,
|
||
cert: options.cert || this.cert,
|
||
ca: options.ca || this.ca,
|
||
ciphers: options.ciphers || this.ciphers,
|
||
rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,
|
||
perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,
|
||
extraHeaders: options.extraHeaders || this.extraHeaders,
|
||
forceNode: options.forceNode || this.forceNode,
|
||
localAddress: options.localAddress || this.localAddress,
|
||
requestTimeout: options.requestTimeout || this.requestTimeout,
|
||
protocols: options.protocols || void (0)
|
||
});
|
||
|
||
return transport;
|
||
};
|
||
|
||
function clone (obj) {
|
||
var o = {};
|
||
for (var i in obj) {
|
||
if (obj.hasOwnProperty(i)) {
|
||
o[i] = obj[i];
|
||
}
|
||
}
|
||
return o;
|
||
}
|
||
|
||
/**
|
||
* 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';
|
||
|
||
// 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;
|
||
}
|
||
|
||
transport.open();
|
||
this.setTransport(transport);
|
||
};
|
||
|
||
/**
|
||
* Sets the current transport. Disables the existing one (if any).
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.setTransport = function (transport) {
|
||
debug('setting transport %s', transport.name);
|
||
var self = this;
|
||
|
||
if (this.transport) {
|
||
debug('clearing existing transport %s', this.transport.name);
|
||
this.transport.removeAllListeners();
|
||
}
|
||
|
||
// set up transport
|
||
this.transport = transport;
|
||
|
||
// 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');
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Probes a transport.
|
||
*
|
||
* @param {String} transport name
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.probe = function (name) {
|
||
debug('probing transport "%s"', name);
|
||
var transport = this.createTransport(name, { probe: 1 });
|
||
var failed = false;
|
||
var self = this;
|
||
|
||
Socket.priorWebsocketSuccess = false;
|
||
|
||
function onTransportOpen () {
|
||
if (self.onlyBinaryUpgrades) {
|
||
var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;
|
||
failed = failed || upgradeLosesBinary;
|
||
}
|
||
if (failed) return;
|
||
|
||
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;
|
||
|
||
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');
|
||
|
||
cleanup();
|
||
|
||
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);
|
||
}
|
||
});
|
||
}
|
||
|
||
function freezeTransport () {
|
||
if (failed) return;
|
||
|
||
// Any callback called by transport should be ignored since now
|
||
failed = true;
|
||
|
||
cleanup();
|
||
|
||
transport.close();
|
||
transport = null;
|
||
}
|
||
|
||
// Handle any error that happens while probing
|
||
function onerror (err) {
|
||
var error = new Error('probe error: ' + err);
|
||
error.transport = transport.name;
|
||
|
||
freezeTransport();
|
||
|
||
debug('probe transport "%s" failed because of error: %s', name, err);
|
||
|
||
self.emit('upgradeError', error);
|
||
}
|
||
|
||
function onTransportClose () {
|
||
onerror('transport closed');
|
||
}
|
||
|
||
// When the socket is closed while we're probing
|
||
function onclose () {
|
||
onerror('socket closed');
|
||
}
|
||
|
||
// 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();
|
||
}
|
||
}
|
||
|
||
// 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);
|
||
}
|
||
|
||
transport.once('open', onTransportOpen);
|
||
transport.once('error', onerror);
|
||
transport.once('close', onTransportClose);
|
||
|
||
this.once('close', onclose);
|
||
this.once('upgrading', onupgrade);
|
||
|
||
transport.open();
|
||
};
|
||
|
||
/**
|
||
* Called when connection is deemed open.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.onOpen = function () {
|
||
debug('socket open');
|
||
this.readyState = 'open';
|
||
Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;
|
||
this.emit('open');
|
||
this.flush();
|
||
|
||
// 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]);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Handles a packet.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onPacket = function (packet) {
|
||
if ('opening' === this.readyState || 'open' === this.readyState ||
|
||
'closing' === this.readyState) {
|
||
debug('socket receive: type "%s", data "%s"', packet.type, packet.data);
|
||
|
||
this.emit('packet', packet);
|
||
|
||
// Socket is live - any packet counts
|
||
this.emit('heartbeat');
|
||
|
||
switch (packet.type) {
|
||
case 'open':
|
||
this.onHandshake(JSON.parse(packet.data));
|
||
break;
|
||
|
||
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);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon handshake completion.
|
||
*
|
||
* @param {Object} handshake obj
|
||
* @api private
|
||
*/
|
||
|
||
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();
|
||
|
||
// Prolong liveness of socket on heartbeat
|
||
this.removeListener('heartbeat', this.onHeartbeat);
|
||
this.on('heartbeat', this.onHeartbeat);
|
||
};
|
||
|
||
/**
|
||
* Resets ping timeout.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
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));
|
||
};
|
||
|
||
/**
|
||
* Pings server every `this.pingInterval` and expects response
|
||
* within `this.pingTimeout` or closes connection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
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);
|
||
};
|
||
|
||
/**
|
||
* Sends a ping packet.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
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);
|
||
|
||
// 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;
|
||
|
||
if (0 === this.writeBuffer.length) {
|
||
this.emit('drain');
|
||
} else {
|
||
this.flush();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Flush write buffers.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
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');
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Sends a message.
|
||
*
|
||
* @param {String} message.
|
||
* @param {Function} callback function.
|
||
* @param {Object} options.
|
||
* @return {Socket} for chaining.
|
||
* @api public
|
||
*/
|
||
|
||
Socket.prototype.write =
|
||
Socket.prototype.send = function (msg, options, fn) {
|
||
this.sendPacket('message', msg, options, fn);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Sends a packet.
|
||
*
|
||
* @param {String} packet type.
|
||
* @param {String} data.
|
||
* @param {Object} options.
|
||
* @param {Function} callback function.
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.sendPacket = function (type, data, options, fn) {
|
||
if ('function' === typeof data) {
|
||
fn = data;
|
||
data = undefined;
|
||
}
|
||
|
||
if ('function' === typeof options) {
|
||
fn = options;
|
||
options = null;
|
||
}
|
||
|
||
if ('closing' === this.readyState || 'closed' === this.readyState) {
|
||
return;
|
||
}
|
||
|
||
options = options || {};
|
||
options.compress = false !== options.compress;
|
||
|
||
var packet = {
|
||
type: type,
|
||
data: data,
|
||
options: options
|
||
};
|
||
this.emit('packetCreate', packet);
|
||
this.writeBuffer.push(packet);
|
||
if (fn) this.once('flush', fn);
|
||
this.flush();
|
||
};
|
||
|
||
/**
|
||
* Closes the connection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.close = function () {
|
||
if ('opening' === this.readyState || 'open' === this.readyState) {
|
||
this.readyState = 'closing';
|
||
|
||
var self = this;
|
||
|
||
if (this.writeBuffer.length) {
|
||
this.once('drain', function () {
|
||
if (this.upgrading) {
|
||
waitForUpgrade();
|
||
} else {
|
||
close();
|
||
}
|
||
});
|
||
} else if (this.upgrading) {
|
||
waitForUpgrade();
|
||
} else {
|
||
close();
|
||
}
|
||
}
|
||
|
||
function close () {
|
||
self.onClose('forced close');
|
||
debug('socket closing - telling transport to close');
|
||
self.transport.close();
|
||
}
|
||
|
||
function cleanupAndClose () {
|
||
self.removeListener('upgrade', cleanupAndClose);
|
||
self.removeListener('upgradeError', cleanupAndClose);
|
||
close();
|
||
}
|
||
|
||
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 this;
|
||
};
|
||
|
||
/**
|
||
* Called upon transport error
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Socket.prototype.onError = function (err) {
|
||
debug('socket error %j', err);
|
||
Socket.priorWebsocketSuccess = false;
|
||
this.emit('error', err);
|
||
this.onClose('transport error', err);
|
||
};
|
||
|
||
/**
|
||
* Called upon transport close.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
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;
|
||
|
||
// clear timers
|
||
clearTimeout(this.pingIntervalTimer);
|
||
clearTimeout(this.pingTimeoutTimer);
|
||
|
||
// stop event from firing again for transport
|
||
this.transport.removeAllListeners('close');
|
||
|
||
// ensure transport won't stay open
|
||
this.transport.close();
|
||
|
||
// ignore further transport communication
|
||
this.transport.removeAllListeners();
|
||
|
||
// set ready state
|
||
this.readyState = 'closed';
|
||
|
||
// 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;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Filters upgrades, returning only those matching client transports.
|
||
*
|
||
* @param {Array} server upgrades
|
||
* @api private
|
||
*
|
||
*/
|
||
|
||
Socket.prototype.filterUpgrades = function (upgrades) {
|
||
var filteredUpgrades = [];
|
||
for (var i = 0, j = upgrades.length; i < j; i++) {
|
||
if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);
|
||
}
|
||
return filteredUpgrades;
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 44 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
/**
|
||
* Module exports.
|
||
*
|
||
* Logic borrowed from Modernizr:
|
||
*
|
||
* - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js
|
||
*/
|
||
|
||
try {
|
||
module.exports = typeof XMLHttpRequest !== 'undefined' &&
|
||
'withCredentials' in new XMLHttpRequest();
|
||
} catch (err) {
|
||
// if XMLHttp support is disabled in IE then it will throw
|
||
// when trying to create
|
||
module.exports = false;
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 45 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Module requirements.
|
||
*/
|
||
|
||
var XMLHttpRequest = __webpack_require__(9);
|
||
var Polling = __webpack_require__(20);
|
||
var Emitter = __webpack_require__(2);
|
||
var inherit = __webpack_require__(6);
|
||
var debug = __webpack_require__(1)('engine.io-client:polling-xhr');
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = XHR;
|
||
module.exports.Request = Request;
|
||
|
||
/**
|
||
* Empty function
|
||
*/
|
||
|
||
function empty () {}
|
||
|
||
/**
|
||
* XHR Polling constructor.
|
||
*
|
||
* @param {Object} opts
|
||
* @api public
|
||
*/
|
||
|
||
function XHR (opts) {
|
||
Polling.call(this, opts);
|
||
this.requestTimeout = opts.requestTimeout;
|
||
this.extraHeaders = opts.extraHeaders;
|
||
|
||
if (global.location) {
|
||
var isSSL = 'https:' === location.protocol;
|
||
var port = location.port;
|
||
|
||
// some user agents have empty `location.port`
|
||
if (!port) {
|
||
port = isSSL ? 443 : 80;
|
||
}
|
||
|
||
this.xd = opts.hostname !== global.location.hostname ||
|
||
port !== opts.port;
|
||
this.xs = opts.secure !== isSSL;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Inherits from Polling.
|
||
*/
|
||
|
||
inherit(XHR, Polling);
|
||
|
||
/**
|
||
* XHR supports binary
|
||
*/
|
||
|
||
XHR.prototype.supportsBinary = true;
|
||
|
||
/**
|
||
* Creates a request.
|
||
*
|
||
* @param {String} method
|
||
* @api private
|
||
*/
|
||
|
||
XHR.prototype.request = function (opts) {
|
||
opts = opts || {};
|
||
opts.uri = this.uri();
|
||
opts.xd = this.xd;
|
||
opts.xs = this.xs;
|
||
opts.agent = this.agent || false;
|
||
opts.supportsBinary = this.supportsBinary;
|
||
opts.enablesXDR = this.enablesXDR;
|
||
|
||
// SSL options for Node.js client
|
||
opts.pfx = this.pfx;
|
||
opts.key = this.key;
|
||
opts.passphrase = this.passphrase;
|
||
opts.cert = this.cert;
|
||
opts.ca = this.ca;
|
||
opts.ciphers = this.ciphers;
|
||
opts.rejectUnauthorized = this.rejectUnauthorized;
|
||
opts.requestTimeout = this.requestTimeout;
|
||
|
||
// other options for Node.js client
|
||
opts.extraHeaders = this.extraHeaders;
|
||
|
||
return new Request(opts);
|
||
};
|
||
|
||
/**
|
||
* Sends data.
|
||
*
|
||
* @param {String} data to send.
|
||
* @param {Function} called upon flush.
|
||
* @api private
|
||
*/
|
||
|
||
XHR.prototype.doWrite = function (data, fn) {
|
||
var isBinary = typeof data !== 'string' && data !== undefined;
|
||
var req = this.request({ method: 'POST', data: data, isBinary: isBinary });
|
||
var self = this;
|
||
req.on('success', fn);
|
||
req.on('error', function (err) {
|
||
self.onError('xhr post error', err);
|
||
});
|
||
this.sendXhr = req;
|
||
};
|
||
|
||
/**
|
||
* Starts a poll cycle.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
XHR.prototype.doPoll = function () {
|
||
debug('xhr poll');
|
||
var req = this.request();
|
||
var self = this;
|
||
req.on('data', function (data) {
|
||
self.onData(data);
|
||
});
|
||
req.on('error', function (err) {
|
||
self.onError('xhr poll error', err);
|
||
});
|
||
this.pollXhr = req;
|
||
};
|
||
|
||
/**
|
||
* Request constructor
|
||
*
|
||
* @param {Object} options
|
||
* @api public
|
||
*/
|
||
|
||
function Request (opts) {
|
||
this.method = opts.method || 'GET';
|
||
this.uri = opts.uri;
|
||
this.xd = !!opts.xd;
|
||
this.xs = !!opts.xs;
|
||
this.async = false !== opts.async;
|
||
this.data = undefined !== opts.data ? opts.data : null;
|
||
this.agent = opts.agent;
|
||
this.isBinary = opts.isBinary;
|
||
this.supportsBinary = opts.supportsBinary;
|
||
this.enablesXDR = opts.enablesXDR;
|
||
this.requestTimeout = opts.requestTimeout;
|
||
|
||
// SSL options for Node.js client
|
||
this.pfx = opts.pfx;
|
||
this.key = opts.key;
|
||
this.passphrase = opts.passphrase;
|
||
this.cert = opts.cert;
|
||
this.ca = opts.ca;
|
||
this.ciphers = opts.ciphers;
|
||
this.rejectUnauthorized = opts.rejectUnauthorized;
|
||
|
||
// other options for Node.js client
|
||
this.extraHeaders = opts.extraHeaders;
|
||
|
||
this.create();
|
||
}
|
||
|
||
/**
|
||
* Mix in `Emitter`.
|
||
*/
|
||
|
||
Emitter(Request.prototype);
|
||
|
||
/**
|
||
* Creates the XHR object and sends the request.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.create = function () {
|
||
var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };
|
||
|
||
// SSL options for Node.js client
|
||
opts.pfx = this.pfx;
|
||
opts.key = this.key;
|
||
opts.passphrase = this.passphrase;
|
||
opts.cert = this.cert;
|
||
opts.ca = this.ca;
|
||
opts.ciphers = this.ciphers;
|
||
opts.rejectUnauthorized = this.rejectUnauthorized;
|
||
|
||
var xhr = this.xhr = new XMLHttpRequest(opts);
|
||
var self = this;
|
||
|
||
try {
|
||
debug('xhr open %s: %s', this.method, this.uri);
|
||
xhr.open(this.method, this.uri, this.async);
|
||
try {
|
||
if (this.extraHeaders) {
|
||
xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);
|
||
for (var i in this.extraHeaders) {
|
||
if (this.extraHeaders.hasOwnProperty(i)) {
|
||
xhr.setRequestHeader(i, this.extraHeaders[i]);
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {}
|
||
|
||
if ('POST' === this.method) {
|
||
try {
|
||
if (this.isBinary) {
|
||
xhr.setRequestHeader('Content-type', 'application/octet-stream');
|
||
} else {
|
||
xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');
|
||
}
|
||
} catch (e) {}
|
||
}
|
||
|
||
try {
|
||
xhr.setRequestHeader('Accept', '*/*');
|
||
} catch (e) {}
|
||
|
||
// ie6 check
|
||
if ('withCredentials' in xhr) {
|
||
xhr.withCredentials = true;
|
||
}
|
||
|
||
if (this.requestTimeout) {
|
||
xhr.timeout = this.requestTimeout;
|
||
}
|
||
|
||
if (this.hasXDR()) {
|
||
xhr.onload = function () {
|
||
self.onLoad();
|
||
};
|
||
xhr.onerror = function () {
|
||
self.onError(xhr.responseText);
|
||
};
|
||
} else {
|
||
xhr.onreadystatechange = function () {
|
||
if (xhr.readyState === 2) {
|
||
var contentType;
|
||
try {
|
||
contentType = xhr.getResponseHeader('Content-Type');
|
||
} catch (e) {}
|
||
if (contentType === 'application/octet-stream') {
|
||
xhr.responseType = 'arraybuffer';
|
||
}
|
||
}
|
||
if (4 !== xhr.readyState) return;
|
||
if (200 === xhr.status || 1223 === xhr.status) {
|
||
self.onLoad();
|
||
} else {
|
||
// make sure the `error` event handler that's user-set
|
||
// does not throw in the same tick and gets caught here
|
||
setTimeout(function () {
|
||
self.onError(xhr.status);
|
||
}, 0);
|
||
}
|
||
};
|
||
}
|
||
|
||
debug('xhr data %s', this.data);
|
||
xhr.send(this.data);
|
||
} catch (e) {
|
||
// Need to defer since .create() is called directly fhrom the constructor
|
||
// and thus the 'error' event can only be only bound *after* this exception
|
||
// occurs. Therefore, also, we cannot throw here at all.
|
||
setTimeout(function () {
|
||
self.onError(e);
|
||
}, 0);
|
||
return;
|
||
}
|
||
|
||
if (global.document) {
|
||
this.index = Request.requestsCount++;
|
||
Request.requests[this.index] = this;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon successful response.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.onSuccess = function () {
|
||
this.emit('success');
|
||
this.cleanup();
|
||
};
|
||
|
||
/**
|
||
* Called if we have data.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.onData = function (data) {
|
||
this.emit('data', data);
|
||
this.onSuccess();
|
||
};
|
||
|
||
/**
|
||
* Called upon error.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.onError = function (err) {
|
||
this.emit('error', err);
|
||
this.cleanup(true);
|
||
};
|
||
|
||
/**
|
||
* Cleans up house.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.cleanup = function (fromError) {
|
||
if ('undefined' === typeof this.xhr || null === this.xhr) {
|
||
return;
|
||
}
|
||
// xmlhttprequest
|
||
if (this.hasXDR()) {
|
||
this.xhr.onload = this.xhr.onerror = empty;
|
||
} else {
|
||
this.xhr.onreadystatechange = empty;
|
||
}
|
||
|
||
if (fromError) {
|
||
try {
|
||
this.xhr.abort();
|
||
} catch (e) {}
|
||
}
|
||
|
||
if (global.document) {
|
||
delete Request.requests[this.index];
|
||
}
|
||
|
||
this.xhr = null;
|
||
};
|
||
|
||
/**
|
||
* Called upon load.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.onLoad = function () {
|
||
var data;
|
||
try {
|
||
var contentType;
|
||
try {
|
||
contentType = this.xhr.getResponseHeader('Content-Type');
|
||
} catch (e) {}
|
||
if (contentType === 'application/octet-stream') {
|
||
data = this.xhr.response || this.xhr.responseText;
|
||
} else {
|
||
data = this.xhr.responseText;
|
||
}
|
||
} catch (e) {
|
||
this.onError(e);
|
||
}
|
||
if (null != data) {
|
||
this.onData(data);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Check if it has XDomainRequest.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
Request.prototype.hasXDR = function () {
|
||
return 'undefined' !== typeof global.XDomainRequest && !this.xs && this.enablesXDR;
|
||
};
|
||
|
||
/**
|
||
* Aborts the request.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Request.prototype.abort = function () {
|
||
this.cleanup();
|
||
};
|
||
|
||
/**
|
||
* Aborts pending requests when unloading the window. This is needed to prevent
|
||
* memory leaks (e.g. when using IE) and to ensure that no spurious error is
|
||
* emitted.
|
||
*/
|
||
|
||
Request.requestsCount = 0;
|
||
Request.requests = {};
|
||
|
||
if (global.document) {
|
||
if (global.attachEvent) {
|
||
global.attachEvent('onunload', unloadHandler);
|
||
} else if (global.addEventListener) {
|
||
global.addEventListener('beforeunload', unloadHandler, false);
|
||
}
|
||
}
|
||
|
||
function unloadHandler () {
|
||
for (var i in Request.requests) {
|
||
if (Request.requests.hasOwnProperty(i)) {
|
||
Request.requests[i].abort();
|
||
}
|
||
}
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 46 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
/**
|
||
* Gets the keys for an object.
|
||
*
|
||
* @return {Array} keys
|
||
* @api private
|
||
*/
|
||
|
||
module.exports = Object.keys || function keys (obj){
|
||
var arr = [];
|
||
var has = Object.prototype.hasOwnProperty;
|
||
|
||
for (var i in obj) {
|
||
if (has.call(obj, i)) {
|
||
arr.push(i);
|
||
}
|
||
}
|
||
return arr;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 47 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/**
|
||
* An abstraction for slicing an arraybuffer even when
|
||
* ArrayBuffer.prototype.slice is not supported
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
module.exports = function(arraybuffer, start, end) {
|
||
var bytes = arraybuffer.byteLength;
|
||
start = start || 0;
|
||
end = end || bytes;
|
||
|
||
if (arraybuffer.slice) { return arraybuffer.slice(start, end); }
|
||
|
||
if (start < 0) { start += bytes; }
|
||
if (end < 0) { end += bytes; }
|
||
if (end > bytes) { end = bytes; }
|
||
|
||
if (start >= bytes || start >= end || bytes === 0) {
|
||
return new ArrayBuffer(0);
|
||
}
|
||
|
||
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;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 48 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = after
|
||
|
||
function after(count, callback, err_cb) {
|
||
var bail = false
|
||
err_cb = err_cb || noop
|
||
proxy.count = count
|
||
|
||
return (count === 0) ? callback() : proxy
|
||
|
||
function proxy(err, result) {
|
||
if (proxy.count <= 0) {
|
||
throw new Error('after called too many times')
|
||
}
|
||
--proxy.count
|
||
|
||
// 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() {}
|
||
|
||
|
||
/***/ }),
|
||
/* 49 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/utf8js v2.1.2 by @mathias */
|
||
;(function(root) {
|
||
|
||
// Detect free variables `exports`
|
||
var freeExports = typeof exports == 'object' && exports;
|
||
|
||
// Detect free variable `module`
|
||
var freeModule = typeof module == 'object' && module &&
|
||
module.exports == freeExports && module;
|
||
|
||
// Detect free variable `global`, from Node.js or Browserified code,
|
||
// and use it as `root`
|
||
var freeGlobal = typeof global == 'object' && global;
|
||
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
|
||
root = freeGlobal;
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
var stringFromCharCode = String.fromCharCode;
|
||
|
||
// Taken from https://mths.be/punycode
|
||
function ucs2decode(string) {
|
||
var output = [];
|
||
var counter = 0;
|
||
var length = string.length;
|
||
var value;
|
||
var extra;
|
||
while (counter < length) {
|
||
value = string.charCodeAt(counter++);
|
||
if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
|
||
// high surrogate, and there is a next character
|
||
extra = string.charCodeAt(counter++);
|
||
if ((extra & 0xFC00) == 0xDC00) { // low surrogate
|
||
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
|
||
} else {
|
||
// unmatched surrogate; only append this code unit, in case the next
|
||
// code unit is the high surrogate of a surrogate pair
|
||
output.push(value);
|
||
counter--;
|
||
}
|
||
} else {
|
||
output.push(value);
|
||
}
|
||
}
|
||
return output;
|
||
}
|
||
|
||
// Taken from https://mths.be/punycode
|
||
function ucs2encode(array) {
|
||
var length = array.length;
|
||
var index = -1;
|
||
var value;
|
||
var output = '';
|
||
while (++index < length) {
|
||
value = array[index];
|
||
if (value > 0xFFFF) {
|
||
value -= 0x10000;
|
||
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
|
||
value = 0xDC00 | value & 0x3FF;
|
||
}
|
||
output += stringFromCharCode(value);
|
||
}
|
||
return output;
|
||
}
|
||
|
||
function checkScalarValue(codePoint, strict) {
|
||
if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
|
||
if (strict) {
|
||
throw Error(
|
||
'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
|
||
' is not a scalar value'
|
||
);
|
||
}
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
function createByte(codePoint, shift) {
|
||
return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
|
||
}
|
||
|
||
function encodeCodePoint(codePoint, strict) {
|
||
if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
|
||
return stringFromCharCode(codePoint);
|
||
}
|
||
var symbol = '';
|
||
if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
|
||
symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
|
||
}
|
||
else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
|
||
if (!checkScalarValue(codePoint, strict)) {
|
||
codePoint = 0xFFFD;
|
||
}
|
||
symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
|
||
symbol += createByte(codePoint, 6);
|
||
}
|
||
else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
|
||
symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
|
||
symbol += createByte(codePoint, 12);
|
||
symbol += createByte(codePoint, 6);
|
||
}
|
||
symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
|
||
return symbol;
|
||
}
|
||
|
||
function utf8encode(string, opts) {
|
||
opts = opts || {};
|
||
var strict = false !== opts.strict;
|
||
|
||
var codePoints = ucs2decode(string);
|
||
var length = codePoints.length;
|
||
var index = -1;
|
||
var codePoint;
|
||
var byteString = '';
|
||
while (++index < length) {
|
||
codePoint = codePoints[index];
|
||
byteString += encodeCodePoint(codePoint, strict);
|
||
}
|
||
return byteString;
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
function readContinuationByte() {
|
||
if (byteIndex >= byteCount) {
|
||
throw Error('Invalid byte index');
|
||
}
|
||
|
||
var continuationByte = byteArray[byteIndex] & 0xFF;
|
||
byteIndex++;
|
||
|
||
if ((continuationByte & 0xC0) == 0x80) {
|
||
return continuationByte & 0x3F;
|
||
}
|
||
|
||
// If we end up here, it’s not a continuation byte
|
||
throw Error('Invalid continuation byte');
|
||
}
|
||
|
||
function decodeSymbol(strict) {
|
||
var byte1;
|
||
var byte2;
|
||
var byte3;
|
||
var byte4;
|
||
var codePoint;
|
||
|
||
if (byteIndex > byteCount) {
|
||
throw Error('Invalid byte index');
|
||
}
|
||
|
||
if (byteIndex == byteCount) {
|
||
return false;
|
||
}
|
||
|
||
// Read first byte
|
||
byte1 = byteArray[byteIndex] & 0xFF;
|
||
byteIndex++;
|
||
|
||
// 1-byte sequence (no continuation bytes)
|
||
if ((byte1 & 0x80) == 0) {
|
||
return byte1;
|
||
}
|
||
|
||
// 2-byte sequence
|
||
if ((byte1 & 0xE0) == 0xC0) {
|
||
byte2 = readContinuationByte();
|
||
codePoint = ((byte1 & 0x1F) << 6) | byte2;
|
||
if (codePoint >= 0x80) {
|
||
return codePoint;
|
||
} else {
|
||
throw Error('Invalid continuation byte');
|
||
}
|
||
}
|
||
|
||
// 3-byte sequence (may include unpaired surrogates)
|
||
if ((byte1 & 0xF0) == 0xE0) {
|
||
byte2 = readContinuationByte();
|
||
byte3 = readContinuationByte();
|
||
codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
|
||
if (codePoint >= 0x0800) {
|
||
return checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;
|
||
} else {
|
||
throw Error('Invalid continuation byte');
|
||
}
|
||
}
|
||
|
||
// 4-byte sequence
|
||
if ((byte1 & 0xF8) == 0xF0) {
|
||
byte2 = readContinuationByte();
|
||
byte3 = readContinuationByte();
|
||
byte4 = readContinuationByte();
|
||
codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
|
||
(byte3 << 0x06) | byte4;
|
||
if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
|
||
return codePoint;
|
||
}
|
||
}
|
||
|
||
throw Error('Invalid UTF-8 detected');
|
||
}
|
||
|
||
var byteArray;
|
||
var byteCount;
|
||
var byteIndex;
|
||
function utf8decode(byteString, opts) {
|
||
opts = opts || {};
|
||
var strict = false !== opts.strict;
|
||
|
||
byteArray = ucs2decode(byteString);
|
||
byteCount = byteArray.length;
|
||
byteIndex = 0;
|
||
var codePoints = [];
|
||
var tmp;
|
||
while ((tmp = decodeSymbol(strict)) !== false) {
|
||
codePoints.push(tmp);
|
||
}
|
||
return ucs2encode(codePoints);
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
var utf8 = {
|
||
'version': '2.1.2',
|
||
'encode': utf8encode,
|
||
'decode': utf8decode
|
||
};
|
||
|
||
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
||
// like the following:
|
||
if (
|
||
true
|
||
) {
|
||
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
|
||
return utf8;
|
||
}).call(exports, __webpack_require__, exports, module),
|
||
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
||
} else if (freeExports && !freeExports.nodeType) {
|
||
if (freeModule) { // in Node.js or RingoJS v0.8.0+
|
||
freeModule.exports = utf8;
|
||
} else { // in Narwhal or RingoJS v0.7.0-
|
||
var object = {};
|
||
var hasOwnProperty = object.hasOwnProperty;
|
||
for (var key in utf8) {
|
||
hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
|
||
}
|
||
}
|
||
} else { // in Rhino or a web browser
|
||
root.utf8 = utf8;
|
||
}
|
||
|
||
}(this));
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(50)(module), __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 50 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = function(module) {
|
||
if(!module.webpackPolyfill) {
|
||
module.deprecate = function() {};
|
||
module.paths = [];
|
||
// module.parent = undefined by default
|
||
if(!module.children) module.children = [];
|
||
Object.defineProperty(module, "loaded", {
|
||
enumerable: true,
|
||
get: function() {
|
||
return module.l;
|
||
}
|
||
});
|
||
Object.defineProperty(module, "id", {
|
||
enumerable: true,
|
||
get: function() {
|
||
return module.i;
|
||
}
|
||
});
|
||
module.webpackPolyfill = 1;
|
||
}
|
||
return module;
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 51 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/*
|
||
* base64-arraybuffer
|
||
* https://github.com/niklasvh/base64-arraybuffer
|
||
*
|
||
* Copyright (c) 2012 Niklas von Hertzen
|
||
* Licensed under the MIT license.
|
||
*/
|
||
(function(){
|
||
"use strict";
|
||
|
||
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
|
||
// Use a lookup table to find the index.
|
||
var lookup = new Uint8Array(256);
|
||
for (var i = 0; i < chars.length; i++) {
|
||
lookup[chars.charCodeAt(i)] = i;
|
||
}
|
||
|
||
exports.encode = function(arraybuffer) {
|
||
var bytes = new Uint8Array(arraybuffer),
|
||
i, len = bytes.length, base64 = "";
|
||
|
||
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];
|
||
}
|
||
|
||
if ((len % 3) === 2) {
|
||
base64 = base64.substring(0, base64.length - 1) + "=";
|
||
} else if (len % 3 === 1) {
|
||
base64 = base64.substring(0, base64.length - 2) + "==";
|
||
}
|
||
|
||
return base64;
|
||
};
|
||
|
||
exports.decode = function(base64) {
|
||
var bufferLength = base64.length * 0.75,
|
||
len = base64.length, i, p = 0,
|
||
encoded1, encoded2, encoded3, encoded4;
|
||
|
||
if (base64[base64.length - 1] === "=") {
|
||
bufferLength--;
|
||
if (base64[base64.length - 2] === "=") {
|
||
bufferLength--;
|
||
}
|
||
}
|
||
|
||
var arraybuffer = new ArrayBuffer(bufferLength),
|
||
bytes = new Uint8Array(arraybuffer);
|
||
|
||
for (i = 0; i < len; i+=4) {
|
||
encoded1 = lookup[base64.charCodeAt(i)];
|
||
encoded2 = lookup[base64.charCodeAt(i+1)];
|
||
encoded3 = lookup[base64.charCodeAt(i+2)];
|
||
encoded4 = lookup[base64.charCodeAt(i+3)];
|
||
|
||
bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
|
||
bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
||
bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
||
}
|
||
|
||
return arraybuffer;
|
||
};
|
||
})();
|
||
|
||
|
||
/***/ }),
|
||
/* 52 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Create a blob builder even when vendor prefixes exist
|
||
*/
|
||
|
||
var BlobBuilder = global.BlobBuilder
|
||
|| global.WebKitBlobBuilder
|
||
|| global.MSBlobBuilder
|
||
|| global.MozBlobBuilder;
|
||
|
||
/**
|
||
* Check if Blob constructor is supported
|
||
*/
|
||
|
||
var blobSupported = (function() {
|
||
try {
|
||
var a = new Blob(['hi']);
|
||
return a.size === 2;
|
||
} catch(e) {
|
||
return false;
|
||
}
|
||
})();
|
||
|
||
/**
|
||
* Check if Blob constructor supports ArrayBufferViews
|
||
* Fails in Safari 6, so we need to map to ArrayBuffers there.
|
||
*/
|
||
|
||
var blobSupportsArrayBufferView = blobSupported && (function() {
|
||
try {
|
||
var b = new Blob([new Uint8Array([1,2])]);
|
||
return b.size === 2;
|
||
} catch(e) {
|
||
return false;
|
||
}
|
||
})();
|
||
|
||
/**
|
||
* Check if BlobBuilder is supported
|
||
*/
|
||
|
||
var blobBuilderSupported = BlobBuilder
|
||
&& BlobBuilder.prototype.append
|
||
&& BlobBuilder.prototype.getBlob;
|
||
|
||
/**
|
||
* Helper function that maps ArrayBufferViews to ArrayBuffers
|
||
* Used by BlobBuilder constructor and old browsers that didn't
|
||
* support it in the Blob constructor.
|
||
*/
|
||
|
||
function mapArrayBufferViews(ary) {
|
||
for (var i = 0; i < ary.length; i++) {
|
||
var chunk = ary[i];
|
||
if (chunk.buffer instanceof ArrayBuffer) {
|
||
var buf = chunk.buffer;
|
||
|
||
// 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;
|
||
}
|
||
|
||
ary[i] = buf;
|
||
}
|
||
}
|
||
}
|
||
|
||
function BlobBuilderConstructor(ary, options) {
|
||
options = options || {};
|
||
|
||
var bb = new BlobBuilder();
|
||
mapArrayBufferViews(ary);
|
||
|
||
for (var i = 0; i < ary.length; i++) {
|
||
bb.append(ary[i]);
|
||
}
|
||
|
||
return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
|
||
};
|
||
|
||
function BlobConstructor(ary, options) {
|
||
mapArrayBufferViews(ary);
|
||
return new Blob(ary, options || {});
|
||
};
|
||
|
||
module.exports = (function() {
|
||
if (blobSupported) {
|
||
return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;
|
||
} else if (blobBuilderSupported) {
|
||
return BlobBuilderConstructor;
|
||
} else {
|
||
return undefined;
|
||
}
|
||
})();
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 53 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {
|
||
/**
|
||
* Module requirements.
|
||
*/
|
||
|
||
var Polling = __webpack_require__(20);
|
||
var inherit = __webpack_require__(6);
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = JSONPPolling;
|
||
|
||
/**
|
||
* Cached regular expressions.
|
||
*/
|
||
|
||
var rNewline = /\n/g;
|
||
var rEscapedNewline = /\\n/g;
|
||
|
||
/**
|
||
* Global JSONP callbacks.
|
||
*/
|
||
|
||
var callbacks;
|
||
|
||
/**
|
||
* Noop.
|
||
*/
|
||
|
||
function empty () { }
|
||
|
||
/**
|
||
* JSONP Polling constructor.
|
||
*
|
||
* @param {Object} opts.
|
||
* @api public
|
||
*/
|
||
|
||
function JSONPPolling (opts) {
|
||
Polling.call(this, opts);
|
||
|
||
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;
|
||
}
|
||
|
||
// callback identifier
|
||
this.index = callbacks.length;
|
||
|
||
// 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);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Inherits from Polling.
|
||
*/
|
||
|
||
inherit(JSONPPolling, Polling);
|
||
|
||
/*
|
||
* JSONP only supports binary as base64 encoded strings
|
||
*/
|
||
|
||
JSONPPolling.prototype.supportsBinary = false;
|
||
|
||
/**
|
||
* Closes the socket.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
JSONPPolling.prototype.doClose = function () {
|
||
if (this.script) {
|
||
this.script.parentNode.removeChild(this.script);
|
||
this.script = null;
|
||
}
|
||
|
||
if (this.form) {
|
||
this.form.parentNode.removeChild(this.form);
|
||
this.form = null;
|
||
this.iframe = null;
|
||
}
|
||
|
||
Polling.prototype.doClose.call(this);
|
||
};
|
||
|
||
/**
|
||
* Starts a poll cycle.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
JSONPPolling.prototype.doPoll = function () {
|
||
var self = this;
|
||
var script = document.createElement('script');
|
||
|
||
if (this.script) {
|
||
this.script.parentNode.removeChild(this.script);
|
||
this.script = null;
|
||
}
|
||
|
||
script.async = true;
|
||
script.src = this.uri();
|
||
script.onerror = function (e) {
|
||
self.onError('jsonp poll error', e);
|
||
};
|
||
|
||
var insertAt = document.getElementsByTagName('script')[0];
|
||
if (insertAt) {
|
||
insertAt.parentNode.insertBefore(script, insertAt);
|
||
} else {
|
||
(document.head || document.body).appendChild(script);
|
||
}
|
||
this.script = script;
|
||
|
||
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);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Writes with a hidden iframe.
|
||
*
|
||
* @param {String} data to send
|
||
* @param {Function} called upon flush.
|
||
* @api private
|
||
*/
|
||
|
||
JSONPPolling.prototype.doWrite = function (data, fn) {
|
||
var self = this;
|
||
|
||
if (!this.form) {
|
||
var form = document.createElement('form');
|
||
var area = document.createElement('textarea');
|
||
var id = this.iframeId = 'eio_iframe_' + this.index;
|
||
var iframe;
|
||
|
||
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);
|
||
|
||
this.form = form;
|
||
this.area = area;
|
||
}
|
||
|
||
this.form.action = this.uri();
|
||
|
||
function complete () {
|
||
initIframe();
|
||
fn();
|
||
}
|
||
|
||
function initIframe () {
|
||
if (self.iframe) {
|
||
try {
|
||
self.form.removeChild(self.iframe);
|
||
} catch (e) {
|
||
self.onError('jsonp polling iframe removal error', e);
|
||
}
|
||
}
|
||
|
||
try {
|
||
// ie6 dynamic iframes with target="" support (thanks Chris Lambacher)
|
||
var html = '<iframe src="javascript:0" name="' + self.iframeId + '">';
|
||
iframe = document.createElement(html);
|
||
} catch (e) {
|
||
iframe = document.createElement('iframe');
|
||
iframe.name = self.iframeId;
|
||
iframe.src = 'javascript:0';
|
||
}
|
||
|
||
iframe.id = self.iframeId;
|
||
|
||
self.form.appendChild(iframe);
|
||
self.iframe = iframe;
|
||
}
|
||
|
||
initIframe();
|
||
|
||
// escape \n to prevent it from being converted into \r\n by some UAs
|
||
// double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side
|
||
data = data.replace(rEscapedNewline, '\\\n');
|
||
this.area.value = data.replace(rNewline, '\\n');
|
||
|
||
try {
|
||
this.form.submit();
|
||
} catch (e) {}
|
||
|
||
if (this.iframe.attachEvent) {
|
||
this.iframe.onreadystatechange = function () {
|
||
if (self.iframe.readyState === 'complete') {
|
||
complete();
|
||
}
|
||
};
|
||
} else {
|
||
this.iframe.onload = complete;
|
||
}
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 54 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
var Transport = __webpack_require__(10);
|
||
var parser = __webpack_require__(3);
|
||
var parseqs = __webpack_require__(5);
|
||
var inherit = __webpack_require__(6);
|
||
var yeast = __webpack_require__(21);
|
||
var debug = __webpack_require__(1)('engine.io-client:websocket');
|
||
var BrowserWebSocket = global.WebSocket || global.MozWebSocket;
|
||
var NodeWebSocket;
|
||
if (typeof window === 'undefined') {
|
||
try {
|
||
NodeWebSocket = __webpack_require__(55);
|
||
} catch (e) { }
|
||
}
|
||
|
||
/**
|
||
* Get either the `WebSocket` or `MozWebSocket` globals
|
||
* in the browser or try to resolve WebSocket-compatible
|
||
* interface exposed by `ws` for Node-like environment.
|
||
*/
|
||
|
||
var WebSocket = BrowserWebSocket;
|
||
if (!WebSocket && typeof window === 'undefined') {
|
||
WebSocket = NodeWebSocket;
|
||
}
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
module.exports = WS;
|
||
|
||
/**
|
||
* WebSocket transport constructor.
|
||
*
|
||
* @api {Object} connection options
|
||
* @api public
|
||
*/
|
||
|
||
function WS (opts) {
|
||
var forceBase64 = (opts && opts.forceBase64);
|
||
if (forceBase64) {
|
||
this.supportsBinary = false;
|
||
}
|
||
this.perMessageDeflate = opts.perMessageDeflate;
|
||
this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;
|
||
this.protocols = opts.protocols;
|
||
if (!this.usingBrowserWebSocket) {
|
||
WebSocket = NodeWebSocket;
|
||
}
|
||
Transport.call(this, opts);
|
||
}
|
||
|
||
/**
|
||
* Inherits from Transport.
|
||
*/
|
||
|
||
inherit(WS, Transport);
|
||
|
||
/**
|
||
* Transport name.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
WS.prototype.name = 'websocket';
|
||
|
||
/*
|
||
* WebSockets support binary
|
||
*/
|
||
|
||
WS.prototype.supportsBinary = true;
|
||
|
||
/**
|
||
* Opens socket.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.doOpen = function () {
|
||
if (!this.check()) {
|
||
// let probe timeout
|
||
return;
|
||
}
|
||
|
||
var uri = this.uri();
|
||
var protocols = this.protocols;
|
||
var opts = {
|
||
agent: this.agent,
|
||
perMessageDeflate: this.perMessageDeflate
|
||
};
|
||
|
||
// SSL options for Node.js client
|
||
opts.pfx = this.pfx;
|
||
opts.key = this.key;
|
||
opts.passphrase = this.passphrase;
|
||
opts.cert = this.cert;
|
||
opts.ca = this.ca;
|
||
opts.ciphers = this.ciphers;
|
||
opts.rejectUnauthorized = this.rejectUnauthorized;
|
||
if (this.extraHeaders) {
|
||
opts.headers = this.extraHeaders;
|
||
}
|
||
if (this.localAddress) {
|
||
opts.localAddress = this.localAddress;
|
||
}
|
||
|
||
try {
|
||
this.ws = this.usingBrowserWebSocket ? (protocols ? new WebSocket(uri, protocols) : new WebSocket(uri)) : new WebSocket(uri, protocols, opts);
|
||
} catch (err) {
|
||
return this.emit('error', err);
|
||
}
|
||
|
||
if (this.ws.binaryType === undefined) {
|
||
this.supportsBinary = false;
|
||
}
|
||
|
||
if (this.ws.supports && this.ws.supports.binary) {
|
||
this.supportsBinary = true;
|
||
this.ws.binaryType = 'nodebuffer';
|
||
} else {
|
||
this.ws.binaryType = 'arraybuffer';
|
||
}
|
||
|
||
this.addEventListeners();
|
||
};
|
||
|
||
/**
|
||
* Adds event listeners to the socket
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.addEventListeners = function () {
|
||
var self = this;
|
||
|
||
this.ws.onopen = function () {
|
||
self.onOpen();
|
||
};
|
||
this.ws.onclose = function () {
|
||
self.onClose();
|
||
};
|
||
this.ws.onmessage = function (ev) {
|
||
self.onData(ev.data);
|
||
};
|
||
this.ws.onerror = function (e) {
|
||
self.onError('websocket error', e);
|
||
};
|
||
};
|
||
|
||
/**
|
||
* Writes data to socket.
|
||
*
|
||
* @param {Array} array of packets.
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.write = function (packets) {
|
||
var self = this;
|
||
this.writable = false;
|
||
|
||
// encodePacket efficient as it uses WS framing
|
||
// no need for encodePayload
|
||
var total = packets.length;
|
||
for (var i = 0, l = total; i < l; i++) {
|
||
(function (packet) {
|
||
parser.encodePacket(packet, self.supportsBinary, function (data) {
|
||
if (!self.usingBrowserWebSocket) {
|
||
// always create a new object (GH-437)
|
||
var opts = {};
|
||
if (packet.options) {
|
||
opts.compress = packet.options.compress;
|
||
}
|
||
|
||
if (self.perMessageDeflate) {
|
||
var len = 'string' === typeof data ? global.Buffer.byteLength(data) : data.length;
|
||
if (len < self.perMessageDeflate.threshold) {
|
||
opts.compress = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Sometimes the websocket has already been closed but the browser didn't
|
||
// have a chance of informing us about it yet, in that case send will
|
||
// throw an error
|
||
try {
|
||
if (self.usingBrowserWebSocket) {
|
||
// TypeError is thrown when passing the second argument on Safari
|
||
self.ws.send(data);
|
||
} else {
|
||
self.ws.send(data, opts);
|
||
}
|
||
} catch (e) {
|
||
debug('websocket closed before onclose event');
|
||
}
|
||
|
||
--total || done();
|
||
});
|
||
})(packets[i]);
|
||
}
|
||
|
||
function done () {
|
||
self.emit('flush');
|
||
|
||
// fake drain
|
||
// defer to next tick to allow Socket to clear writeBuffer
|
||
setTimeout(function () {
|
||
self.writable = true;
|
||
self.emit('drain');
|
||
}, 0);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Called upon close
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.onClose = function () {
|
||
Transport.prototype.onClose.call(this);
|
||
};
|
||
|
||
/**
|
||
* Closes socket.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.doClose = function () {
|
||
if (typeof this.ws !== 'undefined') {
|
||
this.ws.close();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Generates uri for connection.
|
||
*
|
||
* @api private
|
||
*/
|
||
|
||
WS.prototype.uri = function () {
|
||
var query = this.query || {};
|
||
var schema = this.secure ? 'wss' : 'ws';
|
||
var port = '';
|
||
|
||
// avoid port if default for schema
|
||
if (this.port && (('wss' === schema && Number(this.port) !== 443) ||
|
||
('ws' === schema && Number(this.port) !== 80))) {
|
||
port = ':' + this.port;
|
||
}
|
||
|
||
// append timestamp to URI
|
||
if (this.timestampRequests) {
|
||
query[this.timestampParam] = yeast();
|
||
}
|
||
|
||
// communicate binary support capabilities
|
||
if (!this.supportsBinary) {
|
||
query.b64 = 1;
|
||
}
|
||
|
||
query = parseqs.encode(query);
|
||
|
||
// prepend ? to query
|
||
if (query.length) {
|
||
query = '?' + query;
|
||
}
|
||
|
||
var ipv6 = this.hostname.indexOf(':') !== -1;
|
||
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
|
||
};
|
||
|
||
/**
|
||
* Feature detection for WebSocket.
|
||
*
|
||
* @return {Boolean} whether this transport is available.
|
||
* @api public
|
||
*/
|
||
|
||
WS.prototype.check = function () {
|
||
return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 55 */
|
||
/***/ (function(module, exports) {
|
||
|
||
/* (ignored) */
|
||
|
||
/***/ }),
|
||
/* 56 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = toArray
|
||
|
||
function toArray(list, index) {
|
||
var array = []
|
||
|
||
index = index || 0
|
||
|
||
for (var i = index || 0; i < list.length; i++) {
|
||
array[i - index] = list[i]
|
||
}
|
||
|
||
return array
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 57 */
|
||
/***/ (function(module, exports) {
|
||
|
||
|
||
/**
|
||
* Expose `Backoff`.
|
||
*/
|
||
|
||
module.exports = Backoff;
|
||
|
||
/**
|
||
* Initialize backoff timer with `opts`.
|
||
*
|
||
* - `min` initial timeout in milliseconds [100]
|
||
* - `max` max timeout [10000]
|
||
* - `jitter` [0]
|
||
* - `factor` [2]
|
||
*
|
||
* @param {Object} opts
|
||
* @api public
|
||
*/
|
||
|
||
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;
|
||
}
|
||
|
||
/**
|
||
* Return the backoff duration.
|
||
*
|
||
* @return {Number}
|
||
* @api public
|
||
*/
|
||
|
||
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;
|
||
};
|
||
|
||
/**
|
||
* Reset the number of attempts.
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Backoff.prototype.reset = function(){
|
||
this.attempts = 0;
|
||
};
|
||
|
||
/**
|
||
* Set the minimum duration
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Backoff.prototype.setMin = function(min){
|
||
this.ms = min;
|
||
};
|
||
|
||
/**
|
||
* Set the maximum duration
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Backoff.prototype.setMax = function(max){
|
||
this.max = max;
|
||
};
|
||
|
||
/**
|
||
* Set the jitter
|
||
*
|
||
* @api public
|
||
*/
|
||
|
||
Backoff.prototype.setJitter = function(jitter){
|
||
this.jitter = jitter;
|
||
};
|
||
|
||
|
||
|
||
/***/ }),
|
||
/* 58 */
|
||
/***/ (function(module, exports) {
|
||
|
||
if (!("indexOf" in Array.prototype)) {
|
||
Array.prototype.indexOf = function (find, i) {
|
||
if (i === undefined) {
|
||
i = 0;
|
||
}
|
||
if (i < 0) {
|
||
i += this.length;
|
||
}
|
||
if (i < 0) {
|
||
i = 0;
|
||
}
|
||
for (var n = this.length; i < n; i += 1) {
|
||
if (i in this && this[i] === find) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
}
|
||
// Production steps of ECMA-262, Edition 5, 15.4.4.19
|
||
// Reference: http://es5.github.io/#x15.4.4.19
|
||
if (!Array.prototype.map) {
|
||
Array.prototype.map = function (callback, thisArg) {
|
||
var T, A, k;
|
||
if (this == null) {
|
||
throw new TypeError(" this is null or not defined");
|
||
}
|
||
// 1. Let O be the result of calling ToObject passing the |this|
|
||
// value as the argument.
|
||
var O = Object(this);
|
||
// 2. Let lenValue be the result of calling the Get internal
|
||
// method of O with the argument "length".
|
||
// 3. Let len be ToUint32(lenValue).
|
||
var len = O.length >>> 0;
|
||
// 4. If IsCallable(callback) is false, throw a TypeError exception.
|
||
// See: http://es5.github.com/#x9.11
|
||
if (typeof callback !== "function") {
|
||
throw new TypeError(callback + " is not a function");
|
||
}
|
||
// 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||
if (arguments.length > 1) {
|
||
T = thisArg;
|
||
}
|
||
// 6. Let A be a new array created as if by the expression new Array(len)
|
||
// where Array is the standard built-in constructor with that name and
|
||
// len is the value of len.
|
||
A = new Array(len);
|
||
// 7. Let k be 0
|
||
k = 0;
|
||
// 8. Repeat, while k < len
|
||
while (k < len) {
|
||
var kValue, mappedValue;
|
||
// a. Let Pk be ToString(k).
|
||
// This is implicit for LHS operands of the in operator
|
||
// b. Let kPresent be the result of calling the HasProperty internal
|
||
// method of O with argument Pk.
|
||
// This step can be combined with c
|
||
// c. If kPresent is true, then
|
||
if (k in O) {
|
||
// i. Let kValue be the result of calling the Get internal
|
||
// method of O with argument Pk.
|
||
kValue = O[k];
|
||
// ii. Let mappedValue be the result of calling the Call internal
|
||
// method of callback with T as the this value and argument
|
||
// list containing kValue, k, and O.
|
||
mappedValue = callback.call(T, kValue, k, O);
|
||
// iii. Call the DefineOwnProperty internal method of A with arguments
|
||
// Pk, Property Descriptor
|
||
// { Value: mappedValue,
|
||
// Writable: true,
|
||
// Enumerable: true,
|
||
// Configurable: true },
|
||
// and false.
|
||
// In browsers that support Object.defineProperty, use the following:
|
||
// Object.defineProperty(A, k, {
|
||
// value: mappedValue,
|
||
// writable: true,
|
||
// enumerable: true,
|
||
// configurable: true
|
||
// });
|
||
// For best browser support, use the following:
|
||
A[k] = mappedValue;
|
||
}
|
||
// d. Increase k by 1.
|
||
k++;
|
||
}
|
||
// 9. return A
|
||
return A;
|
||
};
|
||
}
|
||
if (!Array.prototype.filter) {
|
||
Array.prototype.filter = function (fun /*, thisArg*/) {
|
||
"use strict";
|
||
if (this === void 0 || this === null) {
|
||
throw new TypeError();
|
||
}
|
||
var t = Object(this);
|
||
var len = t.length >>> 0;
|
||
if (typeof fun !== "function") {
|
||
throw new TypeError();
|
||
}
|
||
var res = [];
|
||
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
|
||
for (var i = 0; i < len; i++) {
|
||
if (i in t) {
|
||
var val = t[i];
|
||
// NOTE: Technically this should Object.defineProperty at
|
||
// the next index, as push can be affected by
|
||
// properties on Object.prototype and Array.prototype.
|
||
// But that method's new, and collisions should be
|
||
// rare, so use the more-compatible alternative.
|
||
if (fun.call(thisArg, val, i, t)) {
|
||
res.push(val);
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
};
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 59 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var __assign = (this && this.__assign) || Object.assign || function(t) {
|
||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
s = arguments[i];
|
||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||
t[p] = s[p];
|
||
}
|
||
return t;
|
||
};
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
var Reloader_1 = __webpack_require__(60);
|
||
var Timer_1 = __webpack_require__(62);
|
||
var events = __webpack_require__(12);
|
||
var utils = __webpack_require__(4);
|
||
var emitter = __webpack_require__(7);
|
||
var sync = exports;
|
||
var nanlogger = __webpack_require__(63);
|
||
var log = nanlogger("Browsersync", { colors: { magenta: "#0F2634" } });
|
||
var reloader = new Reloader_1.Reloader(window, log, Timer_1.Timer);
|
||
var options = {
|
||
tagNames: {
|
||
css: "link",
|
||
jpg: "img",
|
||
jpeg: "img",
|
||
png: "img",
|
||
svg: "img",
|
||
gif: "img",
|
||
js: "script"
|
||
},
|
||
attrs: {
|
||
link: "href",
|
||
img: "src",
|
||
script: "src"
|
||
},
|
||
blacklist: [
|
||
// never allow .map files through
|
||
function (incoming) {
|
||
return incoming.ext === "map";
|
||
}
|
||
]
|
||
};
|
||
var OPT_PATH = "codeSync";
|
||
var current = function () {
|
||
return window.location.pathname;
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
*/
|
||
sync.init = function (bs) {
|
||
if (bs.options.tagNames) {
|
||
options.tagNames = bs.options.tagNames;
|
||
}
|
||
if (bs.options.scrollRestoreTechnique === "window.name") {
|
||
sync.saveScrollInName(emitter);
|
||
}
|
||
else {
|
||
sync.saveScrollInCookie(utils.getWindow(), utils.getDocument());
|
||
}
|
||
bs.socket.on("file:reload", sync.reload(bs));
|
||
bs.socket.on("browser:reload", function () {
|
||
if (bs.canSync({ url: current() }, OPT_PATH)) {
|
||
sync.reloadBrowser(true, bs);
|
||
}
|
||
});
|
||
};
|
||
/**
|
||
* Use window.name to store/restore scroll position
|
||
*/
|
||
sync.saveScrollInName = function () {
|
||
var PRE = "<<BS_START>>";
|
||
var SUF = "<<BS_END>>";
|
||
var regex = new RegExp(PRE + "(.+?)" + SUF);
|
||
var $window = utils.getWindow();
|
||
var saved = {};
|
||
/**
|
||
* Listen for the browser:hardReload event.
|
||
* When it runs, save the current scroll position
|
||
* in window.name
|
||
*/
|
||
emitter.on("browser:hardReload", function (data) {
|
||
var newname = [
|
||
$window.name,
|
||
PRE,
|
||
JSON.stringify({
|
||
bs: {
|
||
hardReload: true,
|
||
scroll: data.scrollPosition
|
||
}
|
||
}),
|
||
SUF
|
||
].join("");
|
||
$window.name = newname;
|
||
});
|
||
/**
|
||
* On page load, check window.name for an existing
|
||
* BS json blob & parse it.
|
||
*/
|
||
try {
|
||
var json = $window.name.match(regex);
|
||
if (json) {
|
||
saved = JSON.parse(json[1]);
|
||
}
|
||
}
|
||
catch (e) {
|
||
saved = {};
|
||
}
|
||
/**
|
||
* If the JSON was parsed correctly, try to
|
||
* find a scroll property and restore it.
|
||
*/
|
||
if (saved.bs && saved.bs.hardReload && saved.bs.scroll) {
|
||
utils.setScroll(saved.bs.scroll);
|
||
}
|
||
/**
|
||
* Remove any existing BS json from window.name
|
||
* to ensure we don't interfere with any other
|
||
* libs who may be using it.
|
||
*/
|
||
$window.name = $window.name.replace(regex, "");
|
||
};
|
||
/**
|
||
* Use a cookie-drop to save scroll position of
|
||
* @param $window
|
||
* @param $document
|
||
*/
|
||
sync.saveScrollInCookie = function ($window, $document) {
|
||
if (!utils.isOldIe()) {
|
||
return;
|
||
}
|
||
if ($document.readyState === "complete") {
|
||
utils.restoreScrollPosition();
|
||
}
|
||
else {
|
||
events.manager.addEvent($document, "readystatechange", function () {
|
||
if ($document.readyState === "complete") {
|
||
utils.restoreScrollPosition();
|
||
}
|
||
});
|
||
}
|
||
emitter.on("browser:hardReload", utils.saveScrollPosition);
|
||
};
|
||
/**
|
||
* @param {BrowserSync} bs
|
||
* @returns {*}
|
||
*/
|
||
sync.reload = function (bs) {
|
||
/**
|
||
* @param data - from socket
|
||
*/
|
||
return function (data) {
|
||
if (!bs.canSync({ url: current() }, OPT_PATH)) {
|
||
return;
|
||
}
|
||
if (data.url || !bs.options.injectChanges) {
|
||
sync.reloadBrowser(true);
|
||
}
|
||
if (data.basename && data.ext) {
|
||
if (sync.isBlacklisted(data)) {
|
||
return;
|
||
}
|
||
reloader.reload(data, __assign({}, options, { liveCSS: true, liveImg: true }));
|
||
}
|
||
};
|
||
};
|
||
/**
|
||
* @param incoming
|
||
* @returns {boolean}
|
||
*/
|
||
sync.isBlacklisted = function (incoming) {
|
||
return options.blacklist.some(function (fn) {
|
||
return fn(incoming);
|
||
});
|
||
};
|
||
/**
|
||
* @param confirm
|
||
*/
|
||
sync.reloadBrowser = function (confirm) {
|
||
emitter.emit("browser:hardReload", {
|
||
scrollPosition: utils.getBrowserScrollPosition()
|
||
});
|
||
if (confirm) {
|
||
utils.reloadBrowser();
|
||
}
|
||
};
|
||
|
||
|
||
/***/ }),
|
||
/* 60 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
/**
|
||
*
|
||
* With thanks to https://github.com/livereload/livereload-js
|
||
* :) :) :)
|
||
*
|
||
*/
|
||
var utils_1 = __webpack_require__(61);
|
||
var hiddenElem;
|
||
var IMAGE_STYLES = [
|
||
{ selector: 'background', styleNames: ['backgroundImage'] },
|
||
{ selector: 'border', styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] }
|
||
];
|
||
var Reloader = /** @class */ (function () {
|
||
function Reloader(window, logger, Timer) {
|
||
this.window = window;
|
||
this.logger = logger;
|
||
this.Timer = Timer;
|
||
this.window = window;
|
||
this.Timer = Timer;
|
||
this.document = this.window.document;
|
||
this.importCacheWaitPeriod = 200;
|
||
this.plugins = [];
|
||
}
|
||
Reloader.prototype.addPlugin = function (plugin) {
|
||
return this.plugins.push(plugin);
|
||
};
|
||
Reloader.prototype.analyze = function (callback) {
|
||
return null;
|
||
// return results;
|
||
};
|
||
Reloader.prototype.reload = function (data, options, cb) {
|
||
this.options = options; // avoid passing it through all the funcs
|
||
var path = data.path;
|
||
if (this.options.stylesheetReloadTimeout == null) {
|
||
this.options.stylesheetReloadTimeout = 15000;
|
||
}
|
||
this.plugins.forEach(function (plugin) {
|
||
if (plugin.reload && plugin.reload(path, options)) {
|
||
return;
|
||
}
|
||
});
|
||
if (options.liveCSS) {
|
||
if (path.match(/\.css$/i)) {
|
||
this.logger.trace("path.match(/\\.css$/i)", true);
|
||
if (this.reloadStylesheet(path)) {
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
if (options.liveImg) {
|
||
if (path.match(/\.(jpe?g|png|gif)$/i)) {
|
||
this.logger.trace("/\\.(jpe?g|png|gif)$/i", true);
|
||
this.reloadImages(path);
|
||
return;
|
||
}
|
||
}
|
||
this.logger.trace('Falling back to legacy method of replacing assets');
|
||
/**
|
||
* LEGACY
|
||
*/
|
||
var domData = Reloader.getElems(data.ext, options);
|
||
var elems = Reloader.getMatches(domData.elems, data.basename, domData.attr);
|
||
for (var i = 0, n = elems.length; i < n; i += 1) {
|
||
this.swapFile(elems[i], domData, options);
|
||
}
|
||
(cb || function () { })(elems, domData);
|
||
};
|
||
Reloader.getElems = function (fileExtension, options) {
|
||
var tagName = options.tagNames[fileExtension];
|
||
var attr = options.attrs[tagName];
|
||
return {
|
||
attr: attr,
|
||
tagName: tagName,
|
||
elems: document.getElementsByTagName(tagName)
|
||
};
|
||
};
|
||
Reloader.getMatches = function (elems, url, attr) {
|
||
if (url[0] === "*") {
|
||
return elems;
|
||
}
|
||
var matches = [];
|
||
var urlMatcher = new RegExp("(^|/)" + url);
|
||
for (var i = 0, len = elems.length; i < len; i += 1) {
|
||
if (urlMatcher.test(elems[i][attr])) {
|
||
matches.push(elems[i]);
|
||
}
|
||
}
|
||
return matches;
|
||
};
|
||
;
|
||
Reloader.prototype.swapFile = function (elem, domData, options) {
|
||
var attr = domData.attr;
|
||
var currentValue = elem[attr];
|
||
var timeStamp = new Date().getTime();
|
||
var key = "browsersync-legacy";
|
||
var suffix = key + "=" + timeStamp;
|
||
var anchor = utils_1.getLocation(currentValue);
|
||
var search = utils_1.updateSearch(anchor.search, key, suffix);
|
||
switch (domData.tagName) {
|
||
case 'link': {
|
||
this.logger.trace("replacing LINK " + attr);
|
||
this.reloadStylesheet(currentValue);
|
||
break;
|
||
}
|
||
case 'img': {
|
||
this.reloadImages(currentValue);
|
||
break;
|
||
}
|
||
default: {
|
||
if (options.timestamps === false) {
|
||
elem[attr] = anchor.href;
|
||
}
|
||
else {
|
||
elem[attr] = anchor.href.split("?")[0] + search;
|
||
}
|
||
this.logger.info("reloading " + elem[attr]);
|
||
setTimeout(function () {
|
||
if (!hiddenElem) {
|
||
hiddenElem = document.createElement("DIV");
|
||
document.body.appendChild(hiddenElem);
|
||
}
|
||
else {
|
||
hiddenElem.style.display = "none";
|
||
hiddenElem.style.display = "block";
|
||
}
|
||
}, 200);
|
||
}
|
||
}
|
||
return {
|
||
elem: elem,
|
||
timeStamp: timeStamp
|
||
};
|
||
};
|
||
;
|
||
Reloader.prototype.reloadPage = function () {
|
||
return this.window.document.location.reload();
|
||
};
|
||
Reloader.prototype.reloadImages = function (path) {
|
||
var _this = this;
|
||
var expando = this.generateUniqueString();
|
||
[].slice.call(this.document.images).forEach(function (img) {
|
||
if (utils_1.pathsMatch(path, utils_1.pathFromUrl(img.src))) {
|
||
img.src = _this.generateCacheBustUrl(img.src, expando);
|
||
}
|
||
});
|
||
if (this.document.querySelectorAll) {
|
||
IMAGE_STYLES.forEach(function (_a) {
|
||
var selector = _a.selector, styleNames = _a.styleNames;
|
||
[].slice.call(_this.document.querySelectorAll("[style*=" + selector + "]")).forEach(function (img) {
|
||
_this.reloadStyleImages(img.style, styleNames, path, expando);
|
||
});
|
||
});
|
||
}
|
||
if (this.document.styleSheets) {
|
||
return [].slice.call(this.document.styleSheets)
|
||
.map(function (styleSheet) {
|
||
return _this.reloadStylesheetImages(styleSheet, path, expando);
|
||
});
|
||
}
|
||
};
|
||
Reloader.prototype.reloadStylesheetImages = function (styleSheet, path, expando) {
|
||
var _this = this;
|
||
var rules;
|
||
try {
|
||
rules = styleSheet != null ? styleSheet.cssRules : undefined;
|
||
}
|
||
catch (e) { }
|
||
//
|
||
if (!rules) {
|
||
return;
|
||
}
|
||
[].slice.call(rules).forEach(function (rule) {
|
||
switch (rule.type) {
|
||
case CSSRule.IMPORT_RULE:
|
||
_this.reloadStylesheetImages(rule.styleSheet, path, expando);
|
||
break;
|
||
case CSSRule.STYLE_RULE:
|
||
[].slice.call(IMAGE_STYLES).forEach(function (_a) {
|
||
var styleNames = _a.styleNames;
|
||
_this.reloadStyleImages(rule.style, styleNames, path, expando);
|
||
});
|
||
break;
|
||
case CSSRule.MEDIA_RULE:
|
||
_this.reloadStylesheetImages(rule, path, expando);
|
||
break;
|
||
}
|
||
});
|
||
};
|
||
Reloader.prototype.reloadStyleImages = function (style, styleNames, path, expando) {
|
||
var _this = this;
|
||
[].slice.call(styleNames).forEach(function (styleName) {
|
||
var value = style[styleName];
|
||
if (typeof value === 'string') {
|
||
var newValue = value.replace(new RegExp("\\burl\\s*\\(([^)]*)\\)"), function (match, src) {
|
||
if (utils_1.pathsMatch(path, utils_1.pathFromUrl(src))) {
|
||
return "url(" + _this.generateCacheBustUrl(src, expando) + ")";
|
||
}
|
||
else {
|
||
return match;
|
||
}
|
||
});
|
||
if (newValue !== value) {
|
||
style[styleName] = newValue;
|
||
}
|
||
}
|
||
});
|
||
};
|
||
Reloader.prototype.reloadStylesheet = function (path) {
|
||
var _this = this;
|
||
// has to be a real array, because DOMNodeList will be modified
|
||
var link;
|
||
var links = ((function () {
|
||
var result = [];
|
||
[].slice.call(_this.document.getElementsByTagName('link')).forEach(function (link) {
|
||
if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) {
|
||
result.push(link);
|
||
}
|
||
});
|
||
return result;
|
||
})());
|
||
// find all imported stylesheets
|
||
var imported = [];
|
||
for (var _i = 0, _a = Array.from(this.document.getElementsByTagName('style')); _i < _a.length; _i++) {
|
||
var style = _a[_i];
|
||
if (style.sheet) {
|
||
this.collectImportedStylesheets(style, style.sheet, imported);
|
||
}
|
||
}
|
||
for (var _b = 0, _c = Array.from(links); _b < _c.length; _b++) {
|
||
link = _c[_b];
|
||
this.collectImportedStylesheets(link, link.sheet, imported);
|
||
}
|
||
// handle prefixfree
|
||
if (this.window.StyleFix && this.document.querySelectorAll) {
|
||
[].slice.call(this.document.querySelectorAll('style[data-href]')).forEach(function (style) {
|
||
links.push(style);
|
||
});
|
||
}
|
||
this.logger.debug("found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets");
|
||
var match = utils_1.pickBestMatch(path, links.concat(imported), function (l) { return utils_1.pathFromUrl(_this.linkHref(l)); });
|
||
if (match) {
|
||
if (match.object && match.object.rule) {
|
||
this.logger.info("reloading imported stylesheet: " + match.object.href);
|
||
this.reattachImportedRule(match.object);
|
||
}
|
||
else {
|
||
this.logger.info("reloading stylesheet: " + this.linkHref(match.object));
|
||
this.reattachStylesheetLink(match.object);
|
||
}
|
||
}
|
||
else {
|
||
this.logger.info("reloading all stylesheets because path '" + path + "' did not match any specific one");
|
||
links.forEach(function (link) { return _this.reattachStylesheetLink(link); });
|
||
}
|
||
return true;
|
||
};
|
||
Reloader.prototype.collectImportedStylesheets = function (link, styleSheet, result) {
|
||
// in WebKit, styleSheet.cssRules is null for inaccessible stylesheets;
|
||
// Firefox/Opera may throw exceptions
|
||
var rules;
|
||
try {
|
||
rules = styleSheet != null ? styleSheet.cssRules : undefined;
|
||
}
|
||
catch (e) { }
|
||
//
|
||
if (rules && rules.length) {
|
||
for (var index = 0; index < rules.length; index++) {
|
||
var rule = rules[index];
|
||
switch (rule.type) {
|
||
case CSSRule.CHARSET_RULE:
|
||
break;
|
||
case CSSRule.IMPORT_RULE:
|
||
result.push({ link: link, rule: rule, index: index, href: rule.href });
|
||
this.collectImportedStylesheets(link, rule.styleSheet, result);
|
||
break;
|
||
default:
|
||
break; // import rules can only be preceded by charset rules
|
||
}
|
||
}
|
||
}
|
||
};
|
||
Reloader.prototype.waitUntilCssLoads = function (clone, func) {
|
||
var _this = this;
|
||
var callbackExecuted = false;
|
||
var executeCallback = function () {
|
||
if (callbackExecuted) {
|
||
return;
|
||
}
|
||
callbackExecuted = true;
|
||
return func();
|
||
};
|
||
// supported by Chrome 19+, Safari 5.2+, Firefox 9+, Opera 9+, IE6+
|
||
// http://www.zachleat.com/web/load-css-dynamically/
|
||
// http://pieisgood.org/test/script-link-events/
|
||
clone.onload = function () {
|
||
_this.logger.debug("the new stylesheet has finished loading");
|
||
_this.knownToSupportCssOnLoad = true;
|
||
return executeCallback();
|
||
};
|
||
if (!this.knownToSupportCssOnLoad) {
|
||
// polling
|
||
var poll_1;
|
||
(poll_1 = function () {
|
||
if (clone.sheet) {
|
||
_this.logger.debug("polling until the new CSS finishes loading...");
|
||
return executeCallback();
|
||
}
|
||
else {
|
||
return _this.Timer.start(50, poll_1);
|
||
}
|
||
})();
|
||
}
|
||
// fail safe
|
||
return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback);
|
||
};
|
||
Reloader.prototype.linkHref = function (link) {
|
||
// prefixfree uses data-href when it turns LINK into STYLE
|
||
return link.href || link.getAttribute('data-href');
|
||
};
|
||
Reloader.prototype.reattachStylesheetLink = function (link) {
|
||
var _this = this;
|
||
// ignore LINKs that will be removed by LR soon
|
||
var clone;
|
||
if (link.__LiveReload_pendingRemoval) {
|
||
return;
|
||
}
|
||
link.__LiveReload_pendingRemoval = true;
|
||
if (link.tagName === 'STYLE') {
|
||
// prefixfree
|
||
clone = this.document.createElement('link');
|
||
clone.rel = 'stylesheet';
|
||
clone.media = link.media;
|
||
clone.disabled = link.disabled;
|
||
}
|
||
else {
|
||
clone = link.cloneNode(false);
|
||
}
|
||
clone.href = this.generateCacheBustUrl(this.linkHref(link));
|
||
// insert the new LINK before the old one
|
||
var parent = link.parentNode;
|
||
if (parent.lastChild === link) {
|
||
parent.appendChild(clone);
|
||
}
|
||
else {
|
||
parent.insertBefore(clone, link.nextSibling);
|
||
}
|
||
return this.waitUntilCssLoads(clone, function () {
|
||
var additionalWaitingTime;
|
||
if (/AppleWebKit/.test(navigator.userAgent)) {
|
||
additionalWaitingTime = 5;
|
||
}
|
||
else {
|
||
additionalWaitingTime = 200;
|
||
}
|
||
return _this.Timer.start(additionalWaitingTime, function () {
|
||
if (!link.parentNode) {
|
||
return;
|
||
}
|
||
link.parentNode.removeChild(link);
|
||
clone.onreadystatechange = null;
|
||
return (_this.window.StyleFix != null ? _this.window.StyleFix.link(clone) : undefined);
|
||
});
|
||
}); // prefixfree
|
||
};
|
||
Reloader.prototype.reattachImportedRule = function (_a) {
|
||
var _this = this;
|
||
var rule = _a.rule, index = _a.index, link = _a.link;
|
||
var parent = rule.parentStyleSheet;
|
||
var href = this.generateCacheBustUrl(rule.href);
|
||
var media = rule.media.length ? [].join.call(rule.media, ', ') : '';
|
||
var newRule = "@import url(\"" + href + "\") " + media + ";";
|
||
// used to detect if reattachImportedRule has been called again on the same rule
|
||
rule.__LiveReload_newHref = href;
|
||
// WORKAROUND FOR WEBKIT BUG: WebKit resets all styles if we add @import'ed
|
||
// stylesheet that hasn't been cached yet. Workaround is to pre-cache the
|
||
// stylesheet by temporarily adding it as a LINK tag.
|
||
var tempLink = this.document.createElement("link");
|
||
tempLink.rel = 'stylesheet';
|
||
tempLink.href = href;
|
||
tempLink.__LiveReload_pendingRemoval = true; // exclude from path matching
|
||
if (link.parentNode) {
|
||
link.parentNode.insertBefore(tempLink, link);
|
||
}
|
||
// wait for it to load
|
||
return this.Timer.start(this.importCacheWaitPeriod, function () {
|
||
if (tempLink.parentNode) {
|
||
tempLink.parentNode.removeChild(tempLink);
|
||
}
|
||
// if another reattachImportedRule call is in progress, abandon this one
|
||
if (rule.__LiveReload_newHref !== href) {
|
||
return;
|
||
}
|
||
parent.insertRule(newRule, index);
|
||
parent.deleteRule(index + 1);
|
||
// save the new rule, so that we can detect another reattachImportedRule call
|
||
rule = parent.cssRules[index];
|
||
rule.__LiveReload_newHref = href;
|
||
// repeat again for good measure
|
||
return _this.Timer.start(_this.importCacheWaitPeriod, function () {
|
||
// if another reattachImportedRule call is in progress, abandon this one
|
||
if (rule.__LiveReload_newHref !== href) {
|
||
return;
|
||
}
|
||
parent.insertRule(newRule, index);
|
||
return parent.deleteRule(index + 1);
|
||
});
|
||
});
|
||
};
|
||
Reloader.prototype.generateUniqueString = function () {
|
||
return "browsersync=" + Date.now();
|
||
};
|
||
Reloader.prototype.generateCacheBustUrl = function (url, expando) {
|
||
if (expando === void 0) { expando = this.generateUniqueString(); }
|
||
var hash, oldParams;
|
||
(_a = utils_1.splitUrl(url), url = _a.url, hash = _a.hash, oldParams = _a.params);
|
||
if (this.options.overrideURL) {
|
||
if (url.indexOf(this.options.serverURL) < 0) {
|
||
var originalUrl = url;
|
||
url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url);
|
||
this.logger.debug("overriding source URL " + originalUrl + " with " + url);
|
||
}
|
||
}
|
||
var params = oldParams.replace(/(\?|&)browsersync=(\d+)/, function (match, sep) { return "" + sep + expando; });
|
||
if (params === oldParams) {
|
||
if (oldParams.length === 0) {
|
||
params = "?" + expando;
|
||
}
|
||
else {
|
||
params = oldParams + "&" + expando;
|
||
}
|
||
}
|
||
return url + params + hash;
|
||
var _a;
|
||
};
|
||
return Reloader;
|
||
}());
|
||
exports.Reloader = Reloader;
|
||
|
||
|
||
/***/ }),
|
||
/* 61 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
function each(incoming) {
|
||
return [].slice.call(incoming || []);
|
||
}
|
||
exports.each = each;
|
||
exports.splitUrl = function (url) {
|
||
var hash, index, params;
|
||
if ((index = url.indexOf("#")) >= 0) {
|
||
hash = url.slice(index);
|
||
url = url.slice(0, index);
|
||
}
|
||
else {
|
||
hash = "";
|
||
}
|
||
if ((index = url.indexOf("?")) >= 0) {
|
||
params = url.slice(index);
|
||
url = url.slice(0, index);
|
||
}
|
||
else {
|
||
params = "";
|
||
}
|
||
return { url: url, params: params, hash: hash };
|
||
};
|
||
exports.pathFromUrl = function (url) {
|
||
var path;
|
||
(url = exports.splitUrl(url).url);
|
||
if (url.indexOf("file://") === 0) {
|
||
path = url.replace(new RegExp("^file://(localhost)?"), "");
|
||
}
|
||
else {
|
||
// http : // hostname :8080 /
|
||
path = url.replace(new RegExp("^([^:]+:)?//([^:/]+)(:\\d*)?/"), "/");
|
||
}
|
||
// decodeURI has special handling of stuff like semicolons, so use decodeURIComponent
|
||
return decodeURIComponent(path);
|
||
};
|
||
exports.pickBestMatch = function (path, objects, pathFunc) {
|
||
var score;
|
||
var bestMatch = { score: 0, object: null };
|
||
objects.forEach(function (object) {
|
||
score = exports.numberOfMatchingSegments(path, pathFunc(object));
|
||
if (score > bestMatch.score) {
|
||
bestMatch = { object: object, score: score };
|
||
}
|
||
});
|
||
if (bestMatch.score > 0) {
|
||
return bestMatch;
|
||
}
|
||
else {
|
||
return null;
|
||
}
|
||
};
|
||
exports.numberOfMatchingSegments = function (path1, path2) {
|
||
// get rid of leading slashes and normalize to lower case
|
||
path1 = path1.replace(/^\/+/, "").toLowerCase();
|
||
path2 = path2.replace(/^\/+/, "").toLowerCase();
|
||
if (path1 === path2) {
|
||
return 10000;
|
||
}
|
||
var comps1 = path1.split("/").reverse();
|
||
var comps2 = path2.split("/").reverse();
|
||
var len = Math.min(comps1.length, comps2.length);
|
||
var eqCount = 0;
|
||
while (eqCount < len && comps1[eqCount] === comps2[eqCount]) {
|
||
++eqCount;
|
||
}
|
||
return eqCount;
|
||
};
|
||
exports.pathsMatch = function (path1, path2) {
|
||
return exports.numberOfMatchingSegments(path1, path2) > 0;
|
||
};
|
||
function getLocation(url) {
|
||
var location = document.createElement("a");
|
||
location.href = url;
|
||
if (location.host === "") {
|
||
location.href = location.href;
|
||
}
|
||
return location;
|
||
}
|
||
exports.getLocation = getLocation;
|
||
/**
|
||
* @param {string} search
|
||
* @param {string} key
|
||
* @param {string} suffix
|
||
*/
|
||
function updateSearch(search, key, suffix) {
|
||
if (search === "") {
|
||
return "?" + suffix;
|
||
}
|
||
return ("?" +
|
||
search
|
||
.slice(1)
|
||
.split("&")
|
||
.map(function (item) {
|
||
return item.split("=");
|
||
})
|
||
.filter(function (tuple) {
|
||
return tuple[0] !== key;
|
||
})
|
||
.map(function (item) {
|
||
return [item[0], item[1]].join("=");
|
||
})
|
||
.concat(suffix)
|
||
.join("&"));
|
||
}
|
||
exports.updateSearch = updateSearch;
|
||
|
||
|
||
/***/ }),
|
||
/* 62 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
/*
|
||
* decaffeinate suggestions:
|
||
* DS102: Remove unnecessary code created because of implicit returns
|
||
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
||
*/
|
||
var Timer = /** @class */ (function () {
|
||
function Timer(func) {
|
||
var _this = this;
|
||
this.func = func;
|
||
this.running = false;
|
||
this.id = null;
|
||
this._handler = function () {
|
||
_this.running = false;
|
||
_this.id = null;
|
||
return _this.func();
|
||
};
|
||
}
|
||
Timer.prototype.start = function (timeout) {
|
||
if (this.running) {
|
||
clearTimeout(this.id);
|
||
}
|
||
this.id = setTimeout(this._handler, timeout);
|
||
return this.running = true;
|
||
};
|
||
Timer.prototype.stop = function () {
|
||
if (this.running) {
|
||
clearTimeout(this.id);
|
||
this.running = false;
|
||
return this.id = null;
|
||
}
|
||
};
|
||
Timer.start = function (timeout, func) {
|
||
setTimeout(func, timeout);
|
||
};
|
||
return Timer;
|
||
}());
|
||
exports.Timer = Timer;
|
||
|
||
|
||
/***/ }),
|
||
/* 63 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var assert = __webpack_require__(64)
|
||
var xtend = __webpack_require__(68)
|
||
|
||
var emojis = {
|
||
trace: '🔍',
|
||
debug: '🐛',
|
||
info: '✨',
|
||
warn: '⚠️',
|
||
error: '🚨',
|
||
fatal: '💀'
|
||
}
|
||
|
||
var levels = {
|
||
trace: 10,
|
||
debug: 20,
|
||
info: 30,
|
||
warn: 40,
|
||
error: 50,
|
||
fatal: 60
|
||
}
|
||
|
||
var defaultColors = {
|
||
foreground: '#d3c0c8',
|
||
background: '#2d2d2d',
|
||
black: '#2d2d2d',
|
||
red: '#f2777a',
|
||
green: '#99cc99',
|
||
yellow: '#ffcc66',
|
||
blue: '#6699cc',
|
||
magenta: '#cc99cc',
|
||
cyan: '#66cccc',
|
||
white: '#d3d0c8',
|
||
brightBlack: '#747369'
|
||
}
|
||
|
||
module.exports = Nanologger
|
||
|
||
function Nanologger (name, opts) {
|
||
opts = opts || {}
|
||
if (!(this instanceof Nanologger)) return new Nanologger(name, opts)
|
||
|
||
assert.equal(typeof opts, 'object', 'nanologger: opts should be type object')
|
||
|
||
this._name = name || ''
|
||
this._colors = xtend(defaultColors, opts.colors || {})
|
||
|
||
try {
|
||
this.logLevel = window.localStorage.getItem('logLevel') || 'info'
|
||
} catch (e) {
|
||
this.logLevel = 'info'
|
||
}
|
||
|
||
this._logLevel = levels[this.logLevel]
|
||
}
|
||
|
||
Nanologger.prototype.trace = function () {
|
||
var args = [ 'trace' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype.debug = function () {
|
||
var args = [ 'debug' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype.info = function () {
|
||
var args = [ 'info' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype.warn = function () {
|
||
var args = [ 'warn' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype.error = function () {
|
||
var args = [ 'error' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype.fatal = function () {
|
||
var args = [ 'fatal' ]
|
||
for (var i = 0, len = arguments.length; i < len; i++) args.push(arguments[i])
|
||
this._print.apply(this, args)
|
||
}
|
||
|
||
Nanologger.prototype._print = function (level) {
|
||
if (levels[level] < this._logLevel) return
|
||
|
||
var time = getTimeStamp()
|
||
var emoji = emojis[level]
|
||
var name = this._name || 'unknown'
|
||
|
||
var msgColor = (level === 'error' || level.fatal)
|
||
? this._colors.red
|
||
: level === 'warn'
|
||
? this._colors.yellow
|
||
: this._colors.green
|
||
|
||
var objs = []
|
||
var args = [ null ]
|
||
var msg = '%c%s ' + emoji + ' %c%s'
|
||
|
||
args.push(color(this._colors.brightBlack), time)
|
||
args.push(color(this._colors.magenta), name)
|
||
|
||
for (var i = 1, len = arguments.length; i < len; i++) {
|
||
var arg = arguments[i]
|
||
if (typeof arg === 'string') {
|
||
if (i === 1) {
|
||
// first string argument is in color
|
||
msg += ' %c%s'
|
||
args.push(color(msgColor))
|
||
args.push(arg)
|
||
} else if (/ms$/.test(arg)) {
|
||
// arguments finishing with 'ms', grey out
|
||
msg += ' %c%s'
|
||
args.push(color(this._colors.brightBlack))
|
||
args.push(arg)
|
||
} else {
|
||
// normal colors
|
||
msg += ' %c%s'
|
||
args.push(color(this._colors.white))
|
||
args.push(arg)
|
||
}
|
||
} else if (typeof arg === 'number') {
|
||
msg += ' %c%d'
|
||
args.push(color(this._colors.magenta))
|
||
args.push(arg)
|
||
} else {
|
||
objs.push(arg)
|
||
}
|
||
}
|
||
|
||
args[0] = msg
|
||
objs.forEach(function (obj) {
|
||
args.push(obj)
|
||
})
|
||
|
||
// In IE/Edge console functions don't inherit from Function.prototype
|
||
// so this is necessary to get all the args applied.
|
||
Function.prototype.apply.apply(console.log, [console, args])
|
||
}
|
||
|
||
function color (color) {
|
||
return 'color: ' + color + ';'
|
||
}
|
||
|
||
function getTimeStamp () {
|
||
var date = new Date()
|
||
var hours = pad(date.getHours().toString())
|
||
var minutes = pad(date.getMinutes().toString())
|
||
var seconds = pad(date.getSeconds().toString())
|
||
return hours + ':' + minutes + ':' + seconds
|
||
}
|
||
|
||
function pad (str) {
|
||
return str.length !== 2 ? 0 + str : str
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 64 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
/* WEBPACK VAR INJECTION */(function(global) {
|
||
|
||
// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
|
||
// original notice:
|
||
|
||
/*!
|
||
* The buffer module from node.js, for the browser.
|
||
*
|
||
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
||
* @license MIT
|
||
*/
|
||
function compare(a, b) {
|
||
if (a === b) {
|
||
return 0;
|
||
}
|
||
|
||
var x = a.length;
|
||
var y = b.length;
|
||
|
||
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
||
if (a[i] !== b[i]) {
|
||
x = a[i];
|
||
y = b[i];
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (x < y) {
|
||
return -1;
|
||
}
|
||
if (y < x) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
function isBuffer(b) {
|
||
if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
|
||
return global.Buffer.isBuffer(b);
|
||
}
|
||
return !!(b != null && b._isBuffer);
|
||
}
|
||
|
||
// based on node assert, original notice:
|
||
|
||
// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
|
||
//
|
||
// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
|
||
//
|
||
// Originally from narwhal.js (http://narwhaljs.org)
|
||
// Copyright (c) 2009 Thomas Robinson <280north.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 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 util = __webpack_require__(65);
|
||
var hasOwn = Object.prototype.hasOwnProperty;
|
||
var pSlice = Array.prototype.slice;
|
||
var functionsHaveNames = (function () {
|
||
return function foo() {}.name === 'foo';
|
||
}());
|
||
function pToString (obj) {
|
||
return Object.prototype.toString.call(obj);
|
||
}
|
||
function isView(arrbuf) {
|
||
if (isBuffer(arrbuf)) {
|
||
return false;
|
||
}
|
||
if (typeof global.ArrayBuffer !== 'function') {
|
||
return false;
|
||
}
|
||
if (typeof ArrayBuffer.isView === 'function') {
|
||
return ArrayBuffer.isView(arrbuf);
|
||
}
|
||
if (!arrbuf) {
|
||
return false;
|
||
}
|
||
if (arrbuf instanceof DataView) {
|
||
return true;
|
||
}
|
||
if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
// 1. The assert module provides functions that throw
|
||
// AssertionError's when particular conditions are not met. The
|
||
// assert module must conform to the following interface.
|
||
|
||
var assert = module.exports = ok;
|
||
|
||
// 2. The AssertionError is defined in assert.
|
||
// new assert.AssertionError({ message: message,
|
||
// actual: actual,
|
||
// expected: expected })
|
||
|
||
var regex = /\s*function\s+([^\(\s]*)\s*/;
|
||
// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
|
||
function getName(func) {
|
||
if (!util.isFunction(func)) {
|
||
return;
|
||
}
|
||
if (functionsHaveNames) {
|
||
return func.name;
|
||
}
|
||
var str = func.toString();
|
||
var match = str.match(regex);
|
||
return match && match[1];
|
||
}
|
||
assert.AssertionError = function AssertionError(options) {
|
||
this.name = 'AssertionError';
|
||
this.actual = options.actual;
|
||
this.expected = options.expected;
|
||
this.operator = options.operator;
|
||
if (options.message) {
|
||
this.message = options.message;
|
||
this.generatedMessage = false;
|
||
} else {
|
||
this.message = getMessage(this);
|
||
this.generatedMessage = true;
|
||
}
|
||
var stackStartFunction = options.stackStartFunction || fail;
|
||
if (Error.captureStackTrace) {
|
||
Error.captureStackTrace(this, stackStartFunction);
|
||
} else {
|
||
// non v8 browsers so we can have a stacktrace
|
||
var err = new Error();
|
||
if (err.stack) {
|
||
var out = err.stack;
|
||
|
||
// try to strip useless frames
|
||
var fn_name = getName(stackStartFunction);
|
||
var idx = out.indexOf('\n' + fn_name);
|
||
if (idx >= 0) {
|
||
// once we have located the function frame
|
||
// we need to strip out everything before it (and its line)
|
||
var next_line = out.indexOf('\n', idx + 1);
|
||
out = out.substring(next_line + 1);
|
||
}
|
||
|
||
this.stack = out;
|
||
}
|
||
}
|
||
};
|
||
|
||
// assert.AssertionError instanceof Error
|
||
util.inherits(assert.AssertionError, Error);
|
||
|
||
function truncate(s, n) {
|
||
if (typeof s === 'string') {
|
||
return s.length < n ? s : s.slice(0, n);
|
||
} else {
|
||
return s;
|
||
}
|
||
}
|
||
function inspect(something) {
|
||
if (functionsHaveNames || !util.isFunction(something)) {
|
||
return util.inspect(something);
|
||
}
|
||
var rawname = getName(something);
|
||
var name = rawname ? ': ' + rawname : '';
|
||
return '[Function' + name + ']';
|
||
}
|
||
function getMessage(self) {
|
||
return truncate(inspect(self.actual), 128) + ' ' +
|
||
self.operator + ' ' +
|
||
truncate(inspect(self.expected), 128);
|
||
}
|
||
|
||
// At present only the three keys mentioned above are used and
|
||
// understood by the spec. Implementations or sub modules can pass
|
||
// other keys to the AssertionError's constructor - they will be
|
||
// ignored.
|
||
|
||
// 3. All of the following functions must throw an AssertionError
|
||
// when a corresponding condition is not met, with a message that
|
||
// may be undefined if not provided. All assertion methods provide
|
||
// both the actual and expected values to the assertion error for
|
||
// display purposes.
|
||
|
||
function fail(actual, expected, message, operator, stackStartFunction) {
|
||
throw new assert.AssertionError({
|
||
message: message,
|
||
actual: actual,
|
||
expected: expected,
|
||
operator: operator,
|
||
stackStartFunction: stackStartFunction
|
||
});
|
||
}
|
||
|
||
// EXTENSION! allows for well behaved errors defined elsewhere.
|
||
assert.fail = fail;
|
||
|
||
// 4. Pure assertion tests whether a value is truthy, as determined
|
||
// by !!guard.
|
||
// assert.ok(guard, message_opt);
|
||
// This statement is equivalent to assert.equal(true, !!guard,
|
||
// message_opt);. To test strictly for the value true, use
|
||
// assert.strictEqual(true, guard, message_opt);.
|
||
|
||
function ok(value, message) {
|
||
if (!value) fail(value, true, message, '==', assert.ok);
|
||
}
|
||
assert.ok = ok;
|
||
|
||
// 5. The equality assertion tests shallow, coercive equality with
|
||
// ==.
|
||
// assert.equal(actual, expected, message_opt);
|
||
|
||
assert.equal = function equal(actual, expected, message) {
|
||
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
|
||
};
|
||
|
||
// 6. The non-equality assertion tests for whether two objects are not equal
|
||
// with != assert.notEqual(actual, expected, message_opt);
|
||
|
||
assert.notEqual = function notEqual(actual, expected, message) {
|
||
if (actual == expected) {
|
||
fail(actual, expected, message, '!=', assert.notEqual);
|
||
}
|
||
};
|
||
|
||
// 7. The equivalence assertion tests a deep equality relation.
|
||
// assert.deepEqual(actual, expected, message_opt);
|
||
|
||
assert.deepEqual = function deepEqual(actual, expected, message) {
|
||
if (!_deepEqual(actual, expected, false)) {
|
||
fail(actual, expected, message, 'deepEqual', assert.deepEqual);
|
||
}
|
||
};
|
||
|
||
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
|
||
if (!_deepEqual(actual, expected, true)) {
|
||
fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
|
||
}
|
||
};
|
||
|
||
function _deepEqual(actual, expected, strict, memos) {
|
||
// 7.1. All identical values are equivalent, as determined by ===.
|
||
if (actual === expected) {
|
||
return true;
|
||
} else if (isBuffer(actual) && isBuffer(expected)) {
|
||
return compare(actual, expected) === 0;
|
||
|
||
// 7.2. If the expected value is a Date object, the actual value is
|
||
// equivalent if it is also a Date object that refers to the same time.
|
||
} else if (util.isDate(actual) && util.isDate(expected)) {
|
||
return actual.getTime() === expected.getTime();
|
||
|
||
// 7.3 If the expected value is a RegExp object, the actual value is
|
||
// equivalent if it is also a RegExp object with the same source and
|
||
// properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
|
||
} else if (util.isRegExp(actual) && util.isRegExp(expected)) {
|
||
return actual.source === expected.source &&
|
||
actual.global === expected.global &&
|
||
actual.multiline === expected.multiline &&
|
||
actual.lastIndex === expected.lastIndex &&
|
||
actual.ignoreCase === expected.ignoreCase;
|
||
|
||
// 7.4. Other pairs that do not both pass typeof value == 'object',
|
||
// equivalence is determined by ==.
|
||
} else if ((actual === null || typeof actual !== 'object') &&
|
||
(expected === null || typeof expected !== 'object')) {
|
||
return strict ? actual === expected : actual == expected;
|
||
|
||
// If both values are instances of typed arrays, wrap their underlying
|
||
// ArrayBuffers in a Buffer each to increase performance
|
||
// This optimization requires the arrays to have the same type as checked by
|
||
// Object.prototype.toString (aka pToString). Never perform binary
|
||
// comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
|
||
// bit patterns are not identical.
|
||
} else if (isView(actual) && isView(expected) &&
|
||
pToString(actual) === pToString(expected) &&
|
||
!(actual instanceof Float32Array ||
|
||
actual instanceof Float64Array)) {
|
||
return compare(new Uint8Array(actual.buffer),
|
||
new Uint8Array(expected.buffer)) === 0;
|
||
|
||
// 7.5 For all other Object pairs, including Array objects, equivalence is
|
||
// determined by having the same number of owned properties (as verified
|
||
// with Object.prototype.hasOwnProperty.call), the same set of keys
|
||
// (although not necessarily the same order), equivalent values for every
|
||
// corresponding key, and an identical 'prototype' property. Note: this
|
||
// accounts for both named and indexed properties on Arrays.
|
||
} else if (isBuffer(actual) !== isBuffer(expected)) {
|
||
return false;
|
||
} else {
|
||
memos = memos || {actual: [], expected: []};
|
||
|
||
var actualIndex = memos.actual.indexOf(actual);
|
||
if (actualIndex !== -1) {
|
||
if (actualIndex === memos.expected.indexOf(expected)) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
memos.actual.push(actual);
|
||
memos.expected.push(expected);
|
||
|
||
return objEquiv(actual, expected, strict, memos);
|
||
}
|
||
}
|
||
|
||
function isArguments(object) {
|
||
return Object.prototype.toString.call(object) == '[object Arguments]';
|
||
}
|
||
|
||
function objEquiv(a, b, strict, actualVisitedObjects) {
|
||
if (a === null || a === undefined || b === null || b === undefined)
|
||
return false;
|
||
// if one is a primitive, the other must be same
|
||
if (util.isPrimitive(a) || util.isPrimitive(b))
|
||
return a === b;
|
||
if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
|
||
return false;
|
||
var aIsArgs = isArguments(a);
|
||
var bIsArgs = isArguments(b);
|
||
if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
|
||
return false;
|
||
if (aIsArgs) {
|
||
a = pSlice.call(a);
|
||
b = pSlice.call(b);
|
||
return _deepEqual(a, b, strict);
|
||
}
|
||
var ka = objectKeys(a);
|
||
var kb = objectKeys(b);
|
||
var key, i;
|
||
// having the same number of owned properties (keys incorporates
|
||
// hasOwnProperty)
|
||
if (ka.length !== kb.length)
|
||
return false;
|
||
//the same set of keys (although not necessarily the same order),
|
||
ka.sort();
|
||
kb.sort();
|
||
//~~~cheap key test
|
||
for (i = ka.length - 1; i >= 0; i--) {
|
||
if (ka[i] !== kb[i])
|
||
return false;
|
||
}
|
||
//equivalent values for every corresponding key, and
|
||
//~~~possibly expensive deep test
|
||
for (i = ka.length - 1; i >= 0; i--) {
|
||
key = ka[i];
|
||
if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 8. The non-equivalence assertion tests for any deep inequality.
|
||
// assert.notDeepEqual(actual, expected, message_opt);
|
||
|
||
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
|
||
if (_deepEqual(actual, expected, false)) {
|
||
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
|
||
}
|
||
};
|
||
|
||
assert.notDeepStrictEqual = notDeepStrictEqual;
|
||
function notDeepStrictEqual(actual, expected, message) {
|
||
if (_deepEqual(actual, expected, true)) {
|
||
fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
|
||
}
|
||
}
|
||
|
||
|
||
// 9. The strict equality assertion tests strict equality, as determined by ===.
|
||
// assert.strictEqual(actual, expected, message_opt);
|
||
|
||
assert.strictEqual = function strictEqual(actual, expected, message) {
|
||
if (actual !== expected) {
|
||
fail(actual, expected, message, '===', assert.strictEqual);
|
||
}
|
||
};
|
||
|
||
// 10. The strict non-equality assertion tests for strict inequality, as
|
||
// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
|
||
|
||
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
|
||
if (actual === expected) {
|
||
fail(actual, expected, message, '!==', assert.notStrictEqual);
|
||
}
|
||
};
|
||
|
||
function expectedException(actual, expected) {
|
||
if (!actual || !expected) {
|
||
return false;
|
||
}
|
||
|
||
if (Object.prototype.toString.call(expected) == '[object RegExp]') {
|
||
return expected.test(actual);
|
||
}
|
||
|
||
try {
|
||
if (actual instanceof expected) {
|
||
return true;
|
||
}
|
||
} catch (e) {
|
||
// Ignore. The instanceof check doesn't work for arrow functions.
|
||
}
|
||
|
||
if (Error.isPrototypeOf(expected)) {
|
||
return false;
|
||
}
|
||
|
||
return expected.call({}, actual) === true;
|
||
}
|
||
|
||
function _tryBlock(block) {
|
||
var error;
|
||
try {
|
||
block();
|
||
} catch (e) {
|
||
error = e;
|
||
}
|
||
return error;
|
||
}
|
||
|
||
function _throws(shouldThrow, block, expected, message) {
|
||
var actual;
|
||
|
||
if (typeof block !== 'function') {
|
||
throw new TypeError('"block" argument must be a function');
|
||
}
|
||
|
||
if (typeof expected === 'string') {
|
||
message = expected;
|
||
expected = null;
|
||
}
|
||
|
||
actual = _tryBlock(block);
|
||
|
||
message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
|
||
(message ? ' ' + message : '.');
|
||
|
||
if (shouldThrow && !actual) {
|
||
fail(actual, expected, 'Missing expected exception' + message);
|
||
}
|
||
|
||
var userProvidedMessage = typeof message === 'string';
|
||
var isUnwantedException = !shouldThrow && util.isError(actual);
|
||
var isUnexpectedException = !shouldThrow && actual && !expected;
|
||
|
||
if ((isUnwantedException &&
|
||
userProvidedMessage &&
|
||
expectedException(actual, expected)) ||
|
||
isUnexpectedException) {
|
||
fail(actual, expected, 'Got unwanted exception' + message);
|
||
}
|
||
|
||
if ((shouldThrow && actual && expected &&
|
||
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
|
||
throw actual;
|
||
}
|
||
}
|
||
|
||
// 11. Expected to throw an error:
|
||
// assert.throws(block, Error_opt, message_opt);
|
||
|
||
assert.throws = function(block, /*optional*/error, /*optional*/message) {
|
||
_throws(true, block, error, message);
|
||
};
|
||
|
||
// EXTENSION! This is annoying to write outside this module.
|
||
assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
|
||
_throws(false, block, error, message);
|
||
};
|
||
|
||
assert.ifError = function(err) { if (err) throw err; };
|
||
|
||
var objectKeys = Object.keys || function (obj) {
|
||
var keys = [];
|
||
for (var key in obj) {
|
||
if (hasOwn.call(obj, key)) keys.push(key);
|
||
}
|
||
return keys;
|
||
};
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
|
||
|
||
/***/ }),
|
||
/* 65 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
|
||
//
|
||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||
// copy of this software and associated documentation files (the
|
||
// "Software"), to deal in the Software without restriction, including
|
||
// without limitation the rights to use, copy, modify, merge, publish,
|
||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||
// persons to whom the Software is furnished to do so, subject to the
|
||
// following conditions:
|
||
//
|
||
// The above copyright notice and this permission notice shall be included
|
||
// in all copies or substantial portions of the Software.
|
||
//
|
||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
||
var formatRegExp = /%[sdj%]/g;
|
||
exports.format = function(f) {
|
||
if (!isString(f)) {
|
||
var objects = [];
|
||
for (var i = 0; i < arguments.length; i++) {
|
||
objects.push(inspect(arguments[i]));
|
||
}
|
||
return objects.join(' ');
|
||
}
|
||
|
||
var i = 1;
|
||
var args = arguments;
|
||
var len = args.length;
|
||
var str = String(f).replace(formatRegExp, function(x) {
|
||
if (x === '%%') return '%';
|
||
if (i >= len) return x;
|
||
switch (x) {
|
||
case '%s': return String(args[i++]);
|
||
case '%d': return Number(args[i++]);
|
||
case '%j':
|
||
try {
|
||
return JSON.stringify(args[i++]);
|
||
} catch (_) {
|
||
return '[Circular]';
|
||
}
|
||
default:
|
||
return x;
|
||
}
|
||
});
|
||
for (var x = args[i]; i < len; x = args[++i]) {
|
||
if (isNull(x) || !isObject(x)) {
|
||
str += ' ' + x;
|
||
} else {
|
||
str += ' ' + inspect(x);
|
||
}
|
||
}
|
||
return str;
|
||
};
|
||
|
||
|
||
// Mark that a method should not be used.
|
||
// Returns a modified function which warns once by default.
|
||
// If --no-deprecation is set, then it is a no-op.
|
||
exports.deprecate = function(fn, msg) {
|
||
// Allow for deprecating things in the process of starting up.
|
||
if (isUndefined(global.process)) {
|
||
return function() {
|
||
return exports.deprecate(fn, msg).apply(this, arguments);
|
||
};
|
||
}
|
||
|
||
if (process.noDeprecation === true) {
|
||
return fn;
|
||
}
|
||
|
||
var warned = false;
|
||
function deprecated() {
|
||
if (!warned) {
|
||
if (process.throwDeprecation) {
|
||
throw new Error(msg);
|
||
} else if (process.traceDeprecation) {
|
||
console.trace(msg);
|
||
} else {
|
||
console.error(msg);
|
||
}
|
||
warned = true;
|
||
}
|
||
return fn.apply(this, arguments);
|
||
}
|
||
|
||
return deprecated;
|
||
};
|
||
|
||
|
||
var debugs = {};
|
||
var debugEnviron;
|
||
exports.debuglog = function(set) {
|
||
if (isUndefined(debugEnviron))
|
||
debugEnviron = process.env.NODE_DEBUG || '';
|
||
set = set.toUpperCase();
|
||
if (!debugs[set]) {
|
||
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
||
var pid = process.pid;
|
||
debugs[set] = function() {
|
||
var msg = exports.format.apply(exports, arguments);
|
||
console.error('%s %d: %s', set, pid, msg);
|
||
};
|
||
} else {
|
||
debugs[set] = function() {};
|
||
}
|
||
}
|
||
return debugs[set];
|
||
};
|
||
|
||
|
||
/**
|
||
* Echos the value of a value. Trys to print the value out
|
||
* in the best way possible given the different types.
|
||
*
|
||
* @param {Object} obj The object to print out.
|
||
* @param {Object} opts Optional options object that alters the output.
|
||
*/
|
||
/* legacy: obj, showHidden, depth, colors*/
|
||
function inspect(obj, opts) {
|
||
// default options
|
||
var ctx = {
|
||
seen: [],
|
||
stylize: stylizeNoColor
|
||
};
|
||
// legacy...
|
||
if (arguments.length >= 3) ctx.depth = arguments[2];
|
||
if (arguments.length >= 4) ctx.colors = arguments[3];
|
||
if (isBoolean(opts)) {
|
||
// legacy...
|
||
ctx.showHidden = opts;
|
||
} else if (opts) {
|
||
// got an "options" object
|
||
exports._extend(ctx, opts);
|
||
}
|
||
// set default options
|
||
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
||
if (isUndefined(ctx.depth)) ctx.depth = 2;
|
||
if (isUndefined(ctx.colors)) ctx.colors = false;
|
||
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
||
if (ctx.colors) ctx.stylize = stylizeWithColor;
|
||
return formatValue(ctx, obj, ctx.depth);
|
||
}
|
||
exports.inspect = inspect;
|
||
|
||
|
||
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
||
inspect.colors = {
|
||
'bold' : [1, 22],
|
||
'italic' : [3, 23],
|
||
'underline' : [4, 24],
|
||
'inverse' : [7, 27],
|
||
'white' : [37, 39],
|
||
'grey' : [90, 39],
|
||
'black' : [30, 39],
|
||
'blue' : [34, 39],
|
||
'cyan' : [36, 39],
|
||
'green' : [32, 39],
|
||
'magenta' : [35, 39],
|
||
'red' : [31, 39],
|
||
'yellow' : [33, 39]
|
||
};
|
||
|
||
// Don't use 'blue' not visible on cmd.exe
|
||
inspect.styles = {
|
||
'special': 'cyan',
|
||
'number': 'yellow',
|
||
'boolean': 'yellow',
|
||
'undefined': 'grey',
|
||
'null': 'bold',
|
||
'string': 'green',
|
||
'date': 'magenta',
|
||
// "name": intentionally not styling
|
||
'regexp': 'red'
|
||
};
|
||
|
||
|
||
function stylizeWithColor(str, styleType) {
|
||
var style = inspect.styles[styleType];
|
||
|
||
if (style) {
|
||
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
||
'\u001b[' + inspect.colors[style][1] + 'm';
|
||
} else {
|
||
return str;
|
||
}
|
||
}
|
||
|
||
|
||
function stylizeNoColor(str, styleType) {
|
||
return str;
|
||
}
|
||
|
||
|
||
function arrayToHash(array) {
|
||
var hash = {};
|
||
|
||
array.forEach(function(val, idx) {
|
||
hash[val] = true;
|
||
});
|
||
|
||
return hash;
|
||
}
|
||
|
||
|
||
function formatValue(ctx, value, recurseTimes) {
|
||
// Provide a hook for user-specified inspect functions.
|
||
// Check that value is an object with an inspect function on it
|
||
if (ctx.customInspect &&
|
||
value &&
|
||
isFunction(value.inspect) &&
|
||
// Filter out the util module, it's inspect function is special
|
||
value.inspect !== exports.inspect &&
|
||
// Also filter out any prototype objects using the circular check.
|
||
!(value.constructor && value.constructor.prototype === value)) {
|
||
var ret = value.inspect(recurseTimes, ctx);
|
||
if (!isString(ret)) {
|
||
ret = formatValue(ctx, ret, recurseTimes);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
// Primitive types cannot have properties
|
||
var primitive = formatPrimitive(ctx, value);
|
||
if (primitive) {
|
||
return primitive;
|
||
}
|
||
|
||
// Look up the keys of the object.
|
||
var keys = Object.keys(value);
|
||
var visibleKeys = arrayToHash(keys);
|
||
|
||
if (ctx.showHidden) {
|
||
keys = Object.getOwnPropertyNames(value);
|
||
}
|
||
|
||
// IE doesn't make error fields non-enumerable
|
||
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
||
if (isError(value)
|
||
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
||
return formatError(value);
|
||
}
|
||
|
||
// Some type of object without properties can be shortcutted.
|
||
if (keys.length === 0) {
|
||
if (isFunction(value)) {
|
||
var name = value.name ? ': ' + value.name : '';
|
||
return ctx.stylize('[Function' + name + ']', 'special');
|
||
}
|
||
if (isRegExp(value)) {
|
||
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
||
}
|
||
if (isDate(value)) {
|
||
return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
||
}
|
||
if (isError(value)) {
|
||
return formatError(value);
|
||
}
|
||
}
|
||
|
||
var base = '', array = false, braces = ['{', '}'];
|
||
|
||
// Make Array say that they are Array
|
||
if (isArray(value)) {
|
||
array = true;
|
||
braces = ['[', ']'];
|
||
}
|
||
|
||
// Make functions say that they are functions
|
||
if (isFunction(value)) {
|
||
var n = value.name ? ': ' + value.name : '';
|
||
base = ' [Function' + n + ']';
|
||
}
|
||
|
||
// Make RegExps say that they are RegExps
|
||
if (isRegExp(value)) {
|
||
base = ' ' + RegExp.prototype.toString.call(value);
|
||
}
|
||
|
||
// Make dates with properties first say the date
|
||
if (isDate(value)) {
|
||
base = ' ' + Date.prototype.toUTCString.call(value);
|
||
}
|
||
|
||
// Make error with message first say the error
|
||
if (isError(value)) {
|
||
base = ' ' + formatError(value);
|
||
}
|
||
|
||
if (keys.length === 0 && (!array || value.length == 0)) {
|
||
return braces[0] + base + braces[1];
|
||
}
|
||
|
||
if (recurseTimes < 0) {
|
||
if (isRegExp(value)) {
|
||
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
||
} else {
|
||
return ctx.stylize('[Object]', 'special');
|
||
}
|
||
}
|
||
|
||
ctx.seen.push(value);
|
||
|
||
var output;
|
||
if (array) {
|
||
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
||
} else {
|
||
output = keys.map(function(key) {
|
||
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
||
});
|
||
}
|
||
|
||
ctx.seen.pop();
|
||
|
||
return reduceToSingleString(output, base, braces);
|
||
}
|
||
|
||
|
||
function formatPrimitive(ctx, value) {
|
||
if (isUndefined(value))
|
||
return ctx.stylize('undefined', 'undefined');
|
||
if (isString(value)) {
|
||
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
||
.replace(/'/g, "\\'")
|
||
.replace(/\\"/g, '"') + '\'';
|
||
return ctx.stylize(simple, 'string');
|
||
}
|
||
if (isNumber(value))
|
||
return ctx.stylize('' + value, 'number');
|
||
if (isBoolean(value))
|
||
return ctx.stylize('' + value, 'boolean');
|
||
// For some reason typeof null is "object", so special case here.
|
||
if (isNull(value))
|
||
return ctx.stylize('null', 'null');
|
||
}
|
||
|
||
|
||
function formatError(value) {
|
||
return '[' + Error.prototype.toString.call(value) + ']';
|
||
}
|
||
|
||
|
||
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
||
var output = [];
|
||
for (var i = 0, l = value.length; i < l; ++i) {
|
||
if (hasOwnProperty(value, String(i))) {
|
||
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
||
String(i), true));
|
||
} else {
|
||
output.push('');
|
||
}
|
||
}
|
||
keys.forEach(function(key) {
|
||
if (!key.match(/^\d+$/)) {
|
||
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
||
key, true));
|
||
}
|
||
});
|
||
return output;
|
||
}
|
||
|
||
|
||
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
||
var name, str, desc;
|
||
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
||
if (desc.get) {
|
||
if (desc.set) {
|
||
str = ctx.stylize('[Getter/Setter]', 'special');
|
||
} else {
|
||
str = ctx.stylize('[Getter]', 'special');
|
||
}
|
||
} else {
|
||
if (desc.set) {
|
||
str = ctx.stylize('[Setter]', 'special');
|
||
}
|
||
}
|
||
if (!hasOwnProperty(visibleKeys, key)) {
|
||
name = '[' + key + ']';
|
||
}
|
||
if (!str) {
|
||
if (ctx.seen.indexOf(desc.value) < 0) {
|
||
if (isNull(recurseTimes)) {
|
||
str = formatValue(ctx, desc.value, null);
|
||
} else {
|
||
str = formatValue(ctx, desc.value, recurseTimes - 1);
|
||
}
|
||
if (str.indexOf('\n') > -1) {
|
||
if (array) {
|
||
str = str.split('\n').map(function(line) {
|
||
return ' ' + line;
|
||
}).join('\n').substr(2);
|
||
} else {
|
||
str = '\n' + str.split('\n').map(function(line) {
|
||
return ' ' + line;
|
||
}).join('\n');
|
||
}
|
||
}
|
||
} else {
|
||
str = ctx.stylize('[Circular]', 'special');
|
||
}
|
||
}
|
||
if (isUndefined(name)) {
|
||
if (array && key.match(/^\d+$/)) {
|
||
return str;
|
||
}
|
||
name = JSON.stringify('' + key);
|
||
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
||
name = name.substr(1, name.length - 2);
|
||
name = ctx.stylize(name, 'name');
|
||
} else {
|
||
name = name.replace(/'/g, "\\'")
|
||
.replace(/\\"/g, '"')
|
||
.replace(/(^"|"$)/g, "'");
|
||
name = ctx.stylize(name, 'string');
|
||
}
|
||
}
|
||
|
||
return name + ': ' + str;
|
||
}
|
||
|
||
|
||
function reduceToSingleString(output, base, braces) {
|
||
var numLinesEst = 0;
|
||
var length = output.reduce(function(prev, cur) {
|
||
numLinesEst++;
|
||
if (cur.indexOf('\n') >= 0) numLinesEst++;
|
||
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
||
}, 0);
|
||
|
||
if (length > 60) {
|
||
return braces[0] +
|
||
(base === '' ? '' : base + '\n ') +
|
||
' ' +
|
||
output.join(',\n ') +
|
||
' ' +
|
||
braces[1];
|
||
}
|
||
|
||
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
||
}
|
||
|
||
|
||
// NOTE: These type checking functions intentionally don't use `instanceof`
|
||
// because it is fragile and can be easily faked with `Object.create()`.
|
||
function isArray(ar) {
|
||
return Array.isArray(ar);
|
||
}
|
||
exports.isArray = isArray;
|
||
|
||
function isBoolean(arg) {
|
||
return typeof arg === 'boolean';
|
||
}
|
||
exports.isBoolean = isBoolean;
|
||
|
||
function isNull(arg) {
|
||
return arg === null;
|
||
}
|
||
exports.isNull = isNull;
|
||
|
||
function isNullOrUndefined(arg) {
|
||
return arg == null;
|
||
}
|
||
exports.isNullOrUndefined = isNullOrUndefined;
|
||
|
||
function isNumber(arg) {
|
||
return typeof arg === 'number';
|
||
}
|
||
exports.isNumber = isNumber;
|
||
|
||
function isString(arg) {
|
||
return typeof arg === 'string';
|
||
}
|
||
exports.isString = isString;
|
||
|
||
function isSymbol(arg) {
|
||
return typeof arg === 'symbol';
|
||
}
|
||
exports.isSymbol = isSymbol;
|
||
|
||
function isUndefined(arg) {
|
||
return arg === void 0;
|
||
}
|
||
exports.isUndefined = isUndefined;
|
||
|
||
function isRegExp(re) {
|
||
return isObject(re) && objectToString(re) === '[object RegExp]';
|
||
}
|
||
exports.isRegExp = isRegExp;
|
||
|
||
function isObject(arg) {
|
||
return typeof arg === 'object' && arg !== null;
|
||
}
|
||
exports.isObject = isObject;
|
||
|
||
function isDate(d) {
|
||
return isObject(d) && objectToString(d) === '[object Date]';
|
||
}
|
||
exports.isDate = isDate;
|
||
|
||
function isError(e) {
|
||
return isObject(e) &&
|
||
(objectToString(e) === '[object Error]' || e instanceof Error);
|
||
}
|
||
exports.isError = isError;
|
||
|
||
function isFunction(arg) {
|
||
return typeof arg === 'function';
|
||
}
|
||
exports.isFunction = isFunction;
|
||
|
||
function isPrimitive(arg) {
|
||
return arg === null ||
|
||
typeof arg === 'boolean' ||
|
||
typeof arg === 'number' ||
|
||
typeof arg === 'string' ||
|
||
typeof arg === 'symbol' || // ES6 symbol
|
||
typeof arg === 'undefined';
|
||
}
|
||
exports.isPrimitive = isPrimitive;
|
||
|
||
exports.isBuffer = __webpack_require__(66);
|
||
|
||
function objectToString(o) {
|
||
return Object.prototype.toString.call(o);
|
||
}
|
||
|
||
|
||
function pad(n) {
|
||
return n < 10 ? '0' + n.toString(10) : n.toString(10);
|
||
}
|
||
|
||
|
||
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
|
||
'Oct', 'Nov', 'Dec'];
|
||
|
||
// 26 Feb 16:19:34
|
||
function timestamp() {
|
||
var d = new Date();
|
||
var time = [pad(d.getHours()),
|
||
pad(d.getMinutes()),
|
||
pad(d.getSeconds())].join(':');
|
||
return [d.getDate(), months[d.getMonth()], time].join(' ');
|
||
}
|
||
|
||
|
||
// log is just a thin wrapper to console.log that prepends a timestamp
|
||
exports.log = function() {
|
||
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
|
||
};
|
||
|
||
|
||
/**
|
||
* Inherit the prototype methods from one constructor into another.
|
||
*
|
||
* The Function.prototype.inherits from lang.js rewritten as a standalone
|
||
* function (not on Function.prototype). NOTE: If this file is to be loaded
|
||
* during bootstrapping this function needs to be rewritten using some native
|
||
* functions as prototype setup using normal JavaScript does not work as
|
||
* expected during bootstrapping (see mirror.js in r114903).
|
||
*
|
||
* @param {function} ctor Constructor function which needs to inherit the
|
||
* prototype.
|
||
* @param {function} superCtor Constructor function to inherit prototype from.
|
||
*/
|
||
exports.inherits = __webpack_require__(67);
|
||
|
||
exports._extend = function(origin, add) {
|
||
// Don't do anything if add isn't an object
|
||
if (!add || !isObject(add)) return origin;
|
||
|
||
var keys = Object.keys(add);
|
||
var i = keys.length;
|
||
while (i--) {
|
||
origin[keys[i]] = add[keys[i]];
|
||
}
|
||
return origin;
|
||
};
|
||
|
||
function hasOwnProperty(obj, prop) {
|
||
return Object.prototype.hasOwnProperty.call(obj, prop);
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(15)))
|
||
|
||
/***/ }),
|
||
/* 66 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = function isBuffer(arg) {
|
||
return arg && typeof arg === 'object'
|
||
&& typeof arg.copy === 'function'
|
||
&& typeof arg.fill === 'function'
|
||
&& typeof arg.readUInt8 === 'function';
|
||
}
|
||
|
||
/***/ }),
|
||
/* 67 */
|
||
/***/ (function(module, exports) {
|
||
|
||
if (typeof Object.create === 'function') {
|
||
// implementation from standard node.js 'util' module
|
||
module.exports = function inherits(ctor, superCtor) {
|
||
ctor.super_ = superCtor
|
||
ctor.prototype = Object.create(superCtor.prototype, {
|
||
constructor: {
|
||
value: ctor,
|
||
enumerable: false,
|
||
writable: true,
|
||
configurable: true
|
||
}
|
||
});
|
||
};
|
||
} else {
|
||
// old school shim for old browsers
|
||
module.exports = function inherits(ctor, superCtor) {
|
||
ctor.super_ = superCtor
|
||
var TempCtor = function () {}
|
||
TempCtor.prototype = superCtor.prototype
|
||
ctor.prototype = new TempCtor()
|
||
ctor.prototype.constructor = ctor
|
||
}
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 68 */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = extend
|
||
|
||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
|
||
function extend() {
|
||
var target = {}
|
||
|
||
for (var i = 0; i < arguments.length; i++) {
|
||
var source = arguments[i]
|
||
|
||
for (var key in source) {
|
||
if (hasOwnProperty.call(source, key)) {
|
||
target[key] = source[key]
|
||
}
|
||
}
|
||
}
|
||
|
||
return target
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 69 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var socket = __webpack_require__(13);
|
||
var emitter = __webpack_require__(7);
|
||
var notify = __webpack_require__(26);
|
||
var tab = __webpack_require__(70);
|
||
var utils = __webpack_require__(4);
|
||
/**
|
||
* @constructor
|
||
*/
|
||
var BrowserSync = function (options) {
|
||
this.options = options;
|
||
this.socket = socket;
|
||
this.emitter = emitter;
|
||
this.utils = utils;
|
||
this.tabHidden = false;
|
||
var bs = this;
|
||
/**
|
||
* Options set
|
||
*/
|
||
socket.on("options:set", function (data) {
|
||
emitter.emit("notify", "Setting options...");
|
||
bs.options = data.options;
|
||
});
|
||
emitter.on("tab:hidden", function () {
|
||
bs.tabHidden = true;
|
||
});
|
||
emitter.on("tab:visible", function () {
|
||
bs.tabHidden = false;
|
||
});
|
||
};
|
||
/**
|
||
* Helper to check if syncing is allowed
|
||
* @param data
|
||
* @param optPath
|
||
* @returns {boolean}
|
||
*/
|
||
BrowserSync.prototype.canSync = function (data, optPath) {
|
||
data = data || {};
|
||
if (data.override) {
|
||
return true;
|
||
}
|
||
var canSync = true;
|
||
if (optPath) {
|
||
canSync = this.getOption(optPath);
|
||
}
|
||
return canSync && data.url === window.location.pathname;
|
||
};
|
||
/**
|
||
* Helper to check if syncing is allowed
|
||
* @returns {boolean}
|
||
*/
|
||
BrowserSync.prototype.getOption = function (path) {
|
||
if (path && path.match(/\./)) {
|
||
return getByPath(this.options, path);
|
||
}
|
||
else {
|
||
var opt = this.options[path];
|
||
if (isUndefined(opt)) {
|
||
return false;
|
||
}
|
||
else {
|
||
return opt;
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* @type {Function}
|
||
*/
|
||
module.exports = BrowserSync;
|
||
/**
|
||
* @param {String} val
|
||
* @returns {boolean}
|
||
*/
|
||
function isUndefined(val) {
|
||
return "undefined" === typeof val;
|
||
}
|
||
/**
|
||
* @param obj
|
||
* @param path
|
||
*/
|
||
function getByPath(obj, path) {
|
||
for (var i = 0, tempPath = path.split("."), len = tempPath.length; i < len; i++) {
|
||
if (!obj || typeof obj !== "object") {
|
||
return false;
|
||
}
|
||
obj = obj[tempPath[i]];
|
||
}
|
||
if (typeof obj === "undefined") {
|
||
return false;
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 70 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var utils = __webpack_require__(4);
|
||
var emitter = __webpack_require__(7);
|
||
var $document = utils.getDocument();
|
||
// Set the name of the hidden property and the change event for visibility
|
||
var hidden, visibilityChange;
|
||
if (typeof $document.hidden !== "undefined") {
|
||
// Opera 12.10 and Firefox 18 and later support
|
||
hidden = "hidden";
|
||
visibilityChange = "visibilitychange";
|
||
}
|
||
else if (typeof $document.mozHidden !== "undefined") {
|
||
hidden = "mozHidden";
|
||
visibilityChange = "mozvisibilitychange";
|
||
}
|
||
else if (typeof $document.msHidden !== "undefined") {
|
||
hidden = "msHidden";
|
||
visibilityChange = "msvisibilitychange";
|
||
}
|
||
else if (typeof $document.webkitHidden !== "undefined") {
|
||
hidden = "webkitHidden";
|
||
visibilityChange = "webkitvisibilitychange";
|
||
}
|
||
// If the page is hidden, pause the video;
|
||
// if the page is shown, play the video
|
||
function handleVisibilityChange() {
|
||
if ($document[hidden]) {
|
||
emitter.emit("tab:hidden");
|
||
}
|
||
else {
|
||
emitter.emit("tab:visible");
|
||
}
|
||
}
|
||
if (typeof $document.addEventListener === "undefined" ||
|
||
typeof $document[hidden] === "undefined") {
|
||
//console.log('not supported');
|
||
}
|
||
else {
|
||
$document.addEventListener(visibilityChange, handleVisibilityChange, false);
|
||
}
|
||
|
||
|
||
/***/ }),
|
||
/* 71 */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
var eventManager = __webpack_require__(12).manager;
|
||
exports.plugins = {
|
||
scroll: __webpack_require__(11),
|
||
clicks: __webpack_require__(27),
|
||
forms: __webpack_require__(28),
|
||
location: __webpack_require__(32)
|
||
};
|
||
/**
|
||
* Load plugins for enabled options
|
||
* @param bs
|
||
*/
|
||
exports.init = function (bs) {
|
||
for (var name in exports.plugins) {
|
||
if (bs.options.ghostMode[name]) {
|
||
exports.plugins[name].init(bs, eventManager);
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
/***/ })
|
||
/******/ ]); |