diff --git a/client/public/build/main.bundle.js b/client/public/build/main.bundle.js index 1e47e9c4841f03d0f5ea9adfaf509091b30e8b85..eed08f16bed00a7e3d925ea747b91b7f2ba2c7ba 100644 --- a/client/public/build/main.bundle.js +++ b/client/public/build/main.bundle.js @@ -2,6 +2,189 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ +/***/ "./node_modules/@socket.io/component-emitter/index.mjs": +/*!*************************************************************!*\ + !*** ./node_modules/@socket.io/component-emitter/index.mjs ***! + \*************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Emitter": function() { return /* binding */ Emitter; } +/* harmony export */ }); +/** + * 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; + } + } + + // Remove event specific arrays for event types that no + // one is subscribed for to avoid memory leak. + if (callbacks.length === 0) { + delete this._callbacks['$' + event]; + } + + 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 = new Array(arguments.length - 1) + , callbacks = this._callbacks['$' + event]; + + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +// alias used for reserved events (protected method) +Emitter.prototype.emitReserved = Emitter.prototype.emit; + +/** + * 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; +}; + + +/***/ }), + /***/ "./client/src/Player.js": /*!******************************!*\ !*** ./client/src/Player.js ***! @@ -9,6 +192,7 @@ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Ressources_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Ressources.js */ "./client/src/Ressources.js"); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } @@ -16,10 +200,12 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } + var Player = /*#__PURE__*/function () { - function Player(x, y, radius, imageFolder) { + function Player(x, y, radius, imageFolder, id, imageId) { _classCallCheck(this, Player); _defineProperty(this, "image", new Image()); + this.id = id; this.x = x; this.y = y; this.radius = radius; @@ -28,7 +214,7 @@ var Player = /*#__PURE__*/function () { x: 0, y: 0 }; - this.imageId = 1; + this.imageId = imageId; this.imageFolder = imageFolder; this.image.src = "/images/character/".concat(this.imageFolder, "/").concat(this.imageFolder).concat(this.imageId, ".png"); } @@ -46,23 +232,23 @@ var Player = /*#__PURE__*/function () { key: "grow", value: function grow() { this.radius += 0.5; - if (this.radius % 80 === 0 && this.imageId <= 5) { + console.log(this.radius % 30); + if (this.radius % 30 === 0 && this.imageId <= 5) { this.imageId += 1; this.image.src = "/images/character/".concat(this.imageFolder, "/").concat(this.imageFolder).concat(this.imageId, ".png"); } } }, { key: "eatSushi", - value: function eatSushi(sushis) { + value: function eatSushi(sushis, socket) { var _this = this; sushis.forEach(function (sushi, idx) { var dx = sushi.x - _this.x; var dy = sushi.y - _this.y; var distance = Math.sqrt(dx * dx + dy * dy); - if (distance < _this.radius) { - // Supprime la nourriture de la liste - sushis.splice(idx, 1); - // Augmente la taille du joueur + if (distance < _this.radius && !sushi.drop) { + sushi.drop = true; + socket.emit("updateSushi", idx); _this.grow(); } }); @@ -131,6 +317,7 @@ var Ressources = /*#__PURE__*/_createClass(function Ressources(name, x, y, size, this.y = y; this.size = size; this.image = image; + this.drop = false; }); var Sushi = /*#__PURE__*/function (_Ressources) { _inherits(Sushi, _Ressources); @@ -154,292 +341,4227 @@ var Sushi = /*#__PURE__*/function (_Ressources) { /***/ }), -/***/ "./client/src/Router.js": -/*!******************************!*\ - !*** ./client/src/Router.js ***! - \******************************/ +/***/ "./node_modules/engine.io-client/build/esm/contrib/has-cors.js": +/*!*********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/contrib/has-cors.js ***! + \*********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": function() { return /* binding */ Router; } +/* harmony export */ "hasCORS": function() { return /* binding */ hasCORS; } /* harmony export */ }); -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -var Router = /*#__PURE__*/function () { - function Router(routes) { - _classCallCheck(this, Router); - this.routes = routes; - this.actualRoute = routes[0].page; - } - _createClass(Router, [{ - key: "ChangePages", - value: function ChangePages(path) { - for (var i = 0; i < this.routes.length; i++) { - if (this.routes[i].path === path) { - document.querySelector(".".concat(this.actualRoute)).style.display = "none"; - this.actualRoute = this.routes[i].page; - document.querySelector(".".concat(this.actualRoute)).style.display = "flex"; - } - } - } - }]); - return Router; -}(); +// imported from https://github.com/component/has-cors +let value = false; +try { + value = typeof XMLHttpRequest !== 'undefined' && + 'withCredentials' in new XMLHttpRequest(); +} +catch (err) { + // if XMLHttp support is disabled in IE then it will throw + // when trying to create +} +const hasCORS = value; /***/ }), -/***/ "./client/src/main.js": -/*!****************************!*\ - !*** ./client/src/main.js ***! - \****************************/ +/***/ "./node_modules/engine.io-client/build/esm/contrib/parseqs.js": +/*!********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/contrib/parseqs.js ***! + \********************************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Player.js */ "./client/src/Player.js"); -/* harmony import */ var _Ressources_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Ressources.js */ "./client/src/Ressources.js"); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "decode": function() { return /* binding */ decode; }, +/* harmony export */ "encode": function() { return /* binding */ encode; } +/* harmony export */ }); +// imported from https://github.com/galkn/querystring +/** + * Compiles a querystring + * Returns string representation of the object + * + * @param {Object} + * @api private + */ +function encode(obj) { + let str = ''; + for (let 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 + */ +function decode(qs) { + let qry = {}; + let pairs = qs.split('&'); + for (let i = 0, l = pairs.length; i < l; i++) { + let pair = pairs[i].split('='); + qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); + } + return qry; +} -var Main = function Main(playerName, playerCharacter) { - var canvas = document.querySelector(".map"); - var ctx = canvas.getContext("2d"); - canvas.width = document.documentElement.clientWidth; - canvas.height = document.documentElement.clientHeight; - ctx.width = 6000; - ctx.height = 3340; - window.addEventListener("resize", function (e) { - e.preventDefault(); - canvas.width = document.documentElement.clientWidth; - canvas.height = document.documentElement.clientHeight; - }); - var image = new Image(); - image.src = "/images/goku.png"; - var backgroundImage = new Image(); - backgroundImage.src = "/images/map.jpg"; - var folder = playerCharacter; - var player = new _Player_js__WEBPACK_IMPORTED_MODULE_0__["default"](canvas.width / 2, canvas.height / 2, 20, folder); - document.addEventListener("keydown", function (event) { - event.preventDefault(); - // Mettre à jour la direction en fonction des touches enfoncées - switch (event.keyCode) { - case 37: - // Gauche - player.direction.x = -1; - break; - case 38: - // Haut - player.direction.y = -1; - break; - case 39: - // Droite - player.direction.x = 1; - break; - case 40: - // Bas - player.direction.y = 1; - break; +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/contrib/parseuri.js": +/*!*********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/contrib/parseuri.js ***! + \*********************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "parse": function() { return /* binding */ parse; } +/* harmony export */ }); +// imported from https://github.com/galkn/parseuri +/** + * Parses a URI + * + * Note: we could also have used the built-in URL object, but it isn't supported on all platforms. + * + * See: + * - https://developer.mozilla.org/en-US/docs/Web/API/URL + * - https://caniuse.com/url + * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B + * + * History of the parse() method: + * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c + * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3 + * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242 + * + * @author Steven Levithan <stevenlevithan.com> (MIT license) + * @api private + */ +const re = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; +const parts = [ + 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor' +]; +function parse(str) { + const 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); } - }); - document.addEventListener("keyup", function (event) { - event.preventDefault(); - // Mettre à jour la direction en fonction des touches relâchées - switch (event.keyCode) { - case 37: - // Gauche - if (player.direction.x < 0) { - player.direction.x = 0; - } - break; - case 38: - // Haut - if (player.direction.y < 0) { - player.direction.y = 0; - } - break; - case 39: - // Droite - if (player.direction.x > 0) { - player.direction.x = 0; - } - break; - case 40: - // Bas - if (player.direction.y > 0) { - player.direction.y = 0; - } - break; + let m = re.exec(str || ''), uri = {}, i = 14; + while (i--) { + uri[parts[i]] = m[i] || ''; } - }); - var sushis = []; - for (var i = 0; i < 1500; i++) { - var xStart = canvas.width / 2; - var xEnd = ctx.width - canvas.width / 2; - var yStart = canvas.height / 2; - var yEnd = ctx.height - canvas.height / 2; - var x = Math.random() * (xEnd - xStart) + xStart; - var y = Math.random() * (-yStart + yEnd) + yStart; - console.log(x, y); - var sushi = new _Ressources_js__WEBPACK_IMPORTED_MODULE_1__.Sushi(x, y, 5); - sushis.push(sushi); - } - var mouseX; - var mouseY; - canvas.addEventListener("mousemove", function (event) { - event.preventDefault(); - mouseX = event.clientX; - mouseY = event.clientY; - player.moveTo(mouseX, mouseY, canvas); - }); - function update() { - ctx.save(); - ctx.clearRect(0, 0, ctx.width, ctx.height); - ctx.beginPath(); - - // Déplacer le joueur en fonction de la direction - var cameraX = canvas.width / 2 - player.x; - var cameraY = canvas.height / 2 - player.y; - ctx.translate(cameraX, cameraY); - // Déplacer le contexte pour centrer la caméra ssur le joueur - // Dessiner le joueur et les autres éléments du jeu - ctx.drawImage(backgroundImage, 0, 0, ctx.width, ctx.height); - sushis.forEach(function (sushi) { - sushi.draw(ctx); + 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; + } + uri.pathNames = pathNames(uri, uri['path']); + uri.queryKey = queryKey(uri, uri['query']); + return uri; +} +function pathNames(obj, path) { + const regx = /\/{2,9}/g, names = path.replace(regx, "/").split("/"); + if (path.slice(0, 1) == '/' || path.length === 0) { + names.splice(0, 1); + } + if (path.slice(-1) == '/') { + names.splice(names.length - 1, 1); + } + return names; +} +function queryKey(uri, query) { + const data = {}; + query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) { + if ($1) { + data[$1] = $2; + } }); + return data; +} - //player.move(ctx); - player.eatSushi(sushis); - player.draw(ctx); - player.move(ctx, mouseX, mouseY); - ctx.restore(); - // Déplacer le contexte pour centrer la caméra sur le joueur - //ctx.translate(-cameraX, -cameraY); - requestAnimationFrame(update); - } - update(); -}; -/* harmony default export */ __webpack_exports__["default"] = (Main); -/***/ }) +/***/ }), -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ !function() { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = function(exports, definition) { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ }(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ !function() { -/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/******/ }(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ !function() { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ }(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -!function() { -/*!*****************************!*\ - !*** ./client/src/index.js ***! - \*****************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./main.js */ "./client/src/main.js"); -/* harmony import */ var _Router_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Router.js */ "./client/src/Router.js"); - - - -/* Navigation */ - -var routes = [{ - path: "/", - page: "home" -}, { - path: "/play", - page: "play" -}, { - path: "/map", - page: "map" -}]; -var router = new _Router_js__WEBPACK_IMPORTED_MODULE_1__["default"](routes); -var links = document.querySelectorAll("a"); -for (var i = 0; i < links.length; i++) { - links[i].addEventListener("click", function (e) { - e.preventDefault(); - router.ChangePages(e.currentTarget.getAttribute("href")); - }); +/***/ "./node_modules/engine.io-client/build/esm/contrib/yeast.js": +/*!******************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/contrib/yeast.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "decode": function() { return /* binding */ decode; }, +/* harmony export */ "encode": function() { return /* binding */ encode; }, +/* harmony export */ "yeast": function() { return /* binding */ yeast; } +/* harmony export */ }); +// imported from https://github.com/unshiftio/yeast + +const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split(''), length = 64, map = {}; +let 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) { + let encoded = ''; + do { + encoded = alphabet[num % length] + encoded; + num = Math.floor(num / length); + } while (num > 0); + return encoded; } -var inputName = document.querySelector(".name"); -var slides = document.querySelectorAll(".slide"); -var playerCharacter = "goku"; -var playerName = ""; -inputName.addEventListener("input", function (e) { - e.preventDefault(); - console.log(e.currentTarget.value); - playerName = e.currentTarget.value; -}); -for (var _i = 0; _i < slides.length; _i++) { - slides[_i].addEventListener("click", function (e) { - playerCharacter = e.currentTarget.getAttribute("name"); - console.log(playerCharacter); - }); +/** + * 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) { + let decoded = 0; + for (i = 0; i < str.length; i++) { + decoded = decoded * length + map[str.charAt(i)]; + } + return decoded; } -var playPages = document.querySelector(".play"); -var startButton = document.querySelector(".start-button"); -var map = document.querySelector(".map"); -startButton.addEventListener("click", function (e) { - e.preventDefault(); - playPages.style.display = "none"; - map.style.display = "block"; - if (playerName.length > 0) { - (0,_main_js__WEBPACK_IMPORTED_MODULE_0__["default"])(playerName, playerCharacter); - } -}); +/** + * Yeast: A tiny growing id generator. + * + * @returns {String} A unique id. + * @api public + */ +function yeast() { + const 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; + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/globalThis.browser.js": +/*!***********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/globalThis.browser.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "globalThisShim": function() { return /* binding */ globalThisShim; } +/* harmony export */ }); +const globalThisShim = (() => { + if (typeof self !== "undefined") { + return self; + } + else if (typeof window !== "undefined") { + return window; + } + else { + return Function("return this")(); + } +})(); + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/index.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Socket": function() { return /* reexport safe */ _socket_js__WEBPACK_IMPORTED_MODULE_0__.Socket; }, +/* harmony export */ "Transport": function() { return /* reexport safe */ _transport_js__WEBPACK_IMPORTED_MODULE_1__.Transport; }, +/* harmony export */ "installTimerFunctions": function() { return /* reexport safe */ _util_js__WEBPACK_IMPORTED_MODULE_3__.installTimerFunctions; }, +/* harmony export */ "nextTick": function() { return /* reexport safe */ _transports_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_5__.nextTick; }, +/* harmony export */ "parse": function() { return /* reexport safe */ _contrib_parseuri_js__WEBPACK_IMPORTED_MODULE_4__.parse; }, +/* harmony export */ "protocol": function() { return /* binding */ protocol; }, +/* harmony export */ "transports": function() { return /* reexport safe */ _transports_index_js__WEBPACK_IMPORTED_MODULE_2__.transports; } +/* harmony export */ }); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./socket.js */ "./node_modules/engine.io-client/build/esm/socket.js"); +/* harmony import */ var _transport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transport.js */ "./node_modules/engine.io-client/build/esm/transport.js"); +/* harmony import */ var _transports_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transports/index.js */ "./node_modules/engine.io-client/build/esm/transports/index.js"); +/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util.js */ "./node_modules/engine.io-client/build/esm/util.js"); +/* harmony import */ var _contrib_parseuri_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./contrib/parseuri.js */ "./node_modules/engine.io-client/build/esm/contrib/parseuri.js"); +/* harmony import */ var _transports_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports/websocket-constructor.js */ "./node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js"); + + +const protocol = _socket_js__WEBPACK_IMPORTED_MODULE_0__.Socket.protocol; + + + + + + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/socket.js": +/*!***********************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/socket.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Socket": function() { return /* binding */ Socket; } +/* harmony export */ }); +/* harmony import */ var _transports_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transports/index.js */ "./node_modules/engine.io-client/build/esm/transports/index.js"); +/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util.js */ "./node_modules/engine.io-client/build/esm/util.js"); +/* harmony import */ var _contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contrib/parseqs.js */ "./node_modules/engine.io-client/build/esm/contrib/parseqs.js"); +/* harmony import */ var _contrib_parseuri_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contrib/parseuri.js */ "./node_modules/engine.io-client/build/esm/contrib/parseuri.js"); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); +/* harmony import */ var engine_io_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/build/esm/index.js"); + + + + + + +class Socket extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_4__.Emitter { + /** + * Socket constructor. + * + * @param {String|Object} uri - uri or options + * @param {Object} opts - options + */ + constructor(uri, opts = {}) { + super(); + this.writeBuffer = []; + if (uri && "object" === typeof uri) { + opts = uri; + uri = null; + } + if (uri) { + uri = (0,_contrib_parseuri_js__WEBPACK_IMPORTED_MODULE_3__.parse)(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 = (0,_contrib_parseuri_js__WEBPACK_IMPORTED_MODULE_3__.parse)(opts.host).host; + } + (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.installTimerFunctions)(this, opts); + this.secure = + null != opts.secure + ? opts.secure + : typeof location !== "undefined" && "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.hostname = + opts.hostname || + (typeof location !== "undefined" ? location.hostname : "localhost"); + this.port = + opts.port || + (typeof location !== "undefined" && location.port + ? location.port + : this.secure + ? "443" + : "80"); + this.transports = opts.transports || ["polling", "websocket"]; + this.writeBuffer = []; + this.prevBufferLen = 0; + this.opts = Object.assign({ + path: "/engine.io", + agent: false, + withCredentials: false, + upgrade: true, + timestampParam: "t", + rememberUpgrade: false, + addTrailingSlash: true, + rejectUnauthorized: true, + perMessageDeflate: { + threshold: 1024, + }, + transportOptions: {}, + closeOnBeforeunload: true, + }, opts); + this.opts.path = + this.opts.path.replace(/\/$/, "") + + (this.opts.addTrailingSlash ? "/" : ""); + if (typeof this.opts.query === "string") { + this.opts.query = (0,_contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_2__.decode)(this.opts.query); + } + // set on handshake + this.id = null; + this.upgrades = null; + this.pingInterval = null; + this.pingTimeout = null; + // set on heartbeat + this.pingTimeoutTimer = null; + if (typeof addEventListener === "function") { + if (this.opts.closeOnBeforeunload) { + // Firefox closes the connection when the "beforeunload" event is emitted but not Chrome. This event listener + // ensures every browser behaves the same (no "disconnect" event at the Socket.IO level when the page is + // closed/reloaded) + this.beforeunloadEventListener = () => { + if (this.transport) { + // silently close the transport + this.transport.removeAllListeners(); + this.transport.close(); + } + }; + addEventListener("beforeunload", this.beforeunloadEventListener, false); + } + if (this.hostname !== "localhost") { + this.offlineEventListener = () => { + this.onClose("transport close", { + description: "network connection lost", + }); + }; + addEventListener("offline", this.offlineEventListener, false); + } + } + this.open(); + } + /** + * Creates transport of the given type. + * + * @param {String} name - transport name + * @return {Transport} + * @private + */ + createTransport(name) { + const query = Object.assign({}, this.opts.query); + // append engine.io protocol identifier + query.EIO = engine_io_parser__WEBPACK_IMPORTED_MODULE_5__.protocol; + // transport name + query.transport = name; + // session id if we already have one + if (this.id) + query.sid = this.id; + const opts = Object.assign({}, this.opts.transportOptions[name], this.opts, { + query, + socket: this, + hostname: this.hostname, + secure: this.secure, + port: this.port, + }); + return new _transports_index_js__WEBPACK_IMPORTED_MODULE_0__.transports[name](opts); + } + /** + * Initializes transport to use and starts probe. + * + * @private + */ + open() { + let transport; + if (this.opts.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 + this.setTimeoutFn(() => { + this.emitReserved("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). + * + * @private + */ + setTransport(transport) { + if (this.transport) { + this.transport.removeAllListeners(); + } + // set up transport + this.transport = transport; + // set up transport listeners + transport + .on("drain", this.onDrain.bind(this)) + .on("packet", this.onPacket.bind(this)) + .on("error", this.onError.bind(this)) + .on("close", (reason) => this.onClose("transport close", reason)); + } + /** + * Probes a transport. + * + * @param {String} name - transport name + * @private + */ + probe(name) { + let transport = this.createTransport(name); + let failed = false; + Socket.priorWebsocketSuccess = false; + const onTransportOpen = () => { + if (failed) + return; + transport.send([{ type: "ping", data: "probe" }]); + transport.once("packet", (msg) => { + if (failed) + return; + if ("pong" === msg.type && "probe" === msg.data) { + this.upgrading = true; + this.emitReserved("upgrading", transport); + if (!transport) + return; + Socket.priorWebsocketSuccess = "websocket" === transport.name; + this.transport.pause(() => { + if (failed) + return; + if ("closed" === this.readyState) + return; + cleanup(); + this.setTransport(transport); + transport.send([{ type: "upgrade" }]); + this.emitReserved("upgrade", transport); + transport = null; + this.upgrading = false; + this.flush(); + }); + } + else { + const err = new Error("probe error"); + // @ts-ignore + err.transport = transport.name; + this.emitReserved("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 + const onerror = (err) => { + const error = new Error("probe error: " + err); + // @ts-ignore + error.transport = transport.name; + freezeTransport(); + this.emitReserved("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) { + freezeTransport(); + } + } + // Remove all listeners on the transport and on self + const cleanup = () => { + transport.removeListener("open", onTransportOpen); + transport.removeListener("error", onerror); + transport.removeListener("close", onTransportClose); + this.off("close", onclose); + this.off("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. + * + * @private + */ + onOpen() { + this.readyState = "open"; + Socket.priorWebsocketSuccess = "websocket" === this.transport.name; + this.emitReserved("open"); + this.flush(); + // we check for `readyState` in case an `open` + // listener already closed the socket + if ("open" === this.readyState && this.opts.upgrade) { + let i = 0; + const l = this.upgrades.length; + for (; i < l; i++) { + this.probe(this.upgrades[i]); + } + } + } + /** + * Handles a packet. + * + * @private + */ + onPacket(packet) { + if ("opening" === this.readyState || + "open" === this.readyState || + "closing" === this.readyState) { + this.emitReserved("packet", packet); + // Socket is live - any packet counts + this.emitReserved("heartbeat"); + switch (packet.type) { + case "open": + this.onHandshake(JSON.parse(packet.data)); + break; + case "ping": + this.resetPingTimeout(); + this.sendPacket("pong"); + this.emitReserved("ping"); + this.emitReserved("pong"); + break; + case "error": + const err = new Error("server error"); + // @ts-ignore + err.code = packet.data; + this.onError(err); + break; + case "message": + this.emitReserved("data", packet.data); + this.emitReserved("message", packet.data); + break; + } + } + else { + } + } + /** + * Called upon handshake completion. + * + * @param {Object} data - handshake obj + * @private + */ + onHandshake(data) { + this.emitReserved("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.maxPayload = data.maxPayload; + this.onOpen(); + // In case open handler closes socket + if ("closed" === this.readyState) + return; + this.resetPingTimeout(); + } + /** + * Sets and resets ping timeout timer based on server pings. + * + * @private + */ + resetPingTimeout() { + this.clearTimeoutFn(this.pingTimeoutTimer); + this.pingTimeoutTimer = this.setTimeoutFn(() => { + this.onClose("ping timeout"); + }, this.pingInterval + this.pingTimeout); + if (this.opts.autoUnref) { + this.pingTimeoutTimer.unref(); + } + } + /** + * Called on `drain` event + * + * @private + */ + onDrain() { + 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.emitReserved("drain"); + } + else { + this.flush(); + } + } + /** + * Flush write buffers. + * + * @private + */ + flush() { + if ("closed" !== this.readyState && + this.transport.writable && + !this.upgrading && + this.writeBuffer.length) { + const packets = this.getWritablePackets(); + this.transport.send(packets); + // keep track of current length of writeBuffer + // splice writeBuffer and callbackBuffer on `drain` + this.prevBufferLen = packets.length; + this.emitReserved("flush"); + } + } + /** + * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP + * long-polling) + * + * @private + */ + getWritablePackets() { + const shouldCheckPayloadSize = this.maxPayload && + this.transport.name === "polling" && + this.writeBuffer.length > 1; + if (!shouldCheckPayloadSize) { + return this.writeBuffer; + } + let payloadSize = 1; // first packet type + for (let i = 0; i < this.writeBuffer.length; i++) { + const data = this.writeBuffer[i].data; + if (data) { + payloadSize += (0,_util_js__WEBPACK_IMPORTED_MODULE_1__.byteLength)(data); + } + if (i > 0 && payloadSize > this.maxPayload) { + return this.writeBuffer.slice(0, i); + } + payloadSize += 2; // separator + packet type + } + return this.writeBuffer; + } + /** + * Sends a message. + * + * @param {String} msg - message. + * @param {Object} options. + * @param {Function} callback function. + * @return {Socket} for chaining. + */ + write(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + } + send(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + } + /** + * Sends a packet. + * + * @param {String} type: packet type. + * @param {String} data. + * @param {Object} options. + * @param {Function} fn - callback function. + * @private + */ + sendPacket(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; + const packet = { + type: type, + data: data, + options: options, + }; + this.emitReserved("packetCreate", packet); + this.writeBuffer.push(packet); + if (fn) + this.once("flush", fn); + this.flush(); + } + /** + * Closes the connection. + */ + close() { + const close = () => { + this.onClose("forced close"); + this.transport.close(); + }; + const cleanupAndClose = () => { + this.off("upgrade", cleanupAndClose); + this.off("upgradeError", cleanupAndClose); + close(); + }; + const waitForUpgrade = () => { + // wait for upgrade to finish since we can't send packets while pausing a transport + this.once("upgrade", cleanupAndClose); + this.once("upgradeError", cleanupAndClose); + }; + if ("opening" === this.readyState || "open" === this.readyState) { + this.readyState = "closing"; + if (this.writeBuffer.length) { + this.once("drain", () => { + if (this.upgrading) { + waitForUpgrade(); + } + else { + close(); + } + }); + } + else if (this.upgrading) { + waitForUpgrade(); + } + else { + close(); + } + } + return this; + } + /** + * Called upon transport error + * + * @private + */ + onError(err) { + Socket.priorWebsocketSuccess = false; + this.emitReserved("error", err); + this.onClose("transport error", err); + } + /** + * Called upon transport close. + * + * @private + */ + onClose(reason, description) { + if ("opening" === this.readyState || + "open" === this.readyState || + "closing" === this.readyState) { + // clear timers + this.clearTimeoutFn(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(); + if (typeof removeEventListener === "function") { + removeEventListener("beforeunload", this.beforeunloadEventListener, false); + removeEventListener("offline", this.offlineEventListener, false); + } + // set ready state + this.readyState = "closed"; + // clear session id + this.id = null; + // emit close event + this.emitReserved("close", reason, description); + // clean buffers after, so users can still + // grab the buffers on `close` event + this.writeBuffer = []; + this.prevBufferLen = 0; + } + } + /** + * Filters upgrades, returning only those matching client transports. + * + * @param {Array} upgrades - server upgrades + * @private + */ + filterUpgrades(upgrades) { + const filteredUpgrades = []; + let i = 0; + const j = upgrades.length; + for (; i < j; i++) { + if (~this.transports.indexOf(upgrades[i])) + filteredUpgrades.push(upgrades[i]); + } + return filteredUpgrades; + } +} +Socket.protocol = engine_io_parser__WEBPACK_IMPORTED_MODULE_5__.protocol; + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transport.js": +/*!**************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transport.js ***! + \**************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Transport": function() { return /* binding */ Transport; } +/* harmony export */ }); +/* harmony import */ var engine_io_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/build/esm/index.js"); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); +/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util.js */ "./node_modules/engine.io-client/build/esm/util.js"); + + + +class TransportError extends Error { + constructor(reason, description, context) { + super(reason); + this.description = description; + this.context = context; + this.type = "TransportError"; + } +} +class Transport extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_1__.Emitter { + /** + * Transport abstract constructor. + * + * @param {Object} opts - options + * @protected + */ + constructor(opts) { + super(); + this.writable = false; + (0,_util_js__WEBPACK_IMPORTED_MODULE_2__.installTimerFunctions)(this, opts); + this.opts = opts; + this.query = opts.query; + this.socket = opts.socket; + } + /** + * Emits an error. + * + * @param {String} reason + * @param description + * @param context - the error context + * @return {Transport} for chaining + * @protected + */ + onError(reason, description, context) { + super.emitReserved("error", new TransportError(reason, description, context)); + return this; + } + /** + * Opens the transport. + */ + open() { + this.readyState = "opening"; + this.doOpen(); + return this; + } + /** + * Closes the transport. + */ + close() { + if (this.readyState === "opening" || this.readyState === "open") { + this.doClose(); + this.onClose(); + } + return this; + } + /** + * Sends multiple packets. + * + * @param {Array} packets + */ + send(packets) { + if (this.readyState === "open") { + this.write(packets); + } + else { + // this might happen if the transport was silently closed in the beforeunload event handler + } + } + /** + * Called upon open + * + * @protected + */ + onOpen() { + this.readyState = "open"; + this.writable = true; + super.emitReserved("open"); + } + /** + * Called with data. + * + * @param {String} data + * @protected + */ + onData(data) { + const packet = (0,engine_io_parser__WEBPACK_IMPORTED_MODULE_0__.decodePacket)(data, this.socket.binaryType); + this.onPacket(packet); + } + /** + * Called with a decoded packet. + * + * @protected + */ + onPacket(packet) { + super.emitReserved("packet", packet); + } + /** + * Called upon close. + * + * @protected + */ + onClose(details) { + this.readyState = "closed"; + super.emitReserved("close", details); + } + /** + * Pauses the transport, in order not to lose packets during an upgrade. + * + * @param onPause + */ + pause(onPause) { } +} + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transports/index.js": +/*!*********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transports/index.js ***! + \*********************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "transports": function() { return /* binding */ transports; } +/* harmony export */ }); +/* harmony import */ var _polling_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polling.js */ "./node_modules/engine.io-client/build/esm/transports/polling.js"); +/* harmony import */ var _websocket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./websocket.js */ "./node_modules/engine.io-client/build/esm/transports/websocket.js"); + + +const transports = { + websocket: _websocket_js__WEBPACK_IMPORTED_MODULE_1__.WS, + polling: _polling_js__WEBPACK_IMPORTED_MODULE_0__.Polling, +}; + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transports/polling.js": +/*!***********************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transports/polling.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Polling": function() { return /* binding */ Polling; }, +/* harmony export */ "Request": function() { return /* binding */ Request; } +/* harmony export */ }); +/* harmony import */ var _transport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../transport.js */ "./node_modules/engine.io-client/build/esm/transport.js"); +/* harmony import */ var _contrib_yeast_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../contrib/yeast.js */ "./node_modules/engine.io-client/build/esm/contrib/yeast.js"); +/* harmony import */ var _contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../contrib/parseqs.js */ "./node_modules/engine.io-client/build/esm/contrib/parseqs.js"); +/* harmony import */ var engine_io_parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/build/esm/index.js"); +/* harmony import */ var _xmlhttprequest_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xmlhttprequest.js */ "./node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js"); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); +/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util.js */ "./node_modules/engine.io-client/build/esm/util.js"); +/* harmony import */ var _globalThis_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../globalThis.js */ "./node_modules/engine.io-client/build/esm/globalThis.browser.js"); + + + + + + + + +function empty() { } +const hasXHR2 = (function () { + const xhr = new _xmlhttprequest_js__WEBPACK_IMPORTED_MODULE_4__.XHR({ + xdomain: false, + }); + return null != xhr.responseType; +})(); +class Polling extends _transport_js__WEBPACK_IMPORTED_MODULE_0__.Transport { + /** + * XHR Polling constructor. + * + * @param {Object} opts + * @package + */ + constructor(opts) { + super(opts); + this.polling = false; + if (typeof location !== "undefined") { + const isSSL = "https:" === location.protocol; + let port = location.port; + // some user agents have empty `location.port` + if (!port) { + port = isSSL ? "443" : "80"; + } + this.xd = + (typeof location !== "undefined" && + opts.hostname !== location.hostname) || + port !== opts.port; + this.xs = opts.secure !== isSSL; + } + /** + * XHR supports binary + */ + const forceBase64 = opts && opts.forceBase64; + this.supportsBinary = hasXHR2 && !forceBase64; + } + get name() { + return "polling"; + } + /** + * Opens the socket (triggers polling). We write a PING message to determine + * when the transport is open. + * + * @protected + */ + doOpen() { + this.poll(); + } + /** + * Pauses polling. + * + * @param {Function} onPause - callback upon buffers are flushed and transport is paused + * @package + */ + pause(onPause) { + this.readyState = "pausing"; + const pause = () => { + this.readyState = "paused"; + onPause(); + }; + if (this.polling || !this.writable) { + let total = 0; + if (this.polling) { + total++; + this.once("pollComplete", function () { + --total || pause(); + }); + } + if (!this.writable) { + total++; + this.once("drain", function () { + --total || pause(); + }); + } + } + else { + pause(); + } + } + /** + * Starts polling cycle. + * + * @private + */ + poll() { + this.polling = true; + this.doPoll(); + this.emitReserved("poll"); + } + /** + * Overloads onData to detect payloads. + * + * @protected + */ + onData(data) { + const callback = (packet) => { + // if its the first message we consider the transport open + if ("opening" === this.readyState && packet.type === "open") { + this.onOpen(); + } + // if its a close packet, we close the ongoing requests + if ("close" === packet.type) { + this.onClose({ description: "transport closed by the server" }); + return false; + } + // otherwise bypass onData and handle the message + this.onPacket(packet); + }; + // decode payload + (0,engine_io_parser__WEBPACK_IMPORTED_MODULE_3__.decodePayload)(data, this.socket.binaryType).forEach(callback); + // if an event did not trigger closing + if ("closed" !== this.readyState) { + // if we got data we're not polling + this.polling = false; + this.emitReserved("pollComplete"); + if ("open" === this.readyState) { + this.poll(); + } + else { + } + } + } + /** + * For polling, send a close packet. + * + * @protected + */ + doClose() { + const close = () => { + this.write([{ type: "close" }]); + }; + if ("open" === this.readyState) { + close(); + } + else { + // in case we're trying to close while + // handshaking is in progress (GH-164) + this.once("open", close); + } + } + /** + * Writes a packets payload. + * + * @param {Array} packets - data packets + * @protected + */ + write(packets) { + this.writable = false; + (0,engine_io_parser__WEBPACK_IMPORTED_MODULE_3__.encodePayload)(packets, (data) => { + this.doWrite(data, () => { + this.writable = true; + this.emitReserved("drain"); + }); + }); + } + /** + * Generates uri for connection. + * + * @private + */ + uri() { + let query = this.query || {}; + const schema = this.opts.secure ? "https" : "http"; + let port = ""; + // cache busting is forced + if (false !== this.opts.timestampRequests) { + query[this.opts.timestampParam] = (0,_contrib_yeast_js__WEBPACK_IMPORTED_MODULE_1__.yeast)(); + } + if (!this.supportsBinary && !query.sid) { + query.b64 = 1; + } + // avoid port if default for schema + if (this.opts.port && + (("https" === schema && Number(this.opts.port) !== 443) || + ("http" === schema && Number(this.opts.port) !== 80))) { + port = ":" + this.opts.port; + } + const encodedQuery = (0,_contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_2__.encode)(query); + const ipv6 = this.opts.hostname.indexOf(":") !== -1; + return (schema + + "://" + + (ipv6 ? "[" + this.opts.hostname + "]" : this.opts.hostname) + + port + + this.opts.path + + (encodedQuery.length ? "?" + encodedQuery : "")); + } + /** + * Creates a request. + * + * @param {String} method + * @private + */ + request(opts = {}) { + Object.assign(opts, { xd: this.xd, xs: this.xs }, this.opts); + return new Request(this.uri(), opts); + } + /** + * Sends data. + * + * @param {String} data to send. + * @param {Function} called upon flush. + * @private + */ + doWrite(data, fn) { + const req = this.request({ + method: "POST", + data: data, + }); + req.on("success", fn); + req.on("error", (xhrStatus, context) => { + this.onError("xhr post error", xhrStatus, context); + }); + } + /** + * Starts a poll cycle. + * + * @private + */ + doPoll() { + const req = this.request(); + req.on("data", this.onData.bind(this)); + req.on("error", (xhrStatus, context) => { + this.onError("xhr poll error", xhrStatus, context); + }); + this.pollXhr = req; + } +} +class Request extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_5__.Emitter { + /** + * Request constructor + * + * @param {Object} options + * @package + */ + constructor(uri, opts) { + super(); + (0,_util_js__WEBPACK_IMPORTED_MODULE_6__.installTimerFunctions)(this, opts); + this.opts = opts; + this.method = opts.method || "GET"; + this.uri = uri; + this.async = false !== opts.async; + this.data = undefined !== opts.data ? opts.data : null; + this.create(); + } + /** + * Creates the XHR object and sends the request. + * + * @private + */ + create() { + const opts = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__.pick)(this.opts, "agent", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "autoUnref"); + opts.xdomain = !!this.opts.xd; + opts.xscheme = !!this.opts.xs; + const xhr = (this.xhr = new _xmlhttprequest_js__WEBPACK_IMPORTED_MODULE_4__.XHR(opts)); + try { + xhr.open(this.method, this.uri, this.async); + try { + if (this.opts.extraHeaders) { + xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true); + for (let i in this.opts.extraHeaders) { + if (this.opts.extraHeaders.hasOwnProperty(i)) { + xhr.setRequestHeader(i, this.opts.extraHeaders[i]); + } + } + } + } + catch (e) { } + if ("POST" === this.method) { + try { + 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 = this.opts.withCredentials; + } + if (this.opts.requestTimeout) { + xhr.timeout = this.opts.requestTimeout; + } + xhr.onreadystatechange = () => { + if (4 !== xhr.readyState) + return; + if (200 === xhr.status || 1223 === xhr.status) { + this.onLoad(); + } + else { + // make sure the `error` event handler that's user-set + // does not throw in the same tick and gets caught here + this.setTimeoutFn(() => { + this.onError(typeof xhr.status === "number" ? xhr.status : 0); + }, 0); + } + }; + xhr.send(this.data); + } + catch (e) { + // Need to defer since .create() is called directly from the constructor + // and thus the 'error' event can only be only bound *after* this exception + // occurs. Therefore, also, we cannot throw here at all. + this.setTimeoutFn(() => { + this.onError(e); + }, 0); + return; + } + if (typeof document !== "undefined") { + this.index = Request.requestsCount++; + Request.requests[this.index] = this; + } + } + /** + * Called upon error. + * + * @private + */ + onError(err) { + this.emitReserved("error", err, this.xhr); + this.cleanup(true); + } + /** + * Cleans up house. + * + * @private + */ + cleanup(fromError) { + if ("undefined" === typeof this.xhr || null === this.xhr) { + return; + } + this.xhr.onreadystatechange = empty; + if (fromError) { + try { + this.xhr.abort(); + } + catch (e) { } + } + if (typeof document !== "undefined") { + delete Request.requests[this.index]; + } + this.xhr = null; + } + /** + * Called upon load. + * + * @private + */ + onLoad() { + const data = this.xhr.responseText; + if (data !== null) { + this.emitReserved("data", data); + this.emitReserved("success"); + this.cleanup(); + } + } + /** + * Aborts the request. + * + * @package + */ + abort() { + this.cleanup(); + } +} +Request.requestsCount = 0; +Request.requests = {}; +/** + * 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. + */ +if (typeof document !== "undefined") { + // @ts-ignore + if (typeof attachEvent === "function") { + // @ts-ignore + attachEvent("onunload", unloadHandler); + } + else if (typeof addEventListener === "function") { + const terminationEvent = "onpagehide" in _globalThis_js__WEBPACK_IMPORTED_MODULE_7__.globalThisShim ? "pagehide" : "unload"; + addEventListener(terminationEvent, unloadHandler, false); + } +} +function unloadHandler() { + for (let i in Request.requests) { + if (Request.requests.hasOwnProperty(i)) { + Request.requests[i].abort(); + } + } +} + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js ***! + \*********************************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "WebSocket": function() { return /* binding */ WebSocket; }, +/* harmony export */ "defaultBinaryType": function() { return /* binding */ defaultBinaryType; }, +/* harmony export */ "nextTick": function() { return /* binding */ nextTick; }, +/* harmony export */ "usingBrowserWebSocket": function() { return /* binding */ usingBrowserWebSocket; } +/* harmony export */ }); +/* harmony import */ var _globalThis_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globalThis.js */ "./node_modules/engine.io-client/build/esm/globalThis.browser.js"); + +const nextTick = (() => { + const isPromiseAvailable = typeof Promise === "function" && typeof Promise.resolve === "function"; + if (isPromiseAvailable) { + return (cb) => Promise.resolve().then(cb); + } + else { + return (cb, setTimeoutFn) => setTimeoutFn(cb, 0); + } +})(); +const WebSocket = _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.WebSocket || _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.MozWebSocket; +const usingBrowserWebSocket = true; +const defaultBinaryType = "arraybuffer"; + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transports/websocket.js": +/*!*************************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transports/websocket.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "WS": function() { return /* binding */ WS; } +/* harmony export */ }); +/* harmony import */ var _transport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../transport.js */ "./node_modules/engine.io-client/build/esm/transport.js"); +/* harmony import */ var _contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../contrib/parseqs.js */ "./node_modules/engine.io-client/build/esm/contrib/parseqs.js"); +/* harmony import */ var _contrib_yeast_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../contrib/yeast.js */ "./node_modules/engine.io-client/build/esm/contrib/yeast.js"); +/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util.js */ "./node_modules/engine.io-client/build/esm/util.js"); +/* harmony import */ var _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./websocket-constructor.js */ "./node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js"); +/* harmony import */ var engine_io_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! engine.io-parser */ "./node_modules/engine.io-parser/build/esm/index.js"); + + + + + + +// detect ReactNative environment +const isReactNative = typeof navigator !== "undefined" && + typeof navigator.product === "string" && + navigator.product.toLowerCase() === "reactnative"; +class WS extends _transport_js__WEBPACK_IMPORTED_MODULE_0__.Transport { + /** + * WebSocket transport constructor. + * + * @param {Object} opts - connection options + * @protected + */ + constructor(opts) { + super(opts); + this.supportsBinary = !opts.forceBase64; + } + get name() { + return "websocket"; + } + doOpen() { + if (!this.check()) { + // let probe timeout + return; + } + const uri = this.uri(); + const protocols = this.opts.protocols; + // React Native only supports the 'headers' option, and will print a warning if anything else is passed + const opts = isReactNative + ? {} + : (0,_util_js__WEBPACK_IMPORTED_MODULE_3__.pick)(this.opts, "agent", "perMessageDeflate", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "localAddress", "protocolVersion", "origin", "maxPayload", "family", "checkServerIdentity"); + if (this.opts.extraHeaders) { + opts.headers = this.opts.extraHeaders; + } + try { + this.ws = + _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.usingBrowserWebSocket && !isReactNative + ? protocols + ? new _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.WebSocket(uri, protocols) + : new _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.WebSocket(uri) + : new _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.WebSocket(uri, protocols, opts); + } + catch (err) { + return this.emitReserved("error", err); + } + this.ws.binaryType = this.socket.binaryType || _websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.defaultBinaryType; + this.addEventListeners(); + } + /** + * Adds event listeners to the socket + * + * @private + */ + addEventListeners() { + this.ws.onopen = () => { + if (this.opts.autoUnref) { + this.ws._socket.unref(); + } + this.onOpen(); + }; + this.ws.onclose = (closeEvent) => this.onClose({ + description: "websocket connection closed", + context: closeEvent, + }); + this.ws.onmessage = (ev) => this.onData(ev.data); + this.ws.onerror = (e) => this.onError("websocket error", e); + } + write(packets) { + this.writable = false; + // encodePacket efficient as it uses WS framing + // no need for encodePayload + for (let i = 0; i < packets.length; i++) { + const packet = packets[i]; + const lastPacket = i === packets.length - 1; + (0,engine_io_parser__WEBPACK_IMPORTED_MODULE_5__.encodePacket)(packet, this.supportsBinary, (data) => { + // always create a new object (GH-437) + const opts = {}; + if (!_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.usingBrowserWebSocket) { + if (packet.options) { + opts.compress = packet.options.compress; + } + if (this.opts.perMessageDeflate) { + const len = + // @ts-ignore + "string" === typeof data ? Buffer.byteLength(data) : data.length; + if (len < this.opts.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 (_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.usingBrowserWebSocket) { + // TypeError is thrown when passing the second argument on Safari + this.ws.send(data); + } + else { + this.ws.send(data, opts); + } + } + catch (e) { + } + if (lastPacket) { + // fake drain + // defer to next tick to allow Socket to clear writeBuffer + (0,_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.nextTick)(() => { + this.writable = true; + this.emitReserved("drain"); + }, this.setTimeoutFn); + } + }); + } + } + doClose() { + if (typeof this.ws !== "undefined") { + this.ws.close(); + this.ws = null; + } + } + /** + * Generates uri for connection. + * + * @private + */ + uri() { + let query = this.query || {}; + const schema = this.opts.secure ? "wss" : "ws"; + let port = ""; + // avoid port if default for schema + if (this.opts.port && + (("wss" === schema && Number(this.opts.port) !== 443) || + ("ws" === schema && Number(this.opts.port) !== 80))) { + port = ":" + this.opts.port; + } + // append timestamp to URI + if (this.opts.timestampRequests) { + query[this.opts.timestampParam] = (0,_contrib_yeast_js__WEBPACK_IMPORTED_MODULE_2__.yeast)(); + } + // communicate binary support capabilities + if (!this.supportsBinary) { + query.b64 = 1; + } + const encodedQuery = (0,_contrib_parseqs_js__WEBPACK_IMPORTED_MODULE_1__.encode)(query); + const ipv6 = this.opts.hostname.indexOf(":") !== -1; + return (schema + + "://" + + (ipv6 ? "[" + this.opts.hostname + "]" : this.opts.hostname) + + port + + this.opts.path + + (encodedQuery.length ? "?" + encodedQuery : "")); + } + /** + * Feature detection for WebSocket. + * + * @return {Boolean} whether this transport is available. + * @private + */ + check() { + return !!_websocket_constructor_js__WEBPACK_IMPORTED_MODULE_4__.WebSocket; + } +} + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js ***! + \**************************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "XHR": function() { return /* binding */ XHR; } +/* harmony export */ }); +/* harmony import */ var _contrib_has_cors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../contrib/has-cors.js */ "./node_modules/engine.io-client/build/esm/contrib/has-cors.js"); +/* harmony import */ var _globalThis_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globalThis.js */ "./node_modules/engine.io-client/build/esm/globalThis.browser.js"); +// browser shim for xmlhttprequest module + + +function XHR(opts) { + const xdomain = opts.xdomain; + // XMLHttpRequest can be disabled on IE + try { + if ("undefined" !== typeof XMLHttpRequest && (!xdomain || _contrib_has_cors_js__WEBPACK_IMPORTED_MODULE_0__.hasCORS)) { + return new XMLHttpRequest(); + } + } + catch (e) { } + if (!xdomain) { + try { + return new _globalThis_js__WEBPACK_IMPORTED_MODULE_1__.globalThisShim[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP"); + } + catch (e) { } + } +} + + +/***/ }), + +/***/ "./node_modules/engine.io-client/build/esm/util.js": +/*!*********************************************************!*\ + !*** ./node_modules/engine.io-client/build/esm/util.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "byteLength": function() { return /* binding */ byteLength; }, +/* harmony export */ "installTimerFunctions": function() { return /* binding */ installTimerFunctions; }, +/* harmony export */ "pick": function() { return /* binding */ pick; } +/* harmony export */ }); +/* harmony import */ var _globalThis_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./globalThis.js */ "./node_modules/engine.io-client/build/esm/globalThis.browser.js"); + +function pick(obj, ...attr) { + return attr.reduce((acc, k) => { + if (obj.hasOwnProperty(k)) { + acc[k] = obj[k]; + } + return acc; + }, {}); +} +// Keep a reference to the real timeout functions so they can be used when overridden +const NATIVE_SET_TIMEOUT = _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.setTimeout; +const NATIVE_CLEAR_TIMEOUT = _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.clearTimeout; +function installTimerFunctions(obj, opts) { + if (opts.useNativeTimers) { + obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(_globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim); + obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(_globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim); + } + else { + obj.setTimeoutFn = _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.setTimeout.bind(_globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim); + obj.clearTimeoutFn = _globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim.clearTimeout.bind(_globalThis_js__WEBPACK_IMPORTED_MODULE_0__.globalThisShim); + } +} +// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64) +const BASE64_OVERHEAD = 1.33; +// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9 +function byteLength(obj) { + if (typeof obj === "string") { + return utf8Length(obj); + } + // arraybuffer or blob + return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD); +} +function utf8Length(str) { + let c = 0, length = 0; + for (let i = 0, l = str.length; i < l; i++) { + c = str.charCodeAt(i); + if (c < 0x80) { + length += 1; + } + else if (c < 0x800) { + length += 2; + } + else if (c < 0xd800 || c >= 0xe000) { + length += 3; + } + else { + i++; + length += 4; + } + } + return length; +} + + +/***/ }), + +/***/ "./node_modules/engine.io-parser/build/esm/commons.js": +/*!************************************************************!*\ + !*** ./node_modules/engine.io-parser/build/esm/commons.js ***! + \************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ERROR_PACKET": function() { return /* binding */ ERROR_PACKET; }, +/* harmony export */ "PACKET_TYPES": function() { return /* binding */ PACKET_TYPES; }, +/* harmony export */ "PACKET_TYPES_REVERSE": function() { return /* binding */ PACKET_TYPES_REVERSE; } +/* harmony export */ }); +const PACKET_TYPES = Object.create(null); // no Map = no polyfill +PACKET_TYPES["open"] = "0"; +PACKET_TYPES["close"] = "1"; +PACKET_TYPES["ping"] = "2"; +PACKET_TYPES["pong"] = "3"; +PACKET_TYPES["message"] = "4"; +PACKET_TYPES["upgrade"] = "5"; +PACKET_TYPES["noop"] = "6"; +const PACKET_TYPES_REVERSE = Object.create(null); +Object.keys(PACKET_TYPES).forEach(key => { + PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key; +}); +const ERROR_PACKET = { type: "error", data: "parser error" }; + + + +/***/ }), + +/***/ "./node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js ***! + \*******************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "decode": function() { return /* binding */ decode; }, +/* harmony export */ "encode": function() { return /* binding */ encode; } +/* harmony export */ }); +// imported from https://github.com/socketio/base64-arraybuffer +const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +// Use a lookup table to find the index. +const lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); +for (let i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; +} +const encode = (arraybuffer) => { + let 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; +}; +const decode = (base64) => { + let 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--; + } + } + const 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; +}; + + +/***/ }), + +/***/ "./node_modules/engine.io-parser/build/esm/decodePacket.browser.js": +/*!*************************************************************************!*\ + !*** ./node_modules/engine.io-parser/build/esm/decodePacket.browser.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _commons_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./commons.js */ "./node_modules/engine.io-parser/build/esm/commons.js"); +/* harmony import */ var _contrib_base64_arraybuffer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contrib/base64-arraybuffer.js */ "./node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js"); + + +const withNativeArrayBuffer = typeof ArrayBuffer === "function"; +const decodePacket = (encodedPacket, binaryType) => { + if (typeof encodedPacket !== "string") { + return { + type: "message", + data: mapBinary(encodedPacket, binaryType) + }; + } + const type = encodedPacket.charAt(0); + if (type === "b") { + return { + type: "message", + data: decodeBase64Packet(encodedPacket.substring(1), binaryType) + }; + } + const packetType = _commons_js__WEBPACK_IMPORTED_MODULE_0__.PACKET_TYPES_REVERSE[type]; + if (!packetType) { + return _commons_js__WEBPACK_IMPORTED_MODULE_0__.ERROR_PACKET; + } + return encodedPacket.length > 1 + ? { + type: _commons_js__WEBPACK_IMPORTED_MODULE_0__.PACKET_TYPES_REVERSE[type], + data: encodedPacket.substring(1) + } + : { + type: _commons_js__WEBPACK_IMPORTED_MODULE_0__.PACKET_TYPES_REVERSE[type] + }; +}; +const decodeBase64Packet = (data, binaryType) => { + if (withNativeArrayBuffer) { + const decoded = (0,_contrib_base64_arraybuffer_js__WEBPACK_IMPORTED_MODULE_1__.decode)(data); + return mapBinary(decoded, binaryType); + } + else { + return { base64: true, data }; // fallback for old browsers + } +}; +const mapBinary = (data, binaryType) => { + switch (binaryType) { + case "blob": + return data instanceof ArrayBuffer ? new Blob([data]) : data; + case "arraybuffer": + default: + return data; // assuming the data is already an ArrayBuffer + } +}; +/* harmony default export */ __webpack_exports__["default"] = (decodePacket); + + +/***/ }), + +/***/ "./node_modules/engine.io-parser/build/esm/encodePacket.browser.js": +/*!*************************************************************************!*\ + !*** ./node_modules/engine.io-parser/build/esm/encodePacket.browser.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _commons_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./commons.js */ "./node_modules/engine.io-parser/build/esm/commons.js"); + +const withNativeBlob = typeof Blob === "function" || + (typeof Blob !== "undefined" && + Object.prototype.toString.call(Blob) === "[object BlobConstructor]"); +const withNativeArrayBuffer = typeof ArrayBuffer === "function"; +// ArrayBuffer.isView method is not defined in IE10 +const isView = obj => { + return typeof ArrayBuffer.isView === "function" + ? ArrayBuffer.isView(obj) + : obj && obj.buffer instanceof ArrayBuffer; +}; +const encodePacket = ({ type, data }, supportsBinary, callback) => { + if (withNativeBlob && data instanceof Blob) { + if (supportsBinary) { + return callback(data); + } + else { + return encodeBlobAsBase64(data, callback); + } + } + else if (withNativeArrayBuffer && + (data instanceof ArrayBuffer || isView(data))) { + if (supportsBinary) { + return callback(data); + } + else { + return encodeBlobAsBase64(new Blob([data]), callback); + } + } + // plain string + return callback(_commons_js__WEBPACK_IMPORTED_MODULE_0__.PACKET_TYPES[type] + (data || "")); +}; +const encodeBlobAsBase64 = (data, callback) => { + const fileReader = new FileReader(); + fileReader.onload = function () { + const content = fileReader.result.split(",")[1]; + callback("b" + (content || "")); + }; + return fileReader.readAsDataURL(data); +}; +/* harmony default export */ __webpack_exports__["default"] = (encodePacket); + + +/***/ }), + +/***/ "./node_modules/engine.io-parser/build/esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/engine.io-parser/build/esm/index.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "decodePacket": function() { return /* reexport safe */ _decodePacket_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }, +/* harmony export */ "decodePayload": function() { return /* binding */ decodePayload; }, +/* harmony export */ "encodePacket": function() { return /* reexport safe */ _encodePacket_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }, +/* harmony export */ "encodePayload": function() { return /* binding */ encodePayload; }, +/* harmony export */ "protocol": function() { return /* binding */ protocol; } +/* harmony export */ }); +/* harmony import */ var _encodePacket_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encodePacket.js */ "./node_modules/engine.io-parser/build/esm/encodePacket.browser.js"); +/* harmony import */ var _decodePacket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./decodePacket.js */ "./node_modules/engine.io-parser/build/esm/decodePacket.browser.js"); + + +const SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text +const encodePayload = (packets, callback) => { + // some packets may be added to the array while encoding, so the initial length must be saved + const length = packets.length; + const encodedPackets = new Array(length); + let count = 0; + packets.forEach((packet, i) => { + // force base64 encoding for binary packets + (0,_encodePacket_js__WEBPACK_IMPORTED_MODULE_0__["default"])(packet, false, encodedPacket => { + encodedPackets[i] = encodedPacket; + if (++count === length) { + callback(encodedPackets.join(SEPARATOR)); + } + }); + }); +}; +const decodePayload = (encodedPayload, binaryType) => { + const encodedPackets = encodedPayload.split(SEPARATOR); + const packets = []; + for (let i = 0; i < encodedPackets.length; i++) { + const decodedPacket = (0,_decodePacket_js__WEBPACK_IMPORTED_MODULE_1__["default"])(encodedPackets[i], binaryType); + packets.push(decodedPacket); + if (decodedPacket.type === "error") { + break; + } + } + return packets; +}; +const protocol = 4; + + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/contrib/backo2.js": +/*!*******************************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/contrib/backo2.js ***! + \*******************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Backoff": function() { return /* binding */ Backoff; } +/* harmony export */ }); +/** + * 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; +}; + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/index.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Manager": function() { return /* reexport safe */ _manager_js__WEBPACK_IMPORTED_MODULE_1__.Manager; }, +/* harmony export */ "Socket": function() { return /* reexport safe */ _socket_js__WEBPACK_IMPORTED_MODULE_2__.Socket; }, +/* harmony export */ "connect": function() { return /* binding */ lookup; }, +/* harmony export */ "default": function() { return /* binding */ lookup; }, +/* harmony export */ "io": function() { return /* binding */ lookup; }, +/* harmony export */ "protocol": function() { return /* reexport safe */ socket_io_parser__WEBPACK_IMPORTED_MODULE_3__.protocol; } +/* harmony export */ }); +/* harmony import */ var _url_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url.js */ "./node_modules/socket.io-client/build/esm/url.js"); +/* harmony import */ var _manager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./manager.js */ "./node_modules/socket.io-client/build/esm/manager.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./socket.js */ "./node_modules/socket.io-client/build/esm/socket.js"); +/* harmony import */ var socket_io_parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/build/esm/index.js"); + + + +/** + * Managers cache. + */ +const cache = {}; +function lookup(uri, opts) { + if (typeof uri === "object") { + opts = uri; + uri = undefined; + } + opts = opts || {}; + const parsed = (0,_url_js__WEBPACK_IMPORTED_MODULE_0__.url)(uri, opts.path || "/socket.io"); + const source = parsed.source; + const id = parsed.id; + const path = parsed.path; + const sameNamespace = cache[id] && path in cache[id]["nsps"]; + const newConnection = opts.forceNew || + opts["force new connection"] || + false === opts.multiplex || + sameNamespace; + let io; + if (newConnection) { + io = new _manager_js__WEBPACK_IMPORTED_MODULE_1__.Manager(source, opts); + } + else { + if (!cache[id]) { + cache[id] = new _manager_js__WEBPACK_IMPORTED_MODULE_1__.Manager(source, opts); + } + io = cache[id]; + } + if (parsed.query && !opts.query) { + opts.query = parsed.queryKey; + } + return io.socket(parsed.path, opts); +} +// so that "lookup" can be used both as a function (e.g. `io(...)`) and as a +// namespace (e.g. `io.connect(...)`), for backward compatibility +Object.assign(lookup, { + Manager: _manager_js__WEBPACK_IMPORTED_MODULE_1__.Manager, + Socket: _socket_js__WEBPACK_IMPORTED_MODULE_2__.Socket, + io: lookup, + connect: lookup, +}); +/** + * Protocol version. + * + * @public + */ + +/** + * Expose constructors for standalone build. + * + * @public + */ + + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/manager.js": +/*!************************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/manager.js ***! + \************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Manager": function() { return /* binding */ Manager; } +/* harmony export */ }); +/* harmony import */ var engine_io_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! engine.io-client */ "./node_modules/engine.io-client/build/esm/index.js"); +/* harmony import */ var _socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./socket.js */ "./node_modules/socket.io-client/build/esm/socket.js"); +/* harmony import */ var socket_io_parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/build/esm/index.js"); +/* harmony import */ var _on_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./on.js */ "./node_modules/socket.io-client/build/esm/on.js"); +/* harmony import */ var _contrib_backo2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./contrib/backo2.js */ "./node_modules/socket.io-client/build/esm/contrib/backo2.js"); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); + + + + + + +class Manager extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_5__.Emitter { + constructor(uri, opts) { + var _a; + super(); + this.nsps = {}; + this.subs = []; + if (uri && "object" === typeof uri) { + opts = uri; + uri = undefined; + } + opts = opts || {}; + opts.path = opts.path || "/socket.io"; + this.opts = opts; + (0,engine_io_client__WEBPACK_IMPORTED_MODULE_0__.installTimerFunctions)(this, opts); + this.reconnection(opts.reconnection !== false); + this.reconnectionAttempts(opts.reconnectionAttempts || Infinity); + this.reconnectionDelay(opts.reconnectionDelay || 1000); + this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000); + this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5); + this.backoff = new _contrib_backo2_js__WEBPACK_IMPORTED_MODULE_4__.Backoff({ + min: this.reconnectionDelay(), + max: this.reconnectionDelayMax(), + jitter: this.randomizationFactor(), + }); + this.timeout(null == opts.timeout ? 20000 : opts.timeout); + this._readyState = "closed"; + this.uri = uri; + const _parser = opts.parser || socket_io_parser__WEBPACK_IMPORTED_MODULE_2__; + this.encoder = new _parser.Encoder(); + this.decoder = new _parser.Decoder(); + this._autoConnect = opts.autoConnect !== false; + if (this._autoConnect) + this.open(); + } + reconnection(v) { + if (!arguments.length) + return this._reconnection; + this._reconnection = !!v; + return this; + } + reconnectionAttempts(v) { + if (v === undefined) + return this._reconnectionAttempts; + this._reconnectionAttempts = v; + return this; + } + reconnectionDelay(v) { + var _a; + if (v === undefined) + return this._reconnectionDelay; + this._reconnectionDelay = v; + (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v); + return this; + } + randomizationFactor(v) { + var _a; + if (v === undefined) + return this._randomizationFactor; + this._randomizationFactor = v; + (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v); + return this; + } + reconnectionDelayMax(v) { + var _a; + if (v === undefined) + return this._reconnectionDelayMax; + this._reconnectionDelayMax = v; + (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v); + return this; + } + timeout(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 + * + * @private + */ + maybeReconnectOnOpen() { + // 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} fn - optional, callback + * @return self + * @public + */ + open(fn) { + if (~this._readyState.indexOf("open")) + return this; + this.engine = new engine_io_client__WEBPACK_IMPORTED_MODULE_0__.Socket(this.uri, this.opts); + const socket = this.engine; + const self = this; + this._readyState = "opening"; + this.skipReconnect = false; + // emit `open` + const openSubDestroy = (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "open", function () { + self.onopen(); + fn && fn(); + }); + // emit `error` + const errorSub = (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "error", (err) => { + self.cleanup(); + self._readyState = "closed"; + this.emitReserved("error", err); + if (fn) { + fn(err); + } + else { + // Only do this if there is no fn to handle the error + self.maybeReconnectOnOpen(); + } + }); + if (false !== this._timeout) { + const timeout = this._timeout; + if (timeout === 0) { + openSubDestroy(); // prevents a race condition with the 'open' event + } + // set timer + const timer = this.setTimeoutFn(() => { + openSubDestroy(); + socket.close(); + // @ts-ignore + socket.emit("error", new Error("timeout")); + }, timeout); + if (this.opts.autoUnref) { + timer.unref(); + } + this.subs.push(function subDestroy() { + clearTimeout(timer); + }); + } + this.subs.push(openSubDestroy); + this.subs.push(errorSub); + return this; + } + /** + * Alias for open() + * + * @return self + * @public + */ + connect(fn) { + return this.open(fn); + } + /** + * Called upon transport open. + * + * @private + */ + onopen() { + // clear old subs + this.cleanup(); + // mark as open + this._readyState = "open"; + this.emitReserved("open"); + // add new subs + const socket = this.engine; + this.subs.push((0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "ping", this.onping.bind(this)), (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "data", this.ondata.bind(this)), (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "error", this.onerror.bind(this)), (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(socket, "close", this.onclose.bind(this)), (0,_on_js__WEBPACK_IMPORTED_MODULE_3__.on)(this.decoder, "decoded", this.ondecoded.bind(this))); + } + /** + * Called upon a ping. + * + * @private + */ + onping() { + this.emitReserved("ping"); + } + /** + * Called with data. + * + * @private + */ + ondata(data) { + try { + this.decoder.add(data); + } + catch (e) { + this.onclose("parse error", e); + } + } + /** + * Called when parser fully decodes a packet. + * + * @private + */ + ondecoded(packet) { + // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a "parse error" + (0,engine_io_client__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => { + this.emitReserved("packet", packet); + }, this.setTimeoutFn); + } + /** + * Called upon socket error. + * + * @private + */ + onerror(err) { + this.emitReserved("error", err); + } + /** + * Creates a new socket for the given `nsp`. + * + * @return {Socket} + * @public + */ + socket(nsp, opts) { + let socket = this.nsps[nsp]; + if (!socket) { + socket = new _socket_js__WEBPACK_IMPORTED_MODULE_1__.Socket(this, nsp, opts); + this.nsps[nsp] = socket; + } + else if (this._autoConnect && !socket.active) { + socket.connect(); + } + return socket; + } + /** + * Called upon a socket close. + * + * @param socket + * @private + */ + _destroy(socket) { + const nsps = Object.keys(this.nsps); + for (const nsp of nsps) { + const socket = this.nsps[nsp]; + if (socket.active) { + return; + } + } + this._close(); + } + /** + * Writes a packet. + * + * @param packet + * @private + */ + _packet(packet) { + const encodedPackets = this.encoder.encode(packet); + for (let i = 0; i < encodedPackets.length; i++) { + this.engine.write(encodedPackets[i], packet.options); + } + } + /** + * Clean up transport subscriptions and packet buffer. + * + * @private + */ + cleanup() { + this.subs.forEach((subDestroy) => subDestroy()); + this.subs.length = 0; + this.decoder.destroy(); + } + /** + * Close the current socket. + * + * @private + */ + _close() { + this.skipReconnect = true; + this._reconnecting = false; + this.onclose("forced close"); + if (this.engine) + this.engine.close(); + } + /** + * Alias for close() + * + * @private + */ + disconnect() { + return this._close(); + } + /** + * Called upon engine close. + * + * @private + */ + onclose(reason, description) { + this.cleanup(); + this.backoff.reset(); + this._readyState = "closed"; + this.emitReserved("close", reason, description); + if (this._reconnection && !this.skipReconnect) { + this.reconnect(); + } + } + /** + * Attempt a reconnection. + * + * @private + */ + reconnect() { + if (this._reconnecting || this.skipReconnect) + return this; + const self = this; + if (this.backoff.attempts >= this._reconnectionAttempts) { + this.backoff.reset(); + this.emitReserved("reconnect_failed"); + this._reconnecting = false; + } + else { + const delay = this.backoff.duration(); + this._reconnecting = true; + const timer = this.setTimeoutFn(() => { + if (self.skipReconnect) + return; + this.emitReserved("reconnect_attempt", self.backoff.attempts); + // check again for the case socket closed in above events + if (self.skipReconnect) + return; + self.open((err) => { + if (err) { + self._reconnecting = false; + self.reconnect(); + this.emitReserved("reconnect_error", err); + } + else { + self.onreconnect(); + } + }); + }, delay); + if (this.opts.autoUnref) { + timer.unref(); + } + this.subs.push(function subDestroy() { + clearTimeout(timer); + }); + } + } + /** + * Called upon successful reconnect. + * + * @private + */ + onreconnect() { + const attempt = this.backoff.attempts; + this._reconnecting = false; + this.backoff.reset(); + this.emitReserved("reconnect", attempt); + } +} + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/on.js": +/*!*******************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/on.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "on": function() { return /* binding */ on; } +/* harmony export */ }); +function on(obj, ev, fn) { + obj.on(ev, fn); + return function subDestroy() { + obj.off(ev, fn); + }; +} + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/socket.js": +/*!***********************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/socket.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Socket": function() { return /* binding */ Socket; } +/* harmony export */ }); +/* harmony import */ var socket_io_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! socket.io-parser */ "./node_modules/socket.io-parser/build/esm/index.js"); +/* harmony import */ var _on_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./on.js */ "./node_modules/socket.io-client/build/esm/on.js"); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); + + + +/** + * Internal events. + * These events can't be emitted by the user. + */ +const RESERVED_EVENTS = Object.freeze({ + connect: 1, + connect_error: 1, + disconnect: 1, + disconnecting: 1, + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener + newListener: 1, + removeListener: 1, +}); +/** + * A Socket is the fundamental class for interacting with the server. + * + * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate. + * + * @example + * const socket = io(); + * + * socket.on("connect", () => { + * console.log("connected"); + * }); + * + * // send an event to the server + * socket.emit("foo", "bar"); + * + * socket.on("foobar", () => { + * // an event was received from the server + * }); + * + * // upon disconnection + * socket.on("disconnect", (reason) => { + * console.log(`disconnected due to ${reason}`); + * }); + */ +class Socket extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_2__.Emitter { + /** + * `Socket` constructor. + */ + constructor(io, nsp, opts) { + super(); + /** + * Whether the socket is currently connected to the server. + * + * @example + * const socket = io(); + * + * socket.on("connect", () => { + * console.log(socket.connected); // true + * }); + * + * socket.on("disconnect", () => { + * console.log(socket.connected); // false + * }); + */ + this.connected = false; + /** + * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will + * be transmitted by the server. + */ + this.recovered = false; + /** + * Buffer for packets received before the CONNECT packet + */ + this.receiveBuffer = []; + /** + * Buffer for packets that will be sent once the socket is connected + */ + this.sendBuffer = []; + /** + * The queue of packets to be sent with retry in case of failure. + * + * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order. + * @private + */ + this._queue = []; + /** + * A sequence to generate the ID of the {@link QueuedPacket}. + * @private + */ + this._queueSeq = 0; + this.ids = 0; + this.acks = {}; + this.flags = {}; + this.io = io; + this.nsp = nsp; + if (opts && opts.auth) { + this.auth = opts.auth; + } + this._opts = Object.assign({}, opts); + if (this.io._autoConnect) + this.open(); + } + /** + * Whether the socket is currently disconnected + * + * @example + * const socket = io(); + * + * socket.on("connect", () => { + * console.log(socket.disconnected); // false + * }); + * + * socket.on("disconnect", () => { + * console.log(socket.disconnected); // true + * }); + */ + get disconnected() { + return !this.connected; + } + /** + * Subscribe to open, close and packet events + * + * @private + */ + subEvents() { + if (this.subs) + return; + const io = this.io; + this.subs = [ + (0,_on_js__WEBPACK_IMPORTED_MODULE_1__.on)(io, "open", this.onopen.bind(this)), + (0,_on_js__WEBPACK_IMPORTED_MODULE_1__.on)(io, "packet", this.onpacket.bind(this)), + (0,_on_js__WEBPACK_IMPORTED_MODULE_1__.on)(io, "error", this.onerror.bind(this)), + (0,_on_js__WEBPACK_IMPORTED_MODULE_1__.on)(io, "close", this.onclose.bind(this)), + ]; + } + /** + * Whether the Socket will try to reconnect when its Manager connects or reconnects. + * + * @example + * const socket = io(); + * + * console.log(socket.active); // true + * + * socket.on("disconnect", (reason) => { + * if (reason === "io server disconnect") { + * // the disconnection was initiated by the server, you need to manually reconnect + * console.log(socket.active); // false + * } + * // else the socket will automatically try to reconnect + * console.log(socket.active); // true + * }); + */ + get active() { + return !!this.subs; + } + /** + * "Opens" the socket. + * + * @example + * const socket = io({ + * autoConnect: false + * }); + * + * socket.connect(); + */ + connect() { + if (this.connected) + return this; + this.subEvents(); + if (!this.io["_reconnecting"]) + this.io.open(); // ensure open + if ("open" === this.io._readyState) + this.onopen(); + return this; + } + /** + * Alias for {@link connect()}. + */ + open() { + return this.connect(); + } + /** + * Sends a `message` event. + * + * This method mimics the WebSocket.send() method. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send + * + * @example + * socket.send("hello"); + * + * // this is equivalent to + * socket.emit("message", "hello"); + * + * @return self + */ + send(...args) { + args.unshift("message"); + this.emit.apply(this, args); + return this; + } + /** + * Override `emit`. + * If the event is in `events`, it's emitted normally. + * + * @example + * socket.emit("hello", "world"); + * + * // all serializable datastructures are supported (no need to call JSON.stringify) + * socket.emit("hello", 1, "2", { 3: ["4"], 5: Uint8Array.from([6]) }); + * + * // with an acknowledgement from the server + * socket.emit("hello", "world", (val) => { + * // ... + * }); + * + * @return self + */ + emit(ev, ...args) { + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev.toString() + '" is a reserved event name'); + } + args.unshift(ev); + if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) { + this._addToQueue(args); + return this; + } + const packet = { + type: socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.EVENT, + data: args, + }; + packet.options = {}; + packet.options.compress = this.flags.compress !== false; + // event ack callback + if ("function" === typeof args[args.length - 1]) { + const id = this.ids++; + const ack = args.pop(); + this._registerAckCallback(id, ack); + packet.id = id; + } + const isTransportWritable = this.io.engine && + this.io.engine.transport && + this.io.engine.transport.writable; + const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected); + if (discardPacket) { + } + else if (this.connected) { + this.notifyOutgoingListeners(packet); + this.packet(packet); + } + else { + this.sendBuffer.push(packet); + } + this.flags = {}; + return this; + } + /** + * @private + */ + _registerAckCallback(id, ack) { + var _a; + const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout; + if (timeout === undefined) { + this.acks[id] = ack; + return; + } + // @ts-ignore + const timer = this.io.setTimeoutFn(() => { + delete this.acks[id]; + for (let i = 0; i < this.sendBuffer.length; i++) { + if (this.sendBuffer[i].id === id) { + this.sendBuffer.splice(i, 1); + } + } + ack.call(this, new Error("operation has timed out")); + }, timeout); + this.acks[id] = (...args) => { + // @ts-ignore + this.io.clearTimeoutFn(timer); + ack.apply(this, [null, ...args]); + }; + } + /** + * Emits an event and waits for an acknowledgement + * + * @example + * // without timeout + * const response = await socket.emitWithAck("hello", "world"); + * + * // with a specific timeout + * try { + * const response = await socket.timeout(1000).emitWithAck("hello", "world"); + * } catch (err) { + * // the server did not acknowledge the event in the given delay + * } + * + * @return a Promise that will be fulfilled when the server acknowledges the event + */ + emitWithAck(ev, ...args) { + // the timeout flag is optional + const withErr = this.flags.timeout !== undefined || this._opts.ackTimeout !== undefined; + return new Promise((resolve, reject) => { + args.push((arg1, arg2) => { + if (withErr) { + return arg1 ? reject(arg1) : resolve(arg2); + } + else { + return resolve(arg1); + } + }); + this.emit(ev, ...args); + }); + } + /** + * Add the packet to the queue. + * @param args + * @private + */ + _addToQueue(args) { + let ack; + if (typeof args[args.length - 1] === "function") { + ack = args.pop(); + } + const packet = { + id: this._queueSeq++, + tryCount: 0, + pending: false, + args, + flags: Object.assign({ fromQueue: true }, this.flags), + }; + args.push((err, ...responseArgs) => { + if (packet !== this._queue[0]) { + // the packet has already been acknowledged + return; + } + const hasError = err !== null; + if (hasError) { + if (packet.tryCount > this._opts.retries) { + this._queue.shift(); + if (ack) { + ack(err); + } + } + } + else { + this._queue.shift(); + if (ack) { + ack(null, ...responseArgs); + } + } + packet.pending = false; + return this._drainQueue(); + }); + this._queue.push(packet); + this._drainQueue(); + } + /** + * Send the first packet of the queue, and wait for an acknowledgement from the server. + * @param force - whether to resend a packet that has not been acknowledged yet + * + * @private + */ + _drainQueue(force = false) { + if (!this.connected || this._queue.length === 0) { + return; + } + const packet = this._queue[0]; + if (packet.pending && !force) { + return; + } + packet.pending = true; + packet.tryCount++; + this.flags = packet.flags; + this.emit.apply(this, packet.args); + } + /** + * Sends a packet. + * + * @param packet + * @private + */ + packet(packet) { + packet.nsp = this.nsp; + this.io._packet(packet); + } + /** + * Called upon engine `open`. + * + * @private + */ + onopen() { + if (typeof this.auth == "function") { + this.auth((data) => { + this._sendConnectPacket(data); + }); + } + else { + this._sendConnectPacket(this.auth); + } + } + /** + * Sends a CONNECT packet to initiate the Socket.IO session. + * + * @param data + * @private + */ + _sendConnectPacket(data) { + this.packet({ + type: socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.CONNECT, + data: this._pid + ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data) + : data, + }); + } + /** + * Called upon engine or manager `error`. + * + * @param err + * @private + */ + onerror(err) { + if (!this.connected) { + this.emitReserved("connect_error", err); + } + } + /** + * Called upon engine `close`. + * + * @param reason + * @param description + * @private + */ + onclose(reason, description) { + this.connected = false; + delete this.id; + this.emitReserved("disconnect", reason, description); + } + /** + * Called with socket packet. + * + * @param packet + * @private + */ + onpacket(packet) { + const sameNamespace = packet.nsp === this.nsp; + if (!sameNamespace) + return; + switch (packet.type) { + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.CONNECT: + if (packet.data && packet.data.sid) { + this.onconnect(packet.data.sid, packet.data.pid); + } + else { + this.emitReserved("connect_error", new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)")); + } + break; + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.EVENT: + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.BINARY_EVENT: + this.onevent(packet); + break; + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.ACK: + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.BINARY_ACK: + this.onack(packet); + break; + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.DISCONNECT: + this.ondisconnect(); + break; + case socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.CONNECT_ERROR: + this.destroy(); + const err = new Error(packet.data.message); + // @ts-ignore + err.data = packet.data.data; + this.emitReserved("connect_error", err); + break; + } + } + /** + * Called upon a server event. + * + * @param packet + * @private + */ + onevent(packet) { + const args = packet.data || []; + if (null != packet.id) { + args.push(this.ack(packet.id)); + } + if (this.connected) { + this.emitEvent(args); + } + else { + this.receiveBuffer.push(Object.freeze(args)); + } + } + emitEvent(args) { + if (this._anyListeners && this._anyListeners.length) { + const listeners = this._anyListeners.slice(); + for (const listener of listeners) { + listener.apply(this, args); + } + } + super.emit.apply(this, args); + if (this._pid && args.length && typeof args[args.length - 1] === "string") { + this._lastOffset = args[args.length - 1]; + } + } + /** + * Produces an ack callback to emit with an event. + * + * @private + */ + ack(id) { + const self = this; + let sent = false; + return function (...args) { + // prevent double callbacks + if (sent) + return; + sent = true; + self.packet({ + type: socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.ACK, + id: id, + data: args, + }); + }; + } + /** + * Called upon a server acknowlegement. + * + * @param packet + * @private + */ + onack(packet) { + const ack = this.acks[packet.id]; + if ("function" === typeof ack) { + ack.apply(this, packet.data); + delete this.acks[packet.id]; + } + else { + } + } + /** + * Called upon server connect. + * + * @private + */ + onconnect(id, pid) { + this.id = id; + this.recovered = pid && this._pid === pid; + this._pid = pid; // defined only if connection state recovery is enabled + this.connected = true; + this.emitBuffered(); + this.emitReserved("connect"); + this._drainQueue(true); + } + /** + * Emit buffered events (received and emitted). + * + * @private + */ + emitBuffered() { + this.receiveBuffer.forEach((args) => this.emitEvent(args)); + this.receiveBuffer = []; + this.sendBuffer.forEach((packet) => { + this.notifyOutgoingListeners(packet); + this.packet(packet); + }); + this.sendBuffer = []; + } + /** + * Called upon server disconnect. + * + * @private + */ + ondisconnect() { + 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. + * + * @private + */ + destroy() { + if (this.subs) { + // clean subscriptions to avoid reconnections + this.subs.forEach((subDestroy) => subDestroy()); + this.subs = undefined; + } + this.io["_destroy"](this); + } + /** + * Disconnects the socket manually. In that case, the socket will not try to reconnect. + * + * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed. + * + * @example + * const socket = io(); + * + * socket.on("disconnect", (reason) => { + * // console.log(reason); prints "io client disconnect" + * }); + * + * socket.disconnect(); + * + * @return self + */ + disconnect() { + if (this.connected) { + this.packet({ type: socket_io_parser__WEBPACK_IMPORTED_MODULE_0__.PacketType.DISCONNECT }); + } + // remove socket from pool + this.destroy(); + if (this.connected) { + // fire events + this.onclose("io client disconnect"); + } + return this; + } + /** + * Alias for {@link disconnect()}. + * + * @return self + */ + close() { + return this.disconnect(); + } + /** + * Sets the compress flag. + * + * @example + * socket.compress(false).emit("hello"); + * + * @param compress - if `true`, compresses the sending data + * @return self + */ + compress(compress) { + this.flags.compress = compress; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not + * ready to send messages. + * + * @example + * socket.volatile.emit("hello"); // the server may or may not receive it + * + * @returns self + */ + get volatile() { + this.flags.volatile = true; + return this; + } + /** + * Sets a modifier for a subsequent event emission that the callback will be called with an error when the + * given number of milliseconds have elapsed without an acknowledgement from the server: + * + * @example + * socket.timeout(5000).emit("my-event", (err) => { + * if (err) { + * // the server did not acknowledge the event in the given delay + * } + * }); + * + * @returns self + */ + timeout(timeout) { + this.flags.timeout = timeout; + return this; + } + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. + * + * @example + * socket.onAny((event, ...args) => { + * console.log(`got ${event}`); + * }); + * + * @param listener + */ + onAny(listener) { + this._anyListeners = this._anyListeners || []; + this._anyListeners.push(listener); + return this; + } + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. The listener is added to the beginning of the listeners array. + * + * @example + * socket.prependAny((event, ...args) => { + * console.log(`got event ${event}`); + * }); + * + * @param listener + */ + prependAny(listener) { + this._anyListeners = this._anyListeners || []; + this._anyListeners.unshift(listener); + return this; + } + /** + * Removes the listener that will be fired when any event is emitted. + * + * @example + * const catchAllListener = (event, ...args) => { + * console.log(`got event ${event}`); + * } + * + * socket.onAny(catchAllListener); + * + * // remove a specific listener + * socket.offAny(catchAllListener); + * + * // or remove all listeners + * socket.offAny(); + * + * @param listener + */ + offAny(listener) { + if (!this._anyListeners) { + return this; + } + if (listener) { + const listeners = this._anyListeners; + for (let i = 0; i < listeners.length; i++) { + if (listener === listeners[i]) { + listeners.splice(i, 1); + return this; + } + } + } + else { + this._anyListeners = []; + } + return this; + } + /** + * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, + * e.g. to remove listeners. + */ + listenersAny() { + return this._anyListeners || []; + } + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. + * + * Note: acknowledgements sent to the server are not included. + * + * @example + * socket.onAnyOutgoing((event, ...args) => { + * console.log(`sent event ${event}`); + * }); + * + * @param listener + */ + onAnyOutgoing(listener) { + this._anyOutgoingListeners = this._anyOutgoingListeners || []; + this._anyOutgoingListeners.push(listener); + return this; + } + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. The listener is added to the beginning of the listeners array. + * + * Note: acknowledgements sent to the server are not included. + * + * @example + * socket.prependAnyOutgoing((event, ...args) => { + * console.log(`sent event ${event}`); + * }); + * + * @param listener + */ + prependAnyOutgoing(listener) { + this._anyOutgoingListeners = this._anyOutgoingListeners || []; + this._anyOutgoingListeners.unshift(listener); + return this; + } + /** + * Removes the listener that will be fired when any event is emitted. + * + * @example + * const catchAllListener = (event, ...args) => { + * console.log(`sent event ${event}`); + * } + * + * socket.onAnyOutgoing(catchAllListener); + * + * // remove a specific listener + * socket.offAnyOutgoing(catchAllListener); + * + * // or remove all listeners + * socket.offAnyOutgoing(); + * + * @param [listener] - the catch-all listener (optional) + */ + offAnyOutgoing(listener) { + if (!this._anyOutgoingListeners) { + return this; + } + if (listener) { + const listeners = this._anyOutgoingListeners; + for (let i = 0; i < listeners.length; i++) { + if (listener === listeners[i]) { + listeners.splice(i, 1); + return this; + } + } + } + else { + this._anyOutgoingListeners = []; + } + return this; + } + /** + * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, + * e.g. to remove listeners. + */ + listenersAnyOutgoing() { + return this._anyOutgoingListeners || []; + } + /** + * Notify the listeners for each packet sent + * + * @param packet + * + * @private + */ + notifyOutgoingListeners(packet) { + if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) { + const listeners = this._anyOutgoingListeners.slice(); + for (const listener of listeners) { + listener.apply(this, packet.data); + } + } + } +} + + +/***/ }), + +/***/ "./node_modules/socket.io-client/build/esm/url.js": +/*!********************************************************!*\ + !*** ./node_modules/socket.io-client/build/esm/url.js ***! + \********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "url": function() { return /* binding */ url; } +/* harmony export */ }); +/* harmony import */ var engine_io_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! engine.io-client */ "./node_modules/engine.io-client/build/esm/index.js"); + +/** + * URL parser. + * + * @param uri - url + * @param path - the request path of the connection + * @param loc - An object meant to mimic window.location. + * Defaults to window.location. + * @public + */ +function url(uri, path = "", loc) { + let obj = uri; + // default to window.location + loc = loc || (typeof location !== "undefined" && location); + if (null == uri) + uri = loc.protocol + "//" + loc.host; + // relative path support + if (typeof uri === "string") { + if ("/" === uri.charAt(0)) { + if ("/" === uri.charAt(1)) { + uri = loc.protocol + uri; + } + else { + uri = loc.host + uri; + } + } + if (!/^(https?|wss?):\/\//.test(uri)) { + if ("undefined" !== typeof loc) { + uri = loc.protocol + "//" + uri; + } + else { + uri = "https://" + uri; + } + } + // parse + obj = (0,engine_io_client__WEBPACK_IMPORTED_MODULE_0__.parse)(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 || "/"; + const ipv6 = obj.host.indexOf(":") !== -1; + const host = ipv6 ? "[" + obj.host + "]" : obj.host; + // define unique id + obj.id = obj.protocol + "://" + host + ":" + obj.port + path; + // define href + obj.href = + obj.protocol + + "://" + + host + + (loc && loc.port === obj.port ? "" : ":" + obj.port); + return obj; +} + + +/***/ }), + +/***/ "./node_modules/socket.io-parser/build/esm/binary.js": +/*!***********************************************************!*\ + !*** ./node_modules/socket.io-parser/build/esm/binary.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "deconstructPacket": function() { return /* binding */ deconstructPacket; }, +/* harmony export */ "reconstructPacket": function() { return /* binding */ reconstructPacket; } +/* harmony export */ }); +/* harmony import */ var _is_binary_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is-binary.js */ "./node_modules/socket.io-parser/build/esm/is-binary.js"); + +/** + * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder. + * + * @param {Object} packet - socket.io event packet + * @return {Object} with deconstructed packet and list of buffers + * @public + */ +function deconstructPacket(packet) { + const buffers = []; + const packetData = packet.data; + const 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 ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_0__.isBinary)(data)) { + const placeholder = { _placeholder: true, num: buffers.length }; + buffers.push(data); + return placeholder; + } + else if (Array.isArray(data)) { + const newData = new Array(data.length); + for (let i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i], buffers); + } + return newData; + } + else if (typeof data === "object" && !(data instanceof Date)) { + const newData = {}; + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + 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 + * @public + */ +function reconstructPacket(packet, buffers) { + packet.data = _reconstructPacket(packet.data, buffers); + delete packet.attachments; // no longer useful + return packet; +} +function _reconstructPacket(data, buffers) { + if (!data) + return data; + if (data && data._placeholder === true) { + const isIndexValid = typeof data.num === "number" && + data.num >= 0 && + data.num < buffers.length; + if (isIndexValid) { + return buffers[data.num]; // appropriate buffer (should be natural order anyway) + } + else { + throw new Error("illegal attachments"); + } + } + else if (Array.isArray(data)) { + for (let i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i], buffers); + } + } + else if (typeof data === "object") { + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + data[key] = _reconstructPacket(data[key], buffers); + } + } + } + return data; +} + + +/***/ }), + +/***/ "./node_modules/socket.io-parser/build/esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/socket.io-parser/build/esm/index.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Decoder": function() { return /* binding */ Decoder; }, +/* harmony export */ "Encoder": function() { return /* binding */ Encoder; }, +/* harmony export */ "PacketType": function() { return /* binding */ PacketType; }, +/* harmony export */ "protocol": function() { return /* binding */ protocol; } +/* harmony export */ }); +/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @socket.io/component-emitter */ "./node_modules/@socket.io/component-emitter/index.mjs"); +/* harmony import */ var _binary_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./binary.js */ "./node_modules/socket.io-parser/build/esm/binary.js"); +/* harmony import */ var _is_binary_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is-binary.js */ "./node_modules/socket.io-parser/build/esm/is-binary.js"); + + + +/** + * Protocol version. + * + * @public + */ +const protocol = 5; +var PacketType; +(function (PacketType) { + PacketType[PacketType["CONNECT"] = 0] = "CONNECT"; + PacketType[PacketType["DISCONNECT"] = 1] = "DISCONNECT"; + PacketType[PacketType["EVENT"] = 2] = "EVENT"; + PacketType[PacketType["ACK"] = 3] = "ACK"; + PacketType[PacketType["CONNECT_ERROR"] = 4] = "CONNECT_ERROR"; + PacketType[PacketType["BINARY_EVENT"] = 5] = "BINARY_EVENT"; + PacketType[PacketType["BINARY_ACK"] = 6] = "BINARY_ACK"; +})(PacketType || (PacketType = {})); +/** + * A socket.io Encoder instance + */ +class Encoder { + /** + * Encoder constructor + * + * @param {function} replacer - custom replacer to pass down to JSON.parse + */ + constructor(replacer) { + this.replacer = replacer; + } + /** + * Encode a packet as a single string if non-binary, or as a + * buffer sequence, depending on packet type. + * + * @param {Object} obj - packet object + */ + encode(obj) { + if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) { + if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.hasBinary)(obj)) { + return this.encodeAsBinary({ + type: obj.type === PacketType.EVENT + ? PacketType.BINARY_EVENT + : PacketType.BINARY_ACK, + nsp: obj.nsp, + data: obj.data, + id: obj.id, + }); + } + } + return [this.encodeAsString(obj)]; + } + /** + * Encode packet as string. + */ + encodeAsString(obj) { + // first is type + let str = "" + obj.type; + // attachments if we have them + if (obj.type === PacketType.BINARY_EVENT || + obj.type === PacketType.BINARY_ACK) { + 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, this.replacer); + } + return str; + } + /** + * Encode packet as 'buffer sequence' by removing blobs, and + * deconstructing packet into object with placeholders and + * a list of buffers. + */ + encodeAsBinary(obj) { + const deconstruction = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.deconstructPacket)(obj); + const pack = this.encodeAsString(deconstruction.packet); + const buffers = deconstruction.buffers; + buffers.unshift(pack); // add packet info to beginning of data list + return buffers; // write all the buffers + } +} +/** + * A socket.io Decoder instance + * + * @return {Object} decoder + */ +class Decoder extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__.Emitter { + /** + * Decoder constructor + * + * @param {function} reviver - custom reviver to pass down to JSON.stringify + */ + constructor(reviver) { + super(); + this.reviver = reviver; + } + /** + * Decodes an encoded packet string into packet JSON. + * + * @param {String} obj - encoded packet + */ + add(obj) { + let packet; + if (typeof obj === "string") { + if (this.reconstructor) { + throw new Error("got plaintext data when reconstructing a packet"); + } + packet = this.decodeString(obj); + const isBinaryEvent = packet.type === PacketType.BINARY_EVENT; + if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) { + packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK; + // binary packet's json + this.reconstructor = new BinaryReconstructor(packet); + // no attachments, labeled binary but no binary data to follow + if (packet.attachments === 0) { + super.emitReserved("decoded", packet); + } + } + else { + // non-binary full packet + super.emitReserved("decoded", packet); + } + } + else if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.isBinary)(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; + super.emitReserved("decoded", packet); + } + } + } + else { + throw new Error("Unknown type: " + obj); + } + } + /** + * Decode a packet String (JSON data) + * + * @param {String} str + * @return {Object} packet + */ + decodeString(str) { + let i = 0; + // look up type + const p = { + type: Number(str.charAt(0)), + }; + if (PacketType[p.type] === undefined) { + throw new Error("unknown packet type " + p.type); + } + // look up attachments if type binary + if (p.type === PacketType.BINARY_EVENT || + p.type === PacketType.BINARY_ACK) { + const start = i + 1; + while (str.charAt(++i) !== "-" && i != str.length) { } + const buf = str.substring(start, i); + 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)) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if ("," === c) + break; + if (i === str.length) + break; + } + p.nsp = str.substring(start, i); + } + else { + p.nsp = "/"; + } + // look up id + const next = str.charAt(i + 1); + if ("" !== next && Number(next) == next) { + const start = i + 1; + while (++i) { + const c = str.charAt(i); + if (null == c || Number(c) != c) { + --i; + break; + } + if (i === str.length) + break; + } + p.id = Number(str.substring(start, i + 1)); + } + // look up json data + if (str.charAt(++i)) { + const payload = this.tryParse(str.substr(i)); + if (Decoder.isPayloadValid(p.type, payload)) { + p.data = payload; + } + else { + throw new Error("invalid payload"); + } + } + return p; + } + tryParse(str) { + try { + return JSON.parse(str, this.reviver); + } + catch (e) { + return false; + } + } + static isPayloadValid(type, payload) { + switch (type) { + case PacketType.CONNECT: + return typeof payload === "object"; + case PacketType.DISCONNECT: + return payload === undefined; + case PacketType.CONNECT_ERROR: + return typeof payload === "string" || typeof payload === "object"; + case PacketType.EVENT: + case PacketType.BINARY_EVENT: + return Array.isArray(payload) && payload.length > 0; + case PacketType.ACK: + case PacketType.BINARY_ACK: + return Array.isArray(payload); + } + } + /** + * Deallocates a parser's resources + */ + destroy() { + if (this.reconstructor) { + this.reconstructor.finishedReconstruction(); + this.reconstructor = null; + } + } +} +/** + * 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 + */ +class BinaryReconstructor { + constructor(packet) { + this.packet = packet; + this.buffers = []; + this.reconPack = packet; + } + /** + * 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. + */ + takeBinaryData(binData) { + this.buffers.push(binData); + if (this.buffers.length === this.reconPack.attachments) { + // done with buffer list + const packet = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.reconstructPacket)(this.reconPack, this.buffers); + this.finishedReconstruction(); + return packet; + } + return null; + } + /** + * Cleans up binary packet reconstruction variables. + */ + finishedReconstruction() { + this.reconPack = null; + this.buffers = []; + } +} + + +/***/ }), + +/***/ "./node_modules/socket.io-parser/build/esm/is-binary.js": +/*!**************************************************************!*\ + !*** ./node_modules/socket.io-parser/build/esm/is-binary.js ***! + \**************************************************************/ +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "hasBinary": function() { return /* binding */ hasBinary; }, +/* harmony export */ "isBinary": function() { return /* binding */ isBinary; } +/* harmony export */ }); +const withNativeArrayBuffer = typeof ArrayBuffer === "function"; +const isView = (obj) => { + return typeof ArrayBuffer.isView === "function" + ? ArrayBuffer.isView(obj) + : obj.buffer instanceof ArrayBuffer; +}; +const toString = Object.prototype.toString; +const withNativeBlob = typeof Blob === "function" || + (typeof Blob !== "undefined" && + toString.call(Blob) === "[object BlobConstructor]"); +const withNativeFile = typeof File === "function" || + (typeof File !== "undefined" && + toString.call(File) === "[object FileConstructor]"); +/** + * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File. + * + * @private + */ +function isBinary(obj) { + return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) || + (withNativeBlob && obj instanceof Blob) || + (withNativeFile && obj instanceof File)); +} +function hasBinary(obj, toJSON) { + if (!obj || typeof obj !== "object") { + return false; + } + if (Array.isArray(obj)) { + for (let i = 0, l = obj.length; i < l; i++) { + if (hasBinary(obj[i])) { + return true; + } + } + return false; + } + if (isBinary(obj)) { + return true; + } + if (obj.toJSON && + typeof obj.toJSON === "function" && + arguments.length === 1) { + return hasBinary(obj.toJSON(), true); + } + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { + return true; + } + } + return false; +} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/*!****************************!*\ + !*** ./client/src/main.js ***! + \****************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Player_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Player.js */ "./client/src/Player.js"); +/* harmony import */ var _Ressources_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Ressources.js */ "./client/src/Ressources.js"); +/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! socket.io-client */ "./node_modules/socket.io-client/build/esm/index.js"); +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + + + +var Main = function Main(playerName, playerCharacter) { + var canvas = document.querySelector(".map"); + var ctx = canvas.getContext("2d"); + canvas.width = document.documentElement.clientWidth; + canvas.height = document.documentElement.clientHeight; + ctx.width = 6000; + ctx.height = 3340; + var xStart = canvas.width / 2; + var xEnd = ctx.width - canvas.width / 2; + var yStart = canvas.height / 2; + var yEnd = ctx.height - canvas.height / 2; + window.addEventListener("resize", function (e) { + e.preventDefault(); + canvas.width = document.documentElement.clientWidth; + canvas.height = document.documentElement.clientHeight; + }); + var backgroundImage = new Image(); + backgroundImage.src = "/images/map.jpg"; + document.addEventListener("keydown", function (event) { + event.preventDefault(); + // Mettre à jour la direction en fonction des touches enfoncées + switch (event.keyCode) { + case 37: + // Gauche + player.direction.x = -1; + break; + case 38: + // Haut + player.direction.y = -1; + break; + case 39: + // Droite + player.direction.x = 1; + break; + case 40: + // Bas + player.direction.y = 1; + break; + } + }); + document.addEventListener("keyup", function (event) { + event.preventDefault(); + // Mettre à jour la direction en fonction des touches relâchées + switch (event.keyCode) { + case 37: + // Gauche + if (player.direction.x < 0) { + player.direction.x = 0; + } + break; + case 38: + // Haut + if (player.direction.y < 0) { + player.direction.y = 0; + } + break; + case 39: + // Droite + if (player.direction.x > 0) { + player.direction.x = 0; + } + break; + case 40: + // Bas + if (player.direction.y > 0) { + player.direction.y = 0; + } + break; + } + }); + var socket = (0,socket_io_client__WEBPACK_IMPORTED_MODULE_2__.io)(); + var sushis = []; + socket.on("sushis", function (data) { + for (var i = 0; i < (data === null || data === void 0 ? void 0 : data.length); i++) { + var sushi = new _Ressources_js__WEBPACK_IMPORTED_MODULE_1__.Sushi(data[i].x * (xEnd - xStart) + xStart, data[i].y * (-yStart + yEnd) + yStart, 5); + sushis.push(sushi); + } + }); + var folder = playerCharacter; + var userId; + function getUserId() { + return new Promise(function (resolve, reject) { + socket.on("user", function (data) { + userId = data; + resolve(userId); + }); + }); + } + function myFunction() { + return _myFunction.apply(this, arguments); + } + function _myFunction() { + _myFunction = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var update, _userId, _player, allUsers, mouseX, mouseY; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + update = function update() { + ctx.save(); + ctx.clearRect(0, 0, ctx.width, ctx.height); + ctx.beginPath(); + var cameraX = canvas.width / 2 - _player.x; + var cameraY = canvas.height / 2 - _player.y; + ctx.translate(cameraX, cameraY); + ctx.drawImage(backgroundImage, 0, 0, ctx.width, ctx.height); + sushis.forEach(function (sushi) { + sushi.draw(ctx); + }); + allUsers.forEach(function (user) { + var otherPlayer = new _Player_js__WEBPACK_IMPORTED_MODULE_0__["default"](user.x, user.y, user.radius, user.imageFolder, user.id, user.imageId); + otherPlayer.draw(ctx); + }); + _player.eatSushi(sushis, socket); + _player.move(ctx, mouseX, mouseY); + ctx.restore(); + socket.emit("updateUser", _player); + requestAnimationFrame(update); + }; + _context.next = 4; + return getUserId(); + case 4: + _userId = _context.sent; + _player = new _Player_js__WEBPACK_IMPORTED_MODULE_0__["default"](Math.random() * (xEnd - xStart) + xStart, Math.random() * (-yStart + yEnd) + yStart, 20, folder, _userId, 1); + socket.emit("newUser", _player); + allUsers = []; + socket.on("allUsers", function (datas) { + allUsers = datas; + }); + socket.on("newSushi", function (data) { + console.log(sushis[data.drop]); + sushis.splice(data.drop, 1); + sushis.push(new _Ressources_js__WEBPACK_IMPORTED_MODULE_1__.Sushi(data["new"].x * (xEnd - xStart) + xStart, data["new"].y * (-yStart + yEnd) + yStart, 5)); + }); + canvas.addEventListener("mousemove", function (event) { + event.preventDefault(); + mouseX = event.clientX; + mouseY = event.clientY; + _player.moveTo(mouseX, mouseY, canvas); + }); + update(); + _context.next = 17; + break; + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](0); + console.error(_context.t0); + case 17: + case "end": + return _context.stop(); + } + }, _callee, null, [[0, 14]]); + })); + return _myFunction.apply(this, arguments); + } + myFunction(); +}; +/* harmony default export */ __webpack_exports__["default"] = (Main); }(); /******/ })() ; diff --git a/client/public/build/main.bundle.js.map b/client/public/build/main.bundle.js.map index 03adb1a22033b7f4120e16f633255771baf0718b..c90fa84ce5a647de9d0fa715a7ad863e4b4679d8 100644 --- a/client/public/build/main.bundle.js.map +++ b/client/public/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"main.bundle.js","mappings":"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","sources":["webpack://sae-2023-groupei-lasoa-gomis/./client/src/Player.js","webpack://sae-2023-groupei-lasoa-gomis/./client/src/Ressources.js","webpack://sae-2023-groupei-lasoa-gomis/./client/src/Router.js","webpack://sae-2023-groupei-lasoa-gomis/./client/src/main.js","webpack://sae-2023-groupei-lasoa-gomis/webpack/bootstrap","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/define property getters","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/hasOwnProperty shorthand","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/make namespace object","webpack://sae-2023-groupei-lasoa-gomis/./client/src/index.js"],"sourcesContent":["class Player {\r\n image = new Image();\r\n constructor(x, y, radius, imageFolder) {\r\n this.x = x;\r\n this.y = y;\r\n this.radius = radius;\r\n this.speed = 4;\r\n this.direction = {\r\n x: 0,\r\n y: 0,\r\n };\r\n this.imageId = 1;\r\n this.imageFolder = imageFolder;\r\n this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`;\r\n }\r\n draw(ctx) {\r\n // Dessiner le cercle\r\n ctx.beginPath();\r\n ctx.drawImage(\r\n this.image,\r\n this.x - this.radius,\r\n this.y - this.radius,\r\n this.radius * 2,\r\n this.radius * 2\r\n );\r\n ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);\r\n ctx.strokeStyle = \"black\";\r\n ctx.stroke();\r\n }\r\n\r\n grow() {\r\n this.radius += 0.5;\r\n if (this.radius % 80 === 0 && this.imageId <= 5) {\r\n this.imageId += 1;\r\n this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`;\r\n }\r\n }\r\n\r\n eatSushi(sushis) {\r\n sushis.forEach((sushi, idx) => {\r\n const dx = sushi.x - this.x;\r\n const dy = sushi.y - this.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n if (distance < this.radius) {\r\n // Supprime la nourriture de la liste\r\n sushis.splice(idx, 1);\r\n // Augmente la taille du joueur\r\n this.grow();\r\n }\r\n });\r\n }\r\n\r\n move(ctx, mouseX, mouseY) {\r\n // Déplacer le cercle en fonction de la direction\r\n if (\r\n mouseX > ctx.canvas.width / 2 - this.radius &&\r\n mouseX < ctx.canvas.width / 2 + this.radius &&\r\n mouseY > ctx.canvas.height / 2 - this.radius &&\r\n mouseY < ctx.canvas.height / 2 + this.radius\r\n ) {\r\n return;\r\n }\r\n this.x += this.direction.x * this.speed;\r\n this.y += this.direction.y * this.speed;\r\n\r\n if (this.x < this.radius + ctx.canvas.width / 2)\r\n this.x = this.radius + ctx.canvas.width / 2;\r\n if (this.y < this.radius + ctx.canvas.height / 2)\r\n this.y = this.radius + ctx.canvas.height / 2;\r\n if (this.x > ctx.width - this.radius - ctx.canvas.width / 2) {\r\n this.x = ctx.width - this.radius - ctx.canvas.width / 2;\r\n }\r\n if (this.y > ctx.height - this.radius - ctx.canvas.height / 2) {\r\n this.y = ctx.height - this.radius - ctx.canvas.height / 2;\r\n }\r\n }\r\n moveTo(x, y, canvas) {\r\n const directionX = x - canvas.width / 2;\r\n const directionY = y - canvas.height / 2;\r\n\r\n const distance = Math.sqrt(directionX ** 2 + directionY ** 2);\r\n this.direction.x = directionX / distance;\r\n this.direction.y = directionY / distance;\r\n }\r\n}\r\n\r\nexport default Player;\r\n","class Ressources {\r\n constructor(name, x, y, size, image) {\r\n this.name = name;\r\n this.x = x;\r\n this.y = y;\r\n this.size = size;\r\n this.image = image;\r\n }\r\n}\r\n\r\nexport class Sushi extends Ressources {\r\n constructor(x, y, size) {\r\n const backgroundImage = new Image();\r\n backgroundImage.src = \"/images/sushi.png\";\r\n super(\"sushi\", x, y, size, backgroundImage);\r\n }\r\n\r\n draw(ctx) {\r\n ctx.beginPath();\r\n ctx.drawImage(this.image, this.x, this.y, 25, 25);\r\n ctx.closePath();\r\n }\r\n}\r\n","export default class Router {\r\n constructor(routes) {\r\n this.routes = routes;\r\n this.actualRoute = routes[0].page;\r\n }\r\n ChangePages(path) {\r\n for (let i = 0; i < this.routes.length; i++) {\r\n if (this.routes[i].path === path) {\r\n document.querySelector(`.${this.actualRoute}`).style.display = \"none\";\r\n this.actualRoute = this.routes[i].page;\r\n document.querySelector(`.${this.actualRoute}`).style.display = \"flex\";\r\n }\r\n }\r\n }\r\n}\r\n","import Player from \"./Player.js\";\r\nimport { Sushi } from \"./Ressources.js\";\r\n\r\nconst Main = (playerName, playerCharacter) => {\r\n const canvas = document.querySelector(\".map\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = document.documentElement.clientWidth;\r\n canvas.height = document.documentElement.clientHeight;\r\n ctx.width = 6000;\r\n ctx.height = 3340;\r\n\r\n window.addEventListener(\"resize\", (e) => {\r\n e.preventDefault();\r\n canvas.width = document.documentElement.clientWidth;\r\n canvas.height = document.documentElement.clientHeight;\r\n });\r\n\r\n const image = new Image();\r\n image.src = \"/images/goku.png\";\r\n const backgroundImage = new Image();\r\n backgroundImage.src = \"/images/map.jpg\";\r\n\r\n let folder = playerCharacter;\r\n\r\n const player = new Player(canvas.width / 2, canvas.height / 2, 20, folder);\r\n\r\n document.addEventListener(\"keydown\", (event) => {\r\n event.preventDefault();\r\n // Mettre à jour la direction en fonction des touches enfoncées\r\n switch (event.keyCode) {\r\n case 37: // Gauche\r\n player.direction.x = -1;\r\n break;\r\n case 38: // Haut\r\n player.direction.y = -1;\r\n break;\r\n case 39: // Droite\r\n player.direction.x = 1;\r\n break;\r\n case 40: // Bas\r\n player.direction.y = 1;\r\n break;\r\n }\r\n });\r\n\r\n document.addEventListener(\"keyup\", (event) => {\r\n event.preventDefault();\r\n // Mettre à jour la direction en fonction des touches relâchées\r\n switch (event.keyCode) {\r\n case 37: // Gauche\r\n if (player.direction.x < 0) {\r\n player.direction.x = 0;\r\n }\r\n break;\r\n case 38: // Haut\r\n if (player.direction.y < 0) {\r\n player.direction.y = 0;\r\n }\r\n break;\r\n case 39: // Droite\r\n if (player.direction.x > 0) {\r\n player.direction.x = 0;\r\n }\r\n break;\r\n case 40: // Bas\r\n if (player.direction.y > 0) {\r\n player.direction.y = 0;\r\n }\r\n break;\r\n }\r\n });\r\n\r\n let sushis = [];\r\n\r\n for (let i = 0; i < 1500; i++) {\r\n const xStart = canvas.width / 2;\r\n const xEnd = ctx.width - canvas.width / 2;\r\n const yStart = canvas.height / 2;\r\n const yEnd = ctx.height - canvas.height / 2;\r\n const x = Math.random() * (xEnd - xStart) + xStart;\r\n const y = Math.random() * (-yStart + yEnd) + yStart;\r\n console.log(x, y);\r\n const sushi = new Sushi(x, y, 5);\r\n sushis.push(sushi);\r\n }\r\n\r\n let mouseX;\r\n let mouseY;\r\n\r\n canvas.addEventListener(\"mousemove\", (event) => {\r\n event.preventDefault();\r\n mouseX = event.clientX;\r\n mouseY = event.clientY;\r\n\r\n player.moveTo(mouseX, mouseY, canvas);\r\n });\r\n\r\n function update() {\r\n ctx.save();\r\n ctx.clearRect(0, 0, ctx.width, ctx.height);\r\n ctx.beginPath();\r\n\r\n // Déplacer le joueur en fonction de la direction\r\n const cameraX = canvas.width / 2 - player.x;\r\n const cameraY = canvas.height / 2 - player.y;\r\n ctx.translate(cameraX, cameraY);\r\n // Déplacer le contexte pour centrer la caméra ssur le joueur\r\n // Dessiner le joueur et les autres éléments du jeu\r\n ctx.drawImage(backgroundImage, 0, 0, ctx.width, ctx.height);\r\n sushis.forEach((sushi) => {\r\n sushi.draw(ctx);\r\n });\r\n\r\n //player.move(ctx);\r\n player.eatSushi(sushis);\r\n player.draw(ctx);\r\n player.move(ctx, mouseX, mouseY);\r\n ctx.restore();\r\n // Déplacer le contexte pour centrer la caméra sur le joueur\r\n //ctx.translate(-cameraX, -cameraY);\r\n requestAnimationFrame(update);\r\n }\r\n update();\r\n};\r\n\r\nexport default Main;\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Main from \"./main.js\";\r\nimport Router from \"./Router.js\";\r\n\r\n/* Navigation */\r\n\r\nconst routes = [\r\n { path: \"/\", page: \"home\" },\r\n { path: \"/play\", page: \"play\" },\r\n { path: \"/map\", page: \"map\" },\r\n];\r\nlet router = new Router(routes);\r\n\r\nconst links = document.querySelectorAll(\"a\");\r\nfor (let i = 0; i < links.length; i++) {\r\n links[i].addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n router.ChangePages(e.currentTarget.getAttribute(\"href\"));\r\n });\r\n}\r\n\r\nconst inputName = document.querySelector(\".name\");\r\nconst slides = document.querySelectorAll(\".slide\");\r\n\r\nlet playerCharacter = \"goku\";\r\nlet playerName = \"\";\r\n\r\ninputName.addEventListener(\"input\", (e) => {\r\n e.preventDefault();\r\n console.log(e.currentTarget.value);\r\n playerName = e.currentTarget.value;\r\n});\r\n\r\nfor (let i = 0; i < slides.length; i++) {\r\n slides[i].addEventListener(\"click\", (e) => {\r\n playerCharacter = e.currentTarget.getAttribute(\"name\");\r\n console.log(playerCharacter);\r\n });\r\n}\r\n\r\nconst playPages = document.querySelector(\".play\");\r\nconst startButton = document.querySelector(\".start-button\");\r\nconst map = document.querySelector(\".map\");\r\n\r\nstartButton.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n playPages.style.display = \"none\";\r\n map.style.display = \"block\";\r\n if (playerName.length > 0) {\r\n Main(playerName, playerCharacter);\r\n }\r\n});\r\n"],"names":["Player","x","y","radius","imageFolder","_classCallCheck","_defineProperty","Image","speed","direction","imageId","image","src","concat","_createClass","key","value","draw","ctx","beginPath","drawImage","arc","Math","PI","strokeStyle","stroke","grow","eatSushi","sushis","_this","forEach","sushi","idx","dx","dy","distance","sqrt","splice","move","mouseX","mouseY","canvas","width","height","moveTo","directionX","directionY","pow","Ressources","name","size","Sushi","_Ressources","_inherits","_super","_createSuper","backgroundImage","call","closePath","Router","routes","actualRoute","page","ChangePages","path","i","length","document","querySelector","style","display","default","Main","playerName","playerCharacter","getContext","documentElement","clientWidth","clientHeight","window","addEventListener","e","preventDefault","folder","player","event","keyCode","xStart","xEnd","yStart","yEnd","random","console","log","push","clientX","clientY","update","save","clearRect","cameraX","cameraY","translate","restore","requestAnimationFrame","router","links","querySelectorAll","currentTarget","getAttribute","inputName","slides","playPages","startButton","map"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"main.bundle.js","mappings":"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A;AACA;AACA;AACA;AACA;AACA;AACA;AACO;;;;;;;;;;;;;;;;ACVP;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACO;AACP;AACA;AACA,sCAAsC,OAAO;AAC7C;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAuH,IAAI,GAAG,IAAI,SAAS,IAAI;AAC/I;AACA;AACA;AACO;AACP;AACA;AACA,wEAAwE;AACxE;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA,wEAAwE;AACxE,kFAAkF;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,IAAI;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;;;;;;;;;;;;;;;;AC5DA;AACa;AACb;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACO;AACP;AACA,gBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,YAAY;AACnB;;;;;;;;;;;;;;;ACjDO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;ACVoC;AACnB;AACX,iBAAiB,uDAAe;AACI;AACQ;AACD;AACJ;AACmB;;;;;;;;;;;;;;;;;;;;;ACPd;AACW;AAChB;AACA;AACS;AACX;AACrC,qBAAqB,iEAAO;AACnC;AACA;AACA;AACA,eAAe,eAAe;AAC9B,eAAe,QAAQ;AACvB;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,2DAAK;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,2DAAK;AACjC;AACA,QAAQ,+DAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,gCAAgC;AAChC;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,8BAA8B,2DAAM;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB;AAChB;AACA;AACA;AACA,sCAAsC;AACtC;AACA,oBAAoB,sDAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,4DAAU;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,6BAA6B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,wBAAwB,6BAA6B;AACrD;AACA;AACA,+BAA+B,oDAAU;AACzC;AACA;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,sDAAQ;;;;;;;;;;;;;;;;;;AChkBsB;AACO;AACL;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,wBAAwB,iEAAO;AACtC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA,QAAQ,+DAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,gBAAgB,WAAW;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,uBAAuB,8DAAY;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACjHuC;AACH;AAC7B;AACP,eAAe,6CAAE;AACjB,aAAa,gDAAO;AACpB;;;;;;;;;;;;;;;;;;;;;;;;ACL4C;AACA;AACG;AACiB;AACJ;AACL;AACE;AACO;AAChE;AACA;AACA,oBAAoB,mDAAc;AAClC;AACA,KAAK;AACL;AACA,CAAC;AACM,sBAAsB,oDAAS;AACtC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,+CAA+C;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,+DAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,eAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,QAAQ,+DAAa;AACrB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wDAAK;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2DAAM;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA,qBAAqB;AACrB,8BAA8B,0BAA0B;AACxD;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACO,sBAAsB,iEAAO;AACpC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA,QAAQ,+DAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,8CAAI;AACzB;AACA;AACA,oCAAoC,mDAAc;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,0EAA0B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;AC9YgE;AACzD;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACM,kBAAkB,oEAAoB,IAAI,uEAAuB;AACjE;AACA;;;;;;;;;;;;;;;;;;;;;ACZqC;AACG;AACH;AACV;AAC0E;AAC5D;AAChD;AACA;AACA;AACA;AACO,iBAAiB,oDAAS;AACjC;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,8CAAI;AAClB;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAAqB;AACrC;AACA,8BAA8B,gEAAS;AACvC,8BAA8B,gEAAS;AACvC,0BAA0B,gEAAS;AACnC;AACA;AACA;AACA;AACA,uDAAuD,wEAAiB;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,YAAY,8DAAY;AACxB;AACA;AACA,qBAAqB,4EAAqB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,4EAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,mEAAQ;AAC5B;AACA;AACA,qBAAqB;AACrB;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wDAAK;AACnD;AACA;AACA;AACA;AACA;AACA,6BAA6B,2DAAM;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA,iBAAiB,gEAAS;AAC1B;AACA;;;;;;;;;;;;;;;;;ACtKA;AACiD;AACe;AACzD;AACP;AACA;AACA;AACA,kEAAkE,yDAAO;AACzE;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0DAAU;AACjC;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AClB+D;AACxD;AACP;AACA;AACA;AACA;AACA;AACA,KAAK,IAAI;AACT;AACA;AACA,2BAA2B,qEAAqB;AAChD,6BAA6B,uEAAuB;AAC7C;AACP;AACA,mDAAmD,0DAAU;AAC7D,uDAAuD,0DAAU;AACjE;AACA;AACA,2BAA2B,0EAA0B,CAAC,0DAAU;AAChE,6BAA6B,4EAA4B,CAAC,0DAAU;AACpE;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;ACnDA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,uBAAuB;AACqC;;;;;;;;;;;;;;;;ACb5D;AACA;AACA;AACA;AACA,gBAAgB,kBAAkB;AAClC;AACA;AACO;AACP;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC1CkE;AACT;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6DAAoB;AAC3C;AACA,eAAe,qDAAY;AAC3B;AACA;AACA;AACA,kBAAkB,6DAAoB;AACtC;AACA;AACA;AACA,kBAAkB,6DAAoB;AACtC;AACA;AACA;AACA;AACA,wBAAwB,sEAAM;AAC9B;AACA;AACA;AACA,iBAAiB,sBAAsB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA,+DAAe,YAAY,EAAC;;;;;;;;;;;;;AChDgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAAe,YAAY,EAAC;;;;;;;;;;;;;;;;;;;;;ACxCiB;AACA;AAC7C,2CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,4DAAY;AACpB;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C,8BAA8B,4DAAY;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AAC6D;;;;;;;;;;;;;;;AC/BpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;ACjE+B;AACQ;AACF;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,4CAAG;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gDAAO;AACxB;AACA;AACA;AACA,4BAA4B,gDAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AAC4C;AAC5C;AACA;AACA;AACA;AACA;AACgF;;;;;;;;;;;;;;;;;;;;;ACxDM;AACjD;AACM;AACd;AACiB;AACU;AACjD,sBAAsB,iEAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,uEAAqB;AAC7B;AACA;AACA;AACA;AACA;AACA,2BAA2B,uDAAO;AAClC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,uCAAuC,6CAAM;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,oDAAM;AAChC;AACA;AACA;AACA;AACA;AACA,+BAA+B,0CAAE;AACjC;AACA;AACA,SAAS;AACT;AACA,yBAAyB,0CAAE;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,0CAAE,0CAA0C,0CAAE,0CAA0C,0CAAE,4CAA4C,0CAAE,4CAA4C,0CAAE;AAC7M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,0DAAQ;AAChB;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA,yBAAyB,8CAAM;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACxWO;AACP;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACL8C;AACjB;AAC2B;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA,kFAAkF,eAAe;AACjG;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C,IAAI;AACJ;AACO,qBAAqB,iEAAO;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C,YAAY;AACZ;AACA;AACA,4CAA4C;AAC5C,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,mBAAmB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C;AAC3C,QAAQ;AACR;AACA;AACA,2CAA2C;AAC3C,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,0CAAE;AACd,YAAY,0CAAE;AACd,YAAY,0CAAE;AACd,YAAY,0CAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA,qCAAqC;AACrC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,mCAAmC;AACzE;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8DAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,4BAA4B;AACxD;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,iBAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gEAAkB;AACpC;AACA,kCAAkC,0CAA0C;AAC5E;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,gEAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,8DAAgB;AACjC,iBAAiB,qEAAuB;AACxC;AACA;AACA,iBAAiB,4DAAc;AAC/B,iBAAiB,mEAAqB;AACtC;AACA;AACA,iBAAiB,mEAAqB;AACtC;AACA;AACA,iBAAiB,sEAAwB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4DAAc;AACpC;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAA0D,cAAc;AACxE;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,MAAM,mEAAqB,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,MAAM;AAClC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,MAAM;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,sBAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACr0ByC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uDAAK;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;AC1D0C;AAC1C;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACO;AACP;AACA;AACA;AACA;AACA,uCAAuC;AACvC,aAAa;AACb;AACA;AACA;AACA;AACA,QAAQ,uDAAQ;AAChB,8BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACO;AACP;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;AClFuD;AACY;AACd;AACrD;AACA;AACA;AACA;AACA;AACO;AACA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,gCAAgC;AACjC;AACA;AACA;AACO;AACP;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA,gBAAgB,wDAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,6DAAiB;AAChD;AACA;AACA,+BAA+B;AAC/B,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACO,sBAAsB,iEAAO;AACpC;AACA;AACA;AACA,eAAe,UAAU;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,uDAAQ;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,sBAAsB;AACrC,gBAAgB,eAAe;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,6DAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACpSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,wCAAwC,OAAO;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;UCjDA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA,8CAA8C;;;;;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","sources":["webpack://sae-2023-groupei-lasoa-gomis/./node_modules/@socket.io/component-emitter/index.mjs","webpack://sae-2023-groupei-lasoa-gomis/./client/src/Player.js","webpack://sae-2023-groupei-lasoa-gomis/./client/src/Ressources.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/contrib/has-cors.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/contrib/parseqs.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/contrib/parseuri.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/contrib/yeast.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/globalThis.browser.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/index.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/socket.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transport.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transports/index.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transports/polling.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transports/websocket.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-client/build/esm/util.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-parser/build/esm/commons.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-parser/build/esm/decodePacket.browser.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-parser/build/esm/encodePacket.browser.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/engine.io-parser/build/esm/index.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/contrib/backo2.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/index.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/manager.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/on.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/socket.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-client/build/esm/url.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-parser/build/esm/binary.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-parser/build/esm/index.js","webpack://sae-2023-groupei-lasoa-gomis/./node_modules/socket.io-parser/build/esm/is-binary.js","webpack://sae-2023-groupei-lasoa-gomis/webpack/bootstrap","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/define property getters","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/hasOwnProperty shorthand","webpack://sae-2023-groupei-lasoa-gomis/webpack/runtime/make namespace object","webpack://sae-2023-groupei-lasoa-gomis/./client/src/main.js"],"sourcesContent":["/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n\n var args = new Array(arguments.length - 1)\n , callbacks = this._callbacks['$' + event];\n\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n","import { Sushi } from \"./Ressources.js\";\r\n\r\nclass Player {\r\n image = new Image();\r\n constructor(x, y, radius, imageFolder, id, imageId) {\r\n this.id = id;\r\n this.x = x;\r\n this.y = y;\r\n this.radius = radius;\r\n this.speed = 4;\r\n this.direction = {\r\n x: 0,\r\n y: 0,\r\n };\r\n this.imageId = imageId;\r\n this.imageFolder = imageFolder;\r\n this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`;\r\n }\r\n draw(ctx) {\r\n // Dessiner le cercle\r\n ctx.beginPath();\r\n ctx.drawImage(\r\n this.image,\r\n this.x - this.radius,\r\n this.y - this.radius,\r\n this.radius * 2,\r\n this.radius * 2\r\n );\r\n ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);\r\n ctx.strokeStyle = \"black\";\r\n ctx.stroke();\r\n }\r\n\r\n grow() {\r\n this.radius += 0.5;\r\n console.log(this.radius % 30);\r\n if (this.radius % 30 === 0 && this.imageId <= 5) {\r\n this.imageId += 1;\r\n this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`;\r\n }\r\n }\r\n\r\n eatSushi(sushis, socket) {\r\n sushis.forEach((sushi, idx) => {\r\n const dx = sushi.x - this.x;\r\n const dy = sushi.y - this.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n if (distance < this.radius && !sushi.drop) {\r\n sushi.drop = true;\r\n socket.emit(\"updateSushi\", idx);\r\n this.grow();\r\n }\r\n });\r\n }\r\n\r\n move(ctx, mouseX, mouseY) {\r\n // Déplacer le cercle en fonction de la direction\r\n if (\r\n mouseX > ctx.canvas.width / 2 - this.radius &&\r\n mouseX < ctx.canvas.width / 2 + this.radius &&\r\n mouseY > ctx.canvas.height / 2 - this.radius &&\r\n mouseY < ctx.canvas.height / 2 + this.radius\r\n ) {\r\n return;\r\n }\r\n this.x += this.direction.x * this.speed;\r\n this.y += this.direction.y * this.speed;\r\n\r\n if (this.x < this.radius + ctx.canvas.width / 2)\r\n this.x = this.radius + ctx.canvas.width / 2;\r\n if (this.y < this.radius + ctx.canvas.height / 2)\r\n this.y = this.radius + ctx.canvas.height / 2;\r\n if (this.x > ctx.width - this.radius - ctx.canvas.width / 2) {\r\n this.x = ctx.width - this.radius - ctx.canvas.width / 2;\r\n }\r\n if (this.y > ctx.height - this.radius - ctx.canvas.height / 2) {\r\n this.y = ctx.height - this.radius - ctx.canvas.height / 2;\r\n }\r\n }\r\n moveTo(x, y, canvas) {\r\n const directionX = x - canvas.width / 2;\r\n const directionY = y - canvas.height / 2;\r\n\r\n const distance = Math.sqrt(directionX ** 2 + directionY ** 2);\r\n this.direction.x = directionX / distance;\r\n this.direction.y = directionY / distance;\r\n }\r\n}\r\n\r\nexport default Player;\r\n","class Ressources {\r\n constructor(name, x, y, size, image) {\r\n this.name = name;\r\n this.x = x;\r\n this.y = y;\r\n this.size = size;\r\n this.image = image;\r\n this.drop = false;\r\n }\r\n}\r\n\r\nexport class Sushi extends Ressources {\r\n constructor(x, y, size) {\r\n const backgroundImage = new Image();\r\n backgroundImage.src = \"/images/sushi.png\";\r\n super(\"sushi\", x, y, size, backgroundImage);\r\n }\r\n\r\n draw(ctx) {\r\n ctx.beginPath();\r\n ctx.drawImage(this.image, this.x, this.y, 25, 25);\r\n ctx.closePath();\r\n }\r\n}\r\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n value = typeof XMLHttpRequest !== 'undefined' &&\n 'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n // if XMLHttp support is disabled in IE then it will throw\n // when trying to create\n}\nexport const hasCORS = value;\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n let str = '';\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (str.length)\n str += '&';\n str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n }\n }\n return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n let qry = {};\n let pairs = qs.split('&');\n for (let i = 0, l = pairs.length; i < l; i++) {\n let pair = pairs[i].split('=');\n qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n return qry;\n}\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n const src = str, b = str.indexOf('['), e = str.indexOf(']');\n if (b != -1 && e != -1) {\n str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n }\n let m = re.exec(str || ''), uri = {}, i = 14;\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n if (b != -1 && e != -1) {\n uri.source = src;\n uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n uri.ipv6uri = true;\n }\n uri.pathNames = pathNames(uri, uri['path']);\n uri.queryKey = queryKey(uri, uri['query']);\n return uri;\n}\nfunction pathNames(obj, path) {\n const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n if (path.slice(0, 1) == '/' || path.length === 0) {\n names.splice(0, 1);\n }\n if (path.slice(-1) == '/') {\n names.splice(names.length - 1, 1);\n }\n return names;\n}\nfunction queryKey(uri, query) {\n const data = {};\n query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n if ($1) {\n data[$1] = $2;\n }\n });\n return data;\n}\n","// imported from https://github.com/unshiftio/yeast\n'use strict';\nconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split(''), length = 64, map = {};\nlet seed = 0, i = 0, prev;\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nexport function encode(num) {\n let encoded = '';\n do {\n encoded = alphabet[num % length] + encoded;\n num = Math.floor(num / length);\n } while (num > 0);\n return encoded;\n}\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nexport function decode(str) {\n let decoded = 0;\n for (i = 0; i < str.length; i++) {\n decoded = decoded * length + map[str.charAt(i)];\n }\n return decoded;\n}\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nexport function yeast() {\n const now = encode(+new Date());\n if (now !== prev)\n return seed = 0, prev = now;\n return now + '.' + encode(seed++);\n}\n//\n// Map each character to its index.\n//\nfor (; i < length; i++)\n map[alphabet[i]] = i;\n","export const globalThisShim = (() => {\n if (typeof self !== \"undefined\") {\n return self;\n }\n else if (typeof window !== \"undefined\") {\n return window;\n }\n else {\n return Function(\"return this\")();\n }\n})();\n","import { Socket } from \"./socket.js\";\nexport { Socket };\nexport const protocol = Socket.protocol;\nexport { Transport } from \"./transport.js\";\nexport { transports } from \"./transports/index.js\";\nexport { installTimerFunctions } from \"./util.js\";\nexport { parse } from \"./contrib/parseuri.js\";\nexport { nextTick } from \"./transports/websocket-constructor.js\";\n","import { transports } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nexport class Socket extends Emitter {\n /**\n * Socket constructor.\n *\n * @param {String|Object} uri - uri or options\n * @param {Object} opts - options\n */\n constructor(uri, opts = {}) {\n super();\n this.writeBuffer = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = null;\n }\n if (uri) {\n uri = parse(uri);\n opts.hostname = uri.host;\n opts.secure = uri.protocol === \"https\" || uri.protocol === \"wss\";\n opts.port = uri.port;\n if (uri.query)\n opts.query = uri.query;\n }\n else if (opts.host) {\n opts.hostname = parse(opts.host).host;\n }\n installTimerFunctions(this, opts);\n this.secure =\n null != opts.secure\n ? opts.secure\n : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n if (opts.hostname && !opts.port) {\n // if no port is specified manually, use the protocol default\n opts.port = this.secure ? \"443\" : \"80\";\n }\n this.hostname =\n opts.hostname ||\n (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n this.port =\n opts.port ||\n (typeof location !== \"undefined\" && location.port\n ? location.port\n : this.secure\n ? \"443\"\n : \"80\");\n this.transports = opts.transports || [\"polling\", \"websocket\"];\n this.writeBuffer = [];\n this.prevBufferLen = 0;\n this.opts = Object.assign({\n path: \"/engine.io\",\n agent: false,\n withCredentials: false,\n upgrade: true,\n timestampParam: \"t\",\n rememberUpgrade: false,\n addTrailingSlash: true,\n rejectUnauthorized: true,\n perMessageDeflate: {\n threshold: 1024,\n },\n transportOptions: {},\n closeOnBeforeunload: true,\n }, opts);\n this.opts.path =\n this.opts.path.replace(/\\/$/, \"\") +\n (this.opts.addTrailingSlash ? \"/\" : \"\");\n if (typeof this.opts.query === \"string\") {\n this.opts.query = decode(this.opts.query);\n }\n // set on handshake\n this.id = null;\n this.upgrades = null;\n this.pingInterval = null;\n this.pingTimeout = null;\n // set on heartbeat\n this.pingTimeoutTimer = null;\n if (typeof addEventListener === \"function\") {\n if (this.opts.closeOnBeforeunload) {\n // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n // closed/reloaded)\n this.beforeunloadEventListener = () => {\n if (this.transport) {\n // silently close the transport\n this.transport.removeAllListeners();\n this.transport.close();\n }\n };\n addEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n }\n if (this.hostname !== \"localhost\") {\n this.offlineEventListener = () => {\n this.onClose(\"transport close\", {\n description: \"network connection lost\",\n });\n };\n addEventListener(\"offline\", this.offlineEventListener, false);\n }\n }\n this.open();\n }\n /**\n * Creates transport of the given type.\n *\n * @param {String} name - transport name\n * @return {Transport}\n * @private\n */\n createTransport(name) {\n const query = Object.assign({}, this.opts.query);\n // append engine.io protocol identifier\n query.EIO = protocol;\n // transport name\n query.transport = name;\n // session id if we already have one\n if (this.id)\n query.sid = this.id;\n const opts = Object.assign({}, this.opts.transportOptions[name], this.opts, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n });\n return new transports[name](opts);\n }\n /**\n * Initializes transport to use and starts probe.\n *\n * @private\n */\n open() {\n let transport;\n if (this.opts.rememberUpgrade &&\n Socket.priorWebsocketSuccess &&\n this.transports.indexOf(\"websocket\") !== -1) {\n transport = \"websocket\";\n }\n else if (0 === this.transports.length) {\n // Emit error on next tick so it can be listened to\n this.setTimeoutFn(() => {\n this.emitReserved(\"error\", \"No transports available\");\n }, 0);\n return;\n }\n else {\n transport = this.transports[0];\n }\n this.readyState = \"opening\";\n // Retry with the next transport if the transport is disabled (jsonp: false)\n try {\n transport = this.createTransport(transport);\n }\n catch (e) {\n this.transports.shift();\n this.open();\n return;\n }\n transport.open();\n this.setTransport(transport);\n }\n /**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @private\n */\n setTransport(transport) {\n if (this.transport) {\n this.transport.removeAllListeners();\n }\n // set up transport\n this.transport = transport;\n // set up transport listeners\n transport\n .on(\"drain\", this.onDrain.bind(this))\n .on(\"packet\", this.onPacket.bind(this))\n .on(\"error\", this.onError.bind(this))\n .on(\"close\", (reason) => this.onClose(\"transport close\", reason));\n }\n /**\n * Probes a transport.\n *\n * @param {String} name - transport name\n * @private\n */\n probe(name) {\n let transport = this.createTransport(name);\n let failed = false;\n Socket.priorWebsocketSuccess = false;\n const onTransportOpen = () => {\n if (failed)\n return;\n transport.send([{ type: \"ping\", data: \"probe\" }]);\n transport.once(\"packet\", (msg) => {\n if (failed)\n return;\n if (\"pong\" === msg.type && \"probe\" === msg.data) {\n this.upgrading = true;\n this.emitReserved(\"upgrading\", transport);\n if (!transport)\n return;\n Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n this.transport.pause(() => {\n if (failed)\n return;\n if (\"closed\" === this.readyState)\n return;\n cleanup();\n this.setTransport(transport);\n transport.send([{ type: \"upgrade\" }]);\n this.emitReserved(\"upgrade\", transport);\n transport = null;\n this.upgrading = false;\n this.flush();\n });\n }\n else {\n const err = new Error(\"probe error\");\n // @ts-ignore\n err.transport = transport.name;\n this.emitReserved(\"upgradeError\", err);\n }\n });\n };\n function freezeTransport() {\n if (failed)\n return;\n // Any callback called by transport should be ignored since now\n failed = true;\n cleanup();\n transport.close();\n transport = null;\n }\n // Handle any error that happens while probing\n const onerror = (err) => {\n const error = new Error(\"probe error: \" + err);\n // @ts-ignore\n error.transport = transport.name;\n freezeTransport();\n this.emitReserved(\"upgradeError\", error);\n };\n function onTransportClose() {\n onerror(\"transport closed\");\n }\n // When the socket is closed while we're probing\n function onclose() {\n onerror(\"socket closed\");\n }\n // When the socket is upgraded while we're probing\n function onupgrade(to) {\n if (transport && to.name !== transport.name) {\n freezeTransport();\n }\n }\n // Remove all listeners on the transport and on self\n const cleanup = () => {\n transport.removeListener(\"open\", onTransportOpen);\n transport.removeListener(\"error\", onerror);\n transport.removeListener(\"close\", onTransportClose);\n this.off(\"close\", onclose);\n this.off(\"upgrading\", onupgrade);\n };\n transport.once(\"open\", onTransportOpen);\n transport.once(\"error\", onerror);\n transport.once(\"close\", onTransportClose);\n this.once(\"close\", onclose);\n this.once(\"upgrading\", onupgrade);\n transport.open();\n }\n /**\n * Called when connection is deemed open.\n *\n * @private\n */\n onOpen() {\n this.readyState = \"open\";\n Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n this.emitReserved(\"open\");\n this.flush();\n // we check for `readyState` in case an `open`\n // listener already closed the socket\n if (\"open\" === this.readyState && this.opts.upgrade) {\n let i = 0;\n const l = this.upgrades.length;\n for (; i < l; i++) {\n this.probe(this.upgrades[i]);\n }\n }\n }\n /**\n * Handles a packet.\n *\n * @private\n */\n onPacket(packet) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n this.emitReserved(\"packet\", packet);\n // Socket is live - any packet counts\n this.emitReserved(\"heartbeat\");\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\n this.resetPingTimeout();\n this.sendPacket(\"pong\");\n this.emitReserved(\"ping\");\n this.emitReserved(\"pong\");\n break;\n case \"error\":\n const err = new Error(\"server error\");\n // @ts-ignore\n err.code = packet.data;\n this.onError(err);\n break;\n case \"message\":\n this.emitReserved(\"data\", packet.data);\n this.emitReserved(\"message\", packet.data);\n break;\n }\n }\n else {\n }\n }\n /**\n * Called upon handshake completion.\n *\n * @param {Object} data - handshake obj\n * @private\n */\n onHandshake(data) {\n this.emitReserved(\"handshake\", data);\n this.id = data.sid;\n this.transport.query.sid = data.sid;\n this.upgrades = this.filterUpgrades(data.upgrades);\n this.pingInterval = data.pingInterval;\n this.pingTimeout = data.pingTimeout;\n this.maxPayload = data.maxPayload;\n this.onOpen();\n // In case open handler closes socket\n if (\"closed\" === this.readyState)\n return;\n this.resetPingTimeout();\n }\n /**\n * Sets and resets ping timeout timer based on server pings.\n *\n * @private\n */\n resetPingTimeout() {\n this.clearTimeoutFn(this.pingTimeoutTimer);\n this.pingTimeoutTimer = this.setTimeoutFn(() => {\n this.onClose(\"ping timeout\");\n }, this.pingInterval + this.pingTimeout);\n if (this.opts.autoUnref) {\n this.pingTimeoutTimer.unref();\n }\n }\n /**\n * Called on `drain` event\n *\n * @private\n */\n onDrain() {\n this.writeBuffer.splice(0, this.prevBufferLen);\n // setting prevBufferLen = 0 is very important\n // for example, when upgrading, upgrade packet is sent over,\n // and a nonzero prevBufferLen could cause problems on `drain`\n this.prevBufferLen = 0;\n if (0 === this.writeBuffer.length) {\n this.emitReserved(\"drain\");\n }\n else {\n this.flush();\n }\n }\n /**\n * Flush write buffers.\n *\n * @private\n */\n flush() {\n if (\"closed\" !== this.readyState &&\n this.transport.writable &&\n !this.upgrading &&\n this.writeBuffer.length) {\n const packets = this.getWritablePackets();\n this.transport.send(packets);\n // keep track of current length of writeBuffer\n // splice writeBuffer and callbackBuffer on `drain`\n this.prevBufferLen = packets.length;\n this.emitReserved(\"flush\");\n }\n }\n /**\n * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n * long-polling)\n *\n * @private\n */\n getWritablePackets() {\n const shouldCheckPayloadSize = this.maxPayload &&\n this.transport.name === \"polling\" &&\n this.writeBuffer.length > 1;\n if (!shouldCheckPayloadSize) {\n return this.writeBuffer;\n }\n let payloadSize = 1; // first packet type\n for (let i = 0; i < this.writeBuffer.length; i++) {\n const data = this.writeBuffer[i].data;\n if (data) {\n payloadSize += byteLength(data);\n }\n if (i > 0 && payloadSize > this.maxPayload) {\n return this.writeBuffer.slice(0, i);\n }\n payloadSize += 2; // separator + packet type\n }\n return this.writeBuffer;\n }\n /**\n * Sends a message.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} callback function.\n * @return {Socket} for chaining.\n */\n write(msg, options, fn) {\n this.sendPacket(\"message\", msg, options, fn);\n return this;\n }\n send(msg, options, fn) {\n this.sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a packet.\n *\n * @param {String} type: packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @private\n */\n sendPacket(type, data, options, fn) {\n if (\"function\" === typeof data) {\n fn = data;\n data = undefined;\n }\n if (\"function\" === typeof options) {\n fn = options;\n options = null;\n }\n if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n return;\n }\n options = options || {};\n options.compress = false !== options.compress;\n const packet = {\n type: type,\n data: data,\n options: options,\n };\n this.emitReserved(\"packetCreate\", packet);\n this.writeBuffer.push(packet);\n if (fn)\n this.once(\"flush\", fn);\n this.flush();\n }\n /**\n * Closes the connection.\n */\n close() {\n const close = () => {\n this.onClose(\"forced close\");\n this.transport.close();\n };\n const cleanupAndClose = () => {\n this.off(\"upgrade\", cleanupAndClose);\n this.off(\"upgradeError\", cleanupAndClose);\n close();\n };\n const waitForUpgrade = () => {\n // wait for upgrade to finish since we can't send packets while pausing a transport\n this.once(\"upgrade\", cleanupAndClose);\n this.once(\"upgradeError\", cleanupAndClose);\n };\n if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n this.readyState = \"closing\";\n if (this.writeBuffer.length) {\n this.once(\"drain\", () => {\n if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n });\n }\n else if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n }\n return this;\n }\n /**\n * Called upon transport error\n *\n * @private\n */\n onError(err) {\n Socket.priorWebsocketSuccess = false;\n this.emitReserved(\"error\", err);\n this.onClose(\"transport error\", err);\n }\n /**\n * Called upon transport close.\n *\n * @private\n */\n onClose(reason, description) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n // clear timers\n this.clearTimeoutFn(this.pingTimeoutTimer);\n // stop event from firing again for transport\n this.transport.removeAllListeners(\"close\");\n // ensure transport won't stay open\n this.transport.close();\n // ignore further transport communication\n this.transport.removeAllListeners();\n if (typeof removeEventListener === \"function\") {\n removeEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n removeEventListener(\"offline\", this.offlineEventListener, false);\n }\n // set ready state\n this.readyState = \"closed\";\n // clear session id\n this.id = null;\n // emit close event\n this.emitReserved(\"close\", reason, description);\n // clean buffers after, so users can still\n // grab the buffers on `close` event\n this.writeBuffer = [];\n this.prevBufferLen = 0;\n }\n }\n /**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} upgrades - server upgrades\n * @private\n */\n filterUpgrades(upgrades) {\n const filteredUpgrades = [];\n let i = 0;\n const j = upgrades.length;\n for (; i < j; i++) {\n if (~this.transports.indexOf(upgrades[i]))\n filteredUpgrades.push(upgrades[i]);\n }\n return filteredUpgrades;\n }\n}\nSocket.protocol = protocol;\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nclass TransportError extends Error {\n constructor(reason, description, context) {\n super(reason);\n this.description = description;\n this.context = context;\n this.type = \"TransportError\";\n }\n}\nexport class Transport extends Emitter {\n /**\n * Transport abstract constructor.\n *\n * @param {Object} opts - options\n * @protected\n */\n constructor(opts) {\n super();\n this.writable = false;\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.query = opts.query;\n this.socket = opts.socket;\n }\n /**\n * Emits an error.\n *\n * @param {String} reason\n * @param description\n * @param context - the error context\n * @return {Transport} for chaining\n * @protected\n */\n onError(reason, description, context) {\n super.emitReserved(\"error\", new TransportError(reason, description, context));\n return this;\n }\n /**\n * Opens the transport.\n */\n open() {\n this.readyState = \"opening\";\n this.doOpen();\n return this;\n }\n /**\n * Closes the transport.\n */\n close() {\n if (this.readyState === \"opening\" || this.readyState === \"open\") {\n this.doClose();\n this.onClose();\n }\n return this;\n }\n /**\n * Sends multiple packets.\n *\n * @param {Array} packets\n */\n send(packets) {\n if (this.readyState === \"open\") {\n this.write(packets);\n }\n else {\n // this might happen if the transport was silently closed in the beforeunload event handler\n }\n }\n /**\n * Called upon open\n *\n * @protected\n */\n onOpen() {\n this.readyState = \"open\";\n this.writable = true;\n super.emitReserved(\"open\");\n }\n /**\n * Called with data.\n *\n * @param {String} data\n * @protected\n */\n onData(data) {\n const packet = decodePacket(data, this.socket.binaryType);\n this.onPacket(packet);\n }\n /**\n * Called with a decoded packet.\n *\n * @protected\n */\n onPacket(packet) {\n super.emitReserved(\"packet\", packet);\n }\n /**\n * Called upon close.\n *\n * @protected\n */\n onClose(details) {\n this.readyState = \"closed\";\n super.emitReserved(\"close\", details);\n }\n /**\n * Pauses the transport, in order not to lose packets during an upgrade.\n *\n * @param onPause\n */\n pause(onPause) { }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nexport const transports = {\n websocket: WS,\n polling: Polling,\n};\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encode } from \"../contrib/parseqs.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { XHR as XMLHttpRequest } from \"./xmlhttprequest.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nfunction empty() { }\nconst hasXHR2 = (function () {\n const xhr = new XMLHttpRequest({\n xdomain: false,\n });\n return null != xhr.responseType;\n})();\nexport class Polling extends Transport {\n /**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @package\n */\n constructor(opts) {\n super(opts);\n this.polling = false;\n if (typeof location !== \"undefined\") {\n const isSSL = \"https:\" === location.protocol;\n let port = location.port;\n // some user agents have empty `location.port`\n if (!port) {\n port = isSSL ? \"443\" : \"80\";\n }\n this.xd =\n (typeof location !== \"undefined\" &&\n opts.hostname !== location.hostname) ||\n port !== opts.port;\n this.xs = opts.secure !== isSSL;\n }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n }\n get name() {\n return \"polling\";\n }\n /**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @protected\n */\n doOpen() {\n this.poll();\n }\n /**\n * Pauses polling.\n *\n * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n * @package\n */\n pause(onPause) {\n this.readyState = \"pausing\";\n const pause = () => {\n this.readyState = \"paused\";\n onPause();\n };\n if (this.polling || !this.writable) {\n let total = 0;\n if (this.polling) {\n total++;\n this.once(\"pollComplete\", function () {\n --total || pause();\n });\n }\n if (!this.writable) {\n total++;\n this.once(\"drain\", function () {\n --total || pause();\n });\n }\n }\n else {\n pause();\n }\n }\n /**\n * Starts polling cycle.\n *\n * @private\n */\n poll() {\n this.polling = true;\n this.doPoll();\n this.emitReserved(\"poll\");\n }\n /**\n * Overloads onData to detect payloads.\n *\n * @protected\n */\n onData(data) {\n const callback = (packet) => {\n // if its the first message we consider the transport open\n if (\"opening\" === this.readyState && packet.type === \"open\") {\n this.onOpen();\n }\n // if its a close packet, we close the ongoing requests\n if (\"close\" === packet.type) {\n this.onClose({ description: \"transport closed by the server\" });\n return false;\n }\n // otherwise bypass onData and handle the message\n this.onPacket(packet);\n };\n // decode payload\n decodePayload(data, this.socket.binaryType).forEach(callback);\n // if an event did not trigger closing\n if (\"closed\" !== this.readyState) {\n // if we got data we're not polling\n this.polling = false;\n this.emitReserved(\"pollComplete\");\n if (\"open\" === this.readyState) {\n this.poll();\n }\n else {\n }\n }\n }\n /**\n * For polling, send a close packet.\n *\n * @protected\n */\n doClose() {\n const close = () => {\n this.write([{ type: \"close\" }]);\n };\n if (\"open\" === this.readyState) {\n close();\n }\n else {\n // in case we're trying to close while\n // handshaking is in progress (GH-164)\n this.once(\"open\", close);\n }\n }\n /**\n * Writes a packets payload.\n *\n * @param {Array} packets - data packets\n * @protected\n */\n write(packets) {\n this.writable = false;\n encodePayload(packets, (data) => {\n this.doWrite(data, () => {\n this.writable = true;\n this.emitReserved(\"drain\");\n });\n });\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n let query = this.query || {};\n const schema = this.opts.secure ? \"https\" : \"http\";\n let port = \"\";\n // cache busting is forced\n if (false !== this.opts.timestampRequests) {\n query[this.opts.timestampParam] = yeast();\n }\n if (!this.supportsBinary && !query.sid) {\n query.b64 = 1;\n }\n // avoid port if default for schema\n if (this.opts.port &&\n ((\"https\" === schema && Number(this.opts.port) !== 443) ||\n (\"http\" === schema && Number(this.opts.port) !== 80))) {\n port = \":\" + this.opts.port;\n }\n const encodedQuery = encode(query);\n const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n return (schema +\n \"://\" +\n (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n port +\n this.opts.path +\n (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, xs: this.xs }, this.opts);\n return new Request(this.uri(), opts);\n }\n /**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @private\n */\n doWrite(data, fn) {\n const req = this.request({\n method: \"POST\",\n data: data,\n });\n req.on(\"success\", fn);\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr post error\", xhrStatus, context);\n });\n }\n /**\n * Starts a poll cycle.\n *\n * @private\n */\n doPoll() {\n const req = this.request();\n req.on(\"data\", this.onData.bind(this));\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr poll error\", xhrStatus, context);\n });\n this.pollXhr = req;\n }\n}\nexport class Request extends Emitter {\n /**\n * Request constructor\n *\n * @param {Object} options\n * @package\n */\n constructor(uri, opts) {\n super();\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.method = opts.method || \"GET\";\n this.uri = uri;\n this.async = false !== opts.async;\n this.data = undefined !== opts.data ? opts.data : null;\n this.create();\n }\n /**\n * Creates the XHR object and sends the request.\n *\n * @private\n */\n create() {\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n opts.xscheme = !!this.opts.xs;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, this.async);\n try {\n if (this.opts.extraHeaders) {\n xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n for (let i in this.opts.extraHeaders) {\n if (this.opts.extraHeaders.hasOwnProperty(i)) {\n xhr.setRequestHeader(i, this.opts.extraHeaders[i]);\n }\n }\n }\n }\n catch (e) { }\n if (\"POST\" === this.method) {\n try {\n xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n }\n catch (e) { }\n }\n try {\n xhr.setRequestHeader(\"Accept\", \"*/*\");\n }\n catch (e) { }\n // ie6 check\n if (\"withCredentials\" in xhr) {\n xhr.withCredentials = this.opts.withCredentials;\n }\n if (this.opts.requestTimeout) {\n xhr.timeout = this.opts.requestTimeout;\n }\n xhr.onreadystatechange = () => {\n if (4 !== xhr.readyState)\n return;\n if (200 === xhr.status || 1223 === xhr.status) {\n this.onLoad();\n }\n else {\n // make sure the `error` event handler that's user-set\n // does not throw in the same tick and gets caught here\n this.setTimeoutFn(() => {\n this.onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n }, 0);\n }\n };\n xhr.send(this.data);\n }\n catch (e) {\n // Need to defer since .create() is called directly from the constructor\n // and thus the 'error' event can only be only bound *after* this exception\n // occurs. Therefore, also, we cannot throw here at all.\n this.setTimeoutFn(() => {\n this.onError(e);\n }, 0);\n return;\n }\n if (typeof document !== \"undefined\") {\n this.index = Request.requestsCount++;\n Request.requests[this.index] = this;\n }\n }\n /**\n * Called upon error.\n *\n * @private\n */\n onError(err) {\n this.emitReserved(\"error\", err, this.xhr);\n this.cleanup(true);\n }\n /**\n * Cleans up house.\n *\n * @private\n */\n cleanup(fromError) {\n if (\"undefined\" === typeof this.xhr || null === this.xhr) {\n return;\n }\n this.xhr.onreadystatechange = empty;\n if (fromError) {\n try {\n this.xhr.abort();\n }\n catch (e) { }\n }\n if (typeof document !== \"undefined\") {\n delete Request.requests[this.index];\n }\n this.xhr = null;\n }\n /**\n * Called upon load.\n *\n * @private\n */\n onLoad() {\n const data = this.xhr.responseText;\n if (data !== null) {\n this.emitReserved(\"data\", data);\n this.emitReserved(\"success\");\n this.cleanup();\n }\n }\n /**\n * Aborts the request.\n *\n * @package\n */\n abort() {\n this.cleanup();\n }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n // @ts-ignore\n if (typeof attachEvent === \"function\") {\n // @ts-ignore\n attachEvent(\"onunload\", unloadHandler);\n }\n else if (typeof addEventListener === \"function\") {\n const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n addEventListener(terminationEvent, unloadHandler, false);\n }\n}\nfunction unloadHandler() {\n for (let i in Request.requests) {\n if (Request.requests.hasOwnProperty(i)) {\n Request.requests[i].abort();\n }\n }\n}\n","import { globalThisShim as globalThis } from \"../globalThis.js\";\nexport const nextTick = (() => {\n const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n if (isPromiseAvailable) {\n return (cb) => Promise.resolve().then(cb);\n }\n else {\n return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n }\n})();\nexport const WebSocket = globalThis.WebSocket || globalThis.MozWebSocket;\nexport const usingBrowserWebSocket = true;\nexport const defaultBinaryType = \"arraybuffer\";\n","import { Transport } from \"../transport.js\";\nimport { encode } from \"../contrib/parseqs.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { defaultBinaryType, nextTick, usingBrowserWebSocket, WebSocket, } from \"./websocket-constructor.js\";\nimport { encodePacket } from \"engine.io-parser\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n typeof navigator.product === \"string\" &&\n navigator.product.toLowerCase() === \"reactnative\";\nexport class WS extends Transport {\n /**\n * WebSocket transport constructor.\n *\n * @param {Object} opts - connection options\n * @protected\n */\n constructor(opts) {\n super(opts);\n this.supportsBinary = !opts.forceBase64;\n }\n get name() {\n return \"websocket\";\n }\n doOpen() {\n if (!this.check()) {\n // let probe timeout\n return;\n }\n const uri = this.uri();\n const protocols = this.opts.protocols;\n // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n const opts = isReactNative\n ? {}\n : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n if (this.opts.extraHeaders) {\n opts.headers = this.opts.extraHeaders;\n }\n try {\n this.ws =\n usingBrowserWebSocket && !isReactNative\n ? protocols\n ? new WebSocket(uri, protocols)\n : new WebSocket(uri)\n : new WebSocket(uri, protocols, opts);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this.ws.binaryType = this.socket.binaryType || defaultBinaryType;\n this.addEventListeners();\n }\n /**\n * Adds event listeners to the socket\n *\n * @private\n */\n addEventListeners() {\n this.ws.onopen = () => {\n if (this.opts.autoUnref) {\n this.ws._socket.unref();\n }\n this.onOpen();\n };\n this.ws.onclose = (closeEvent) => this.onClose({\n description: \"websocket connection closed\",\n context: closeEvent,\n });\n this.ws.onmessage = (ev) => this.onData(ev.data);\n this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n }\n write(packets) {\n this.writable = false;\n // encodePacket efficient as it uses WS framing\n // no need for encodePayload\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacket(packet, this.supportsBinary, (data) => {\n // always create a new object (GH-437)\n const opts = {};\n if (!usingBrowserWebSocket) {\n if (packet.options) {\n opts.compress = packet.options.compress;\n }\n if (this.opts.perMessageDeflate) {\n const len = \n // @ts-ignore\n \"string\" === typeof data ? Buffer.byteLength(data) : data.length;\n if (len < this.opts.perMessageDeflate.threshold) {\n opts.compress = false;\n }\n }\n }\n // Sometimes the websocket has already been closed but the browser didn't\n // have a chance of informing us about it yet, in that case send will\n // throw an error\n try {\n if (usingBrowserWebSocket) {\n // TypeError is thrown when passing the second argument on Safari\n this.ws.send(data);\n }\n else {\n this.ws.send(data, opts);\n }\n }\n catch (e) {\n }\n if (lastPacket) {\n // fake drain\n // defer to next tick to allow Socket to clear writeBuffer\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n if (typeof this.ws !== \"undefined\") {\n this.ws.close();\n this.ws = null;\n }\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n let query = this.query || {};\n const schema = this.opts.secure ? \"wss\" : \"ws\";\n let port = \"\";\n // avoid port if default for schema\n if (this.opts.port &&\n ((\"wss\" === schema && Number(this.opts.port) !== 443) ||\n (\"ws\" === schema && Number(this.opts.port) !== 80))) {\n port = \":\" + this.opts.port;\n }\n // append timestamp to URI\n if (this.opts.timestampRequests) {\n query[this.opts.timestampParam] = yeast();\n }\n // communicate binary support capabilities\n if (!this.supportsBinary) {\n query.b64 = 1;\n }\n const encodedQuery = encode(query);\n const ipv6 = this.opts.hostname.indexOf(\":\") !== -1;\n return (schema +\n \"://\" +\n (ipv6 ? \"[\" + this.opts.hostname + \"]\" : this.opts.hostname) +\n port +\n this.opts.path +\n (encodedQuery.length ? \"?\" + encodedQuery : \"\"));\n }\n /**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @private\n */\n check() {\n return !!WebSocket;\n }\n}\n","// browser shim for xmlhttprequest module\nimport { hasCORS } from \"../contrib/has-cors.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nexport function XHR(opts) {\n const xdomain = opts.xdomain;\n // XMLHttpRequest can be disabled on IE\n try {\n if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n return new XMLHttpRequest();\n }\n }\n catch (e) { }\n if (!xdomain) {\n try {\n return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n }\n catch (e) { }\n }\n}\n","import { globalThisShim as globalThis } from \"./globalThis.js\";\nexport function pick(obj, ...attr) {\n return attr.reduce((acc, k) => {\n if (obj.hasOwnProperty(k)) {\n acc[k] = obj[k];\n }\n return acc;\n }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n if (opts.useNativeTimers) {\n obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n }\n else {\n obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n if (typeof obj === \"string\") {\n return utf8Length(obj);\n }\n // arraybuffer or blob\n return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n let c = 0, length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n}\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach(key => {\n PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nexport const decode = (base64) => {\n let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst decodePacket = (encodedPacket, binaryType) => {\n if (typeof encodedPacket !== \"string\") {\n return {\n type: \"message\",\n data: mapBinary(encodedPacket, binaryType)\n };\n }\n const type = encodedPacket.charAt(0);\n if (type === \"b\") {\n return {\n type: \"message\",\n data: decodeBase64Packet(encodedPacket.substring(1), binaryType)\n };\n }\n const packetType = PACKET_TYPES_REVERSE[type];\n if (!packetType) {\n return ERROR_PACKET;\n }\n return encodedPacket.length > 1\n ? {\n type: PACKET_TYPES_REVERSE[type],\n data: encodedPacket.substring(1)\n }\n : {\n type: PACKET_TYPES_REVERSE[type]\n };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n if (withNativeArrayBuffer) {\n const decoded = decode(data);\n return mapBinary(decoded, binaryType);\n }\n else {\n return { base64: true, data }; // fallback for old browsers\n }\n};\nconst mapBinary = (data, binaryType) => {\n switch (binaryType) {\n case \"blob\":\n return data instanceof ArrayBuffer ? new Blob([data]) : data;\n case \"arraybuffer\":\n default:\n return data; // assuming the data is already an ArrayBuffer\n }\n};\nexport default decodePacket;\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = obj => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n if (withNativeBlob && data instanceof Blob) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(data, callback);\n }\n }\n else if (withNativeArrayBuffer &&\n (data instanceof ArrayBuffer || isView(data))) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(new Blob([data]), callback);\n }\n }\n // plain string\n return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n const fileReader = new FileReader();\n fileReader.onload = function () {\n const content = fileReader.result.split(\",\")[1];\n callback(\"b\" + (content || \"\"));\n };\n return fileReader.readAsDataURL(data);\n};\nexport default encodePacket;\n","import encodePacket from \"./encodePacket.js\";\nimport decodePacket from \"./decodePacket.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n // some packets may be added to the array while encoding, so the initial length must be saved\n const length = packets.length;\n const encodedPackets = new Array(length);\n let count = 0;\n packets.forEach((packet, i) => {\n // force base64 encoding for binary packets\n encodePacket(packet, false, encodedPacket => {\n encodedPackets[i] = encodedPacket;\n if (++count === length) {\n callback(encodedPackets.join(SEPARATOR));\n }\n });\n });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n const encodedPackets = encodedPayload.split(SEPARATOR);\n const packets = [];\n for (let i = 0; i < encodedPackets.length; i++) {\n const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n packets.push(decodedPacket);\n if (decodedPacket.type === \"error\") {\n break;\n }\n }\n return packets;\n};\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n opts = opts || {};\n this.ms = opts.min || 100;\n this.max = opts.max || 10000;\n this.factor = opts.factor || 2;\n this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n var ms = this.ms * Math.pow(this.factor, this.attempts++);\n if (this.jitter) {\n var rand = Math.random();\n var deviation = Math.floor(rand * this.jitter * ms);\n ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n }\n return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n this.jitter = jitter;\n};\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n if (typeof uri === \"object\") {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n const parsed = url(uri, opts.path || \"/socket.io\");\n const source = parsed.source;\n const id = parsed.id;\n const path = parsed.path;\n const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n const newConnection = opts.forceNew ||\n opts[\"force new connection\"] ||\n false === opts.multiplex ||\n sameNamespace;\n let io;\n if (newConnection) {\n io = new Manager(source, opts);\n }\n else {\n if (!cache[id]) {\n cache[id] = new Manager(source, opts);\n }\n io = cache[id];\n }\n if (parsed.query && !opts.query) {\n opts.query = parsed.queryKey;\n }\n return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n Manager,\n Socket,\n io: lookup,\n connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n constructor(uri, opts) {\n var _a;\n super();\n this.nsps = {};\n this.subs = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n opts.path = opts.path || \"/socket.io\";\n this.opts = opts;\n installTimerFunctions(this, opts);\n this.reconnection(opts.reconnection !== false);\n this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n this.reconnectionDelay(opts.reconnectionDelay || 1000);\n this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n this.backoff = new Backoff({\n min: this.reconnectionDelay(),\n max: this.reconnectionDelayMax(),\n jitter: this.randomizationFactor(),\n });\n this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n this._readyState = \"closed\";\n this.uri = uri;\n const _parser = opts.parser || parser;\n this.encoder = new _parser.Encoder();\n this.decoder = new _parser.Decoder();\n this._autoConnect = opts.autoConnect !== false;\n if (this._autoConnect)\n this.open();\n }\n reconnection(v) {\n if (!arguments.length)\n return this._reconnection;\n this._reconnection = !!v;\n return this;\n }\n reconnectionAttempts(v) {\n if (v === undefined)\n return this._reconnectionAttempts;\n this._reconnectionAttempts = v;\n return this;\n }\n reconnectionDelay(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelay;\n this._reconnectionDelay = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n return this;\n }\n randomizationFactor(v) {\n var _a;\n if (v === undefined)\n return this._randomizationFactor;\n this._randomizationFactor = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n return this;\n }\n reconnectionDelayMax(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelayMax;\n this._reconnectionDelayMax = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n return this;\n }\n timeout(v) {\n if (!arguments.length)\n return this._timeout;\n this._timeout = v;\n return this;\n }\n /**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @private\n */\n maybeReconnectOnOpen() {\n // Only try to reconnect if it's the first time we're connecting\n if (!this._reconnecting &&\n this._reconnection &&\n this.backoff.attempts === 0) {\n // keeps reconnection from firing twice for the same reconnection loop\n this.reconnect();\n }\n }\n /**\n * Sets the current transport `socket`.\n *\n * @param {Function} fn - optional, callback\n * @return self\n * @public\n */\n open(fn) {\n if (~this._readyState.indexOf(\"open\"))\n return this;\n this.engine = new Engine(this.uri, this.opts);\n const socket = this.engine;\n const self = this;\n this._readyState = \"opening\";\n this.skipReconnect = false;\n // emit `open`\n const openSubDestroy = on(socket, \"open\", function () {\n self.onopen();\n fn && fn();\n });\n // emit `error`\n const errorSub = on(socket, \"error\", (err) => {\n self.cleanup();\n self._readyState = \"closed\";\n this.emitReserved(\"error\", err);\n if (fn) {\n fn(err);\n }\n else {\n // Only do this if there is no fn to handle the error\n self.maybeReconnectOnOpen();\n }\n });\n if (false !== this._timeout) {\n const timeout = this._timeout;\n if (timeout === 0) {\n openSubDestroy(); // prevents a race condition with the 'open' event\n }\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n socket.close();\n // @ts-ignore\n socket.emit(\"error\", new Error(\"timeout\"));\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(function subDestroy() {\n clearTimeout(timer);\n });\n }\n this.subs.push(openSubDestroy);\n this.subs.push(errorSub);\n return this;\n }\n /**\n * Alias for open()\n *\n * @return self\n * @public\n */\n connect(fn) {\n return this.open(fn);\n }\n /**\n * Called upon transport open.\n *\n * @private\n */\n onopen() {\n // clear old subs\n this.cleanup();\n // mark as open\n this._readyState = \"open\";\n this.emitReserved(\"open\");\n // add new subs\n const socket = this.engine;\n this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n }\n /**\n * Called upon a ping.\n *\n * @private\n */\n onping() {\n this.emitReserved(\"ping\");\n }\n /**\n * Called with data.\n *\n * @private\n */\n ondata(data) {\n try {\n this.decoder.add(data);\n }\n catch (e) {\n this.onclose(\"parse error\", e);\n }\n }\n /**\n * Called when parser fully decodes a packet.\n *\n * @private\n */\n ondecoded(packet) {\n // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n nextTick(() => {\n this.emitReserved(\"packet\", packet);\n }, this.setTimeoutFn);\n }\n /**\n * Called upon socket error.\n *\n * @private\n */\n onerror(err) {\n this.emitReserved(\"error\", err);\n }\n /**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @public\n */\n socket(nsp, opts) {\n let socket = this.nsps[nsp];\n if (!socket) {\n socket = new Socket(this, nsp, opts);\n this.nsps[nsp] = socket;\n }\n else if (this._autoConnect && !socket.active) {\n socket.connect();\n }\n return socket;\n }\n /**\n * Called upon a socket close.\n *\n * @param socket\n * @private\n */\n _destroy(socket) {\n const nsps = Object.keys(this.nsps);\n for (const nsp of nsps) {\n const socket = this.nsps[nsp];\n if (socket.active) {\n return;\n }\n }\n this._close();\n }\n /**\n * Writes a packet.\n *\n * @param packet\n * @private\n */\n _packet(packet) {\n const encodedPackets = this.encoder.encode(packet);\n for (let i = 0; i < encodedPackets.length; i++) {\n this.engine.write(encodedPackets[i], packet.options);\n }\n }\n /**\n * Clean up transport subscriptions and packet buffer.\n *\n * @private\n */\n cleanup() {\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs.length = 0;\n this.decoder.destroy();\n }\n /**\n * Close the current socket.\n *\n * @private\n */\n _close() {\n this.skipReconnect = true;\n this._reconnecting = false;\n this.onclose(\"forced close\");\n if (this.engine)\n this.engine.close();\n }\n /**\n * Alias for close()\n *\n * @private\n */\n disconnect() {\n return this._close();\n }\n /**\n * Called upon engine close.\n *\n * @private\n */\n onclose(reason, description) {\n this.cleanup();\n this.backoff.reset();\n this._readyState = \"closed\";\n this.emitReserved(\"close\", reason, description);\n if (this._reconnection && !this.skipReconnect) {\n this.reconnect();\n }\n }\n /**\n * Attempt a reconnection.\n *\n * @private\n */\n reconnect() {\n if (this._reconnecting || this.skipReconnect)\n return this;\n const self = this;\n if (this.backoff.attempts >= this._reconnectionAttempts) {\n this.backoff.reset();\n this.emitReserved(\"reconnect_failed\");\n this._reconnecting = false;\n }\n else {\n const delay = this.backoff.duration();\n this._reconnecting = true;\n const timer = this.setTimeoutFn(() => {\n if (self.skipReconnect)\n return;\n this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n // check again for the case socket closed in above events\n if (self.skipReconnect)\n return;\n self.open((err) => {\n if (err) {\n self._reconnecting = false;\n self.reconnect();\n this.emitReserved(\"reconnect_error\", err);\n }\n else {\n self.onreconnect();\n }\n });\n }, delay);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(function subDestroy() {\n clearTimeout(timer);\n });\n }\n }\n /**\n * Called upon successful reconnect.\n *\n * @private\n */\n onreconnect() {\n const attempt = this.backoff.attempts;\n this._reconnecting = false;\n this.backoff.reset();\n this.emitReserved(\"reconnect\", attempt);\n }\n}\n","export function on(obj, ev, fn) {\n obj.on(ev, fn);\n return function subDestroy() {\n obj.off(ev, fn);\n };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n connect: 1,\n connect_error: 1,\n disconnect: 1,\n disconnecting: 1,\n // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n newListener: 1,\n removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n * // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n * console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n /**\n * `Socket` constructor.\n */\n constructor(io, nsp, opts) {\n super();\n /**\n * Whether the socket is currently connected to the server.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.connected); // true\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.connected); // false\n * });\n */\n this.connected = false;\n /**\n * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n * be transmitted by the server.\n */\n this.recovered = false;\n /**\n * Buffer for packets received before the CONNECT packet\n */\n this.receiveBuffer = [];\n /**\n * Buffer for packets that will be sent once the socket is connected\n */\n this.sendBuffer = [];\n /**\n * The queue of packets to be sent with retry in case of failure.\n *\n * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n * @private\n */\n this._queue = [];\n /**\n * A sequence to generate the ID of the {@link QueuedPacket}.\n * @private\n */\n this._queueSeq = 0;\n this.ids = 0;\n this.acks = {};\n this.flags = {};\n this.io = io;\n this.nsp = nsp;\n if (opts && opts.auth) {\n this.auth = opts.auth;\n }\n this._opts = Object.assign({}, opts);\n if (this.io._autoConnect)\n this.open();\n }\n /**\n * Whether the socket is currently disconnected\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.disconnected); // false\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.disconnected); // true\n * });\n */\n get disconnected() {\n return !this.connected;\n }\n /**\n * Subscribe to open, close and packet events\n *\n * @private\n */\n subEvents() {\n if (this.subs)\n return;\n const io = this.io;\n this.subs = [\n on(io, \"open\", this.onopen.bind(this)),\n on(io, \"packet\", this.onpacket.bind(this)),\n on(io, \"error\", this.onerror.bind(this)),\n on(io, \"close\", this.onclose.bind(this)),\n ];\n }\n /**\n * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n *\n * @example\n * const socket = io();\n *\n * console.log(socket.active); // true\n *\n * socket.on(\"disconnect\", (reason) => {\n * if (reason === \"io server disconnect\") {\n * // the disconnection was initiated by the server, you need to manually reconnect\n * console.log(socket.active); // false\n * }\n * // else the socket will automatically try to reconnect\n * console.log(socket.active); // true\n * });\n */\n get active() {\n return !!this.subs;\n }\n /**\n * \"Opens\" the socket.\n *\n * @example\n * const socket = io({\n * autoConnect: false\n * });\n *\n * socket.connect();\n */\n connect() {\n if (this.connected)\n return this;\n this.subEvents();\n if (!this.io[\"_reconnecting\"])\n this.io.open(); // ensure open\n if (\"open\" === this.io._readyState)\n this.onopen();\n return this;\n }\n /**\n * Alias for {@link connect()}.\n */\n open() {\n return this.connect();\n }\n /**\n * Sends a `message` event.\n *\n * This method mimics the WebSocket.send() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n *\n * @example\n * socket.send(\"hello\");\n *\n * // this is equivalent to\n * socket.emit(\"message\", \"hello\");\n *\n * @return self\n */\n send(...args) {\n args.unshift(\"message\");\n this.emit.apply(this, args);\n return this;\n }\n /**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @example\n * socket.emit(\"hello\", \"world\");\n *\n * // all serializable datastructures are supported (no need to call JSON.stringify)\n * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n *\n * // with an acknowledgement from the server\n * socket.emit(\"hello\", \"world\", (val) => {\n * // ...\n * });\n *\n * @return self\n */\n emit(ev, ...args) {\n if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n }\n args.unshift(ev);\n if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n this._addToQueue(args);\n return this;\n }\n const packet = {\n type: PacketType.EVENT,\n data: args,\n };\n packet.options = {};\n packet.options.compress = this.flags.compress !== false;\n // event ack callback\n if (\"function\" === typeof args[args.length - 1]) {\n const id = this.ids++;\n const ack = args.pop();\n this._registerAckCallback(id, ack);\n packet.id = id;\n }\n const isTransportWritable = this.io.engine &&\n this.io.engine.transport &&\n this.io.engine.transport.writable;\n const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected);\n if (discardPacket) {\n }\n else if (this.connected) {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n }\n else {\n this.sendBuffer.push(packet);\n }\n this.flags = {};\n return this;\n }\n /**\n * @private\n */\n _registerAckCallback(id, ack) {\n var _a;\n const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n if (timeout === undefined) {\n this.acks[id] = ack;\n return;\n }\n // @ts-ignore\n const timer = this.io.setTimeoutFn(() => {\n delete this.acks[id];\n for (let i = 0; i < this.sendBuffer.length; i++) {\n if (this.sendBuffer[i].id === id) {\n this.sendBuffer.splice(i, 1);\n }\n }\n ack.call(this, new Error(\"operation has timed out\"));\n }, timeout);\n this.acks[id] = (...args) => {\n // @ts-ignore\n this.io.clearTimeoutFn(timer);\n ack.apply(this, [null, ...args]);\n };\n }\n /**\n * Emits an event and waits for an acknowledgement\n *\n * @example\n * // without timeout\n * const response = await socket.emitWithAck(\"hello\", \"world\");\n *\n * // with a specific timeout\n * try {\n * const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n * } catch (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n *\n * @return a Promise that will be fulfilled when the server acknowledges the event\n */\n emitWithAck(ev, ...args) {\n // the timeout flag is optional\n const withErr = this.flags.timeout !== undefined || this._opts.ackTimeout !== undefined;\n return new Promise((resolve, reject) => {\n args.push((arg1, arg2) => {\n if (withErr) {\n return arg1 ? reject(arg1) : resolve(arg2);\n }\n else {\n return resolve(arg1);\n }\n });\n this.emit(ev, ...args);\n });\n }\n /**\n * Add the packet to the queue.\n * @param args\n * @private\n */\n _addToQueue(args) {\n let ack;\n if (typeof args[args.length - 1] === \"function\") {\n ack = args.pop();\n }\n const packet = {\n id: this._queueSeq++,\n tryCount: 0,\n pending: false,\n args,\n flags: Object.assign({ fromQueue: true }, this.flags),\n };\n args.push((err, ...responseArgs) => {\n if (packet !== this._queue[0]) {\n // the packet has already been acknowledged\n return;\n }\n const hasError = err !== null;\n if (hasError) {\n if (packet.tryCount > this._opts.retries) {\n this._queue.shift();\n if (ack) {\n ack(err);\n }\n }\n }\n else {\n this._queue.shift();\n if (ack) {\n ack(null, ...responseArgs);\n }\n }\n packet.pending = false;\n return this._drainQueue();\n });\n this._queue.push(packet);\n this._drainQueue();\n }\n /**\n * Send the first packet of the queue, and wait for an acknowledgement from the server.\n * @param force - whether to resend a packet that has not been acknowledged yet\n *\n * @private\n */\n _drainQueue(force = false) {\n if (!this.connected || this._queue.length === 0) {\n return;\n }\n const packet = this._queue[0];\n if (packet.pending && !force) {\n return;\n }\n packet.pending = true;\n packet.tryCount++;\n this.flags = packet.flags;\n this.emit.apply(this, packet.args);\n }\n /**\n * Sends a packet.\n *\n * @param packet\n * @private\n */\n packet(packet) {\n packet.nsp = this.nsp;\n this.io._packet(packet);\n }\n /**\n * Called upon engine `open`.\n *\n * @private\n */\n onopen() {\n if (typeof this.auth == \"function\") {\n this.auth((data) => {\n this._sendConnectPacket(data);\n });\n }\n else {\n this._sendConnectPacket(this.auth);\n }\n }\n /**\n * Sends a CONNECT packet to initiate the Socket.IO session.\n *\n * @param data\n * @private\n */\n _sendConnectPacket(data) {\n this.packet({\n type: PacketType.CONNECT,\n data: this._pid\n ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n : data,\n });\n }\n /**\n * Called upon engine or manager `error`.\n *\n * @param err\n * @private\n */\n onerror(err) {\n if (!this.connected) {\n this.emitReserved(\"connect_error\", err);\n }\n }\n /**\n * Called upon engine `close`.\n *\n * @param reason\n * @param description\n * @private\n */\n onclose(reason, description) {\n this.connected = false;\n delete this.id;\n this.emitReserved(\"disconnect\", reason, description);\n }\n /**\n * Called with socket packet.\n *\n * @param packet\n * @private\n */\n onpacket(packet) {\n const sameNamespace = packet.nsp === this.nsp;\n if (!sameNamespace)\n return;\n switch (packet.type) {\n case PacketType.CONNECT:\n if (packet.data && packet.data.sid) {\n this.onconnect(packet.data.sid, packet.data.pid);\n }\n else {\n this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n }\n break;\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n this.onevent(packet);\n break;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n this.onack(packet);\n break;\n case PacketType.DISCONNECT:\n this.ondisconnect();\n break;\n case PacketType.CONNECT_ERROR:\n this.destroy();\n const err = new Error(packet.data.message);\n // @ts-ignore\n err.data = packet.data.data;\n this.emitReserved(\"connect_error\", err);\n break;\n }\n }\n /**\n * Called upon a server event.\n *\n * @param packet\n * @private\n */\n onevent(packet) {\n const args = packet.data || [];\n if (null != packet.id) {\n args.push(this.ack(packet.id));\n }\n if (this.connected) {\n this.emitEvent(args);\n }\n else {\n this.receiveBuffer.push(Object.freeze(args));\n }\n }\n emitEvent(args) {\n if (this._anyListeners && this._anyListeners.length) {\n const listeners = this._anyListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n super.emit.apply(this, args);\n if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n this._lastOffset = args[args.length - 1];\n }\n }\n /**\n * Produces an ack callback to emit with an event.\n *\n * @private\n */\n ack(id) {\n const self = this;\n let sent = false;\n return function (...args) {\n // prevent double callbacks\n if (sent)\n return;\n sent = true;\n self.packet({\n type: PacketType.ACK,\n id: id,\n data: args,\n });\n };\n }\n /**\n * Called upon a server acknowlegement.\n *\n * @param packet\n * @private\n */\n onack(packet) {\n const ack = this.acks[packet.id];\n if (\"function\" === typeof ack) {\n ack.apply(this, packet.data);\n delete this.acks[packet.id];\n }\n else {\n }\n }\n /**\n * Called upon server connect.\n *\n * @private\n */\n onconnect(id, pid) {\n this.id = id;\n this.recovered = pid && this._pid === pid;\n this._pid = pid; // defined only if connection state recovery is enabled\n this.connected = true;\n this.emitBuffered();\n this.emitReserved(\"connect\");\n this._drainQueue(true);\n }\n /**\n * Emit buffered events (received and emitted).\n *\n * @private\n */\n emitBuffered() {\n this.receiveBuffer.forEach((args) => this.emitEvent(args));\n this.receiveBuffer = [];\n this.sendBuffer.forEach((packet) => {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n });\n this.sendBuffer = [];\n }\n /**\n * Called upon server disconnect.\n *\n * @private\n */\n ondisconnect() {\n this.destroy();\n this.onclose(\"io server disconnect\");\n }\n /**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @private\n */\n destroy() {\n if (this.subs) {\n // clean subscriptions to avoid reconnections\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs = undefined;\n }\n this.io[\"_destroy\"](this);\n }\n /**\n * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n *\n * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"disconnect\", (reason) => {\n * // console.log(reason); prints \"io client disconnect\"\n * });\n *\n * socket.disconnect();\n *\n * @return self\n */\n disconnect() {\n if (this.connected) {\n this.packet({ type: PacketType.DISCONNECT });\n }\n // remove socket from pool\n this.destroy();\n if (this.connected) {\n // fire events\n this.onclose(\"io client disconnect\");\n }\n return this;\n }\n /**\n * Alias for {@link disconnect()}.\n *\n * @return self\n */\n close() {\n return this.disconnect();\n }\n /**\n * Sets the compress flag.\n *\n * @example\n * socket.compress(false).emit(\"hello\");\n *\n * @param compress - if `true`, compresses the sending data\n * @return self\n */\n compress(compress) {\n this.flags.compress = compress;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n * ready to send messages.\n *\n * @example\n * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n *\n * @returns self\n */\n get volatile() {\n this.flags.volatile = true;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n * given number of milliseconds have elapsed without an acknowledgement from the server:\n *\n * @example\n * socket.timeout(5000).emit(\"my-event\", (err) => {\n * if (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n * });\n *\n * @returns self\n */\n timeout(timeout) {\n this.flags.timeout = timeout;\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * @example\n * socket.onAny((event, ...args) => {\n * console.log(`got ${event}`);\n * });\n *\n * @param listener\n */\n onAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * @example\n * socket.prependAny((event, ...args) => {\n * console.log(`got event ${event}`);\n * });\n *\n * @param listener\n */\n prependAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`got event ${event}`);\n * }\n *\n * socket.onAny(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAny(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAny();\n *\n * @param listener\n */\n offAny(listener) {\n if (!this._anyListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAny() {\n return this._anyListeners || [];\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.onAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n onAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.prependAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n prependAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`sent event ${event}`);\n * }\n *\n * socket.onAnyOutgoing(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAnyOutgoing(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAnyOutgoing();\n *\n * @param [listener] - the catch-all listener (optional)\n */\n offAnyOutgoing(listener) {\n if (!this._anyOutgoingListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyOutgoingListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyOutgoingListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAnyOutgoing() {\n return this._anyOutgoingListeners || [];\n }\n /**\n * Notify the listeners for each packet sent\n *\n * @param packet\n *\n * @private\n */\n notifyOutgoingListeners(packet) {\n if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n const listeners = this._anyOutgoingListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, packet.data);\n }\n }\n }\n}\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n * Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n let obj = uri;\n // default to window.location\n loc = loc || (typeof location !== \"undefined\" && location);\n if (null == uri)\n uri = loc.protocol + \"//\" + loc.host;\n // relative path support\n if (typeof uri === \"string\") {\n if (\"/\" === uri.charAt(0)) {\n if (\"/\" === uri.charAt(1)) {\n uri = loc.protocol + uri;\n }\n else {\n uri = loc.host + uri;\n }\n }\n if (!/^(https?|wss?):\\/\\//.test(uri)) {\n if (\"undefined\" !== typeof loc) {\n uri = loc.protocol + \"//\" + uri;\n }\n else {\n uri = \"https://\" + uri;\n }\n }\n // parse\n obj = parse(uri);\n }\n // make sure we treat `localhost:80` and `localhost` equally\n if (!obj.port) {\n if (/^(http|ws)$/.test(obj.protocol)) {\n obj.port = \"80\";\n }\n else if (/^(http|ws)s$/.test(obj.protocol)) {\n obj.port = \"443\";\n }\n }\n obj.path = obj.path || \"/\";\n const ipv6 = obj.host.indexOf(\":\") !== -1;\n const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n // define unique id\n obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n // define href\n obj.href =\n obj.protocol +\n \"://\" +\n host +\n (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n return obj;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n const buffers = [];\n const packetData = packet.data;\n const pack = packet;\n pack.data = _deconstructPacket(packetData, buffers);\n pack.attachments = buffers.length; // number of binary 'attachments'\n return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (isBinary(data)) {\n const placeholder = { _placeholder: true, num: buffers.length };\n buffers.push(data);\n return placeholder;\n }\n else if (Array.isArray(data)) {\n const newData = new Array(data.length);\n for (let i = 0; i < data.length; i++) {\n newData[i] = _deconstructPacket(data[i], buffers);\n }\n return newData;\n }\n else if (typeof data === \"object\" && !(data instanceof Date)) {\n const newData = {};\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n newData[key] = _deconstructPacket(data[key], buffers);\n }\n }\n return newData;\n }\n return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n packet.data = _reconstructPacket(packet.data, buffers);\n delete packet.attachments; // no longer useful\n return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (data && data._placeholder === true) {\n const isIndexValid = typeof data.num === \"number\" &&\n data.num >= 0 &&\n data.num < buffers.length;\n if (isIndexValid) {\n return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n }\n else {\n throw new Error(\"illegal attachments\");\n }\n }\n else if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n data[i] = _reconstructPacket(data[i], buffers);\n }\n }\n else if (typeof data === \"object\") {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n data[key] = _reconstructPacket(data[key], buffers);\n }\n }\n }\n return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if (hasBinary(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = deconstructPacket(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n /**\n * Decoder constructor\n *\n * @param {function} reviver - custom reviver to pass down to JSON.stringify\n */\n constructor(reviver) {\n super();\n this.reviver = reviver;\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if (isBinary(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n p.attachments = Number(buf);\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return typeof payload === \"object\";\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || typeof payload === \"object\";\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return Array.isArray(payload) && payload.length > 0;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = reconstructPacket(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n (typeof File !== \"undefined\" &&\n toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n (withNativeBlob && obj instanceof Blob) ||\n (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (hasBinary(obj[i])) {\n return true;\n }\n }\n return false;\n }\n if (isBinary(obj)) {\n return true;\n }\n if (obj.toJSON &&\n typeof obj.toJSON === \"function\" &&\n arguments.length === 1) {\n return hasBinary(obj.toJSON(), true);\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n return true;\n }\n }\n return false;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Player from \"./Player.js\";\r\nimport { Sushi } from \"./Ressources.js\";\r\nimport { io } from \"socket.io-client\";\r\n\r\nconst Main = (playerName, playerCharacter) => {\r\n const canvas = document.querySelector(\".map\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = document.documentElement.clientWidth;\r\n canvas.height = document.documentElement.clientHeight;\r\n ctx.width = 6000;\r\n ctx.height = 3340;\r\n const xStart = canvas.width / 2;\r\n const xEnd = ctx.width - canvas.width / 2;\r\n const yStart = canvas.height / 2;\r\n const yEnd = ctx.height - canvas.height / 2;\r\n\r\n window.addEventListener(\"resize\", (e) => {\r\n e.preventDefault();\r\n canvas.width = document.documentElement.clientWidth;\r\n canvas.height = document.documentElement.clientHeight;\r\n });\r\n\r\n const backgroundImage = new Image();\r\n backgroundImage.src = \"/images/map.jpg\";\r\n\r\n document.addEventListener(\"keydown\", (event) => {\r\n event.preventDefault();\r\n // Mettre à jour la direction en fonction des touches enfoncées\r\n switch (event.keyCode) {\r\n case 37: // Gauche\r\n player.direction.x = -1;\r\n break;\r\n case 38: // Haut\r\n player.direction.y = -1;\r\n break;\r\n case 39: // Droite\r\n player.direction.x = 1;\r\n break;\r\n case 40: // Bas\r\n player.direction.y = 1;\r\n break;\r\n }\r\n });\r\n\r\n document.addEventListener(\"keyup\", (event) => {\r\n event.preventDefault();\r\n // Mettre à jour la direction en fonction des touches relâchées\r\n switch (event.keyCode) {\r\n case 37: // Gauche\r\n if (player.direction.x < 0) {\r\n player.direction.x = 0;\r\n }\r\n break;\r\n case 38: // Haut\r\n if (player.direction.y < 0) {\r\n player.direction.y = 0;\r\n }\r\n break;\r\n case 39: // Droite\r\n if (player.direction.x > 0) {\r\n player.direction.x = 0;\r\n }\r\n break;\r\n case 40: // Bas\r\n if (player.direction.y > 0) {\r\n player.direction.y = 0;\r\n }\r\n break;\r\n }\r\n });\r\n\r\n const socket = io();\r\n\r\n let sushis = [];\r\n socket.on(\"sushis\", (data) => {\r\n for (let i = 0; i < data?.length; i++) {\r\n const sushi = new Sushi(\r\n data[i].x * (xEnd - xStart) + xStart,\r\n data[i].y * (-yStart + yEnd) + yStart,\r\n 5\r\n );\r\n sushis.push(sushi);\r\n }\r\n });\r\n\r\n let folder = playerCharacter;\r\n let userId;\r\n\r\n function getUserId() {\r\n return new Promise((resolve, reject) => {\r\n socket.on(\"user\", (data) => {\r\n userId = data;\r\n resolve(userId);\r\n });\r\n });\r\n }\r\n\r\n async function myFunction() {\r\n try {\r\n const userId = await getUserId();\r\n const player = new Player(\r\n Math.random() * (xEnd - xStart) + xStart,\r\n Math.random() * (-yStart + yEnd) + yStart,\r\n 20,\r\n folder,\r\n userId,\r\n 1\r\n );\r\n\r\n socket.emit(\"newUser\", player);\r\n\r\n let allUsers = [];\r\n socket.on(\"allUsers\", (datas) => {\r\n allUsers = datas;\r\n });\r\n\r\n socket.on(\"newSushi\", (data) => {\r\n console.log(sushis[data.drop]);\r\n sushis.splice(data.drop, 1);\r\n sushis.push(\r\n new Sushi(\r\n data.new.x * (xEnd - xStart) + xStart,\r\n data.new.y * (-yStart + yEnd) + yStart,\r\n 5\r\n )\r\n );\r\n });\r\n\r\n let mouseX;\r\n let mouseY;\r\n\r\n canvas.addEventListener(\"mousemove\", (event) => {\r\n event.preventDefault();\r\n mouseX = event.clientX;\r\n mouseY = event.clientY;\r\n\r\n player.moveTo(mouseX, mouseY, canvas);\r\n });\r\n\r\n function update() {\r\n ctx.save();\r\n ctx.clearRect(0, 0, ctx.width, ctx.height);\r\n ctx.beginPath();\r\n const cameraX = canvas.width / 2 - player.x;\r\n const cameraY = canvas.height / 2 - player.y;\r\n ctx.translate(cameraX, cameraY);\r\n ctx.drawImage(backgroundImage, 0, 0, ctx.width, ctx.height);\r\n sushis.forEach((sushi) => {\r\n sushi.draw(ctx);\r\n });\r\n allUsers.forEach((user) => {\r\n const otherPlayer = new Player(\r\n user.x,\r\n user.y,\r\n user.radius,\r\n user.imageFolder,\r\n user.id,\r\n user.imageId\r\n );\r\n otherPlayer.draw(ctx);\r\n });\r\n player.eatSushi(sushis, socket);\r\n player.move(ctx, mouseX, mouseY);\r\n ctx.restore();\r\n socket.emit(\"updateUser\", player);\r\n requestAnimationFrame(update);\r\n }\r\n update();\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n myFunction();\r\n};\r\n\r\nexport default Main;\r\n"],"names":["Sushi","Player","x","y","radius","imageFolder","id","imageId","_classCallCheck","_defineProperty","Image","speed","direction","image","src","concat","_createClass","key","value","draw","ctx","beginPath","drawImage","arc","Math","PI","strokeStyle","stroke","grow","console","log","eatSushi","sushis","socket","_this","forEach","sushi","idx","dx","dy","distance","sqrt","drop","emit","move","mouseX","mouseY","canvas","width","height","moveTo","directionX","directionY","pow","Ressources","name","size","_Ressources","_inherits","_super","_createSuper","backgroundImage","call","closePath","_regeneratorRuntime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","defineProperty","obj","desc","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","_typeof","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","done","methodName","undefined","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","_catch","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","arguments","apply","io","Main","playerName","playerCharacter","document","querySelector","getContext","documentElement","clientWidth","clientHeight","xStart","xEnd","yStart","yEnd","window","addEventListener","e","preventDefault","event","keyCode","player","on","data","folder","userId","getUserId","myFunction","_myFunction","_callee","update","_userId","_player","allUsers","_callee$","_context","save","clearRect","cameraX","cameraY","translate","user","otherPlayer","restore","requestAnimationFrame","random","datas","splice","clientX","clientY","t0"],"sourceRoot":""} \ No newline at end of file diff --git a/client/src/Player.js b/client/src/Player.js index 843be20727f1a211cebf1eef56531ecbdbce9fbc..5fb72b5e7311146a0f18dbb9b4d2a9bc64200aa1 100644 --- a/client/src/Player.js +++ b/client/src/Player.js @@ -1,6 +1,8 @@ +import { Sushi } from "./Ressources.js"; + class Player { image = new Image(); - constructor(x, y, radius, imageFolder, id) { + constructor(x, y, radius, imageFolder, id, imageId) { this.id = id; this.x = x; this.y = y; @@ -10,7 +12,7 @@ class Player { x: 0, y: 0, }; - this.imageId = 1; + this.imageId = imageId; this.imageFolder = imageFolder; this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`; } @@ -31,21 +33,21 @@ class Player { grow() { this.radius += 0.5; - if (this.radius % 80 === 0 && this.imageId <= 5) { + console.log(this.radius % 30); + if (this.radius % 30 === 0 && this.imageId <= 5) { this.imageId += 1; this.image.src = `/images/character/${this.imageFolder}/${this.imageFolder}${this.imageId}.png`; } } - eatSushi(sushis) { + eatSushi(sushis, socket) { sushis.forEach((sushi, idx) => { const dx = sushi.x - this.x; const dy = sushi.y - this.y; const distance = Math.sqrt(dx * dx + dy * dy); - if (distance < this.radius) { - // Supprime la nourriture de la liste - sushis.splice(idx, 1); - // Augmente la taille du joueur + if (distance < this.radius && !sushi.drop) { + sushi.drop = true; + socket.emit("updateSushi", idx); this.grow(); } }); diff --git a/client/src/Ressources.js b/client/src/Ressources.js index 733e7ff46f4ecd47fe13fb4e801ce4c776d0e60a..e669603c234bf0d07891b9f388b4b1a0a70d924a 100644 --- a/client/src/Ressources.js +++ b/client/src/Ressources.js @@ -5,6 +5,7 @@ class Ressources { this.y = y; this.size = size; this.image = image; + this.drop = false; } } diff --git a/client/src/main.js b/client/src/main.js index eae0349c44bef3df04398fdf81a0c2963fb83296..951f1a79416a17491384c4112f10219e5619b769 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -104,7 +104,8 @@ const Main = (playerName, playerCharacter) => { Math.random() * (-yStart + yEnd) + yStart, 20, folder, - userId + userId, + 1 ); socket.emit("newUser", player); @@ -114,6 +115,18 @@ const Main = (playerName, playerCharacter) => { allUsers = datas; }); + socket.on("newSushi", (data) => { + console.log(sushis[data.drop]); + sushis.splice(data.drop, 1); + sushis.push( + new Sushi( + data.new.x * (xEnd - xStart) + xStart, + data.new.y * (-yStart + yEnd) + yStart, + 5 + ) + ); + }); + let mouseX; let mouseY; @@ -142,11 +155,12 @@ const Main = (playerName, playerCharacter) => { user.y, user.radius, user.imageFolder, - user.id + user.id, + user.imageId ); otherPlayer.draw(ctx); }); - player.eatSushi(sushis); + player.eatSushi(sushis, socket); player.move(ctx, mouseX, mouseY); ctx.restore(); socket.emit("updateUser", player); diff --git a/server/index.js b/server/index.js index bf2ed3a134596b60d959cc83c1d5cde3ac1770d2..c48a9ae9ecf848fa7d538abf777de5e2ccdef2da 100644 --- a/server/index.js +++ b/server/index.js @@ -22,13 +22,21 @@ io.on("connection", (socket) => { users.push(data); socket.emit("allUsers", users); }); + socket.on("updateUser", (data) => { for (let i = 0; i < users.length; i++) { if (users[i].id === data.id) { users[i] = data; } + users.sort((a, b) => a.radius - b.radius); + socket.emit("allUsers", users); } - socket.emit("allUsers", users); + }); + + socket.on("updateSushi", (data) => { + sushis.splice(data, 1); + sushis.push({ x: Math.random(), y: Math.random() }); + io.emit("newSushi", { new: sushis[sushis.length - 1], drop: data }); }); });