From dc5a7ca431f7dc50d19dff8d8c996335d3c9fa71 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Sat, 6 Apr 2024 23:26:18 -0400 Subject: [PATCH 01/35] Display storage use of host/puter separately --- packages/backend/src/routers/df.js | 6 +++ .../src/services/HostDiskUsageService.js | 48 +++++++++++++++++-- src/UI/Settings/UIWindowSettings.js | 22 ++++++++- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/routers/df.js b/packages/backend/src/routers/df.js index 3e6aceac0..e8fb315b4 100644 --- a/packages/backend/src/routers/df.js +++ b/packages/backend/src/routers/df.js @@ -22,6 +22,8 @@ const config = require('../config.js'); const router = new express.Router(); const auth = require('../middleware/auth.js'); +// TODO: Why is this both a POST and a GET? + // -----------------------------------------------------------------------// // POST /df // -----------------------------------------------------------------------// @@ -35,11 +37,13 @@ router.post('/df', auth, express.json(), async (req, response, next)=>{ return response.status(400).send({code: 'account_is_not_verified', message: 'Account is not verified'}); const {df} = require('../helpers'); + const svc_hostDiskUsage = req.services.get('host-disk-usage', { optional: true }); try{ // auth response.send({ used: parseInt(await df(req.user.id)), capacity: config.is_storage_limited ? (req.user.free_storage === undefined || req.user.free_storage === null) ? config.storage_capacity : req.user.free_storage : config.available_device_storage, + ...(svc_hostDiskUsage ? svc_hostDiskUsage.get_extra() : {}), }); }catch(e){ console.log(e) @@ -60,11 +64,13 @@ router.get('/df', auth, express.json(), async (req, response, next)=>{ return response.status(400).send({code: 'account_is_not_verified', message: 'Account is not verified'}); const {df} = require('../helpers'); + const svc_hostDiskUsage = req.services.get('host-disk-usage', { optional: true }); try{ // auth response.send({ used: parseInt(await df(req.user.id)), capacity: config.is_storage_limited ? (req.user.free_storage === undefined || req.user.free_storage === null) ? config.storage_capacity : req.user.free_storage : config.available_device_storage, + ...(svc_hostDiskUsage ? svc_hostDiskUsage.get_extra() : {}), }); }catch(e){ console.log(e) diff --git a/packages/backend/src/services/HostDiskUsageService.js b/packages/backend/src/services/HostDiskUsageService.js index 464cf61e5..5e049aa7e 100644 --- a/packages/backend/src/services/HostDiskUsageService.js +++ b/packages/backend/src/services/HostDiskUsageService.js @@ -21,7 +21,6 @@ class HostDiskUsageService extends BaseService { } else if (current_platform == "linux") { const mountpoint = this.get_linux_mountpint(process.cwd()); free_space = this.get_disk_capacity_linux(mountpoint); - // TODO: Implement for linux systems } else if (current_platform == "win32") { this.log.warn('HostDiskUsageService: Windows is not supported yet'); // TODO: Implement for windows systems @@ -31,6 +30,31 @@ class HostDiskUsageService extends BaseService { config.available_device_storage = free_space; } + // TODO: TTL cache this value + get_host_usage () { + const current_platform = process.platform; + + let disk_use = 0; + if (current_platform == "darwin") { + const mountpoint = this.get_darwin_mountpoint(process.cwd()); + disk_use = this.get_disk_use_darwin(mountpoint); + } else if (current_platform == "linux") { + const mountpoint = this.get_linux_mountpint(process.cwd()); + disk_use = this.get_disk_use_linux(mountpoint); + } else if (current_platform == "win32") { + this.log.warn('HostDiskUsageService: Windows is not supported yet'); + // TODO: Implement for windows systems + } + return disk_use; + } + + // Called by the /df endpoint + get_extra () { + return { + host_used: this.get_host_usage(), + }; + } + // Get the mountpoint/drive of the current working directory in mac os get_darwin_mountpoint(directory) { @@ -50,14 +74,13 @@ class HostDiskUsageService extends BaseService { // Get the free space on the mountpoint/drive in mac os get_disk_capacity_darwin(mountpoint) { - const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $4}'`, { encoding: 'utf-8' }).trim().split(' '); + const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $2}'`, { encoding: 'utf-8' }).trim().split(' '); return parseInt(disk_info) * 512; } // Get the free space on the mountpoint/drive in linux get_disk_capacity_linux(mountpoint) { - // TODO: Implement for linux systems - const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $4}'`, { encoding: 'utf-8' }).trim().split(' '); + const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $2}'`, { encoding: 'utf-8' }).trim().split(' '); return parseInt(disk_info) * 1024; } @@ -65,6 +88,23 @@ class HostDiskUsageService extends BaseService { get_disk_capacity_windows(drive) { // TODO: Implement for windows systems } + + // Get the free space on the mountpoint/drive in mac os + get_disk_use_darwin(mountpoint) { + const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $4}'`, { encoding: 'utf-8' }).trim().split(' '); + return parseInt(disk_info) * 512; + } + + // Get the free space on the mountpoint/drive in linux + get_disk_use_linux(mountpoint) { + const disk_info = execSync(`df -P "${mountpoint}" | awk 'NR==2 {print $4}'`, { encoding: 'utf-8' }).trim().split(' '); + return parseInt(disk_info) * 1024; + } + + // Get the free space on the drive in windows + get_disk_use_windows(drive) { + // TODO: Implement for windows systems + } } module.exports = HostDiskUsageService; diff --git a/src/UI/Settings/UIWindowSettings.js b/src/UI/Settings/UIWindowSettings.js index e155bbd9e..728d246b9 100644 --- a/src/UI/Settings/UIWindowSettings.js +++ b/src/UI/Settings/UIWindowSettings.js @@ -58,10 +58,12 @@ async function UIWindowSettings(options){ used of +
+
` h += ``; @@ -247,10 +249,26 @@ async function UIWindowSettings(options){ let usage_percentage = (res.used / res.capacity * 100).toFixed(0); usage_percentage = usage_percentage > 100 ? 100 : usage_percentage; - $('#storage-used').html(byte_format(res.used)); + let general_used = res.used; + + let host_usage_percentage = 0; + if ( res.host_used ) { + $('#storage-puter-used').html(byte_format(res.used)); + $('#storage-puter-used-w').show(); + + general_used = res.host_used; + host_usage_percentage = ((res.host_used - res.used) / res.capacity * 100).toFixed(0); + } + + $('#storage-used').html(byte_format(general_used)); $('#storage-capacity').html(byte_format(res.capacity)); - $('#storage-used-percent').html(usage_percentage + '%'); + $('#storage-used-percent').html( + usage_percentage + '%' + + (host_usage_percentage > 0 + ? ' / ' + host_usage_percentage + '%' : '') + ); $('#storage-bar').css('width', usage_percentage + '%'); + $('#storage-bar-host').css('width', host_usage_percentage + '%'); if (usage_percentage >= 100) { $('#storage-bar').css({ 'border-top-right-radius': '3px', From 8018a607a82783330abc41b1d48607c2b7ddf192 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Sun, 7 Apr 2024 00:05:54 -0400 Subject: [PATCH 02/35] Add CSS --- src/css/style.css | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/css/style.css b/src/css/style.css index 8553d8fec..dc645a4e9 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -3478,6 +3478,7 @@ label { } #storage-bar { + float: left; height: 15px; background-color: #dbe3ef; border-top-left-radius: 3px; @@ -3485,12 +3486,20 @@ label { width: 0; } +#storage-bar-host { + float: left; + height: 15px; + background-color: #dbe3ef9c; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + width: 0; +} + #storage-used-percent { position: absolute; - left: calc(50% - 20px); text-align: center; display: inline-block; - width: 40px; + width: 100%; font-size: 13px; } From 79f98795c7c4c925a96548fe2a3fd93430e98dab Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Mon, 8 Apr 2024 17:05:47 -0400 Subject: [PATCH 03/35] Fix version checker using later javascript features --- run-selfhosted.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/run-selfhosted.js b/run-selfhosted.js index 3c63230c6..c2ddc1137 100644 --- a/run-selfhosted.js +++ b/run-selfhosted.js @@ -93,10 +93,18 @@ const early_init_errors = [ } ]; +const newstuff = { + // Nullish coalescing operator + nco: (...a) => a.reduce((acc, val) => acc == undefined ? val : acc), + // Optional chaining + oc: (obj, ...keys) => keys.reduce((acc, key) => acc ? acc[key] : undefined, obj), + oc_call: (maybe_fn, ...args) => maybe_fn ? maybe_fn(...args) : undefined, +};1 + const _print_error_help = (error_help) => { const lines = []; - lines.push(error_help.title ?? error_help.text); - for ( const note of (error_help.notes ?? []) ) { + lines.push(nco(error_help.title, error_help.text)); + for ( const note of (nco(error_help.notes, [])) ) { lines.push(`📝 ${note}`) } if ( error_help.suggestions ) { @@ -120,7 +128,7 @@ const _print_error_help = (error_help) => { await main(); } catch (e) { for ( const error_help of early_init_errors ) { - if ( e?.message?.includes(error_help.text) ) { + if ( oc_call(oc(e, message, includes), error_help.text) ) { _print_error_help(error_help); break; } From 068e620249b534f7732176237fa218102eebdab1 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Apr 2024 10:39:06 +0100 Subject: [PATCH 04/35] Add a message broadcasting service A broadcast is a message sent to every running app that uses Puter.js. Broadcasts have a name and a data payload, and are sent as a 'broadcast' message. Send a broadcast using: `globalThis.services.get('broadcast').sendBroadcast(...)` When doing so, you have the option to keep the broadcast message around, so that it can be sent to any newly-launched apps. Sending another broadcast with the same name will overwrite the previous one, so you don't have to worry about flooding a new app with duplicates. --- src/IPC.js | 3 ++ src/initgui.js | 2 ++ src/services/BroadcastService.js | 61 ++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 src/services/BroadcastService.js diff --git a/src/IPC.js b/src/IPC.js index de771e447..56e257876 100644 --- a/src/IPC.js +++ b/src/IPC.js @@ -105,6 +105,9 @@ window.addEventListener('message', async (event) => { }, '*'); delete window.child_launch_callbacks[event.data.appInstanceID]; } + + // Send any saved broadcasts to the new app + globalThis.services.get('broadcast').sendSavedBroadcastsTo(event.data.appInstanceID); } //------------------------------------------------- // windowFocused diff --git a/src/initgui.js b/src/initgui.js index b5d2afb37..dfb1e3b04 100644 --- a/src/initgui.js +++ b/src/initgui.js @@ -36,6 +36,7 @@ import PuterDialog from './UI/PuterDialog.js'; import determine_active_container_parent from './helpers/determine_active_container_parent.js'; import { ThemeService } from './services/ThemeService.js'; import UIWindowThemeDialog from './UI/UIWindowThemeDialog.js'; +import { BroadcastService } from './services/BroadcastService.js'; const launch_services = async function () { const services_l_ = []; @@ -49,6 +50,7 @@ const launch_services = async function () { services_m_[name] = instance; } + register('broadcast', new BroadcastService()); register('theme', new ThemeService()); for (const [_, instance] of services_l_) { diff --git a/src/services/BroadcastService.js b/src/services/BroadcastService.js new file mode 100644 index 000000000..e0e6a470d --- /dev/null +++ b/src/services/BroadcastService.js @@ -0,0 +1,61 @@ +/** + * Copyright (C) 2024 Puter Technologies Inc. + * + * This file is part of Puter. + * + * Puter is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { Service } from "../definitions.js"; + +export class BroadcastService extends Service { + // After a new app is launched, it will receive these broadcasts + #broadcastsToSendToNewAppInstances = new Map(); // name -> data + + async _init() { + // Nothing + } + + // Send a 'broadcast' message to all open apps, with the given name and data. + // If sendToNewAppInstances is true, the message will be saved, and sent to any apps that are launched later. + // A new saved broadcast will replace an earlier one with the same name. + sendBroadcast(name, data, { sendToNewAppInstances = false } = {}) { + $('.window-app-iframe[data-appUsesSDK=true]').each((_, iframe) => { + iframe.contentWindow.postMessage({ + msg: 'broadcast', + name: name, + data: data, + }, '*'); + }); + + if (sendToNewAppInstances) { + this.#broadcastsToSendToNewAppInstances.set(name, data); + } + } + + // Send all saved broadcast messages to the given app instance. + sendSavedBroadcastsTo(appInstanceID) { + const iframe = $(`.window[data-element_uuid="${appInstanceID}"] .window-app-iframe[data-appUsesSDK=true]`).get(0); + if (!iframe) { + console.error(`Attempted to send saved broadcasts to app instance ${appInstanceID}, which is not using the Puter SDK`); + return; + } + for (const [name, data] of this.#broadcastsToSendToNewAppInstances) { + iframe.contentWindow.postMessage({ + msg: 'broadcast', + name: name, + data: data, + }, '*'); + } + } +} From 59cdb6e8c6bd65468cffc3e6fc0936a0e93d1364 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Apr 2024 10:40:06 +0100 Subject: [PATCH 05/35] Broadcast when theme changes --- src/services/ThemeService.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/services/ThemeService.js b/src/services/ThemeService.js index afd6c8414..10921b3ef 100644 --- a/src/services/ThemeService.js +++ b/src/services/ThemeService.js @@ -31,7 +31,11 @@ const default_values = { }; export class ThemeService extends Service { + #broadcastService; + async _init () { + this.#broadcastService = globalThis.services.get('broadcast'); + this.state = { sat: 41.18, hue: 210, @@ -113,6 +117,16 @@ export class ThemeService extends Service { this.root.style.setProperty('--primary-saturation', s.sat + '%'); this.root.style.setProperty('--primary-lightness', s.lig + '%'); this.root.style.setProperty('--primary-alpha', s.alpha); + + // TODO: Should we debounce this to reduce traffic? + this.#broadcastService.sendBroadcast('themeChanged', { + palette: { + primaryHue: s.hue, + primarySaturation: s.sat + '%', + primaryLightness: s.lig + '%', + primaryAlpha: s.alpha, + }, + }, { sendToNewAppInstances: true }); } save_ () { From 84a31b3520dee9a67d4d24bbbd256f2de3ee48f6 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 8 Apr 2024 14:04:44 +0100 Subject: [PATCH 06/35] Broadcast when the language changes This is left open to future additions, by naming it 'locale', and having the language just be an object field. Side note, maybe we should have a LocaleService for this? --- src/helpers.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/helpers.js b/src/helpers.js index a8486d11e..7a8731b85 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -722,7 +722,14 @@ window.mutate_user_preferences = function(user_preferences_delta) { window.update_user_preferences = function(user_preferences) { window.user_preferences = user_preferences; localStorage.setItem('user_preferences', JSON.stringify(user_preferences)); - window.locale = user_preferences.language ?? 'en'; + const language = user_preferences.language ?? 'en'; + window.locale = language; + + // Broadcast locale change to apps + const broadcastService = globalThis.services.get('broadcast'); + broadcastService.sendBroadcast('localeChanged', { + language: language, + }, { sendToNewAppInstances: true }); } window.sendWindowWillCloseMsg = function(iframe_element) { From cce6531d45cf815e0cf80ba52f48bbcd865aaecd Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Apr 2024 15:08:36 +0100 Subject: [PATCH 07/35] Notify parents/children when an app closes Send an appClosed message with the instance ID of the app that was closed. This will be picked up by Puter.js's AppConnection and reported as a 'close' event. To make this work, a `data-parent_instance_id` attribute is set on child app windows. This is very similar to the `data-parent_uuid` attribute, which tracks parent windows instead of parent app instances. (Dialogs have a parent window, but are not apps, so don't have a parent app instance.) The difference is subtle, and we may want to combine these in the future, but currently closing an app will close any child windows, which is not behaviour we want for child apps. --- src/UI/UIWindow.js | 28 +++++++++++++++++++++++++++- src/helpers.js | 4 ++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/UI/UIWindow.js b/src/UI/UIWindow.js index a922e4033..3134c23e7 100644 --- a/src/UI/UIWindow.js +++ b/src/UI/UIWindow.js @@ -185,6 +185,7 @@ async function UIWindow(options) { data-uid ="${options.uid}" data-element_uuid="${options.element_uuid}" data-parent_uuid="${options.parent_uuid}" + ${options.parent_instance_id ? `data-parent_instance_id="${options.parent_instance_id}"` : ''} data-id ="${win_id}" data-iframe_msg_uid ="${options.iframe_msg_uid}" data-is_dir ="${options.is_dir}" @@ -2745,8 +2746,9 @@ $.fn.close = async function(options) { options = options || {}; $(this).each(async function() { const el_iframe = $(this).find('.window-app-iframe'); + const app_uses_sdk = el_iframe.length > 0 && el_iframe.attr('data-appUsesSDK') === 'true'; // tell child app that this window is about to close, get its response - if(el_iframe.length > 0 && el_iframe.attr('data-appUsesSDK') === 'true'){ + if(app_uses_sdk){ if(!options.bypass_iframe_messaging){ const resp = await sendWindowWillCloseMsg(el_iframe.get(0)); if(!resp.msg){ @@ -2819,6 +2821,30 @@ $.fn.close = async function(options) { } // close child windows $(`.window[data-parent_uuid="${window_uuid}"]`).close(); + + // notify other apps that we're closing + if (app_uses_sdk) { + // notify parent app, if we have one, that we're closing + const parent_id = this.dataset['parent_instance_id']; + const parent = $(`.window[data-element_uuid="${parent_id}"] .window-app-iframe`).get(0); + if (parent) { + parent.contentWindow.postMessage({ + msg: 'appClosed', + appInstanceID: window_uuid, + }, '*'); + } + + // notify child apps, if we have them, that we're closing + const children = $(`.window[data-parent_instance_id="${window_uuid}"] .window-app-iframe`); + children.each((_, child) => { + child.contentWindow.postMessage({ + msg: 'appClosed', + appInstanceID: window_uuid, + }, '*'); + }); + // TODO: Once other AppConnections exist, those will need notifying too. + } + // remove backdrop $(this).closest('.window-backdrop').remove(); // remove DOM element diff --git a/src/helpers.js b/src/helpers.js index a8486d11e..d977e1b20 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -1853,6 +1853,10 @@ window.launch_app = async (options)=>{ let icon, title, file_signature; const window_options = options.window_options ?? {}; + if (options.parent_instance_id) { + window_options.parent_instance_id = options.parent_instance_id; + } + // try to get 3rd-party app info let app_info = options.app_obj ?? await get_apps(options.name); From c69a0abfa9514cd0e1cf08eba3a02854f4544b2a Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Apr 2024 14:52:53 +0100 Subject: [PATCH 08/35] Extract a window_for_app_instance() helper function --- src/IPC.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/IPC.js b/src/IPC.js index de771e447..92b0855a0 100644 --- a/src/IPC.js +++ b/src/IPC.js @@ -74,11 +74,15 @@ window.addEventListener('message', async (event) => { return; } - const iframe_for_app_instance = (instanceID) => { - return $(`.window[data-element_uuid="${instanceID}"]`).find('.window-app-iframe').get(0) + const window_for_app_instance = (instance_id) => { + return $(`.window[data-element_uuid="${instance_id}"]`).get(0); }; - const $el_parent_window = $(`.window[data-element_uuid="${event.data.appInstanceID}"]`); + const iframe_for_app_instance = (instance_id) => { + return $(window_for_app_instance(instance_id)).find('.window-app-iframe').get(0); + }; + + const $el_parent_window = $(window_for_app_instance(event.data.appInstanceID)); const parent_window_id = $el_parent_window.attr('data-id'); const $el_parent_disable_mask = $el_parent_window.find('.window-disable-mask'); const target_iframe = iframe_for_app_instance(event.data.appInstanceID); @@ -354,7 +358,7 @@ window.addEventListener('message', async (event) => { // setWindowTitle //-------------------------------------------------------- else if(event.data.msg === 'setWindowTitle' && event.data.new_title !== undefined){ - const el_window = $(`.window[data-element_uuid="${event.data.appInstanceID}"]`).get(0); + const el_window = window_for_app_instance(event.data.appInstanceID); // set window title $(el_window).find(`.window-head-title`).html(html_encode(event.data.new_title)); // send confirmation to requester window @@ -1101,6 +1105,6 @@ window.addEventListener('message', async (event) => { // exit //-------------------------------------------------------- else if(event.data.msg === 'exit'){ - $(`.window[data-element_uuid="${event.data.appInstanceID}"]`).close({bypass_iframe_messaging: true}); + $(window_for_app_instance(event.data.appInstanceID)).close({bypass_iframe_messaging: true}); } }); \ No newline at end of file From 21c64e827bc96dfbf1f314ef8fdc63671f8a9410 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 9 Apr 2024 15:05:48 +0100 Subject: [PATCH 09/35] Add closeApp message Sending a 'closeApp' message allows an app to close a target app, if it has permission to do so. Currently, permission is granted if the requesting app is the parent of the target app, or has godmode set. --- src/IPC.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/IPC.js b/src/IPC.js index 92b0855a0..54c53e4fc 100644 --- a/src/IPC.js +++ b/src/IPC.js @@ -1100,6 +1100,43 @@ window.addEventListener('message', async (event) => { contents, }, targetAppOrigin); } + //-------------------------------------------------------- + // closeApp + //-------------------------------------------------------- + else if (event.data.msg === 'closeApp') { + const { appInstanceID, targetAppInstanceID } = event.data; + + const target_window = window_for_app_instance(targetAppInstanceID); + if (!target_window) { + console.warn(`Failed to close non-existent app ${targetAppInstanceID}`); + return; + } + + // Check permissions + const allowed = (() => { + // Parents can close their children + if (target_window.dataset['parent_instance_id']) { + console.log(`⚠️ Allowing app ${appInstanceID} to close child app ${targetAppInstanceID}`); + return true; + } + + // God-mode apps can close anything + const app_info = await get_apps(app_name); + if (app_info.godmode === 1) { + console.log(`⚠️ Allowing GODMODE app ${appInstanceID} to close app ${targetAppInstanceID}`); + return true; + } + + // TODO: What other situations should we allow? + return false; + })(); + + if (allowed) { + $(target_window).close(); + } else { + console.warn(`⚠️ App ${appInstanceID} is not permitted to close app ${targetAppInstanceID}`); + } + } //-------------------------------------------------------- // exit From 367c18bfc5ac37b656e6cf8b35625fddf8290d65 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 10 Apr 2024 12:16:08 -0400 Subject: [PATCH 10/35] Add endpoint to list permissions --- .../src/routers/auth/list-permissions.js | 82 ++++++++++++++----- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/packages/backend/src/routers/auth/list-permissions.js b/packages/backend/src/routers/auth/list-permissions.js index e1571af3d..486b509a6 100644 --- a/packages/backend/src/routers/auth/list-permissions.js +++ b/packages/backend/src/routers/auth/list-permissions.js @@ -17,7 +17,7 @@ * along with this program. If not, see . */ const eggspress = require("../../api/eggspress"); -const { get_app } = require("../../helpers"); +const { get_app, get_user } = require("../../helpers"); const { UserActorType } = require("../../services/auth/Actor"); const { DB_READ } = require("../../services/database/consts"); const { Context } = require("../../util/context"); @@ -38,29 +38,73 @@ module.exports = eggspress('/auth/list-permissions', { const db = x.get('services').get('database').get(DB_READ, 'permissions'); - const permissions = []; + const permissions = {}; - const rows = await db.read( - 'SELECT * FROM `user_to_app_permissions` WHERE user_id=?', - [ actor.type.user.id ] - ); + { + permissions.myself_to_app = []; - for ( const row of rows ) { - const app = await get_app({ id: row.app_id }); + const rows = await db.read( + 'SELECT * FROM `user_to_app_permissions` WHERE user_id=?', + [ actor.type.user.id ] + ); - delete app.id; - delete app.approved_for_listing; - delete app.approved_for_opening_items; - delete app.godmode; - delete app.owner_user_id; + for ( const row of rows ) { + const app = await get_app({ id: row.app_id }); - const permission = { - app, - permission: row.permission, - extra: row.extra - }; + delete app.id; + delete app.approved_for_listing; + delete app.approved_for_opening_items; + delete app.godmode; + delete app.owner_user_id; - permissions.push(permission); + const permission = { + app, + permission: row.permission, + extra: row.extra + }; + + permissions.myself_to_app.push(permission); + } + } + { + permissions.myself_to_user = []; + + const rows = await db.read( + 'SELECT * FROM `user_to_user_permissions` WHERE issuer_user_id=?', + [ actor.type.user.id ] + ); + + for ( const row of rows ) { + const user = await get_user({ id: row.holder_user_id }); + + const permission = { + user: user.username, + permission: row.permission, + extra: row.extra + }; + + permissions.myself_to_user.push(permission); + } + } + { + permissions.user_to_myself = []; + + const rows = await db.read( + 'SELECT * FROM `user_to_user_permissions` WHERE holder_user_id=?', + [ actor.type.user.id ] + ); + + for ( const row of rows ) { + const user = await get_user({ id: row.issuer_user_id }); + + const permission = { + user: user.username, + permission: row.permission, + extra: row.extra + }; + + permissions.user_to_myself.push(permission); + } } res.json(permissions); From 0eded34c8cca7d10861fede2efdf29e4ad09dbcf Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 10 Apr 2024 12:22:21 -0400 Subject: [PATCH 11/35] Add indented logs and fix a bug --- packages/backend/src/services/auth/ACLService.js | 15 +++++++++------ .../src/services/auth/PermissionService.js | 14 ++++++++++++-- .../src/services/runtime-analysis/LogService.js | 6 +++++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/services/auth/ACLService.js b/packages/backend/src/services/auth/ACLService.js index 0a6012f66..f0b7d7dcf 100644 --- a/packages/backend/src/services/auth/ACLService.js +++ b/packages/backend/src/services/auth/ACLService.js @@ -25,13 +25,16 @@ const { AppUnderUserActorType, UserActorType, Actor, SystemActorType, AccessToke class ACLService extends BaseService { async check (actor, resource, mode) { - const result = await this._check_fsNode(actor, resource, mode); - if ( this.verbose ) console.log('LOGGING ACL CHECK', { - actor, mode, - // trace: (new Error()).stack, - result, + const ld = (Context.get('logdent') ?? 0) + 1; + return await Context.get().sub({ logdent: ld }).arun(async () => { + const result = await this._check_fsNode(actor, resource, mode); + if ( this.verbose ) console.log('LOGGING ACL CHECK', { + actor, mode, + // trace: (new Error()).stack, + result, + }); + return result; }); - return result; } async _check_fsNode (actor, fsNode, mode) { diff --git a/packages/backend/src/services/auth/PermissionService.js b/packages/backend/src/services/auth/PermissionService.js index e6f45e92f..692d4a8ca 100644 --- a/packages/backend/src/services/auth/PermissionService.js +++ b/packages/backend/src/services/auth/PermissionService.js @@ -17,6 +17,7 @@ * along with this program. If not, see . */ const { get_user, get_app } = require("../../helpers"); +const { Context } = require("../../util/context"); const BaseService = require("../BaseService"); const { DB_WRITE } = require("../database/consts"); const { UserActorType, Actor, AppUnderUserActorType, AccessTokenActorType } = require("./Actor"); @@ -183,8 +184,16 @@ class PermissionService extends BaseService { return permission; } + async check () { + const ld = (Context.get('logdent') ?? 0) + 1; + return await Context.get().sub({ logdent: ld }).arun(async () => { + const res = await this.check__(...arguments); + // this.log.noticeme('RETURN ' + res); + return res; + }); + } - async check (actor, permission) { + async check__ (actor, permission) { permission = await this._rewrite_permission(permission); this.log.info(`checking permission ${permission} for actor ${actor.uid}`, { @@ -210,7 +219,8 @@ class PermissionService extends BaseService { if ( actor.type instanceof AppUnderUserActorType ) { // NEXT: const app_uid = actor.type.app.uid; - const user_has_permission = await this.check_user_permission(actor, permission); + const user_actor = actor.get_related_actor(UserActorType); + const user_has_permission = await this.check_user_permission(user_actor, permission); if ( ! user_has_permission ) return undefined; return await this.check_user_app_permission(actor, app_uid, permission); diff --git a/packages/backend/src/services/runtime-analysis/LogService.js b/packages/backend/src/services/runtime-analysis/LogService.js index a66d6a4ee..4c5e3dc2b 100644 --- a/packages/backend/src/services/runtime-analysis/LogService.js +++ b/packages/backend/src/services/runtime-analysis/LogService.js @@ -159,7 +159,11 @@ class DevLogger { log_lvl, crumbs, message, fields, objects, ); } - this.log(stringify_log_entry({ + const ld = Context.get('logdent', { allow_fallback: true }) + const prefix = globalThis.dev_console_indent_on + ? Array(ld ?? 0).fill(' ').join('') + : ''; + this.log(prefix + stringify_log_entry({ log_lvl, crumbs, message, fields, objects, })); } From eb66848aeecab888da86cbbe22dfbc0c90503fc0 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 10 Apr 2024 12:25:44 -0400 Subject: [PATCH 12/35] Update database version when creating a new one --- .../src/services/database/SqliteDatabaseAccessService.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/services/database/SqliteDatabaseAccessService.js b/packages/backend/src/services/database/SqliteDatabaseAccessService.js index de1f782df..90049c9f7 100644 --- a/packages/backend/src/services/database/SqliteDatabaseAccessService.js +++ b/packages/backend/src/services/database/SqliteDatabaseAccessService.js @@ -41,6 +41,9 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { this.db = new Database(this.config.path); + // Database upgrade logic + const TARGET_VERSION = 1; + if ( do_setup ) { this.log.noticeme(`SETUP: creating database at ${this.config.path}`); const sql_files = [ @@ -55,11 +58,9 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { const contents = fs.readFileSync(filename, 'utf8'); this.db.exec(contents); } + await this.db.exec(`PRAGMA user_version = ${TARGET_VERSION};`); } - // Database upgrade logic - const TARGET_VERSION = 1; - const [{ user_version }] = await this._read('PRAGMA user_version'); this.log.info('database version: ' + user_version); From e436693d3ed0decbb5a793c0d8d9901463791f2a Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 10 Apr 2024 21:54:16 -0400 Subject: [PATCH 13/35] Improve session mgmt (part 1) --- packages/backend/src/middleware/auth.js | 31 +++---- .../backend/src/routers/auth/list-sessions.js | 0 .../backend/src/services/auth/AuthService.js | 88 +++++++++++++++++++ .../database/SqliteDatabaseAccessService.js | 7 +- .../database/sqlite_setup/0004_sessions.sql | 7 ++ 5 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 packages/backend/src/routers/auth/list-sessions.js create mode 100644 packages/backend/src/services/database/sqlite_setup/0004_sessions.sql diff --git a/packages/backend/src/middleware/auth.js b/packages/backend/src/middleware/auth.js index a231d8b9b..0c4305578 100644 --- a/packages/backend/src/middleware/auth.js +++ b/packages/backend/src/middleware/auth.js @@ -17,35 +17,26 @@ * along with this program. If not, see . */ "use strict" +const APIError = require('../api/APIError'); const {jwt_auth} = require('../helpers'); +const { UserActorType } = require('../services/auth/Actor'); const { DB_WRITE } = require('../services/database/consts'); const { Context } = require('../util/context'); +const auth2 = require('./auth2'); const auth = async (req, res, next)=>{ + let auth2_ok = false; try{ - let auth_res = await jwt_auth(req); + // Delegate to new middleware + await auth2(req, res, () => { auth2_ok = true; }); + if ( ! auth2_ok ) return; - // is account suspended? - if(auth_res.user.suspended) - return res.status(401).send({error: 'Account suspended'}); - - // successful auth - req.user = auth_res.user; - req.token = auth_res.token; - - // let's add it to the context too - try { - const x = Context.get(); - x.set('user', req.user); - } catch (e) { - console.error(e); + // Everything using the old reference to the auth middleware + // should only allow session tokens + if ( ! (req.actor.type instanceof UserActorType) ) { + throw APIError.create('forbidden'); } - // record as daily active users - const db = req.services.get('database').get(DB_WRITE, 'auth'); - db.write('UPDATE `user` SET `last_activity_ts` = now() WHERE id=? LIMIT 1', [req.user.id]); - - // go to next next(); } // auth failed diff --git a/packages/backend/src/routers/auth/list-sessions.js b/packages/backend/src/routers/auth/list-sessions.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index 292186225..539caf02c 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -34,6 +34,8 @@ class AuthService extends BaseService { async _init () { this.db = await this.services.get('database').get(DB_WRITE, 'auth'); + + this.sessions = {}; } async authenticate_from_token (token) { @@ -43,6 +45,7 @@ class AuthService extends BaseService { ); if ( ! decoded.hasOwnProperty('type') ) { + throw new Error('legacy token'); const user = await this.db.requireRead( "SELECT * FROM `user` WHERE `uuid` = ? LIMIT 1", [decoded.uuid], @@ -66,6 +69,25 @@ class AuthService extends BaseService { }); } + if ( decoded.type === 'session' ) { + const session = this.get_session_(decoded.uuid); + + if ( ! session ) { + throw APIError.create('token_auth_failed'); + } + + const user = await get_user({ uuid: decoded.user_uid }); + + const actor_type = new UserActorType({ + user, + }); + + return new Actor({ + user_uid: decoded.user_uid, + type: actor_type, + }); + } + if ( decoded.type === 'app-under-user' ) { const user = await get_user({ uuid: decoded.user_uid }); if ( ! user ) { @@ -149,6 +171,72 @@ class AuthService extends BaseService { return token; } + async create_session_ (user, meta = {}) { + this.log.info(`CREATING SESSION`); + const uuid = this.modules.uuidv4(); + await this.db.write( + 'INSERT INTO `sessions` ' + + '(`uuid`, `user_id`, `meta`) ' + + 'VALUES (?, ?, ?)', + [uuid, user.id, JSON.stringify(meta)], + ); + const session = { uuid, user_uid: user.uuid, meta }; + this.sessions[uuid] = session; + return session; + } + + async get_session_ (uuid) { + this.log.info(`USING SESSION`); + if ( this.sessions[uuid] ) { + return this.sessions[uuid]; + } + + const [session] = await this.db.read( + "SELECT * FROM `sessions` WHERE `uuid` = ? LIMIT 1", + [uuid], + ); + + return session; + } + + async create_session_token (user, meta) { + const session = await this.create_session_(user, meta); + + const token = this.modules.jwt.sign({ + type: 'session', + version: '0.0.0', + uuid: session.uuid, + meta: session.meta, + user_uid: user.uuid, + }, this.global_config.jwt_secret); + + return token; + } + + async check_session (cur_token) { + const decoded = this.modules.jwt.verify( + cur_token, this.global_config.jwt_secret + ); + + if ( decoded.type && decoded.type !== 'session' ) { + // throw APIError.create('token_auth_failed'); + return {}; + } + + const user = await get_user({ uuid: decoded.user_uid }); + if ( ! user ) { + return {}; + } + + if ( decoded.type ) return { user, token: cur_token }; + + this.log.info(`UPGRADING SESSION`); + + // Upgrade legacy token + const token = await this.create_session_token(user); + return { user, token }; + } + async create_access_token (authorizer, permissions) { const jwt_obj = {}; const authorizer_obj = {}; diff --git a/packages/backend/src/services/database/SqliteDatabaseAccessService.js b/packages/backend/src/services/database/SqliteDatabaseAccessService.js index 90049c9f7..c54d29efe 100644 --- a/packages/backend/src/services/database/SqliteDatabaseAccessService.js +++ b/packages/backend/src/services/database/SqliteDatabaseAccessService.js @@ -42,7 +42,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { this.db = new Database(this.config.path); // Database upgrade logic - const TARGET_VERSION = 1; + const TARGET_VERSION = 2; if ( do_setup ) { this.log.noticeme(`SETUP: creating database at ${this.config.path}`); @@ -50,6 +50,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { '0001_create-tables.sql', '0002_add-default-apps.sql', '0003_user-permissions.sql', + '0004_sessions.sql', ].map(p => path_.join(__dirname, 'sqlite_setup', p)); const fs = require('fs'); for ( const filename of sql_files ) { @@ -70,6 +71,10 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { upgrade_files.push('0003_user-permissions.sql'); } + if ( user_version <= 1 ) { + upgrade_files.push('0004_sessions.sql'); + } + if ( upgrade_files.length > 0 ) { this.log.noticeme(`Database out of date: ${this.config.path}`); this.log.noticeme(`UPGRADING DATABASE: ${user_version} -> ${TARGET_VERSION}`); diff --git a/packages/backend/src/services/database/sqlite_setup/0004_sessions.sql b/packages/backend/src/services/database/sqlite_setup/0004_sessions.sql new file mode 100644 index 000000000..a5a986acf --- /dev/null +++ b/packages/backend/src/services/database/sqlite_setup/0004_sessions.sql @@ -0,0 +1,7 @@ +CREATE TABLE `sessions` ( + "id" INTEGER PRIMARY KEY AUTOINCREMENT, + "user_id" INTEGER NOT NULL, + "uuid" TEXT NOT NULL, + "meta" JSON DEFAULT NULL, + FOREIGN KEY("user_id") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); From 18b3e06fe897aec69876f22c66cdb895fc821a38 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 10 Apr 2024 23:00:37 -0400 Subject: [PATCH 14/35] Add session listing and revocation --- .../backend/src/routers/auth/list-sessions.js | 23 ++++++++++ .../src/routers/auth/revoke-session.js | 33 ++++++++++++++ packages/backend/src/routers/login.js | 3 +- packages/backend/src/routers/signup.js | 16 ++++--- .../backend/src/services/PuterAPIService.js | 2 + .../backend/src/services/auth/AuthService.js | 45 +++++++++++++++++-- 6 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 packages/backend/src/routers/auth/revoke-session.js diff --git a/packages/backend/src/routers/auth/list-sessions.js b/packages/backend/src/routers/auth/list-sessions.js index e69de29bb..a163c78c7 100644 --- a/packages/backend/src/routers/auth/list-sessions.js +++ b/packages/backend/src/routers/auth/list-sessions.js @@ -0,0 +1,23 @@ +const eggspress = require("../../api/eggspress"); +const { UserActorType } = require("../../services/auth/Actor"); +const { Context } = require("../../util/context"); + +module.exports = eggspress('/auth/list-sessions', { + subdomain: 'api', + auth2: true, + allowedMethods: ['GET'], +}, async (req, res, next) => { + const x = Context.get(); + const svc_auth = x.get('services').get('auth'); + + // Only users can list their own sessions + // apps, access tokens, etc should NEVER access this + const actor = x.get('actor'); + if ( ! (actor.type instanceof UserActorType) ) { + throw APIError.create('forbidden'); + } + + const sessions = await svc_auth.list_sessions(actor); + + res.json(sessions); +}); diff --git a/packages/backend/src/routers/auth/revoke-session.js b/packages/backend/src/routers/auth/revoke-session.js new file mode 100644 index 000000000..5604066c4 --- /dev/null +++ b/packages/backend/src/routers/auth/revoke-session.js @@ -0,0 +1,33 @@ +const APIError = require("../../api/APIError"); +const eggspress = require("../../api/eggspress"); +const { UserActorType } = require("../../services/auth/Actor"); +const { Context } = require("../../util/context"); + +module.exports = eggspress('/auth/revoke-session', { + subdomain: 'api', + auth2: true, + allowedMethods: ['POST'], +}, async (req, res, next) => { + const x = Context.get(); + const svc_auth = x.get('services').get('auth'); + + // Only users can list their own sessions + // apps, access tokens, etc should NEVER access this + const actor = x.get('actor'); + if ( ! (actor.type instanceof UserActorType) ) { + throw APIError.create('forbidden'); + } + + // Ensure valid UUID + if ( ! req.body.uuid || typeof req.body.uuid !== 'string' ) { + throw APIError.create('field_invalid', null, { + key: 'uuid', + expected: 'string' + }); + } + + const sessions = await svc_auth.revoke_session( + actor, req.body.uuid); + + res.json({ sessions }); +}); diff --git a/packages/backend/src/routers/login.js b/packages/backend/src/routers/login.js index 795497900..1f5c6c0ca 100644 --- a/packages/backend/src/routers/login.js +++ b/packages/backend/src/routers/login.js @@ -89,7 +89,8 @@ router.post('/login', express.json(), body_parser_error_handler, async (req, res return res.status(400).send('Incorrect password.') // check password if(await bcrypt.compare(req.body.password, user.password)){ - const token = await jwt.sign({uuid: user.uuid}, config.jwt_secret) + const svc_auth = req.services.get('auth'); + const token = await svc_auth.create_session_token(user); //set cookie // res.cookie(config.cookie_name, token); res.cookie(config.cookie_name, token, { diff --git a/packages/backend/src/routers/signup.js b/packages/backend/src/routers/signup.js index ca45d9d7a..012fdfb21 100644 --- a/packages/backend/src/routers/signup.js +++ b/packages/backend/src/routers/signup.js @@ -52,6 +52,7 @@ module.exports = eggspress(['/signup'], { const validator = require('validator') let uuid_user; + const svc_auth = Context.get('services').get('auth'); const svc_authAudit = Context.get('services').get('auth-audit'); svc_authAudit.record({ requester: Context.get('requester'), @@ -67,9 +68,11 @@ module.exports = eggspress(['/signup'], { // check if user is already logged in if ( req.body.is_temp && req.cookies[config.cookie_name] ) { - const token = req.cookies[config.cookie_name]; - const decoded = await jwt.verify(token, config.jwt_secret); - const user = await get_user({ uuid: decoded.uuid }); + const { user, token } = await svc_auth.check_session( + req.cookies[config.cookie_name] + ); + // const decoded = await jwt.verify(token, config.jwt_secret); + // const user = await get_user({ uuid: decoded.uuid }); if ( user ) { return res.send({ token: token, @@ -233,17 +236,20 @@ module.exports = eggspress(['/signup'], { db.write('UPDATE `user` SET `last_activity_ts` = now() WHERE id=? LIMIT 1', [pseudo_user.id]); invalidate_cached_user_by_id(pseudo_user.id); } - // create token for login - const token = await jwt.sign({uuid: user_uuid}, config.jwt_secret); // user id // todo if pseudo user, assign directly no need to do another DB lookup const user_id = (pseudo_user === undefined) ? insert_res.insertId : pseudo_user.id; + const [user] = await db.read( 'SELECT * FROM `user` WHERE `id` = ? LIMIT 1', [user_id] ); + // create token for login + const token = await svc_auth.create_session_token(user); + // jwt.sign({uuid: user_uuid}, config.jwt_secret); + //------------------------------------------------------------- // email confirmation //------------------------------------------------------------- diff --git a/packages/backend/src/services/PuterAPIService.js b/packages/backend/src/services/PuterAPIService.js index a285ef94c..27d29b399 100644 --- a/packages/backend/src/services/PuterAPIService.js +++ b/packages/backend/src/services/PuterAPIService.js @@ -33,6 +33,8 @@ class PuterAPIService extends BaseService { app.use(require('../routers/auth/grant-user-user')); app.use(require('../routers/auth/revoke-user-user')); app.use(require('../routers/auth/list-permissions')) + app.use(require('../routers/auth/list-sessions')) + app.use(require('../routers/auth/revoke-session')) app.use(require('../routers/auth/check-app')) app.use(require('../routers/auth/app-uid-from-origin')) app.use(require('../routers/auth/create-access-token')) diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index 539caf02c..0f5380d7d 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -70,7 +70,7 @@ class AuthService extends BaseService { } if ( decoded.type === 'session' ) { - const session = this.get_session_(decoded.uuid); + const session = await this.get_session_(decoded.uuid); if ( ! session ) { throw APIError.create('token_auth_failed'); @@ -80,6 +80,7 @@ class AuthService extends BaseService { const actor_type = new UserActorType({ user, + session: session.uuid, }); return new Actor({ @@ -218,8 +219,9 @@ class AuthService extends BaseService { cur_token, this.global_config.jwt_secret ); + console.log('\x1B[36;1mDECODED SESSION', decoded); + if ( decoded.type && decoded.type !== 'session' ) { - // throw APIError.create('token_auth_failed'); return {}; } @@ -228,12 +230,22 @@ class AuthService extends BaseService { return {}; } - if ( decoded.type ) return { user, token: cur_token }; + if ( decoded.type ) { + // Ensure session exists + const session = await this.get_session_(decoded.uuid); + if ( ! session ) { + return {}; + } + + // Return the session + return { user, token: cur_token }; + } this.log.info(`UPGRADING SESSION`); // Upgrade legacy token - const token = await this.create_session_token(user); + // TODO: phase this out + const { token } = await this.create_session_token(user); return { user, token }; } @@ -294,6 +306,31 @@ class AuthService extends BaseService { return jwt; } + async list_sessions (actor) { + // We won't take the cached sessions here because it's + // possible the user has sessions on other servers + const sessions = await this.db.read( + 'SELECT uuid, meta FROM `sessions` WHERE `user_id` = ?', + [actor.type.user.id], + ); + + sessions.forEach(session => { + if ( session.uuid === actor.type.session ) { + session.current = true; + } + }); + + return sessions; + } + + async revoke_session (actor, uuid) { + delete this.sessions[uuid]; + await this.db.write( + `DELETE FROM sessions WHERE uuid = ? AND user_id = ?`, + [uuid, actor.type.user.id] + ); + } + async get_user_app_token_from_origin (origin) { origin = this._origin_from_url(origin); const app_uid = await this._app_uid_from_origin(origin); From 09bf422686572398acdd496e5f2c0e1ba4c3133e Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 00:29:39 -0400 Subject: [PATCH 15/35] Add session manager ui --- packages/backend/src/routers/login.js | 2 +- packages/backend/src/routers/signup.js | 4 +- .../backend/src/services/auth/AuthService.js | 45 +++++- src/UI/Settings/UIWindowSettings.js | 13 ++ src/UI/UIWindowManageSessions.js | 148 ++++++++++++++++++ src/css/style.css | 58 +++++++ src/i18n/translations/en.js | 4 + 7 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 src/UI/UIWindowManageSessions.js diff --git a/packages/backend/src/routers/login.js b/packages/backend/src/routers/login.js index 1f5c6c0ca..3a75c1990 100644 --- a/packages/backend/src/routers/login.js +++ b/packages/backend/src/routers/login.js @@ -90,7 +90,7 @@ router.post('/login', express.json(), body_parser_error_handler, async (req, res // check password if(await bcrypt.compare(req.body.password, user.password)){ const svc_auth = req.services.get('auth'); - const token = await svc_auth.create_session_token(user); + const token = await svc_auth.create_session_token(user, { req }); //set cookie // res.cookie(config.cookie_name, token); res.cookie(config.cookie_name, token, { diff --git a/packages/backend/src/routers/signup.js b/packages/backend/src/routers/signup.js index 012fdfb21..91a9cd607 100644 --- a/packages/backend/src/routers/signup.js +++ b/packages/backend/src/routers/signup.js @@ -247,7 +247,9 @@ module.exports = eggspress(['/signup'], { ); // create token for login - const token = await svc_auth.create_session_token(user); + const token = await svc_auth.create_session_token(user, { + req, + }); // jwt.sign({uuid: user_uuid}, config.jwt_secret); //------------------------------------------------------------- diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index 0f5380d7d..c00345421 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -174,6 +174,44 @@ class AuthService extends BaseService { async create_session_ (user, meta = {}) { this.log.info(`CREATING SESSION`); + + if ( meta.req ) { + const req = meta.req; + delete meta.req; + + const ip = this.global_config.fowarded + ? req.headers['x-forwarded-for'] || + req.connection.remoteAddress + : req.connection.remoteAddress + ; + + meta.ip = ip; + + meta.server = this.global_config.server_id; + + if ( req.headers['user-agent'] ) { + meta.user_agent = req.headers['user-agent']; + } + + if ( req.headers['referer'] ) { + meta.referer = req.headers['referer']; + } + + if ( req.headers['origin'] ) { + const origin = this._origin_from_url(req.headers['origin']); + if ( origin ) { + meta.origin = origin; + } + } + + if ( req.headers['host'] ) { + const host = this._origin_from_url(req.headers['host']); + if ( host ) { + meta.host = host; + } + } + } + const uuid = this.modules.uuidv4(); await this.db.write( 'INSERT INTO `sessions` ' + @@ -197,6 +235,8 @@ class AuthService extends BaseService { [uuid], ); + session.meta = JSON.parse(session.meta ?? {}); + return session; } @@ -214,7 +254,7 @@ class AuthService extends BaseService { return token; } - async check_session (cur_token) { + async check_session (cur_token, meta) { const decoded = this.modules.jwt.verify( cur_token, this.global_config.jwt_secret ); @@ -245,7 +285,7 @@ class AuthService extends BaseService { // Upgrade legacy token // TODO: phase this out - const { token } = await this.create_session_token(user); + const { token } = await this.create_session_token(user, meta); return { user, token }; } @@ -318,6 +358,7 @@ class AuthService extends BaseService { if ( session.uuid === actor.type.session ) { session.current = true; } + session.meta = JSON.parse(session.meta ?? {}); }); return sessions; diff --git a/src/UI/Settings/UIWindowSettings.js b/src/UI/Settings/UIWindowSettings.js index 6a8560d43..518b84078 100644 --- a/src/UI/Settings/UIWindowSettings.js +++ b/src/UI/Settings/UIWindowSettings.js @@ -26,6 +26,7 @@ import changeLanguage from "../../i18n/i18nChangeLanguage.js" import UIWindowConfirmUserDeletion from './UIWindowConfirmUserDeletion.js'; import UITabAbout from './UITabAbout.js'; import UIWindowThemeDialog from '../UIWindowThemeDialog.js'; +import UIWindowManageSessions from '../UIWindowManageSessions.js'; async function UIWindowSettings(options){ return new Promise(async (resolve) => { @@ -111,6 +112,14 @@ async function UIWindowSettings(options){ h += ``; h += ``; + // session manager + h += `
`; + h += `${i18n('sessions')}`; + h += `
`; + h += ``; + h += `
`; + h += `
`; + h += ``; // Personalization @@ -324,6 +333,10 @@ async function UIWindowSettings(options){ UIWindowThemeDialog(); }) + $(el_window).find('.manage-sessions').on('click', function (e) { + UIWindowManageSessions(); + }) + $(el_window).on('click', '.settings-sidebar-item', function(){ const $this = $(this); const settings = $this.attr('data-settings'); diff --git a/src/UI/UIWindowManageSessions.js b/src/UI/UIWindowManageSessions.js new file mode 100644 index 000000000..561597fb5 --- /dev/null +++ b/src/UI/UIWindowManageSessions.js @@ -0,0 +1,148 @@ +import UIAlert from "./UIAlert.js"; +import UIWindow from "./UIWindow.js"; + +const UIWindowManageSessions = async function UIWindowManageSessions () { + const services = globalThis.services; + + const w = await UIWindow({ + title: i18n('ui_manage_sessions'), + icon: null, + uid: null, + is_dir: false, + message: 'message', + // body_icon: options.body_icon, + // backdrop: options.backdrop ?? false, + is_droppable: false, + has_head: true, + selectable_body: false, + draggable_body: true, + allow_context_menu: false, + window_class: 'window-session-manager', + dominant: true, + body_content: '', + // width: 600, + // parent_uuid: options.parent_uuid, + // ...options.window_options, + }); + + const SessionWidget = ({ session }) => { + const el = document.createElement('div'); + el.classList.add('session-widget'); + el.dataset.uuid = session.uuid; + // '
' +
+        //    JSON.stringify(session, null, 2) +
+        //     '
'; + + const el_uuid = document.createElement('div'); + el_uuid.textContent = session.uuid; + el.appendChild(el_uuid); + el_uuid.classList.add('session-widget-uuid'); + + const el_meta = document.createElement('div'); + el_meta.classList.add('session-widget-meta'); + for ( const key in session.meta ) { + const el_entry = document.createElement('div'); + el_entry.classList.add('session-widget-meta-entry'); + + const el_key = document.createElement('div'); + el_key.textContent = key; + el_key.classList.add('session-widget-meta-key'); + el_entry.appendChild(el_key); + + const el_value = document.createElement('div'); + el_value.textContent = session.meta[key]; + el_value.classList.add('session-widget-meta-value'); + el_entry.appendChild(el_value); + + el_meta.appendChild(el_entry); + } + el.appendChild(el_meta); + + const el_actions = document.createElement('div'); + el_actions.classList.add('session-widget-actions'); + + const el_btn_revoke = document.createElement('button'); + el_btn_revoke.textContent = i18n('ui_revoke'); + el_btn_revoke.classList.add('button', 'button-danger'); + el_btn_revoke.addEventListener('click', async () => { + try{ + const alert_resp = await UIAlert({ + message: i18n('confirm_session_revoke'), + buttons:[ + { + label: i18n('yes'), + value: 'yes', + type: 'primary', + }, + { + label: i18n('cancel') + }, + ] + }); + + if ( alert_resp !== 'yes' ) { + return; + } + + const resp = await fetch(`${api_origin}/auth/revoke-session`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + uuid: session.uuid, + }), + }); + if ( resp.ok ) { + el.remove(); + return; + } + UIAlert({ message: await resp.text() }).appendTo(w_body); + } catch ( e ) { + UIAlert({ message: e.toString() }).appendTo(w_body); + } + }); + el_actions.appendChild(el_btn_revoke); + el.appendChild(el_actions); + + return { + appendTo (parent) { + parent.appendChild(el); + return this; + } + }; + }; + + const reload_sessions = async () => { + const resp = await fetch(`${api_origin}/auth/list-sessions`, { + method: 'GET', + }); + + const sessions = await resp.json(); + + for ( const el of w_body.querySelectorAll('.session-widget') ) { + if ( !sessions.find(s => s.uuid === el.dataset.uuid) ) { + el.remove(); + } + } + + for ( const session of sessions ) { + if ( w.querySelector(`.session-widget[data-uuid="${session.uuid}"]`) ) { + continue; + } + SessionWidget({ session }).appendTo(w_body); + } + }; + + const w_body = w.querySelector('.window-body'); + + w_body.classList.add('session-manager-list'); + + reload_sessions(); + const interval = setInterval(reload_sessions, 8000); + w.on_close = () => { + clearInterval(interval); + } +}; + +export default UIWindowManageSessions; diff --git a/src/css/style.css b/src/css/style.css index b1b349ea9..299f7f243 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -3703,3 +3703,61 @@ label { background: #04AA6D; cursor: pointer; } + +.session-manager-list { + display: flex; + flex-direction: column; + gap: 10px; + padding: 10px; + box-sizing: border-box; + height: 100% !important; +} + +.session-widget { + display: flex; + flex-direction: column; + padding: 10px; + border: 1px solid #e0e0e0; + border-radius: 4px; + gap: 4px; +} + +.session-widget-uuid { + font-size: 12px; + font-weight: 600; + color: #9c185b; +} + +.session-widget-meta { + display: flex; + flex-direction: column; + gap: 10px; + max-height: 100px; + overflow-y: scroll; +} + +.session-widget-meta-entry { + display: flex; + flex-direction: row; + align-items: center; +} + +.session-widget-meta-key { + font-size: 12px; + color: #666; + flex-basis: 40%; + flex-shrink: 0; +} + +.session-widget-meta-value { + font-size: 12px; + color: #666; + flex-grow: 1; +} + +.session-widget-actions { + display: flex; + flex-direction: row; + gap: 10px; + justify-content: flex-end; +} \ No newline at end of file diff --git a/src/i18n/translations/en.js b/src/i18n/translations/en.js index 3fed31897..473966097 100644 --- a/src/i18n/translations/en.js +++ b/src/i18n/translations/en.js @@ -51,6 +51,7 @@ const en = { confirm_new_password: "Confirm New Password", confirm_delete_user: "Are you sure you want to delete your account? All your files and data will be permanently deleted. This action cannot be undone.", confirm_delete_user_title: "Delete Account?", + confirm_session_revoke: "Are you sure you want to revoke this session?", contact_us: "Contact Us", contain: 'Contain', continue: "Continue", @@ -112,6 +113,7 @@ const en = { log_in: "Log In", log_into_another_account_anyway: 'Log into another account anyway', log_out: 'Log Out', + manage_sessions: "Manage Sessions", move: 'Move', moving: "Moving", my_websites: "My Websites", @@ -205,6 +207,8 @@ const en = { type: 'Type', type_confirm_to_delete_account: "Type 'confirm' to delete your account.", ui_colors: "UI Colors", + ui_manage_sessions: "Session Manager", + ui_revoke: "Revoke", undo: 'Undo', unlimited: 'Unlimited', unzip: "Unzip", From 1aeedd86967d034d03c7736d5e3d73bc289890be Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Thu, 11 Apr 2024 08:55:13 +0800 Subject: [PATCH 16/35] Add a simple Traditional Chinese translation --- src/i18n/translations/translations.js | 2 + src/i18n/translations/zhtw.js | 226 ++++++++++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 src/i18n/translations/zhtw.js diff --git a/src/i18n/translations/translations.js b/src/i18n/translations/translations.js index d53c0f7b0..ccecb8c67 100644 --- a/src/i18n/translations/translations.js +++ b/src/i18n/translations/translations.js @@ -39,6 +39,7 @@ import sv from './sv.js'; import th from './th.js'; import ur from './ur.js'; import zh from './zh.js'; +import zhtw from './zhtw.js'; import emoji from './emoji.js'; @@ -66,6 +67,7 @@ export default { sv, th, zh, + zhtw, ur, emoji, }; diff --git a/src/i18n/translations/zhtw.js b/src/i18n/translations/zhtw.js new file mode 100644 index 000000000..755fab818 --- /dev/null +++ b/src/i18n/translations/zhtw.js @@ -0,0 +1,226 @@ +/** + * Copyright (C) 2024 Puter Technologies Inc. + * + * This file is part of Puter. + * + * Puter is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +const zhtw = { + name: "繁體中文", + english_name: "Traditional Chinese", + code: "zhtw", + dictionary: { + about: "關於", + account: "帳號", + access_granted_to: "已授予存取權限給", + add_existing_account: "新增現有帳號", + all_fields_required: '所有欄位都必須填寫。', + apply: "套用", + ascending: '升序', + auto_arrange: '自動排列', + background: "背景", + browse: "瀏覽", + cancel: '取消', + center: '中心', + change_desktop_background: '更改桌面背景…', + change_email: "更改電子郵件", + change_language: "更改語言", + change_password: "更改密碼", + change_ui_colors: "更改 UI 顏色", + change_username: "更改使用者名稱", + close_all_windows: "關閉所有視窗", + close_all_windows_and_log_out: '關閉視窗並登出', + change_always_open_with: "您是否希望總是用此程式開啟這類型的檔案", + color: '顏色', + hue: '色調', + confirm_account_for_free_referral_storage_c2a: '建立帳號並確認您的電子郵件地址以獲得 1 GB 的免費儲存空間。您的朋友也將獲得 1 GB 的免費儲存空間。', + confirm_delete_multiple_items: '您確定要永久刪除這些項目嗎?', + confirm_delete_single_item: '您確定要永久刪除此項目嗎?', + confirm_open_apps_log_out: '您有開啟的應用程式。您確定要登出嗎?', + confirm_new_password: "確認新密碼", + confirm_delete_user: "您確定要刪除您的帳號嗎?您的所有檔案和資料將被永久刪除。此操作無法復原。", + confirm_delete_user_title: "刪除帳號?", + contact_us: "聯絡我們", + contain: '包含', + continue: "繼續", + copy: '複製', + copy_link: "複製連結", + copying: "正在複製", + cover: '覆蓋', + create_account: "建立帳號", + create_free_account: "建立免費帳號", + create_shortcut: "建立捷徑", + credits: "鳴謝", + current_password: "目前的密碼", + cut: '剪下', + clock: "時鐘", + clock_visible_hide: '隱藏 - 總是隱藏', + clock_visible_show: '顯示 - 總是顯示', + clock_visible_auto: '自動 - 預設,僅在全螢幕模式下可見。', + date_modified: '修改日期', + delete: '刪除', + delete_account: "刪除帳號", + delete_permanently: "永久刪除", + deploy_as_app: '部署為應用程式', + descending: '降序', + desktop_background_fit: "適應", + developers: "開發者", + dir_published_as_website: `%strong% 已發布到:`, + disassociate_dir: "取消關聯目錄", + download: '下載', + download_file: '下載檔案', + downloading: "正在下載", + email: "電子郵件", + email_or_username: "電子郵件或使用者名稱", + empty_trash: '清空垃圾桶', + empty_trash_confirmation: `您確定要永久刪除垃圾桶中的項目嗎?`, + emptying_trash: '正在清空垃圾桶…', + enter_password_to_confirm_delete_user: "輸入您的密碼以確認刪除帳號", + feedback: "回饋", + feedback_c2a: "請使用下面的表單向我們傳送您的回饋、評論和錯誤報告。", + feedback_sent_confirmation: "感謝您聯絡我們。如果您的帳號有關聯的電子郵件,我們將盡快回覆您。", + fit: "適應", + forgot_pass_c2a: "忘記密碼?", + from: "從", + general: "一般", + get_a_copy_of_on_puter: `在 Puter.com 上取得 '%%' 的副本!`, + get_copy_link: '取得複製連結', + hide_all_windows: "隱藏所有視窗", + html_document: 'HTML 文件', + image: '圖片', + incorrect_password: "密碼錯誤", + invite_link: "邀請連結", + item: '項目', + items_in_trash_cannot_be_renamed: `此項目無法重新命名,因為它在垃圾桶中。要重新命名此項目,請先將其從垃圾桶中拖出。`, + jpeg_image: 'JPEG 圖片', + keep_in_taskbar: '保留在工作列', + language: "語言", + license: "許可證", + lightness: '亮度', + loading: '載入中', + log_in: "登入", + log_into_another_account_anyway: '無論如何都要登入另一個帳號', + log_out: '登出', + move: '移動', + moving: "正在移動", + my_websites: "我的網站", + name: '名稱', + name_cannot_be_empty: '名稱不能為空。', + name_cannot_contain_double_period: "名稱不能為 '..' 字元。", + name_cannot_contain_period: "名稱不能為 '.' 字元。", + name_cannot_contain_slash: "名稱不能包含 '/' 字元。", + name_must_be_string: "名稱只能是字串。", + name_too_long: `名稱不能超過 %% 個字元。`, + new: '新建', + new_folder: '新資料夾', + new_password: "新密碼", + new_username: "新使用者名稱", + no: '否', + no_dir_associated_with_site: '此地址沒有關聯的目錄。', + no_websites_published: "您尚未發布任何網站。", + ok: '確定', + open: "開啟", + open_in_new_tab: "在新標籤頁中開啟", + open_in_new_window: "在新視窗中開啟", + open_with: "開啟方式", + oss_code_and_content: "開源軟體和內容", + password: "密碼", + password_changed: "密碼已更改。", + passwords_do_not_match: '`新密碼` 和 `確認新密碼` 不符。', + paste: '貼上', + paste_into_folder: "貼入資料夾", + personalization: "個人化", + pick_name_for_website: "為您的網站選擇一個名稱:", + picture: "圖片", + plural_suffix: '個', + powered_by_puter_js: `由 {{link=docs}}Puter.js{{/link}} 提供技術支援`, + preparing: "準備中...", + preparing_for_upload: "準備上傳...", + privacy: "隱私", + proceed_to_login: '繼續登入', + proceed_with_account_deletion: "繼續刪除帳號", + properties: "屬性", + publish: "發布", + publish_as_website: '發布為網站', + puter_description: `Puter 是一個以隱私為首的個人雲端,將您的所有檔案、應用程式和遊戲保留在一個 + 安全的地方,隨時隨地都可以存取。`, + recent: "最近", + recover_password: "找回密碼", + refer_friends_c2a: "每推薦一位朋友在 Puter 上建立並確認帳號,您就可以獲得 1 GB 的儲存空間。您的朋友也會獲得 1 GB 的儲存空間!", + refer_friends_social_media_c2a: `在 Puter.com 上獲得 1 GB 的免費儲存空間!`, + refresh: '重新整理', + release_address_confirmation: `您確定要釋放此地址嗎?`, + remove_from_taskbar:'從工作列移除', + rename: '重新命名', + repeat: '重複', + replace: '取代', + replace_all: '全部取代', + resend_confirmation_code: "重新傳送確認碼", + reset_colors: "重設顏色", + restore: "還原", + saturation: '飽和度', + save_account: '儲存帳號', + save_account_to_get_copy_link: "請建立帳號以繼續。", + save_account_to_publish: '請建立帳號以繼續。', + save_session: '儲存工作階段', + save_session_c2a: '建立帳號以儲存您目前的工作階段,避免遺失您的工作。', + scan_qr_c2a: '掃描下方的 QR Code,從其他裝置登入此工作階段', + select: "選擇", + selected: '已選擇', + select_color: '選擇顏色…', + send: "傳送", + send_password_recovery_email: "傳送密碼恢復電子郵件", + session_saved: "感謝您建立帳號。此工作階段已儲存。", + settings: "設定", + set_new_password: "設定新密碼", + share_to: "分享到", + show_all_windows: "顯示所有視窗", + show_hidden: '顯示隱藏項目', + sign_in_with_puter: "使用 Puter 登入", + sign_up: "註冊", + signing_in: "正在登入…", + size: '大小', + skip: '跳過', + sort_by: '排序方式', + start: '開始', + status: "狀態", + storage_usage: "儲存空間使用情況", + taking_longer_than_usual: '花費的時間比預期的還長。請稍候...', + terms: "條款", + text_document: '文字文件', + tos_fineprint: `點選 '建立免費帳號' 即表示您同意 Puter 的 {{link=terms}}服務條款{{/link}} 和 {{link=privacy}}隱私政策{{/link}}。`, + transparency: "透明度", + trash: '垃圾桶', + type: '類型', + type_confirm_to_delete_account: "輸入 'confirm' 以刪除您的帳號。", + ui_colors: "UI 顏色", + undo: '復原', + unlimited: '無限', + unzip: "解壓縮", + upload: '上傳', + upload_here: '在此上傳', + usage: '使用情況', + username: "使用者名稱", + username_changed: '使用者名稱已成功更新。', + versions: "版本", + visibility: '可視性', + yes: '是', + yes_release_it: '是的,釋放它', + you_have_been_referred_to_puter_by_a_friend: "您的朋友推薦您使用 Puter!", + zip: "壓縮", + storage_puter_used: "由 Puter 使用", + } +}; + +export default zhtw; From 776b6831f3db784fb2571dd8b6fd82227d285307 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 11 Apr 2024 14:35:22 +0100 Subject: [PATCH 17/35] Fix permission check for closeApp message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Firstly, I was missing an `async` here, which somehow still worked for me then, but produced errors for me when I tried it today. Then, actually await the promise. Finally, actually check the target's parent is us, and not just that it has the attribute! I don't know what was going on in my head that day. 🤦‍♂️ --- src/IPC.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IPC.js b/src/IPC.js index d9a2eb4af..f8aad6602 100644 --- a/src/IPC.js +++ b/src/IPC.js @@ -1116,9 +1116,9 @@ window.addEventListener('message', async (event) => { } // Check permissions - const allowed = (() => { + const allowed = await (async () => { // Parents can close their children - if (target_window.dataset['parent_instance_id']) { + if (target_window.dataset['parent_instance_id'] === appInstanceID) { console.log(`⚠️ Allowing app ${appInstanceID} to close child app ${targetAppInstanceID}`); return true; } From 7abf5faa3cd179d85a7fa0c7054e5a8863318cdf Mon Sep 17 00:00:00 2001 From: Nariman Jelveh Date: Thu, 11 Apr 2024 10:13:52 -0700 Subject: [PATCH 18/35] fix missing translations --- src/i18n/translations/de.js | 1 + src/i18n/translations/en.js | 1 + src/i18n/translations/fa.js | 1 + src/i18n/translations/ko.js | 13 +++++++++++++ 4 files changed, 16 insertions(+) diff --git a/src/i18n/translations/de.js b/src/i18n/translations/de.js index 4e899e158..8fc51caee 100644 --- a/src/i18n/translations/de.js +++ b/src/i18n/translations/de.js @@ -146,6 +146,7 @@ const de = { size: 'Größe', sort_by: 'Sotieren nach', start: 'Start', + storage_puter_used: 'Verwendet von Puter', taking_longer_than_usual: 'Dauert etwas länger als gewöhnlich. Bitte warten...', text_document: 'Textdokument', tos_fineprint: `Indem Sie auf „Kostenloses Konto erstellen“ klicken, stimmen Sie den {{link=terms}}Nutzungsbedingungen{{/link}} und der {{link=privacy}}Datenschutzerklärung{{/link}} von Puter zu.`, diff --git a/src/i18n/translations/en.js b/src/i18n/translations/en.js index 5375cde5c..4bbc306f4 100644 --- a/src/i18n/translations/en.js +++ b/src/i18n/translations/en.js @@ -190,6 +190,7 @@ const en = { start: 'Start', status: "Status", storage_usage: "Storage Usage", + storage_puter_used: 'used by Puter', taking_longer_than_usual: 'Taking a little longer than usual. Please wait...', terms: "Terms", text_document: 'Text document', diff --git a/src/i18n/translations/fa.js b/src/i18n/translations/fa.js index d0db2ae45..1aecc6d17 100644 --- a/src/i18n/translations/fa.js +++ b/src/i18n/translations/fa.js @@ -147,6 +147,7 @@ const fa = { size: 'اندازه', sort_by: 'مرتب سازی بر اساس', start: 'شروع', + storage_puter_used: 'استفاده شده توسط Puter', taking_longer_than_usual: 'کمی بیشتر از معمول طول می کشد. لطفا صبر کنید...', text_document: 'سند متنی', tos_fineprint: `با کلیک بر روی 'ایجاد حساب کاربری رایگان' شما با {{link=terms}}شرایط خدمات{{/link}} و {{link=privacy}}سیاست حفظ حریم خصوصی{{/link}} Puter موافقت می کنید.`, diff --git a/src/i18n/translations/ko.js b/src/i18n/translations/ko.js index e02299282..5954e0947 100644 --- a/src/i18n/translations/ko.js +++ b/src/i18n/translations/ko.js @@ -21,7 +21,9 @@ const ko = { english_name: "Korean", code: "ko", dictionary: { + about: "정보", access_granted_to: "접근 권한 부여", + account: "계정", add_existing_account: "기존 계정 추가", all_fields_required: '모든 필드는 필수입니다.', apply: "적용", @@ -34,6 +36,10 @@ const ko = { change_language: "언어 변경", change_password: "비밀번호 변경", change_username: "사용자 이름 변경", + clock: '시계', + clock_visible_hide: '숨기기 - 항상 숨김', + clock_visible_show: '표시 - 항상 표시', + clock_visible_auto: '자동 - 숨김', close_all_windows: "모든 창 닫기", color: '색상', confirm_account_for_free_referral_storage_c2a: '계정을 생성하고 이메일 주소를 확인하여 1GB의 무료 저장 공간을 받으십시오. 친구도 1GB의 무료 저장 공간을 받게 됩니다.', @@ -52,6 +58,7 @@ const ko = { cut: '잘라내기', date_modified: '수정한 날짜', delete: '삭제', + delete_account: "계정 삭제", delete_permanently: "영구 삭제", deploy_as_app: '앱으로 배포', descending: '내림차순', @@ -80,6 +87,7 @@ const ko = { items_in_trash_cannot_be_renamed: `이 항목은 휴지통에 있기 때문에 이름을 바꿀 수 없습니다. 이 항목의 이름을 바꾸려면 먼저 휴지통에서 끌어내십시오.`, jpeg_image: 'JPEG 이미지', keep_in_taskbar: '작업 표시줄에 유지', + language: "언어", log_in: "로그인", log_out: '로그아웃', move: '이동', @@ -136,6 +144,7 @@ const ko = { send: "보내기", send_password_recovery_email: "비밀번호 복구 이메일 보내기", session_saved: "계정을 생성해 주셔서 감사합니다. 이 세션이 저장되었습니다.", + settings: "설정", set_new_password: "새 비밀번호 설정", share_to: "공유", show_all_windows: "모든 창 표시", @@ -146,6 +155,8 @@ const ko = { size: '크기', sort_by: '정렬 기준', start: '시작', + storage_usage: "저장 공간 사용량", + storage_puter_used: 'Puter에서 사용 중', taking_longer_than_usual: '보통보다 조금 더 오래 걸립니다. 잠시만 기다려 주십시오...', text_document: '텍스트 문서', tos_fineprint: `무료 계정 생성을 클릭하면 Puter의 {{link=terms}}서비스 약관{{/link}}과 {{link=privacy}}개인정보 보호정책{{/link}}에 동의하는 것입니다.`, @@ -157,7 +168,9 @@ const ko = { upload_here: '여기에 업로드', username: "사용자 이름", username_changed: '사용자 이름이 성공적으로 업데이트되었습니다.', + usage: "사용량", versions: "버전", + visibility: '가시성', yes_release_it: '예, 해제합니다', you_have_been_referred_to_puter_by_a_friend: "친구가 Puter로 추천했습니다!", zip: "압축", From e3d238f897f98ffc67d921988dfbfbad6ce0cdc3 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 13:57:29 -0400 Subject: [PATCH 19/35] Do not use git to get version number --- packages/backend/package.json | 2 +- .../backend/src/services/PuterVersionService.js | 14 +++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index eb18aa61b..320bd2d58 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@heyputer/backend", - "version": "1.0.0", + "version": "2.0.2", "description": "Backend/Kernel for Puter", "main": "exports.js", "scripts": { diff --git a/packages/backend/src/services/PuterVersionService.js b/packages/backend/src/services/PuterVersionService.js index 165812a16..3977902d3 100644 --- a/packages/backend/src/services/PuterVersionService.js +++ b/packages/backend/src/services/PuterVersionService.js @@ -60,27 +60,19 @@ class PuterVersionService extends AdvancedBase { } get_version () { - let git_version; let deploy_timestamp; if ( this.config.env === 'dev' ) { - // get commit hash from git - git_version = this.modules._exec('git describe --tags', { - cwd: this.modules._path.join(__dirname, '../../'), - encoding: 'utf8', - }).trim(); deploy_timestamp = Date.now(); } else { - // get git version from file - const path = this.modules._path.join(__dirname, '../../git_version'); - - git_version = this.modules.fs.readFileSync(path, 'utf8').trim(); deploy_timestamp = Number.parseInt((this.modules.fs.readFileSync( this.modules._path.join(__dirname, '../../deploy_timestamp'), 'utf8' )).trim()); } + const version = process.env.npm_package_version || + require('../../package.json').version; return { - version: git_version, + version, environment: this.config.env, location: this.config.server_id, deploy_timestamp, From fc5025a2a8d202da816d2f6bebd6ee648e5117eb Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 14:37:34 -0400 Subject: [PATCH 20/35] Simplify PuterVersionService --- package-lock.json | 2 +- packages/backend/src/CoreModule.js | 9 ++- .../backend/src/services/PuterAPIService.js | 1 - .../src/services/PuterVersionService.js | 60 ++++--------------- 4 files changed, 18 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b1c28248..2a73bfe0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10789,7 +10789,7 @@ }, "packages/backend": { "name": "@heyputer/backend", - "version": "1.0.0", + "version": "2.0.2", "license": "AGPL-3.0-only", "workspaces": [ "packages/*" diff --git a/packages/backend/src/CoreModule.js b/packages/backend/src/CoreModule.js index 5357b3e82..317c4e1d2 100644 --- a/packages/backend/src/CoreModule.js +++ b/packages/backend/src/CoreModule.js @@ -43,6 +43,11 @@ module.exports = CoreModule; const install = async ({ services, app }) => { const config = require('./config'); + // /!\ IMPORTANT /!\ + // For new services, put the import immediate above the + // call to services.registerService. We'll clean this up + // in a future PR. + const { LogService } = require('./services/runtime-analysis/LogService'); const { PagerService } = require('./services/runtime-analysis/PagerService'); const { AlarmService } = require('./services/runtime-analysis/AlarmService'); @@ -182,6 +187,8 @@ const install = async ({ services, app }) => { const { EventService } = require('./services/EventService'); services.registerService('event', EventService); + const { PuterVersionService } = require('./services/PuterVersionService'); + services.registerService('puter-version', PuterVersionService); } const install_legacy = async ({ services }) => { @@ -192,7 +199,6 @@ const install_legacy = async ({ services }) => { const PerformanceMonitor = require('./monitor/PerformanceMonitor'); const { OperationTraceService } = require('./services/OperationTraceService'); const { WSPushService } = require('./services/WSPushService'); - const { PuterVersionService } = require('./services/PuterVersionService'); const { ReferralCodeService } = require('./services/ReferralCodeService'); const { Emailservice } = require('./services/EmailService'); const { ClientOperationService } = require('./services/ClientOperationService'); @@ -207,7 +213,6 @@ const install_legacy = async ({ services }) => { services.registerService('filesystem', FilesystemService); services.registerService('operationTrace', OperationTraceService); services.registerService('__event-push-ws', WSPushService); - services.registerService('puter-version', PuterVersionService); services.registerService('referral-code', ReferralCodeService); services.registerService('email', Emailservice); services.registerService('file-cache', FileCacheService); diff --git a/packages/backend/src/services/PuterAPIService.js b/packages/backend/src/services/PuterAPIService.js index a285ef94c..d8d33f824 100644 --- a/packages/backend/src/services/PuterAPIService.js +++ b/packages/backend/src/services/PuterAPIService.js @@ -22,7 +22,6 @@ class PuterAPIService extends BaseService { async ['__on_install.routes'] () { const { app } = this.services.get('web-server'); - app.use(require('../routers/version')) app.use(require('../routers/apps')) app.use(require('../routers/query/app')) app.use(require('../routers/change_username')) diff --git a/packages/backend/src/services/PuterVersionService.js b/packages/backend/src/services/PuterVersionService.js index 3977902d3..108cf2f51 100644 --- a/packages/backend/src/services/PuterVersionService.js +++ b/packages/backend/src/services/PuterVersionService.js @@ -16,66 +16,26 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -const { AdvancedBase } = require("puter-js-common"); -const { NodeUIDSelector } = require("../filesystem/node/selectors"); -const { get_user } = require("../helpers"); -const { TeePromise } = require("../util/promise"); -const { StreamBuffer } = require("../util/streamutil"); +const BaseService = require("./BaseService"); -class PuterVersionService extends AdvancedBase { - static MODULES = { - _path: require('path'), - fs: require('fs'), - _exec: require('child_process').execSync, - axios: require('axios'), +class PuterVersionService extends BaseService { + async _init () { + this.boot_time = Date.now(); } - constructor ({ services, config }) { - super(); - this.fs = services.get('filesystem'); - this.config = config; - - this._init({ config }); - this.ready_ = new TeePromise(); - } - - async _init ({ config }) { - // this.node = await this.fs.node(new NodeUIDSelector(config.puter_hosted_data.puter_versions)); - // this.user = await get_user({ username: 'puter' }); - - // await this._poll_versions({ config }); - - // setInterval(async () => { - // await this._poll_versions({ config }); - // }, 60 * 1000); - } - - // not used anymore - this was for getting version numbers from a file hosted on puter - async _poll_versions ({ config }) { - const resp = await this.modules.axios.get( - config.puter_hosted_data.puter_versions - ); - this.versions_ = resp.data.versions; - this.ready_.resolve(); + async ['__on_install.routes'] () { + const { app } = this.services.get('web-server'); + app.use(require('../routers/version')); } get_version () { - let deploy_timestamp; - if ( this.config.env === 'dev' ) { - deploy_timestamp = Date.now(); - } else { - deploy_timestamp = Number.parseInt((this.modules.fs.readFileSync( - this.modules._path.join(__dirname, '../../deploy_timestamp'), - 'utf8' - )).trim()); - } const version = process.env.npm_package_version || require('../../package.json').version; return { version, - environment: this.config.env, - location: this.config.server_id, - deploy_timestamp, + environment: this.global_config.env, + location: this.global_config.server_id, + deploy_timestamp: this.boot_time, }; } } From b8e66cada99146ba65e08b7a6ac27e1ed1aba722 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 19:07:00 -0400 Subject: [PATCH 21/35] Add puter.js --- packages/backend/src/SelfhostedModule.js | 24 + .../backend/src/services/DevWatcherService.js | 93 + .../src/services/ServceStaticFilesService.js | 17 + packages/backend/src/util/configutil.js | 19 + packages/puter-dot-js/.gitignore | 137 + packages/puter-dot-js/APACHE_LICENSE.txt | 201 + packages/puter-dot-js/README.md | 55 + packages/puter-dot-js/app-migration-guide.txt | 12 + packages/puter-dot-js/package-lock.json | 1738 +++++++ packages/puter-dot-js/package.json | 19 + packages/puter-dot-js/src/bg.png | Bin 0 -> 308941 bytes packages/puter-dot-js/src/bg.webp | Bin 0 -> 7000 bytes packages/puter-dot-js/src/index.js | 358 ++ .../puter-dot-js/src/lib/EventListener.js | 49 + packages/puter-dot-js/src/lib/path.js | 509 ++ .../src/lib/socket.io/socket.io.esm.min.js | 7 + .../lib/socket.io/socket.io.esm.min.js.map | 1 + .../src/lib/socket.io/socket.io.js | 4385 +++++++++++++++++ .../src/lib/socket.io/socket.io.js.map | 1 + .../src/lib/socket.io/socket.io.min.js | 7 + .../src/lib/socket.io/socket.io.min.js.map | 1 + .../lib/socket.io/socket.io.msgpack.min.js | 7 + .../socket.io/socket.io.msgpack.min.js.map | 1 + packages/puter-dot-js/src/lib/utils.js | 436 ++ packages/puter-dot-js/src/modules/AI.js | 253 + packages/puter-dot-js/src/modules/Apps.js | 158 + packages/puter-dot-js/src/modules/Auth.js | 115 + packages/puter-dot-js/src/modules/FSItem.js | 98 + .../src/modules/FileSystem/index.js | 133 + .../src/modules/FileSystem/operations/copy.js | 61 + .../FileSystem/operations/deleteFSEntry.js | 59 + .../modules/FileSystem/operations/mkdir.js | 59 + .../src/modules/FileSystem/operations/move.js | 57 + .../src/modules/FileSystem/operations/read.js | 44 + .../modules/FileSystem/operations/readdir.js | 46 + .../modules/FileSystem/operations/rename.js | 56 + .../src/modules/FileSystem/operations/sign.js | 103 + .../modules/FileSystem/operations/space.js | 40 + .../src/modules/FileSystem/operations/stat.js | 57 + .../modules/FileSystem/operations/upload.js | 419 ++ .../modules/FileSystem/operations/write.js | 53 + .../FileSystem/utils/getAbsolutePathForApp.js | 21 + packages/puter-dot-js/src/modules/Hosting.js | 136 + packages/puter-dot-js/src/modules/KV.js | 205 + packages/puter-dot-js/src/modules/OS.js | 90 + .../puter-dot-js/src/modules/PuterDialog.js | 373 ++ packages/puter-dot-js/src/modules/UI.js | 1019 ++++ packages/puter-dot-js/test/fs.test.js | 619 +++ packages/puter-dot-js/test/kv.test.js | 417 ++ packages/puter-dot-js/test/run.html | 137 + src/index.js | 5 +- 51 files changed, 12907 insertions(+), 3 deletions(-) create mode 100644 packages/backend/src/services/DevWatcherService.js create mode 100644 packages/backend/src/services/ServceStaticFilesService.js create mode 100644 packages/backend/src/util/configutil.js create mode 100644 packages/puter-dot-js/.gitignore create mode 100644 packages/puter-dot-js/APACHE_LICENSE.txt create mode 100644 packages/puter-dot-js/README.md create mode 100644 packages/puter-dot-js/app-migration-guide.txt create mode 100644 packages/puter-dot-js/package-lock.json create mode 100644 packages/puter-dot-js/package.json create mode 100644 packages/puter-dot-js/src/bg.png create mode 100644 packages/puter-dot-js/src/bg.webp create mode 100644 packages/puter-dot-js/src/index.js create mode 100644 packages/puter-dot-js/src/lib/EventListener.js create mode 100644 packages/puter-dot-js/src/lib/path.js create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.js create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.js.map create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.min.js create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js create mode 100644 packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map create mode 100644 packages/puter-dot-js/src/lib/utils.js create mode 100644 packages/puter-dot-js/src/modules/AI.js create mode 100644 packages/puter-dot-js/src/modules/Apps.js create mode 100644 packages/puter-dot-js/src/modules/Auth.js create mode 100644 packages/puter-dot-js/src/modules/FSItem.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/index.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/copy.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/move.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/read.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/rename.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/sign.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/space.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/stat.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/upload.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/operations/write.js create mode 100644 packages/puter-dot-js/src/modules/FileSystem/utils/getAbsolutePathForApp.js create mode 100644 packages/puter-dot-js/src/modules/Hosting.js create mode 100644 packages/puter-dot-js/src/modules/KV.js create mode 100644 packages/puter-dot-js/src/modules/OS.js create mode 100644 packages/puter-dot-js/src/modules/PuterDialog.js create mode 100644 packages/puter-dot-js/src/modules/UI.js create mode 100644 packages/puter-dot-js/test/fs.test.js create mode 100644 packages/puter-dot-js/test/kv.test.js create mode 100644 packages/puter-dot-js/test/run.html diff --git a/packages/backend/src/SelfhostedModule.js b/packages/backend/src/SelfhostedModule.js index 490a6de0c..3829dc50b 100644 --- a/packages/backend/src/SelfhostedModule.js +++ b/packages/backend/src/SelfhostedModule.js @@ -9,6 +9,30 @@ class SelfhostedModule extends AdvancedBase { const ComplainAboutVersionsService = require('./services/ComplainAboutVersionsService'); services.registerService('complain-about-versions', ComplainAboutVersionsService); + + const DevWatcherService = require('./services/DevWatcherService'); + const path_ = require('path'); + services.registerService('__dev-watcher', DevWatcherService, { + root: path_.resolve(__dirname, '../../../'), + commands: [ + { + name: 'puter.js:webpack-watch', + directory: 'packages/puter-dot-js', + command: 'npm', + args: ['run', 'start-webpack'], + }, + ], + }); + + const ServeStaticFilesService = require("./services/ServceStaticFilesService"); + services.registerService('__serve-puterjs', ServeStaticFilesService, { + directories: [ + { + prefix: '/sdk', + path: path_.resolve(__dirname, '../../../packages/puter-dot-js/dist'), + }, + ], + }); } } diff --git a/packages/backend/src/services/DevWatcherService.js b/packages/backend/src/services/DevWatcherService.js new file mode 100644 index 000000000..8272c3c3d --- /dev/null +++ b/packages/backend/src/services/DevWatcherService.js @@ -0,0 +1,93 @@ +const BaseService = require("./BaseService"); + +class ProxyLogger { + constructor (log) { + this.log = log; + } + attach (stream) { + let buffer = ''; + stream.on('data', (chunk) => { + buffer += chunk.toString(); + let lineEndIndex = buffer.indexOf('\n'); + while (lineEndIndex !== -1) { + const line = buffer.substring(0, lineEndIndex); + this.log(line); + buffer = buffer.substring(lineEndIndex + 1); + lineEndIndex = buffer.indexOf('\n'); + } + }); + + stream.on('end', () => { + if (buffer.length) { + this.log(buffer); + } + }); + } +} + +/** + * @description + * This service is used to run webpack watchers. + */ +class DevWatcherService extends BaseService { + static MODULES = { + path: require('path'), + spawn: require('child_process').spawn, + }; + + _construct () { + this.instances = []; + } + + async _init (args) { + const { root, commands } = args; + + process.on('exit', () => { + this.exit_all_(); + }) + + for ( const entry of commands ) { + const { name, directory, command, args } = entry; + const fullpath = this.modules.path.join( + root, directory); + this.start_({ name, fullpath, command, args }); + } + } + + log_ (name, isErr, line) { + let txt = `[${name}:`; + txt += isErr + ? `\x1B[31;1merr\x1B[0m` + : `\x1B[32;1mout\x1B[0m`; + txt += '] ' + line; + this.log.info(txt); + } + + async start_ ({ name, fullpath, command, args }) { + this.log.info(`Starting ${name} in ${fullpath}`); + const proc = this.modules.spawn(command, args, { + shell: true, + env: process.env, + cwd: fullpath, + }); + this.instances.push({ + name, proc, + }); + const out = new ProxyLogger((line) => this.log_(name, false, line)); + out.attach(proc.stdout); + const err = new ProxyLogger((line) => this.log_(name, true, line)); + err.attach(proc.stderr); + proc.on('exit', () => { + this.log.info(`[${name}:exit] Process exited (${proc.exitCode})`); + this.instances = this.instances.filter((inst) => inst.proc !== proc); + }) + } + + async exit_all_ () { + for ( const { proc } of this.instances ) { + proc.kill(); + } + } +}; + +module.exports = DevWatcherService; diff --git a/packages/backend/src/services/ServceStaticFilesService.js b/packages/backend/src/services/ServceStaticFilesService.js new file mode 100644 index 000000000..95cf68f28 --- /dev/null +++ b/packages/backend/src/services/ServceStaticFilesService.js @@ -0,0 +1,17 @@ +const BaseService = require("./BaseService"); + +class ServeStaticFilesService extends BaseService { + async _init (args) { + this.directories = args.directories; + } + + async ['__on_install.routes'] () { + const { app } = this.services.get('web-server'); + + for ( const { prefix, path } of this.directories ) { + app.use(prefix, require('express').static(path)); + } + } +} + +module.exports = ServeStaticFilesService; diff --git a/packages/backend/src/util/configutil.js b/packages/backend/src/util/configutil.js new file mode 100644 index 000000000..12f707e09 --- /dev/null +++ b/packages/backend/src/util/configutil.js @@ -0,0 +1,19 @@ +let memoized_common_template_vars_ = null; +const get_common_template_vars = () => { + const path_ = require('path'); + if ( memoized_common_template_vars_ !== null ) { + return memoized_common_template_vars_; + } + + const code_root = path_.resolve(__dirname, '../../'); + + memoized_common_template_vars_ = { + code_root, + }; + + return memoized_common_template_vars_; +} + +module.exports = { + get_common_template_vars, +}; diff --git a/packages/puter-dot-js/.gitignore b/packages/puter-dot-js/.gitignore new file mode 100644 index 000000000..55c551533 --- /dev/null +++ b/packages/puter-dot-js/.gitignore @@ -0,0 +1,137 @@ +# MAC OS hidden directory settings file +.DS_Store + +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env.production + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# End of https://www.toptal.com/developers/gitignore/api/node +*.zip +*.pem +.DS_Store +./build +build + +# config file +src/config.js +ssl +ssl/ \ No newline at end of file diff --git a/packages/puter-dot-js/APACHE_LICENSE.txt b/packages/puter-dot-js/APACHE_LICENSE.txt new file mode 100644 index 000000000..a5811bf38 --- /dev/null +++ b/packages/puter-dot-js/APACHE_LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 Puter Technologies Inc. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/puter-dot-js/README.md b/packages/puter-dot-js/README.md new file mode 100644 index 000000000..480ee13ed --- /dev/null +++ b/packages/puter-dot-js/README.md @@ -0,0 +1,55 @@ +

Puter.js

+

The official JavaScript SDK for Puter.com. Cloud and AI features right from your frontend code!

+

+ « LIVE DEMO » +
+
+ Docs + · + Puter.com + · + Discord + · + Reddit + · + X (Twitter) +

+ +## Installation +``` +git clone https://github.com/HeyPuter/puter.js.git +cd puter.js +npm install +``` + +## Run development server + +``` +npm start +``` + +## Build + +``` +npm run build +``` + +### Example +Make sure the development server is running. + +```html + + + + + + +``` diff --git a/packages/puter-dot-js/app-migration-guide.txt b/packages/puter-dot-js/app-migration-guide.txt new file mode 100644 index 000000000..f1f530ab2 --- /dev/null +++ b/packages/puter-dot-js/app-migration-guide.txt @@ -0,0 +1,12 @@ +all UI function calls from puter should be in the form `puter.ui.` + e.g. `puter.showOpenFilePicker` becomes `puter.ui.showOpenFilePicker` + +puter.FileSystem. -> puter.fs. +puter.Router. -> puter.router. +puter.Apps. -> puter.apps. + +puter.setItem -> puter.kv.set +puter.getItem -> puter.kv.get +puter.removeItem -> puter.kv.del +puter.createCloudItem(...) -> new puter.CloudItem(...) +puter.router.* -> puter.hosting.* \ No newline at end of file diff --git a/packages/puter-dot-js/package-lock.json b/packages/puter-dot-js/package-lock.json new file mode 100644 index 000000000..d4484de1a --- /dev/null +++ b/packages/puter-dot-js/package-lock.json @@ -0,0 +1,1738 @@ +{ + "name": "puter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "puter", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "concurrently": "^8.2.2", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", + "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", + "dev": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "peer": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.601", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz", + "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==", + "dev": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "peer": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true, + "peer": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "peer": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/packages/puter-dot-js/package.json b/packages/puter-dot-js/package.json new file mode 100644 index 000000000..bf929f243 --- /dev/null +++ b/packages/puter-dot-js/package.json @@ -0,0 +1,19 @@ +{ + "name": "puter", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start-server": "npx http-server --cors -c-1", + "start-webpack": "export NODE_OPTIONS=--openssl-legacy-provider && webpack ./src/index.js --output-filename puter.js && webpack ./src/index.js --output-filename puter.dev.js --watch --devtool source-map", + "start": "concurrently \"npm run start-server\" \"npm run start-webpack\"", + "build": "export NODE_OPTIONS=--openssl-legacy-provider && webpack ./src/index.js --output-filename puter.js && { echo \"// Copyright 2024 Puter Technologies Inc. All rights reserved.\"; echo \"// Generated on $(date '+%Y-%m-%d %H:%M')\n\"; cat ./dist/puter.js; } > temp && mv temp ./dist/puter.js" + }, + "keywords": [], + "author": "", + "license": "Apache-2.0", + "devDependencies": { + "concurrently": "^8.2.2", + "webpack-cli": "^5.1.4" + } +} diff --git a/packages/puter-dot-js/src/bg.png b/packages/puter-dot-js/src/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e746a236b26fcb68d8387c8ea9cdcdacae9a8ee4 GIT binary patch literal 308941 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 z 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

0NM+W4hmZTSn&Rj!P$1_&!9W2lXTbdL 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

$Tc85WvpjCDv}wE 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

Q{G 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 M07*qoM6N<$f@IjD-T(jq literal 0 HcmV?d00001 diff --git a/packages/puter-dot-js/src/bg.webp b/packages/puter-dot-js/src/bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..eb0210a33740a2583ad3594e663c20de4ac077b1 GIT binary patch literal 7000 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 literal 0 HcmV?d00001 diff --git a/packages/puter-dot-js/src/index.js b/packages/puter-dot-js/src/index.js new file mode 100644 index 000000000..549d163ad --- /dev/null +++ b/packages/puter-dot-js/src/index.js @@ -0,0 +1,358 @@ +import OS from './modules/OS.js'; +import FileSystem from './modules/FileSystem/index.js'; +import Hosting from './modules/Hosting.js'; +import Apps from './modules/Apps.js'; +import UI from './modules/UI.js'; +import KV from './modules/KV.js'; +import AI from './modules/AI.js'; +import Auth from './modules/Auth.js'; +import FSItem from './modules/FSItem.js'; +import * as utils from './lib/utils.js'; +import path from './lib/path.js'; + +window.puter = (function() { + 'use strict'; + + class Puter{ + // The environment that the SDK is running in. Can be 'gui', 'app' or 'web'. + // 'gui' means the SDK is running in the Puter GUI, i.e. Puter.com. + // 'app' means the SDK is running as a Puter app, i.e. within an iframe in the Puter GUI. + // 'web' means the SDK is running in a 3rd-party website. + env; + + defaultAPIOrigin = 'https://api.puter.com'; + defaultGUIOrigin = 'https://puter.com'; + + // An optional callback when the user is authenticated. This can be set by the app using the SDK. + onAuth; + + /** + * State object to keep track of the authentication request status. + * This is used to prevent multiple authentication popups from showing up by different parts of the app. + */ + puterAuthState = { + isPromptOpen: false, + authGranted: null, + resolver: null + }; + + // Holds the unique app instance ID that is provided by the host environment + appInstanceID; + + // Holds the unique app instance ID for the parent (if any), which is provided by the host environment + parentInstanceID; + + // Expose the FSItem class + static FSItem = FSItem; + + // Event handling properties + eventHandlers = {}; + + // -------------------------------------------- + // Constructor + // -------------------------------------------- + constructor(options) { + options = options ?? {}; + + // Holds the query parameters found in the current URL + let URLParams = new URLSearchParams(window.location.search); + + // Figure out the environment in which the SDK is running + if (URLParams.has('puter.app_instance_id')) + this.env = 'app'; + else if(window.puter_gui_enabled === true) + this.env = 'gui'; + else + this.env = 'web'; + + // there are some specific situations where puter is definitely loaded in GUI mode + // we're going to check for those situations here so that we don't break anything unintentionally + // if navigator URL's hostname is 'puter.com' + if(window.location.hostname === 'puter.com'){ + this.env = 'gui'; + } + + // Get the 'args' from the URL. This is used to pass arguments to the app. + if(URLParams.has('puter.args')){ + this.args = JSON.parse(decodeURIComponent(URLParams.get('puter.args'))); + }else{ + this.args = {}; + } + + // Try to extract appInstanceID from the URL. appInstanceID is included in every messaage + // sent to the host environment. This is used to help host environment identify the app + // instance that sent the message and communicate back to it. + if(URLParams.has('puter.app_instance_id')){ + this.appInstanceID = decodeURIComponent(URLParams.get('puter.app_instance_id')); + } + + // Try to extract parentInstanceID from the URL. If another app launched this app instance, parentInstanceID + // holds its instance ID, and is used to communicate with that parent app. + if(URLParams.has('puter.parent_instance_id')){ + this.parentInstanceID = decodeURIComponent(URLParams.get('puter.parent_instance_id')); + } + + // Try to extract `puter.app.id` from the URL. `puter.app.id` is the unique ID of the app. + // App ID is useful for identifying the app when communicating with the Puter API, among other things. + if(URLParams.has('puter.app.id')){ + this.appID = decodeURIComponent(URLParams.get('puter.app.id')); + } + + // Construct this App's AppData path based on the appID. AppData path is used to store files that are specific to this app. + // The default AppData path is `~/AppData/`. + if(this.appID){ + this.appDataPath = `~/AppData/${this.appID}`; + } + + // Construct APIOrigin from the URL. APIOrigin is used to build the URLs for the Puter API endpoints. + // The default APIOrigin is https://api.puter.com. However, if the URL contains a `puter.api_origin` query parameter, + // then that value is used as the APIOrigin. If the URL contains a `puter.domain` query parameter, then the APIOrigin + // is constructed as `https://api.`. + this.APIOrigin = this.defaultAPIOrigin; + if(URLParams.has('puter.api_origin')){ + this.APIOrigin = decodeURIComponent(URLParams.get('puter.api_origin')); + }else if(URLParams.has('puter.domain')){ + this.APIOrigin = 'https://api.' + URLParams.get('puter.domain'); + } + + // The SDK is running in the Puter GUI (i.e. 'gui') + if(this.env === 'gui'){ + this.authToken = window.auth_token; + // initialize submodules + this.initSubmodules(); + } + // Loaded in an iframe in the Puter GUI (i.e. 'app') + // When SDK is loaded in App mode the initiation process should start when the DOM is ready + else if (this.env === 'app') { + this.authToken = decodeURIComponent(URLParams.get('puter.auth.token')); + // initialize submodules + this.initSubmodules(); + // If the authToken is already set in localStorage, then we don't need to show the dialog + try { + if(localStorage.getItem('puter.auth.token')){ + this.setAuthToken(localStorage.getItem('puter.auth.token')); + } + // if appID is already set in localStorage, then we don't need to show the dialog + if(localStorage.getItem('puter.app.id')){ + this.setAppID(localStorage.getItem('puter.app.id')); + } + } catch (error) { + // Handle the error here + console.error('Error accessing localStorage:', error); + } + } + // SDK was loaded in a 3rd-party website. + // When SDK is loaded in GUI the initiation process should start when the DOM is ready. This is because + // the SDK needs to show a dialog to the user to ask for permission to access their Puter account. + else if(this.env === 'web') { + // initialize submodules + this.initSubmodules(); + try{ + // If the authToken is already set in localStorage, then we don't need to show the dialog + if(localStorage.getItem('puter.auth.token')){ + this.setAuthToken(localStorage.getItem('puter.auth.token')); + } + // if appID is already set in localStorage, then we don't need to show the dialog + if(localStorage.getItem('puter.app.id')){ + this.setAppID(localStorage.getItem('puter.app.id')); + } + } catch (error) { + // Handle the error here + console.error('Error accessing localStorage:', error); + } + } + } + + // Initialize submodules + initSubmodules = function(){ + // Auth + this.auth = new Auth(this.authToken, this.APIOrigin, this.appID, this.env); + // OS + this.os = new OS(this.authToken, this.APIOrigin, this.appID, this.env); + // FileSystem + this.fs = new FileSystem(this.authToken, this.APIOrigin, this.appID, this.env); + // UI + this.ui = new UI(this.appInstanceID, this.parentInstanceID, this.appID, this.env); + // Hosting + this.hosting = new Hosting(this.authToken, this.APIOrigin, this.appID, this.env); + // Apps + this.apps = new Apps(this.authToken, this.APIOrigin, this.appID, this.env); + // AI + this.ai = new AI(this.authToken, this.APIOrigin, this.appID, this.env); + // Key-Value Store + this.kv = new KV(this.authToken, this.APIOrigin, this.appID, this.env); + // Path + this.path = path; + } + + updateSubmodules() { + // Update submodules with new auth token and API origin + [this.os, this.fs, this.hosting, this.apps, this.ai, this.kv].forEach(module => { + if(!module) return; + module.setAuthToken(this.authToken); + module.setAPIOrigin(this.APIOrigin); + }); + } + + setAppID = function (appID) { + // save to localStorage + try{ + localStorage.setItem('puter.app.id', appID); + } catch (error) { + // Handle the error here + console.error('Error accessing localStorage:', error); + } + this.appID = appID; + } + + setAuthToken = function (authToken) { + this.authToken = authToken; + // If the SDK is running on a 3rd-party site or an app, then save the authToken in localStorage + if(this.env === 'web' || this.env === 'app'){ + try{ + localStorage.setItem('puter.auth.token', authToken); + } catch (error) { + // Handle the error here + console.error('Error accessing localStorage:', error); + } + } + // reinitialize submodules + this.updateSubmodules(); + } + + setAPIOrigin = function (APIOrigin) { + this.APIOrigin = APIOrigin; + // reinitialize submodules + this.updateSubmodules(); + } + + resetAuthToken = function () { + this.authToken = null; + // If the SDK is running on a 3rd-party site or an app, then save the authToken in localStorage + if(this.env === 'web' || this.env === 'app'){ + try{ + localStorage.removeItem('puter.auth.token'); + } catch (error) { + // Handle the error here + console.error('Error accessing localStorage:', error); + } + } + // reinitialize submodules + this.updateSubmodules(); + } + + exit = function() { + window.parent.postMessage({ + msg: "exit", + appInstanceID: this.appInstanceID, + }, '*'); + } + + /** + * A function that generates a domain-safe name by combining a random adjective, a random noun, and a random number (between 0 and 9999). + * The result is returned as a string with components separated by hyphens. + * It is useful when you need to create unique identifiers that are also human-friendly. + * + * @param {string} [separateWith='-'] - The character to use to separate the components of the generated name. + * @returns {string} A unique, hyphen-separated string comprising of an adjective, a noun, and a number. + * + */ + randName = function(separateWith = '-'){ + const first_adj = ['helpful','sensible', 'loyal', 'honest', 'clever', 'capable','calm', 'smart', 'genius', 'bright', 'charming', 'creative', 'diligent', 'elegant', 'fancy', + 'colorful', 'avid', 'active', 'gentle', 'happy', 'intelligent', 'jolly', 'kind', 'lively', 'merry', 'nice', 'optimistic', 'polite', + 'quiet', 'relaxed', 'silly', 'victorious', 'witty', 'young', 'zealous', 'strong', 'brave', 'agile', 'bold']; + + const nouns = ['street', 'roof', 'floor', 'tv', 'idea', 'morning', 'game', 'wheel', 'shoe', 'bag', 'clock', 'pencil', 'pen', + 'magnet', 'chair', 'table', 'house', 'dog', 'room', 'book', 'car', 'cat', 'tree', + 'flower', 'bird', 'fish', 'sun', 'moon', 'star', 'cloud', 'rain', 'snow', 'wind', 'mountain', + 'river', 'lake', 'sea', 'ocean', 'island', 'bridge', 'road', 'train', 'plane', 'ship', 'bicycle', + 'horse', 'elephant', 'lion', 'tiger', 'bear', 'zebra', 'giraffe', 'monkey', 'snake', 'rabbit', 'duck', + 'goose', 'penguin', 'frog', 'crab', 'shrimp', 'whale', 'octopus', 'spider', 'ant', 'bee', 'butterfly', 'dragonfly', + 'ladybug', 'snail', 'camel', 'kangaroo', 'koala', 'panda', 'piglet', 'sheep', 'wolf', 'fox', 'deer', 'mouse', 'seal', + 'chicken', 'cow', 'dinosaur', 'puppy', 'kitten', 'circle', 'square', 'garden', 'otter', 'bunny', 'meerkat', 'harp'] + + // return a random combination of first_adj + noun + number (between 0 and 9999) + // e.g. clever-idea-123 + return first_adj[Math.floor(Math.random() * first_adj.length)] + separateWith + nouns[Math.floor(Math.random() * nouns.length)] + separateWith + Math.floor(Math.random() * 10000); + } + + getUser = function(...args){ + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + }; + } + + return new Promise((resolve, reject) => { + const xhr = utils.initXhr('/whoami', this.APIOrigin, this.authToken, 'get'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) + } + + print = function(...args){ + for(let arg of args){ + document.getElementsByTagName('body')[0].append(arg); + } + } + } + + + // Create a new Puter object and return it + const puterobj = new Puter(); + + // Return the Puter object + return puterobj; +}()); + +window.addEventListener('message', async (event) => { + // if the message is not from Puter, then ignore it + if(event.origin !== puter.defaultGUIOrigin) return; + + if(event.data.msg && event.data.msg === 'requestOrigin'){ + event.source.postMessage({ + msg: "originResponse", + }, '*'); + } + else if (event.data.msg === 'puter.token') { + // puterDialog.close(); + // Set the authToken property + puter.setAuthToken(event.data.token); + // update appID + puter.setAppID(event.data.app_uid); + // Remove the event listener to avoid memory leaks + // window.removeEventListener('message', messageListener); + + puter.puterAuthState.authGranted = true; + // Resolve the promise + // resolve(); + + // Call onAuth callback + if(puter.onAuth && typeof puter.onAuth === 'function'){ + puter.getUser().then((user) => { + puter.onAuth(user) + }); + } + + puter.puterAuthState.isPromptOpen = false; + // Resolve or reject any waiting promises. + if (puter.puterAuthState.resolver) { + if (puter.puterAuthState.authGranted) { + puter.puterAuthState.resolver.resolve(); + } else { + puter.puterAuthState.resolver.reject(); + } + puter.puterAuthState.resolver = null; + }; + } +}) diff --git a/packages/puter-dot-js/src/lib/EventListener.js b/packages/puter-dot-js/src/lib/EventListener.js new file mode 100644 index 000000000..b7fa78217 --- /dev/null +++ b/packages/puter-dot-js/src/lib/EventListener.js @@ -0,0 +1,49 @@ +export default class EventListener { + // Array of all supported event names. + #eventNames; + + // Map of eventName -> array of listeners + #eventListeners; + + constructor(eventNames) { + this.#eventNames = eventNames; + + this.#eventListeners = (() => { + const map = new Map(); + for (let eventName of this.#eventNames) { + map[eventName] = []; + } + return map; + })(); + } + + emit(eventName, data) { + if (!this.#eventNames.includes(eventName)) { + console.error(`Event name '${eventName}' not supported`); + return; + } + this.#eventListeners[eventName].forEach((listener) => { + listener(data); + }); + } + + on(eventName, callback) { + if (!this.#eventNames.includes(eventName)) { + console.error(`Event name '${eventName}' not supported`); + return; + } + this.#eventListeners[eventName].push(callback); + } + + off(eventName, callback) { + if (!this.#eventNames.includes(eventName)) { + console.error(`Event name '${eventName}' not supported`); + return; + } + const listeners = this.#eventListeners[eventName]; + const index = listeners.indexOf(callback) + if (index !== -1) { + listeners.splice(index, 1); + } + } +} \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/path.js b/packages/puter-dot-js/src/lib/path.js new file mode 100644 index 000000000..489297458 --- /dev/null +++ b/packages/puter-dot-js/src/lib/path.js @@ -0,0 +1,509 @@ +// import {cwd} from './env.js' +let cwd; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +//'use strict'; + +const + CHAR_UPPERCASE_A = 65, + CHAR_LOWERCASE_A = 97, + CHAR_UPPERCASE_Z = 90, + CHAR_LOWERCASE_Z = 122, + CHAR_DOT = 46, + CHAR_FORWARD_SLASH = 47, + CHAR_BACKWARD_SLASH = 92, + CHAR_COLON = 58, + CHAR_QUESTION_MARK = 63; + +function isPathSeparator(code) { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +} + +function isPosixPathSeparator(code) { + return code === CHAR_FORWARD_SLASH; +} + +// Resolves . and .. elements in a path with directory names +function normalizeString(path, allowAboveRoot, separator, isPathSeparator) { + let res = ''; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = 0; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) + code = path.charCodeAt(i); + else if (isPathSeparator(code)) + break; + else + code = CHAR_FORWARD_SLASH; + + if (isPathSeparator(code)) { + if (lastSlash === i - 1 || dots === 1) { + // NOOP + } else if (dots === 2) { + if (res.length < 2 || lastSegmentLength !== 2 || + res.charCodeAt( res.length - 1) !== CHAR_DOT || + res.charCodeAt(res.length - 2) !== CHAR_DOT) { + if (res.length > 2) { + const lastSlashIndex = res.lastIndexOf(separator); + if (lastSlashIndex === -1) { + res = ''; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = + res.length - 1 - res.lastIndexOf(res, separator); + } + lastSlash = i; + dots = 0; + continue; + } else if (res.length !== 0) { + res = ''; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + res += res.length > 0 ? `${separator}..` : '..'; + lastSegmentLength = 2; + } + } else { + if (res.length > 0) + res += `${separator}${path.slice(lastSlash + 1, i)}`; + else + res = path.slice(lastSlash + 1, i); + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === CHAR_DOT && dots !== -1) { + ++dots; + } else { + dots = -1; + } + } + return res; +} + +const path = { + // path.resolve([from ...], to) + resolve(...args) { + let resolvedPath = ''; + let resolvedAbsolute = false; + + for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + // orig const path = i >= 0 ? args[i] : posixCwd(); + const path = i >= 0 ? args[i] : (cwd !== undefined ? cwd : '/'); + // const path = i >= 0 ? args[i] : '/'; + + // Skip empty entries + if (path.length === 0) { + continue; + } + + resolvedPath = `${path}/${resolvedPath}`; + resolvedAbsolute = + path.charCodeAt(0) === CHAR_FORWARD_SLASH; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', + isPosixPathSeparator); + + if (resolvedAbsolute) { + return `/${resolvedPath}`; + } + return resolvedPath.length > 0 ? resolvedPath : '.'; + }, + + normalize(path) { + if (path.length === 0) + return '.'; + + const isAbsolute = + path.charCodeAt(0) === CHAR_FORWARD_SLASH; + const trailingSeparator = + path.charCodeAt(path.length - 1) === CHAR_FORWARD_SLASH; + + // Normalize the path + path = normalizeString(path, !isAbsolute, '/', isPosixPathSeparator); + + if (path.length === 0) { + if (isAbsolute) + return '/'; + return trailingSeparator ? './' : '.'; + } + if (trailingSeparator) + path += '/'; + + return isAbsolute ? `/${path}` : path; + }, + + isAbsolute(path) { + return path.length > 0 && + path.charCodeAt(0) === CHAR_FORWARD_SLASH; + }, + + join(...args) { + if (args.length === 0) + return '.'; + let joined; + for (let i = 0; i < args.length; ++i) { + const arg = args[i]; + if (arg.length > 0) { + if (joined === undefined) + joined = arg; + else + joined += `/${arg}`; + } + } + if (joined === undefined) + return '.'; + return path.normalize(joined); + }, + + relative(from, to) { + if (from === to) + return ''; + + // Trim leading forward slashes. + from = path.resolve(from); + to = path.resolve(to); + + if (from === to) + return ''; + + const fromStart = 1; + const fromEnd = from.length; + const fromLen = fromEnd - fromStart; + const toStart = 1; + const toLen = to.length - toStart; + + // Compare paths to find the longest common path from root + const length = (fromLen < toLen ? fromLen : toLen); + let lastCommonSep = -1; + let i = 0; + for (; i < length; i++) { + const fromCode = from.charCodeAt(fromStart + i); + if (fromCode !== to.charCodeAt(toStart + i)) + break; + else if (fromCode === CHAR_FORWARD_SLASH) + lastCommonSep = i; + } + if (i === length) { + if (toLen > length) { + if (to.charCodeAt(toStart + i) === CHAR_FORWARD_SLASH) { + // We get here if `from` is the exact base path for `to`. + // For example: from='/foo/bar'; to='/foo/bar/baz' + return to.slice(toStart + i + 1); + } + if (i === 0) { + // We get here if `from` is the root + // For example: from='/'; to='/foo' + return to.slice(toStart + i); + } + } else if (fromLen > length) { + if (from.charCodeAt(fromStart + i) === + CHAR_FORWARD_SLASH) { + // We get here if `to` is the exact base path for `from`. + // For example: from='/foo/bar/baz'; to='/foo/bar' + lastCommonSep = i; + } else if (i === 0) { + // We get here if `to` is the root. + // For example: from='/foo/bar'; to='/' + lastCommonSep = 0; + } + } + } + + let out = ''; + // Generate the relative path based on the path difference between `to` + // and `from`. + for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) { + if (i === fromEnd || + from.charCodeAt(i) === CHAR_FORWARD_SLASH) { + out += out.length === 0 ? '..' : '/..'; + } + } + + // Lastly, append the rest of the destination (`to`) path that comes after + // the common path parts. + return `${out}${to.slice(toStart + lastCommonSep)}`; + }, + + toNamespacedPath(path) { + // Non-op on posix systems + return path; + }, + + dirname(path) { + if (path.length === 0) + return '.'; + const hasRoot = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let end = -1; + let matchedSlash = true; + for (let i = path.length - 1; i >= 1; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) + return hasRoot ? '/' : '.'; + if (hasRoot && end === 1) + return '//'; + return path.slice(0, end); + }, + + basename(path, ext) { + let start = 0; + let end = -1; + let matchedSlash = true; + + if (ext !== undefined && ext.length > 0 && ext.length <= path.length) { + if (ext === path) + return ''; + let extIdx = ext.length - 1; + let firstNonSlashEnd = -1; + for (let i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else { + if (firstNonSlashEnd === -1) { + // We saw the first non-path separator, remember this index in case + // we need it if the extension ends up not matching + matchedSlash = false; + firstNonSlashEnd = i + 1; + } + if (extIdx >= 0) { + // Try to match the explicit extension + if (code === ext.charCodeAt(extIdx)) { + if (--extIdx === -1) { + // We matched the extension, so mark this as the end of our path + // component + end = i; + } + } else { + // Extension does not match, so our result is the entire path + // component + extIdx = -1; + end = firstNonSlashEnd; + } + } + } + } + + if (start === end) + end = firstNonSlashEnd; + else if (end === -1) + end = path.length; + return path.slice(start, end); + } + for (let i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) + return ''; + return path.slice(start, end); + }, + + extname(path) { + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + let preDotState = 0; + for (let i = path.length - 1; i >= 0; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (startDot === -1 || + end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && + startDot === end - 1 && + startDot === startPart + 1)) { + return ''; + } + return path.slice(startDot, end); + }, + + format: _format.bind( null, '/'), + + parse(path) { + const ret = { root: '', dir: '', base: '', ext: '', name: '' }; + if (path.length === 0) + return ret; + const isAbsolute = + path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let start; + if (isAbsolute) { + ret.root = '/'; + start = 1; + } else { + start = 0; + } + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + let i = path.length - 1; + + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + let preDotState = 0; + + // Get non-dir info + for (; i >= start; --i) { + const code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (end !== -1) { + const start = startPart === 0 && isAbsolute ? 1 : startPart; + if (startDot === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && + startDot === end - 1 && + startDot === startPart + 1)) { + ret.base = ret.name = path.slice(start, end); + } else { + ret.name = path.slice(start, startDot); + ret.base = path.slice(start, end); + ret.ext = path.slice(startDot, end); + } + } + + if (startPart > 0) + ret.dir = path.slice(0, startPart - 1); + else if (isAbsolute) + ret.dir = '/'; + + return ret; + }, + + sep: '/', + delimiter: ':', + win32: null, + posix: null + }; + + function _format(sep, pathObject) { + validateObject(pathObject, 'pathObject'); + const dir = pathObject.dir || pathObject.root; + const base = pathObject.base || + `${pathObject.name || ''}${pathObject.ext || ''}`; + if (!dir) { + return base; + } + return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`; + } + +export default path \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js b/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js new file mode 100644 index 000000000..4cdde6057 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js @@ -0,0 +1,7 @@ +/*! + * Socket.IO v4.7.2 + * (c) 2014-2023 Guillermo Rauch + * Released under the MIT License. + */ +const t=Object.create(null);t.open="0",t.close="1",t.ping="2",t.pong="3",t.message="4",t.upgrade="5",t.noop="6";const e=Object.create(null);Object.keys(t).forEach((s=>{e[t[s]]=s}));const s={type:"error",data:"parser error"},n="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),i="function"==typeof ArrayBuffer,r=t=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer,o=({type:e,data:s},o,h)=>n&&s instanceof Blob?o?h(s):a(s,h):i&&(s instanceof ArrayBuffer||r(s))?o?h(s):a(new Blob([s]),h):h(t[e]+(s||"")),a=(t,e)=>{const s=new FileReader;return s.onload=function(){const t=s.result.split(",")[1];e("b"+(t||""))},s.readAsDataURL(t)};function h(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}let c;const u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p="undefined"==typeof Uint8Array?[]:new Uint8Array(256);for(let t=0;t<64;t++)p[u.charCodeAt(t)]=t;const l="function"==typeof ArrayBuffer,d=(t,n)=>{if("string"!=typeof t)return{type:"message",data:y(t,n)};const i=t.charAt(0);if("b"===i)return{type:"message",data:f(t.substring(1),n)};return e[i]?t.length>1?{type:e[i],data:t.substring(1)}:{type:e[i]}:s},f=(t,e)=>{if(l){const s=(t=>{let e,s,n,i,r,o=.75*t.length,a=t.length,h=0;"="===t[t.length-1]&&(o--,"="===t[t.length-2]&&o--);const c=new ArrayBuffer(o),u=new Uint8Array(c);for(e=0;e>4,u[h++]=(15&n)<<4|i>>2,u[h++]=(3&i)<<6|63&r;return c})(t);return y(s,e)}return{base64:!0,data:t}},y=(t,e)=>"blob"===e?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer,g=String.fromCharCode(30);function m(){return new TransformStream({transform(t,e){!function(t,e){n&&t.data instanceof Blob?t.data.arrayBuffer().then(h).then(e):i&&(t.data instanceof ArrayBuffer||r(t.data))?e(h(t.data)):o(t,!1,(t=>{c||(c=new TextEncoder),e(c.encode(t))}))}(t,(s=>{const n=s.length;let i;if(n<126)i=new Uint8Array(1),new DataView(i.buffer).setUint8(0,n);else if(n<65536){i=new Uint8Array(3);const t=new DataView(i.buffer);t.setUint8(0,126),t.setUint16(1,n)}else{i=new Uint8Array(9);const t=new DataView(i.buffer);t.setUint8(0,127),t.setBigUint64(1,BigInt(n))}t.data&&"string"!=typeof t.data&&(i[0]|=128),e.enqueue(i),e.enqueue(s)}))}})}let b;function v(t){return t.reduce(((t,e)=>t+e.length),0)}function w(t,e){if(t[0].length===e)return t.shift();const s=new Uint8Array(e);let n=0;for(let i=0;i(t.hasOwnProperty(s)&&(e[s]=t[s]),e)),{})}const A=_.setTimeout,O=_.clearTimeout;function T(t,e){e.useNativeTimers?(t.setTimeoutFn=A.bind(_),t.clearTimeoutFn=O.bind(_)):(t.setTimeoutFn=_.setTimeout.bind(_),t.clearTimeoutFn=_.clearTimeout.bind(_))}class R extends Error{constructor(t,e,s){super(t),this.description=e,this.context=s,this.type="TransportError"}}class C extends k{constructor(t){super(),this.writable=!1,T(this,t),this.opts=t,this.query=t.query,this.socket=t.socket}onError(t,e,s){return super.emitReserved("error",new R(t,e,s)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}send(t){"open"===this.readyState&&this.write(t)}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(t){const e=d(t,this.socket.binaryType);this.onPacket(e)}onPacket(t){super.emitReserved("packet",t)}onClose(t){this.readyState="closed",super.emitReserved("close",t)}pause(t){}createUri(t,e={}){return t+"://"+this._hostname()+this._port()+this.opts.path+this._query(e)}_hostname(){const t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}_port(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(t){const e=function(t){let e="";for(let s in t)t.hasOwnProperty(s)&&(e.length&&(e+="&"),e+=encodeURIComponent(s)+"="+encodeURIComponent(t[s]));return e}(t);return e.length?"?"+e:""}}const B="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),N=64,S={};let x,L=0,q=0;function P(t){let e="";do{e=B[t%N]+e,t=Math.floor(t/N)}while(t>0);return e}function j(){const t=P(+new Date);return t!==x?(L=0,x=t):t+"."+P(L++)}for(;q{var t;3===s.readyState&&(null===(t=this.opts.cookieJar)||void 0===t||t.parseCookies(s)),4===s.readyState&&(200===s.status||1223===s.status?this.onLoad():this.setTimeoutFn((()=>{this.onError("number"==typeof s.status?s.status:0)}),0))},s.send(this.data)}catch(t){return void this.setTimeoutFn((()=>{this.onError(t)}),0)}"undefined"!=typeof document&&(this.index=V.requestsCount++,V.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=F,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete V.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}}if(V.requestsCount=0,V.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",H);else if("function"==typeof addEventListener){addEventListener("onpagehide"in _?"pagehide":"unload",H,!1)}function H(){for(let t in V.requests)V.requests.hasOwnProperty(t)&&V.requests[t].abort()}const K="function"==typeof Promise&&"function"==typeof Promise.resolve?t=>Promise.resolve().then(t):(t,e)=>e(t,0),Y=_.WebSocket||_.MozWebSocket,W="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();const z={websocket:class extends C{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),e=this.opts.protocols,s=W?{}:E(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(s.headers=this.opts.extraHeaders);try{this.ws=W?new Y(t,e,s):e?new Y(t,e):new Y(t)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let e=0;e{try{this.ws.send(t)}catch(t){}n&&K((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){void 0!==this.ws&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",e=this.query||{};return this.opts.timestampRequests&&(e[this.opts.timestampParam]=j()),this.supportsBinary||(e.b64=1),this.createUri(t,e)}check(){return!!Y}},webtransport:class extends C{get name(){return"webtransport"}doOpen(){"function"==typeof WebTransport&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then((()=>{this.onClose()})).catch((t=>{this.onError("webtransport error",t)})),this.transport.ready.then((()=>{this.transport.createBidirectionalStream().then((t=>{const e=function(t,e){b||(b=new TextDecoder);const n=[];let i=0,r=-1,o=!1;return new TransformStream({transform(a,h){for(n.push(a);;){if(0===i){if(v(n)<1)break;const t=w(n,1);o=128==(128&t[0]),r=127&t[0],i=r<126?3:126===r?1:2}else if(1===i){if(v(n)<2)break;const t=w(n,2);r=new DataView(t.buffer,t.byteOffset,t.length).getUint16(0),i=3}else if(2===i){if(v(n)<8)break;const t=w(n,8),e=new DataView(t.buffer,t.byteOffset,t.length),o=e.getUint32(0);if(o>Math.pow(2,21)-1){h.enqueue(s);break}r=o*Math.pow(2,32)+e.getUint32(4),i=3}else{if(v(n)t){h.enqueue(s);break}}}})}(Number.MAX_SAFE_INTEGER,this.socket.binaryType),n=t.readable.pipeThrough(e).getReader(),i=m();i.readable.pipeTo(t.writable),this.writer=i.writable.getWriter();const r=()=>{n.read().then((({done:t,value:e})=>{t||(this.onPacket(e),r())})).catch((t=>{}))};r();const o={type:"open"};this.query.sid&&(o.data=`{"sid":"${this.query.sid}"}`),this.writer.write(o).then((()=>this.onOpen()))}))})))}write(t){this.writable=!1;for(let e=0;e{n&&K((()=>{this.writable=!0,this.emitReserved("drain")}),this.setTimeoutFn)}))}}doClose(){var t;null===(t=this.transport)||void 0===t||t.close()}},polling:class extends C{constructor(t){if(super(t),this.polling=!1,"undefined"!=typeof location){const e="https:"===location.protocol;let s=location.port;s||(s=e?"443":"80"),this.xd="undefined"!=typeof location&&t.hostname!==location.hostname||s!==t.port}const e=t&&t.forceBase64;this.supportsBinary=M&&!e,this.opts.withCredentials&&(this.cookieJar=void 0)}get name(){return"polling"}doOpen(){this.poll()}pause(t){this.readyState="pausing";const e=()=>{this.readyState="paused",t()};if(this.polling||!this.writable){let t=0;this.polling&&(t++,this.once("pollComplete",(function(){--t||e()}))),this.writable||(t++,this.once("drain",(function(){--t||e()})))}else e()}poll(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){((t,e)=>{const s=t.split(g),n=[];for(let t=0;t{if("opening"===this.readyState&&"open"===t.type&&this.onOpen(),"close"===t.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(t)})),"closed"!==this.readyState&&(this.polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState&&this.poll())}doClose(){const t=()=>{this.write([{type:"close"}])};"open"===this.readyState?t():this.once("open",t)}write(t){this.writable=!1,((t,e)=>{const s=t.length,n=new Array(s);let i=0;t.forEach(((t,r)=>{o(t,!1,(t=>{n[r]=t,++i===s&&e(n.join(g))}))}))})(t,(t=>{this.doWrite(t,(()=>{this.writable=!0,this.emitReserved("drain")}))}))}uri(){const t=this.opts.secure?"https":"http",e=this.query||{};return!1!==this.opts.timestampRequests&&(e[this.opts.timestampParam]=j()),this.supportsBinary||e.sid||(e.b64=1),this.createUri(t,e)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new V(this.uri(),t)}doWrite(t,e){const s=this.request({method:"POST",data:t});s.on("success",e),s.on("error",((t,e)=>{this.onError("xhr post error",t,e)}))}doPoll(){const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",((t,e)=>{this.onError("xhr poll error",t,e)})),this.pollXhr=t}}},J=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,$=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Q(t){const e=t,s=t.indexOf("["),n=t.indexOf("]");-1!=s&&-1!=n&&(t=t.substring(0,s)+t.substring(s,n).replace(/:/g,";")+t.substring(n,t.length));let i=J.exec(t||""),r={},o=14;for(;o--;)r[$[o]]=i[o]||"";return-1!=s&&-1!=n&&(r.source=e,r.host=r.host.substring(1,r.host.length-1).replace(/;/g,":"),r.authority=r.authority.replace("[","").replace("]","").replace(/;/g,":"),r.ipv6uri=!0),r.pathNames=function(t,e){const s=/\/{2,9}/g,n=e.replace(s,"/").split("/");"/"!=e.slice(0,1)&&0!==e.length||n.splice(0,1);"/"==e.slice(-1)&&n.splice(n.length-1,1);return n}(0,r.path),r.queryKey=function(t,e){const s={};return e.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,e,n){e&&(s[e]=n)})),s}(0,r.query),r}class X extends k{constructor(t,e={}){super(),this.binaryType="arraybuffer",this.writeBuffer=[],t&&"object"==typeof t&&(e=t,t=null),t?(t=Q(t),e.hostname=t.host,e.secure="https"===t.protocol||"wss"===t.protocol,e.port=t.port,t.query&&(e.query=t.query)):e.host&&(e.hostname=Q(e.host).host),T(this,e),this.secure=null!=e.secure?e.secure:"undefined"!=typeof location&&"https:"===location.protocol,e.hostname&&!e.port&&(e.port=this.secure?"443":"80"),this.hostname=e.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=e.port||("undefined"!=typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=e.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(t){let e={},s=t.split("&");for(let t=0,n=s.length;t{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){const e=Object.assign({},this.opts.query);e.EIO=4,e.transport=t,this.id&&(e.sid=this.id);const s=Object.assign({},this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[t]);return new z[t](s)}open(){let t;if(this.opts.rememberUpgrade&&X.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn((()=>{this.emitReserved("error","No transports available")}),0);t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}setTransport(t){this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",(t=>this.onClose("transport close",t)))}probe(t){let e=this.createTransport(t),s=!1;X.priorWebsocketSuccess=!1;const n=()=>{s||(e.send([{type:"ping",data:"probe"}]),e.once("packet",(t=>{if(!s)if("pong"===t.type&&"probe"===t.data){if(this.upgrading=!0,this.emitReserved("upgrading",e),!e)return;X.priorWebsocketSuccess="websocket"===e.name,this.transport.pause((()=>{s||"closed"!==this.readyState&&(c(),this.setTransport(e),e.send([{type:"upgrade"}]),this.emitReserved("upgrade",e),e=null,this.upgrading=!1,this.flush())}))}else{const t=new Error("probe error");t.transport=e.name,this.emitReserved("upgradeError",t)}})))};function i(){s||(s=!0,c(),e.close(),e=null)}const r=t=>{const s=new Error("probe error: "+t);s.transport=e.name,i(),this.emitReserved("upgradeError",s)};function o(){r("transport closed")}function a(){r("socket closed")}function h(t){e&&t.name!==e.name&&i()}const c=()=>{e.removeListener("open",n),e.removeListener("error",r),e.removeListener("close",o),this.off("close",a),this.off("upgrading",h)};e.once("open",n),e.once("error",r),e.once("close",o),this.once("close",a),this.once("upgrading",h),-1!==this.upgrades.indexOf("webtransport")&&"webtransport"!==t?this.setTimeoutFn((()=>{s||e.open()}),200):e.open()}onOpen(){if(this.readyState="open",X.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade){let t=0;const e=this.upgrades.length;for(;t{this.onClose("ping timeout")}),this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let t=1;for(let s=0;s=57344?s+=3:(n++,s+=4);return s}(e):Math.ceil(1.33*(e.byteLength||e.size))),s>0&&t>this.maxPayload)return this.writeBuffer.slice(0,s);t+=2}var e;return this.writeBuffer}write(t,e,s){return this.sendPacket("message",t,e,s),this}send(t,e,s){return this.sendPacket("message",t,e,s),this}sendPacket(t,e,s,n){if("function"==typeof e&&(n=e,e=void 0),"function"==typeof s&&(n=s,s=null),"closing"===this.readyState||"closed"===this.readyState)return;(s=s||{}).compress=!1!==s.compress;const i={type:t,data:e,options:s};this.emitReserved("packetCreate",i),this.writeBuffer.push(i),n&&this.once("flush",n),this.flush()}close(){const t=()=>{this.onClose("forced close"),this.transport.close()},e=()=>{this.off("upgrade",e),this.off("upgradeError",e),t()},s=()=>{this.once("upgrade",e),this.once("upgradeError",e)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(()=>{this.upgrading?s():t()})):this.upgrading?s():t()),this}onError(t){X.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const e=[];let s=0;const n=t.length;for(;s"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t.buffer instanceof ArrayBuffer,tt=Object.prototype.toString,et="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===tt.call(Blob),st="function"==typeof File||"undefined"!=typeof File&&"[object FileConstructor]"===tt.call(File);function nt(t){return G&&(t instanceof ArrayBuffer||Z(t))||et&&t instanceof Blob||st&&t instanceof File}function it(t,e){if(!t||"object"!=typeof t)return!1;if(Array.isArray(t)){for(let e=0,s=t.length;e=0&&t.num{delete this.acks[t];for(let e=0;e{this.io.clearTimeoutFn(i),e.apply(this,[null,...t])}}emitWithAck(t,...e){const s=void 0!==this.flags.timeout||void 0!==this._opts.ackTimeout;return new Promise(((n,i)=>{e.push(((t,e)=>s?t?i(t):n(e):n(t))),this.emit(t,...e)}))}_addToQueue(t){let e;"function"==typeof t[t.length-1]&&(e=t.pop());const s={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push(((t,...n)=>{if(s!==this._queue[0])return;return null!==t?s.tryCount>this._opts.retries&&(this._queue.shift(),e&&e(t)):(this._queue.shift(),e&&e(null,...n)),s.pending=!1,this._drainQueue()})),this._queue.push(s),this._drainQueue()}_drainQueue(t=!1){if(!this.connected||0===this._queue.length)return;const e=this._queue[0];e.pending&&!t||(e.pending=!0,e.tryCount++,this.flags=e.flags,this.emit.apply(this,e.args))}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){"function"==typeof this.auth?this.auth((t=>{this._sendConnectPacket(t)})):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:pt.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,e){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e)}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case pt.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):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 pt.EVENT:case pt.BINARY_EVENT:this.onevent(t);break;case pt.ACK:case pt.BINARY_ACK:this.onack(t);break;case pt.DISCONNECT:this.ondisconnect();break;case pt.CONNECT_ERROR:this.destroy();const e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}onevent(t){const e=t.data||[];null!=t.id&&e.push(this.ack(t.id)),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const e=this._anyListeners.slice();for(const s of e)s.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}ack(t){const e=this;let s=!1;return function(...n){s||(s=!0,e.packet({type:pt.ACK,id:t,data:n}))}}onack(t){const e=this.acks[t.id];"function"==typeof e&&(e.apply(this,t.data),delete this.acks[t.id])}onconnect(t,e){this.id=t,this.recovered=e&&this._pid===e,this._pid=e,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach((t=>this.emitEvent(t))),this.receiveBuffer=[],this.sendBuffer.forEach((t=>{this.notifyOutgoingListeners(t),this.packet(t)})),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach((t=>t())),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:pt.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const e=this._anyListeners;for(let s=0;s0&&t.jitter<=1?t.jitter:0,this.attempts=0}vt.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),s=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-s:t+s}return 0|Math.min(t,this.max)},vt.prototype.reset=function(){this.attempts=0},vt.prototype.setMin=function(t){this.ms=t},vt.prototype.setMax=function(t){this.max=t},vt.prototype.setJitter=function(t){this.jitter=t};class wt extends k{constructor(t,e){var s;super(),this.nsps={},this.subs=[],t&&"object"==typeof t&&(e=t,t=void 0),(e=e||{}).path=e.path||"/socket.io",this.opts=e,T(this,e),this.reconnection(!1!==e.reconnection),this.reconnectionAttempts(e.reconnectionAttempts||1/0),this.reconnectionDelay(e.reconnectionDelay||1e3),this.reconnectionDelayMax(e.reconnectionDelayMax||5e3),this.randomizationFactor(null!==(s=e.randomizationFactor)&&void 0!==s?s:.5),this.backoff=new vt({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==e.timeout?2e4:e.timeout),this._readyState="closed",this.uri=t;const n=e.parser||yt;this.encoder=new n.Encoder,this.decoder=new n.Decoder,this._autoConnect=!1!==e.autoConnect,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}randomizationFactor(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}reconnectionDelayMax(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(t){if(~this._readyState.indexOf("open"))return this;this.engine=new X(this.uri,this.opts);const e=this.engine,s=this;this._readyState="opening",this.skipReconnect=!1;const n=gt(e,"open",(function(){s.onopen(),t&&t()})),i=e=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",e),t?t(e):this.maybeReconnectOnOpen()},r=gt(e,"error",i);if(!1!==this._timeout){const t=this._timeout,s=this.setTimeoutFn((()=>{n(),i(new Error("timeout")),e.close()}),t);this.opts.autoUnref&&s.unref(),this.subs.push((()=>{this.clearTimeoutFn(s)}))}return this.subs.push(n),this.subs.push(r),this}connect(t){return this.open(t)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(gt(t,"ping",this.onping.bind(this)),gt(t,"data",this.ondata.bind(this)),gt(t,"error",this.onerror.bind(this)),gt(t,"close",this.onclose.bind(this)),gt(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}ondecoded(t){K((()=>{this.emitReserved("packet",t)}),this.setTimeoutFn)}onerror(t){this.emitReserved("error",t)}socket(t,e){let s=this.nsps[t];return s?this._autoConnect&&!s.active&&s.connect():(s=new bt(this,t,e),this.nsps[t]=s),s}_destroy(t){const e=Object.keys(this.nsps);for(const t of e){if(this.nsps[t].active)return}this._close()}_packet(t){const e=this.encoder.encode(t);for(let s=0;st())),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,e){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,e),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const e=this.backoff.duration();this._reconnecting=!0;const s=this.setTimeoutFn((()=>{t.skipReconnect||(this.emitReserved("reconnect_attempt",t.backoff.attempts),t.skipReconnect||t.open((e=>{e?(t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",e)):t.onreconnect()})))}),e);this.opts.autoUnref&&s.unref(),this.subs.push((()=>{this.clearTimeoutFn(s)}))}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}const kt={};function _t(t,e){"object"==typeof t&&(e=t,t=void 0);const s=function(t,e="",s){let n=t;s=s||"undefined"!=typeof location&&location,null==t&&(t=s.protocol+"//"+s.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?s.protocol+t:s.host+t),/^(https?|wss?):\/\//.test(t)||(t=void 0!==s?s.protocol+"//"+t:"https://"+t),n=Q(t)),n.port||(/^(http|ws)$/.test(n.protocol)?n.port="80":/^(http|ws)s$/.test(n.protocol)&&(n.port="443")),n.path=n.path||"/";const i=-1!==n.host.indexOf(":")?"["+n.host+"]":n.host;return n.id=n.protocol+"://"+i+":"+n.port+e,n.href=n.protocol+"://"+i+(s&&s.port===n.port?"":":"+n.port),n}(t,(e=e||{}).path||"/socket.io"),n=s.source,i=s.id,r=s.path,o=kt[i]&&r in kt[i].nsps;let a;return e.forceNew||e["force new connection"]||!1===e.multiplex||o?a=new wt(n,e):(kt[i]||(kt[i]=new wt(n,e)),a=kt[i]),s.query&&!e.query&&(e.query=s.queryKey),a.socket(s.path,e)}Object.assign(_t,{Manager:wt,Socket:bt,io:_t,connect:_t});export{wt as Manager,bt as Socket,_t as connect,_t as default,_t as io,ut as protocol}; +//# sourceMappingURL=socket.io.esm.min.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map b/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map new file mode 100644 index 000000000..f78e5b788 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.io.esm.min.js","sources":["../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/index.js","../node_modules/@socket.io/component-emitter/index.mjs","../node_modules/engine.io-client/build/esm/globalThis.browser.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/contrib/yeast.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-parser/build/esm/index.js","../build/esm/on.js","../build/esm/socket.js","../build/esm/contrib/backo2.js","../build/esm/manager.js","../build/esm/index.js","../build/esm/url.js"],"sourcesContent":["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","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};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data\n .arrayBuffer()\n .then(toArray)\n .then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, encoded => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\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\";\nexport const 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 if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET } from \"./commons.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 function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, encodedPacket => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n }\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* READ_PAYLOAD */;\n }\n else if (state === 2 /* READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n }\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","/**\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","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 { 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","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.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 createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\n}\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/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","// 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","// 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}\nexport function createCookieJar() { }\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { createCookieJar, 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 }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n if (this.opts.withCredentials) {\n this.cookieJar = createCookieJar();\n }\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 const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\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 return this.createUri(schema, query);\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, cookieJar: this.cookieJar }, 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.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 var _a;\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, true);\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 (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\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 var _a;\n if (xhr.readyState === 3) {\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr);\n }\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 { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { 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;\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 const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\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 return this.createUri(schema, query);\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","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: Polling,\n};\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"./websocket-constructor.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n // @ts-ignore\n if (typeof WebTransport !== \"function\") {\n return;\n }\n // @ts-ignore\n this.transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n this.transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this.transport.ready.then(() => {\n this.transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this.writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this.writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this.writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();\n }\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 (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","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\";\nimport { defaultBinaryType } from \"./transports/websocket-constructor.js\";\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.binaryType = defaultBinaryType;\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 || [\n \"polling\",\n \"websocket\",\n \"webtransport\",\n ];\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: false,\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, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\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 if (this.upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\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 this.resetPingTimeout();\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\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","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","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 * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\",\n \"connect_error\",\n \"disconnect\",\n \"disconnecting\",\n \"newListener\",\n \"removeListener\", // used by the Node.js EventEmitter\n];\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// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\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 isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\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","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","/**\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 { 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 const onError = (err) => {\n this.cleanup();\n this._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 this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(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(() => {\n this.clearTimeoutFn(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","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 { 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"],"names":["PACKET_TYPES","Object","create","PACKET_TYPES_REVERSE","keys","forEach","key","ERROR_PACKET","type","data","withNativeBlob","Blob","prototype","toString","call","withNativeArrayBuffer","ArrayBuffer","isView","obj","buffer","encodePacket","supportsBinary","callback","encodeBlobAsBase64","fileReader","FileReader","onload","content","result","split","readAsDataURL","toArray","Uint8Array","byteOffset","byteLength","TEXT_ENCODER","chars","lookup","i","charCodeAt","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","substring","length","decoded","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","len","p","arraybuffer","bytes","decode","SEPARATOR","String","fromCharCode","createPacketEncoderStream","TransformStream","transform","packet","controller","arrayBuffer","then","encoded","TextEncoder","encode","encodePacketToBinary","payloadLength","header","DataView","setUint8","view","setUint16","setBigUint64","BigInt","enqueue","TEXT_DECODER","totalLength","chunks","reduce","acc","chunk","concatChunks","size","shift","j","slice","Emitter","mixin","on","addEventListener","event","fn","this","_callbacks","push","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","cb","callbacks","splice","emit","args","Array","emitReserved","listeners","hasListeners","globalThisShim","self","window","Function","pick","attr","k","hasOwnProperty","NATIVE_SET_TIMEOUT","globalThis","setTimeout","NATIVE_CLEAR_TIMEOUT","clearTimeout","installTimerFunctions","opts","useNativeTimers","setTimeoutFn","bind","clearTimeoutFn","TransportError","Error","constructor","reason","description","context","super","Transport","writable","query","socket","onError","open","readyState","doOpen","close","doClose","onClose","send","packets","write","onOpen","onData","onPacket","details","pause","onPause","createUri","schema","_hostname","_port","path","_query","hostname","indexOf","port","secure","Number","encodedQuery","str","encodeURIComponent","alphabet","map","prev","seed","num","Math","floor","yeast","now","Date","value","XMLHttpRequest","err","hasCORS","XHR","xdomain","e","concat","join","empty","hasXHR2","responseType","Request","uri","method","undefined","_a","xd","xhr","extraHeaders","setDisableHeaderCheck","setRequestHeader","cookieJar","addCookies","withCredentials","requestTimeout","timeout","onreadystatechange","parseCookies","status","onLoad","document","index","requestsCount","requests","cleanup","fromError","abort","responseText","attachEvent","unloadHandler","nextTick","Promise","resolve","WebSocket","MozWebSocket","isReactNative","navigator","product","toLowerCase","transports","websocket","forceBase64","name","check","protocols","headers","ws","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","onmessage","ev","onerror","lastPacket","timestampRequests","timestampParam","b64","webtransport","WebTransport","transport","transportOptions","closed","catch","ready","createBidirectionalStream","stream","decoderStream","maxPayload","TextDecoder","state","expectedLength","isBinary","headerArray","getUint16","n","getUint32","pow","createPacketDecoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","writer","getWriter","read","done","sid","polling","location","isSSL","protocol","createCookieJar","poll","total","doPoll","encodedPayload","encodedPackets","decodedPacket","decodePayload","count","encodePayload","doWrite","request","assign","req","xhrStatus","pollXhr","re","parts","parse","src","b","replace","m","exec","source","host","authority","ipv6uri","pathNames","regx","names","queryKey","$0","$1","$2","Socket","writeBuffer","prevBufferLen","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","qs","qry","pairs","l","pair","decodeURIComponent","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","beforeunloadEventListener","offlineEventListener","createTransport","EIO","priorWebsocketSuccess","setTransport","onDrain","probe","failed","onTransportOpen","msg","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","resetPingTimeout","onHandshake","JSON","sendPacket","code","filterUpgrades","getWritablePackets","payloadSize","c","utf8Length","ceil","options","compress","cleanupAndClose","waitForUpgrade","filteredUpgrades","withNativeFile","File","hasBinary","toJSON","isArray","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","RESERVED_EVENTS","PacketType","isObject","Decoder","reviver","add","reconstructor","decodeString","isBinaryEvent","BINARY_EVENT","BINARY_ACK","EVENT","ACK","BinaryReconstructor","takeBinaryData","start","buf","nsp","next","payload","tryParse","substr","isPayloadValid","static","CONNECT","DISCONNECT","CONNECT_ERROR","destroy","finishedReconstruction","reconPack","binData","replacer","encodeAsString","encodeAsBinary","stringify","deconstruction","unshift","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","flags","auth","_opts","_autoConnect","disconnected","subEvents","subs","onpacket","active","_readyState","retries","fromQueue","volatile","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","notifyOutgoingListeners","ackTimeout","timer","emitWithAck","withErr","reject","arg1","arg2","tryCount","pending","responseArgs","_drainQueue","force","_packet","_sendConnectPacket","_pid","pid","offset","_lastOffset","onconnect","onevent","onack","ondisconnect","message","emitEvent","_anyListeners","listener","sent","emitBuffered","subDestroy","onAny","prependAny","offAny","listenersAny","onAnyOutgoing","_anyOutgoingListeners","prependAnyOutgoing","offAnyOutgoing","listenersAnyOutgoing","Backoff","ms","min","max","factor","jitter","attempts","duration","rand","random","deviation","reset","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","Encoder","decoder","autoConnect","v","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","maybeReconnectOnOpen","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","errorSub","onping","ondata","ondecoded","_destroy","_close","delay","onreconnect","attempt","cache","parsed","loc","test","href","url","sameNamespace","forceNew","multiplex"],"mappings":";;;;;AAAA,MAAMA,EAAeC,OAAOC,OAAO,MACnCF,EAAmB,KAAI,IACvBA,EAAoB,MAAI,IACxBA,EAAmB,KAAI,IACvBA,EAAmB,KAAI,IACvBA,EAAsB,QAAI,IAC1BA,EAAsB,QAAI,IAC1BA,EAAmB,KAAI,IACvB,MAAMG,EAAuBF,OAAOC,OAAO,MAC3CD,OAAOG,KAAKJ,GAAcK,SAAQC,IAC9BH,EAAqBH,EAAaM,IAAQA,CAAG,IAEjD,MAAMC,EAAe,CAAEC,KAAM,QAASC,KAAM,gBCXtCC,EAAiC,mBAATC,MACT,oBAATA,MACqC,6BAAzCV,OAAOW,UAAUC,SAASC,KAAKH,MACjCI,EAA+C,mBAAhBC,YAE/BC,EAASC,GAC0B,mBAAvBF,YAAYC,OACpBD,YAAYC,OAAOC,GACnBA,GAAOA,EAAIC,kBAAkBH,YAEjCI,EAAe,EAAGZ,OAAMC,QAAQY,EAAgBC,IAC9CZ,GAAkBD,aAAgBE,KAC9BU,EACOC,EAASb,GAGTc,EAAmBd,EAAMa,GAG/BP,IACJN,aAAgBO,aAAeC,EAAOR,IACnCY,EACOC,EAASb,GAGTc,EAAmB,IAAIZ,KAAK,CAACF,IAAQa,GAI7CA,EAAStB,EAAaQ,IAASC,GAAQ,KAE5Cc,EAAqB,CAACd,EAAMa,KAC9B,MAAME,EAAa,IAAIC,WAKvB,OAJAD,EAAWE,OAAS,WAChB,MAAMC,EAAUH,EAAWI,OAAOC,MAAM,KAAK,GAC7CP,EAAS,KAAOK,GAAW,IACnC,EACWH,EAAWM,cAAcrB,EAAK,EAEzC,SAASsB,EAAQtB,GACb,OAAIA,aAAgBuB,WACTvB,EAEFA,aAAgBO,YACd,IAAIgB,WAAWvB,GAGf,IAAIuB,WAAWvB,EAAKU,OAAQV,EAAKwB,WAAYxB,EAAKyB,WAEjE,CACA,IAAIC,EClDJ,MAAMC,EAAQ,mEAERC,EAA+B,oBAAfL,WAA6B,GAAK,IAAIA,WAAW,KACvE,IAAK,IAAIM,EAAI,EAAGA,EAAIF,GAAcE,IAC9BD,EAAOD,EAAMG,WAAWD,IAAMA,EAkB3B,MCrBDvB,EAA+C,mBAAhBC,YACxBwB,EAAe,CAACC,EAAeC,KACxC,GAA6B,iBAAlBD,EACP,MAAO,CACHjC,KAAM,UACNC,KAAMkC,EAAUF,EAAeC,IAGvC,MAAMlC,EAAOiC,EAAcG,OAAO,GAClC,GAAa,MAATpC,EACA,MAAO,CACHA,KAAM,UACNC,KAAMoC,EAAmBJ,EAAcK,UAAU,GAAIJ,IAI7D,OADmBvC,EAAqBK,GAIjCiC,EAAcM,OAAS,EACxB,CACEvC,KAAML,EAAqBK,GAC3BC,KAAMgC,EAAcK,UAAU,IAEhC,CACEtC,KAAML,EAAqBK,IARxBD,CASN,EAEHsC,EAAqB,CAACpC,EAAMiC,KAC9B,GAAI3B,EAAuB,CACvB,MAAMiC,EDTQ,CAACC,IACnB,IAA8DX,EAAUY,EAAUC,EAAUC,EAAUC,EAAlGC,EAA+B,IAAhBL,EAAOF,OAAeQ,EAAMN,EAAOF,OAAWS,EAAI,EACnC,MAA9BP,EAAOA,EAAOF,OAAS,KACvBO,IACkC,MAA9BL,EAAOA,EAAOF,OAAS,IACvBO,KAGR,MAAMG,EAAc,IAAIzC,YAAYsC,GAAeI,EAAQ,IAAI1B,WAAWyB,GAC1E,IAAKnB,EAAI,EAAGA,EAAIiB,EAAKjB,GAAK,EACtBY,EAAWb,EAAOY,EAAOV,WAAWD,IACpCa,EAAWd,EAAOY,EAAOV,WAAWD,EAAI,IACxCc,EAAWf,EAAOY,EAAOV,WAAWD,EAAI,IACxCe,EAAWhB,EAAOY,EAAOV,WAAWD,EAAI,IACxCoB,EAAMF,KAAQN,GAAY,EAAMC,GAAY,EAC5CO,EAAMF,MAAoB,GAAXL,IAAkB,EAAMC,GAAY,EACnDM,EAAMF,MAAoB,EAAXJ,IAAiB,EAAiB,GAAXC,EAE1C,OAAOI,CAAW,ECTEE,CAAOlD,GACvB,OAAOkC,EAAUK,EAASN,EAC7B,CAEG,MAAO,CAAEO,QAAQ,EAAMxC,OAC1B,EAECkC,EAAY,CAAClC,EAAMiC,IAEZ,SADDA,EAEIjC,aAAgBE,KAETF,EAIA,IAAIE,KAAK,CAACF,IAIjBA,aAAgBO,YAETP,EAIAA,EAAKU,OCvDtByC,EAAYC,OAAOC,aAAa,IA4B/B,SAASC,IACZ,OAAO,IAAIC,gBAAgB,CACvBC,UAAUC,EAAQC,IHmBnB,SAA8BD,EAAQ5C,GACrCZ,GAAkBwD,EAAOzD,gBAAgBE,KAClCuD,EAAOzD,KACT2D,cACAC,KAAKtC,GACLsC,KAAK/C,GAELP,IACJmD,EAAOzD,gBAAgBO,aAAeC,EAAOiD,EAAOzD,OAC9Ca,EAASS,EAAQmC,EAAOzD,OAEnCW,EAAa8C,GAAQ,GAAOI,IACnBnC,IACDA,EAAe,IAAIoC,aAEvBjD,EAASa,EAAaqC,OAAOF,GAAS,GAE9C,CGnCYG,CAAqBP,GAAQzB,IACzB,MAAMiC,EAAgBjC,EAAcM,OACpC,IAAI4B,EAEJ,GAAID,EAAgB,IAChBC,EAAS,IAAI3C,WAAW,GACxB,IAAI4C,SAASD,EAAOxD,QAAQ0D,SAAS,EAAGH,QAEvC,GAAIA,EAAgB,MAAO,CAC5BC,EAAS,IAAI3C,WAAW,GACxB,MAAM8C,EAAO,IAAIF,SAASD,EAAOxD,QACjC2D,EAAKD,SAAS,EAAG,KACjBC,EAAKC,UAAU,EAAGL,EACrB,KACI,CACDC,EAAS,IAAI3C,WAAW,GACxB,MAAM8C,EAAO,IAAIF,SAASD,EAAOxD,QACjC2D,EAAKD,SAAS,EAAG,KACjBC,EAAKE,aAAa,EAAGC,OAAOP,GAC/B,CAEGR,EAAOzD,MAA+B,iBAAhByD,EAAOzD,OAC7BkE,EAAO,IAAM,KAEjBR,EAAWe,QAAQP,GACnBR,EAAWe,QAAQzC,EAAc,GAExC,GAET,CACA,IAAI0C,EACJ,SAASC,EAAYC,GACjB,OAAOA,EAAOC,QAAO,CAACC,EAAKC,IAAUD,EAAMC,EAAMzC,QAAQ,EAC7D,CACA,SAAS0C,EAAaJ,EAAQK,GAC1B,GAAIL,EAAO,GAAGtC,SAAW2C,EACrB,OAAOL,EAAOM,QAElB,MAAMxE,EAAS,IAAIa,WAAW0D,GAC9B,IAAIE,EAAI,EACR,IAAK,IAAItD,EAAI,EAAGA,EAAIoD,EAAMpD,IACtBnB,EAAOmB,GAAK+C,EAAO,GAAGO,KAClBA,IAAMP,EAAO,GAAGtC,SAChBsC,EAAOM,QACPC,EAAI,GAMZ,OAHIP,EAAOtC,QAAU6C,EAAIP,EAAO,GAAGtC,SAC/BsC,EAAO,GAAKA,EAAO,GAAGQ,MAAMD,IAEzBzE,CACX,CC/EO,SAAS2E,EAAQ5E,GACtB,GAAIA,EAAK,OAWX,SAAeA,GACb,IAAK,IAAIZ,KAAOwF,EAAQlF,UACtBM,EAAIZ,GAAOwF,EAAQlF,UAAUN,GAE/B,OAAOY,CACT,CAhBkB6E,CAAM7E,EACxB,CA0BA4E,EAAQlF,UAAUoF,GAClBF,EAAQlF,UAAUqF,iBAAmB,SAASC,EAAOC,GAInD,OAHAC,KAAKC,WAAaD,KAAKC,YAAc,CAAA,GACpCD,KAAKC,WAAW,IAAMH,GAASE,KAAKC,WAAW,IAAMH,IAAU,IAC7DI,KAAKH,GACDC,IACT,EAYAN,EAAQlF,UAAU2F,KAAO,SAASL,EAAOC,GACvC,SAASH,IACPI,KAAKI,IAAIN,EAAOF,GAChBG,EAAGM,MAAML,KAAMM,UAChB,CAID,OAFAV,EAAGG,GAAKA,EACRC,KAAKJ,GAAGE,EAAOF,GACRI,IACT,EAYAN,EAAQlF,UAAU4F,IAClBV,EAAQlF,UAAU+F,eAClBb,EAAQlF,UAAUgG,mBAClBd,EAAQlF,UAAUiG,oBAAsB,SAASX,EAAOC,GAItD,GAHAC,KAAKC,WAAaD,KAAKC,YAAc,CAAA,EAGjC,GAAKK,UAAU3D,OAEjB,OADAqD,KAAKC,WAAa,GACXD,KAIT,IAUIU,EAVAC,EAAYX,KAAKC,WAAW,IAAMH,GACtC,IAAKa,EAAW,OAAOX,KAGvB,GAAI,GAAKM,UAAU3D,OAEjB,cADOqD,KAAKC,WAAW,IAAMH,GACtBE,KAKT,IAAK,IAAI9D,EAAI,EAAGA,EAAIyE,EAAUhE,OAAQT,IAEpC,IADAwE,EAAKC,EAAUzE,MACJ6D,GAAMW,EAAGX,KAAOA,EAAI,CAC7BY,EAAUC,OAAO1E,EAAG,GACpB,KACD,CASH,OAJyB,IAArByE,EAAUhE,eACLqD,KAAKC,WAAW,IAAMH,GAGxBE,IACT,EAUAN,EAAQlF,UAAUqG,KAAO,SAASf,GAChCE,KAAKC,WAAaD,KAAKC,YAAc,CAAA,EAKrC,IAHA,IAAIa,EAAO,IAAIC,MAAMT,UAAU3D,OAAS,GACpCgE,EAAYX,KAAKC,WAAW,IAAMH,GAE7B5D,EAAI,EAAGA,EAAIoE,UAAU3D,OAAQT,IACpC4E,EAAK5E,EAAI,GAAKoE,UAAUpE,GAG1B,GAAIyE,EAEG,CAAIzE,EAAI,EAAb,IAAK,IAAWiB,GADhBwD,EAAYA,EAAUlB,MAAM,IACI9C,OAAQT,EAAIiB,IAAOjB,EACjDyE,EAAUzE,GAAGmE,MAAML,KAAMc,EADKnE,CAKlC,OAAOqD,IACT,EAGAN,EAAQlF,UAAUwG,aAAetB,EAAQlF,UAAUqG,KAUnDnB,EAAQlF,UAAUyG,UAAY,SAASnB,GAErC,OADAE,KAAKC,WAAaD,KAAKC,YAAc,CAAA,EAC9BD,KAAKC,WAAW,IAAMH,IAAU,EACzC,EAUAJ,EAAQlF,UAAU0G,aAAe,SAASpB,GACxC,QAAUE,KAAKiB,UAAUnB,GAAOnD,MAClC,ECxKO,MAAMwE,EACW,oBAATC,KACAA,KAEgB,oBAAXC,OACLA,OAGAC,SAAS,cAATA,GCPR,SAASC,EAAKzG,KAAQ0G,GACzB,OAAOA,EAAKtC,QAAO,CAACC,EAAKsC,KACjB3G,EAAI4G,eAAeD,KACnBtC,EAAIsC,GAAK3G,EAAI2G,IAEVtC,IACR,CAAE,EACT,CAEA,MAAMwC,EAAqBC,EAAWC,WAChCC,EAAuBF,EAAWG,aACjC,SAASC,EAAsBlH,EAAKmH,GACnCA,EAAKC,iBACLpH,EAAIqH,aAAeR,EAAmBS,KAAKR,GAC3C9G,EAAIuH,eAAiBP,EAAqBM,KAAKR,KAG/C9G,EAAIqH,aAAeP,EAAWC,WAAWO,KAAKR,GAC9C9G,EAAIuH,eAAiBT,EAAWG,aAAaK,KAAKR,GAE1D,CCjBA,MAAMU,UAAuBC,MACzBC,YAAYC,EAAQC,EAAaC,GAC7BC,MAAMH,GACNzC,KAAK0C,YAAcA,EACnB1C,KAAK2C,QAAUA,EACf3C,KAAK5F,KAAO,gBACf,EAEE,MAAMyI,UAAkBnD,EAO3B8C,YAAYP,GACRW,QACA5C,KAAK8C,UAAW,EAChBd,EAAsBhC,KAAMiC,GAC5BjC,KAAKiC,KAAOA,EACZjC,KAAK+C,MAAQd,EAAKc,MAClB/C,KAAKgD,OAASf,EAAKe,MACtB,CAUDC,QAAQR,EAAQC,EAAaC,GAEzB,OADAC,MAAM5B,aAAa,QAAS,IAAIsB,EAAeG,EAAQC,EAAaC,IAC7D3C,IACV,CAIDkD,OAGI,OAFAlD,KAAKmD,WAAa,UAClBnD,KAAKoD,SACEpD,IACV,CAIDqD,QAKI,MAJwB,YAApBrD,KAAKmD,YAAgD,SAApBnD,KAAKmD,aACtCnD,KAAKsD,UACLtD,KAAKuD,WAEFvD,IACV,CAMDwD,KAAKC,GACuB,SAApBzD,KAAKmD,YACLnD,KAAK0D,MAAMD,EAKlB,CAMDE,SACI3D,KAAKmD,WAAa,OAClBnD,KAAK8C,UAAW,EAChBF,MAAM5B,aAAa,OACtB,CAOD4C,OAAOvJ,GACH,MAAMyD,EAAS1B,EAAa/B,EAAM2F,KAAKgD,OAAO1G,YAC9C0D,KAAK6D,SAAS/F,EACjB,CAMD+F,SAAS/F,GACL8E,MAAM5B,aAAa,SAAUlD,EAChC,CAMDyF,QAAQO,GACJ9D,KAAKmD,WAAa,SAClBP,MAAM5B,aAAa,QAAS8C,EAC/B,CAMDC,MAAMC,GAAY,CAClBC,UAAUC,EAAQnB,EAAQ,IACtB,OAAQmB,EACJ,MACAlE,KAAKmE,YACLnE,KAAKoE,QACLpE,KAAKiC,KAAKoC,KACVrE,KAAKsE,OAAOvB,EACnB,CACDoB,YACI,MAAMI,EAAWvE,KAAKiC,KAAKsC,SAC3B,OAAkC,IAA3BA,EAASC,QAAQ,KAAcD,EAAW,IAAMA,EAAW,GACrE,CACDH,QACI,OAAIpE,KAAKiC,KAAKwC,OACRzE,KAAKiC,KAAKyC,QAAUC,OAA0B,MAAnB3E,KAAKiC,KAAKwC,QACjCzE,KAAKiC,KAAKyC,QAAqC,KAA3BC,OAAO3E,KAAKiC,KAAKwC,OACpC,IAAMzE,KAAKiC,KAAKwC,KAGhB,EAEd,CACDH,OAAOvB,GACH,MAAM6B,ECjIP,SAAgB9J,GACnB,IAAI+J,EAAM,GACV,IAAK,IAAI3I,KAAKpB,EACNA,EAAI4G,eAAexF,KACf2I,EAAIlI,SACJkI,GAAO,KACXA,GAAOC,mBAAmB5I,GAAK,IAAM4I,mBAAmBhK,EAAIoB,KAGpE,OAAO2I,CACX,CDuH6BzG,CAAO2E,GAC5B,OAAO6B,EAAajI,OAAS,IAAMiI,EAAe,EACrD,EEzIL,MAAMG,EAAW,mEAAmEtJ,MAAM,IAAKkB,EAAS,GAAIqI,EAAM,GAClH,IAAqBC,EAAjBC,EAAO,EAAGhJ,EAAI,EAQX,SAASkC,EAAO+G,GACnB,IAAIjH,EAAU,GACd,GACIA,EAAU6G,EAASI,EAAMxI,GAAUuB,EACnCiH,EAAMC,KAAKC,MAAMF,EAAMxI,SAClBwI,EAAM,GACf,OAAOjH,CACX,CAqBO,SAASoH,IACZ,MAAMC,EAAMnH,GAAQ,IAAIoH,MACxB,OAAID,IAAQN,GACDC,EAAO,EAAGD,EAAOM,GACrBA,EAAM,IAAMnH,EAAO8G,IAC9B,CAIA,KAAOhJ,EAAIS,EAAQT,IACf8I,EAAID,EAAS7I,IAAMA,EChDvB,IAAIuJ,GAAQ,EACZ,IACIA,EAAkC,oBAAnBC,gBACX,oBAAqB,IAAIA,cACjC,CACA,MAAOC,GAGP,CACO,MAAMC,EAAUH,ECPhB,SAASI,EAAI5D,GAChB,MAAM6D,EAAU7D,EAAK6D,QAErB,IACI,GAAI,oBAAuBJ,kBAAoBI,GAAWF,GACtD,OAAO,IAAIF,cAElB,CACD,MAAOK,GAAM,CACb,IAAKD,EACD,IACI,OAAO,IAAIlE,EAAW,CAAC,UAAUoE,OAAO,UAAUC,KAAK,OAAM,oBAChE,CACD,MAAOF,GAAM,CAErB,CCXA,SAASG,IAAW,CACpB,MAAMC,EAIK,MAHK,IAAIT,EAAe,CAC3BI,SAAS,IAEMM,aAkNhB,MAAMC,UAAgB3G,EAOzB8C,YAAY8D,EAAKrE,GACbW,QACAZ,EAAsBhC,KAAMiC,GAC5BjC,KAAKiC,KAAOA,EACZjC,KAAKuG,OAAStE,EAAKsE,QAAU,MAC7BvG,KAAKsG,IAAMA,EACXtG,KAAK3F,UAAOmM,IAAcvE,EAAK5H,KAAO4H,EAAK5H,KAAO,KAClD2F,KAAKlG,QACR,CAMDA,SACI,IAAI2M,EACJ,MAAMxE,EAAOV,EAAKvB,KAAKiC,KAAM,QAAS,MAAO,MAAO,aAAc,OAAQ,KAAM,UAAW,qBAAsB,aACjHA,EAAK6D,UAAY9F,KAAKiC,KAAKyE,GAC3B,MAAMC,EAAO3G,KAAK2G,IAAM,IAAIjB,EAAezD,GAC3C,IACI0E,EAAIzD,KAAKlD,KAAKuG,OAAQvG,KAAKsG,KAAK,GAChC,IACI,GAAItG,KAAKiC,KAAK2E,aAAc,CACxBD,EAAIE,uBAAyBF,EAAIE,uBAAsB,GACvD,IAAK,IAAI3K,KAAK8D,KAAKiC,KAAK2E,aAChB5G,KAAKiC,KAAK2E,aAAalF,eAAexF,IACtCyK,EAAIG,iBAAiB5K,EAAG8D,KAAKiC,KAAK2E,aAAa1K,GAG1D,CACJ,CACD,MAAO6J,GAAM,CACb,GAAI,SAAW/F,KAAKuG,OAChB,IACII,EAAIG,iBAAiB,eAAgB,2BACxC,CACD,MAAOf,GAAM,CAEjB,IACIY,EAAIG,iBAAiB,SAAU,MAClC,CACD,MAAOf,GAAM,CACkB,QAA9BU,EAAKzG,KAAKiC,KAAK8E,iBAA8B,IAAPN,GAAyBA,EAAGO,WAAWL,GAE1E,oBAAqBA,IACrBA,EAAIM,gBAAkBjH,KAAKiC,KAAKgF,iBAEhCjH,KAAKiC,KAAKiF,iBACVP,EAAIQ,QAAUnH,KAAKiC,KAAKiF,gBAE5BP,EAAIS,mBAAqB,KACrB,IAAIX,EACmB,IAAnBE,EAAIxD,aAC2B,QAA9BsD,EAAKzG,KAAKiC,KAAK8E,iBAA8B,IAAPN,GAAyBA,EAAGY,aAAaV,IAEhF,IAAMA,EAAIxD,aAEV,MAAQwD,EAAIW,QAAU,OAASX,EAAIW,OACnCtH,KAAKuH,SAKLvH,KAAKmC,cAAa,KACdnC,KAAKiD,QAA8B,iBAAf0D,EAAIW,OAAsBX,EAAIW,OAAS,EAAE,GAC9D,GACN,EAELX,EAAInD,KAAKxD,KAAK3F,KACjB,CACD,MAAO0L,GAOH,YAHA/F,KAAKmC,cAAa,KACdnC,KAAKiD,QAAQ8C,EAAE,GAChB,EAEN,CACuB,oBAAbyB,WACPxH,KAAKyH,MAAQpB,EAAQqB,gBACrBrB,EAAQsB,SAAS3H,KAAKyH,OAASzH,KAEtC,CAMDiD,QAAQ0C,GACJ3F,KAAKgB,aAAa,QAAS2E,EAAK3F,KAAK2G,KACrC3G,KAAK4H,SAAQ,EAChB,CAMDA,QAAQC,GACJ,QAAI,IAAuB7H,KAAK2G,KAAO,OAAS3G,KAAK2G,IAArD,CAIA,GADA3G,KAAK2G,IAAIS,mBAAqBlB,EAC1B2B,EACA,IACI7H,KAAK2G,IAAImB,OACZ,CACD,MAAO/B,GAAM,CAEO,oBAAbyB,iBACAnB,EAAQsB,SAAS3H,KAAKyH,OAEjCzH,KAAK2G,IAAM,IAXV,CAYJ,CAMDY,SACI,MAAMlN,EAAO2F,KAAK2G,IAAIoB,aACT,OAAT1N,IACA2F,KAAKgB,aAAa,OAAQ3G,GAC1B2F,KAAKgB,aAAa,WAClBhB,KAAK4H,UAEZ,CAMDE,QACI9H,KAAK4H,SACR,EASL,GAPAvB,EAAQqB,cAAgB,EACxBrB,EAAQsB,SAAW,CAAA,EAMK,oBAAbH,SAEP,GAA2B,mBAAhBQ,YAEPA,YAAY,WAAYC,QAEvB,GAAgC,mBAArBpI,iBAAiC,CAE7CA,iBADyB,eAAgB+B,EAAa,WAAa,SAChCqG,GAAe,EACrD,CAEL,SAASA,IACL,IAAK,IAAI/L,KAAKmK,EAAQsB,SACdtB,EAAQsB,SAASjG,eAAexF,IAChCmK,EAAQsB,SAASzL,GAAG4L,OAGhC,CCpYO,MAAMI,EACqC,mBAAZC,SAAqD,mBAApBA,QAAQC,QAE/D1H,GAAOyH,QAAQC,UAAUnK,KAAKyC,GAG/B,CAACA,EAAIyB,IAAiBA,EAAazB,EAAI,GAGzC2H,EAAYzG,EAAWyG,WAAazG,EAAW0G,aCJtDC,EAAqC,oBAAdC,WACI,iBAAtBA,UAAUC,SACmB,gBAApCD,UAAUC,QAAQC,cCLf,MAAMC,EAAa,CACtBC,UDKG,cAAiB/F,EAOpBL,YAAYP,GACRW,MAAMX,GACNjC,KAAK/E,gBAAkBgH,EAAK4G,WAC/B,CACGC,WACA,MAAO,WACV,CACD1F,SACI,IAAKpD,KAAK+I,QAEN,OAEJ,MAAMzC,EAAMtG,KAAKsG,MACX0C,EAAYhJ,KAAKiC,KAAK+G,UAEtB/G,EAAOsG,EACP,CAAE,EACFhH,EAAKvB,KAAKiC,KAAM,QAAS,oBAAqB,MAAO,MAAO,aAAc,OAAQ,KAAM,UAAW,qBAAsB,eAAgB,kBAAmB,SAAU,aAAc,SAAU,uBAChMjC,KAAKiC,KAAK2E,eACV3E,EAAKgH,QAAUjJ,KAAKiC,KAAK2E,cAE7B,IACI5G,KAAKkJ,GACyBX,EAIpB,IAAIF,EAAU/B,EAAK0C,EAAW/G,GAH9B+G,EACI,IAAIX,EAAU/B,EAAK0C,GACnB,IAAIX,EAAU/B,EAE/B,CACD,MAAOX,GACH,OAAO3F,KAAKgB,aAAa,QAAS2E,EACrC,CACD3F,KAAKkJ,GAAG5M,WAAa0D,KAAKgD,OAAO1G,WACjC0D,KAAKmJ,mBACR,CAMDA,oBACInJ,KAAKkJ,GAAGE,OAAS,KACTpJ,KAAKiC,KAAKoH,WACVrJ,KAAKkJ,GAAGI,QAAQC,QAEpBvJ,KAAK2D,QAAQ,EAEjB3D,KAAKkJ,GAAGM,QAAWC,GAAezJ,KAAKuD,QAAQ,CAC3Cb,YAAa,8BACbC,QAAS8G,IAEbzJ,KAAKkJ,GAAGQ,UAAaC,GAAO3J,KAAK4D,OAAO+F,EAAGtP,MAC3C2F,KAAKkJ,GAAGU,QAAW7D,GAAM/F,KAAKiD,QAAQ,kBAAmB8C,EAC5D,CACDrC,MAAMD,GACFzD,KAAK8C,UAAW,EAGhB,IAAK,IAAI5G,EAAI,EAAGA,EAAIuH,EAAQ9G,OAAQT,IAAK,CACrC,MAAM4B,EAAS2F,EAAQvH,GACjB2N,EAAa3N,IAAMuH,EAAQ9G,OAAS,EAC1C3B,EAAa8C,EAAQkC,KAAK/E,gBAAiBZ,IAmBvC,IAGQ2F,KAAKkJ,GAAG1F,KAAKnJ,EAKpB,CACD,MAAO0L,GACN,CACG8D,GAGA3B,GAAS,KACLlI,KAAK8C,UAAW,EAChB9C,KAAKgB,aAAa,QAAQ,GAC3BhB,KAAKmC,aACX,GAER,CACJ,CACDmB,eAC2B,IAAZtD,KAAKkJ,KACZlJ,KAAKkJ,GAAG7F,QACRrD,KAAKkJ,GAAK,KAEjB,CAMD5C,MACI,MAAMpC,EAASlE,KAAKiC,KAAKyC,OAAS,MAAQ,KACpC3B,EAAQ/C,KAAK+C,OAAS,GAS5B,OAPI/C,KAAKiC,KAAK6H,oBACV/G,EAAM/C,KAAKiC,KAAK8H,gBAAkBzE,KAGjCtF,KAAK/E,iBACN8H,EAAMiH,IAAM,GAEThK,KAAKiE,UAAUC,EAAQnB,EACjC,CAODgG,QACI,QAASV,CACZ,GCjJD4B,aCFG,cAAiBpH,EAChBiG,WACA,MAAO,cACV,CACD1F,SAEgC,mBAAjB8G,eAIXlK,KAAKmK,UAAY,IAAID,aAAalK,KAAKiE,UAAU,SAAUjE,KAAKiC,KAAKmI,iBAAiBpK,KAAK8I,OAC3F9I,KAAKmK,UAAUE,OACVpM,MAAK,KACN+B,KAAKuD,SAAS,IAEb+G,OAAO3E,IACR3F,KAAKiD,QAAQ,qBAAsB0C,EAAI,IAG3C3F,KAAKmK,UAAUI,MAAMtM,MAAK,KACtB+B,KAAKmK,UAAUK,4BAA4BvM,MAAMwM,IAC7C,MAAMC,Eb8Df,SAAmCC,EAAYrO,GAC7CyC,IACDA,EAAe,IAAI6L,aAEvB,MAAM3L,EAAS,GACf,IAAI4L,EAAQ,EACRC,GAAkB,EAClBC,GAAW,EACf,OAAO,IAAInN,gBAAgB,CACvBC,UAAUuB,EAAOrB,GAEb,IADAkB,EAAOiB,KAAKd,KACC,CACT,GAAc,IAAVyL,EAA+B,CAC/B,GAAI7L,EAAYC,GAAU,EACtB,MAEJ,MAAMV,EAASc,EAAaJ,EAAQ,GACpC8L,EAAkC,MAAV,IAAZxM,EAAO,IACnBuM,EAA6B,IAAZvM,EAAO,GAEpBsM,EADAC,EAAiB,IACT,EAEgB,MAAnBA,EACG,EAGA,CAEf,MACI,GAAc,IAAVD,EAA2C,CAChD,GAAI7L,EAAYC,GAAU,EACtB,MAEJ,MAAM+L,EAAc3L,EAAaJ,EAAQ,GACzC6L,EAAiB,IAAItM,SAASwM,EAAYjQ,OAAQiQ,EAAYnP,WAAYmP,EAAYrO,QAAQsO,UAAU,GACxGJ,EAAQ,CACX,MACI,GAAc,IAAVA,EAA2C,CAChD,GAAI7L,EAAYC,GAAU,EACtB,MAEJ,MAAM+L,EAAc3L,EAAaJ,EAAQ,GACnCP,EAAO,IAAIF,SAASwM,EAAYjQ,OAAQiQ,EAAYnP,WAAYmP,EAAYrO,QAC5EuO,EAAIxM,EAAKyM,UAAU,GACzB,GAAID,EAAI9F,KAAKgG,IAAI,EAAG,IAAW,EAAG,CAE9BrN,EAAWe,QAAQ3E,GACnB,KACH,CACD2Q,EAAiBI,EAAI9F,KAAKgG,IAAI,EAAG,IAAM1M,EAAKyM,UAAU,GACtDN,EAAQ,CACX,KACI,CACD,GAAI7L,EAAYC,GAAU6L,EACtB,MAEJ,MAAMzQ,EAAOgF,EAAaJ,EAAQ6L,GAClC/M,EAAWe,QAAQ1C,EAAa2O,EAAW1Q,EAAO0E,EAAaxB,OAAOlD,GAAOiC,IAC7EuO,EAAQ,CACX,CACD,GAAuB,IAAnBC,GAAwBA,EAAiBH,EAAY,CACrD5M,EAAWe,QAAQ3E,GACnB,KACH,CACJ,CACJ,GAET,CajIsCkR,CAA0B1G,OAAO2G,iBAAkBtL,KAAKgD,OAAO1G,YAC/EiP,EAASd,EAAOe,SAASC,YAAYf,GAAegB,YACpDC,EAAgBhO,IACtBgO,EAAcH,SAASI,OAAOnB,EAAO3H,UACrC9C,KAAK6L,OAASF,EAAc7I,SAASgJ,YACrC,MAAMC,EAAO,KACTR,EACKQ,OACA9N,MAAK,EAAG+N,OAAMvG,YACXuG,IAGJhM,KAAK6D,SAAS4B,GACdsG,IAAM,IAELzB,OAAO3E,IAAD,GACT,EAENoG,IACA,MAAMjO,EAAS,CAAE1D,KAAM,QACnB4F,KAAK+C,MAAMkJ,MACXnO,EAAOzD,KAAO,WAAW2F,KAAK+C,MAAMkJ,SAExCjM,KAAK6L,OAAOnI,MAAM5F,GAAQG,MAAK,IAAM+B,KAAK2D,UAAS,GACrD,IAET,CACDD,MAAMD,GACFzD,KAAK8C,UAAW,EAChB,IAAK,IAAI5G,EAAI,EAAGA,EAAIuH,EAAQ9G,OAAQT,IAAK,CACrC,MAAM4B,EAAS2F,EAAQvH,GACjB2N,EAAa3N,IAAMuH,EAAQ9G,OAAS,EAC1CqD,KAAK6L,OAAOnI,MAAM5F,GAAQG,MAAK,KACvB4L,GACA3B,GAAS,KACLlI,KAAK8C,UAAW,EAChB9C,KAAKgB,aAAa,QAAQ,GAC3BhB,KAAKmC,aACX,GAER,CACJ,CACDmB,UACI,IAAImD,EACsB,QAAzBA,EAAKzG,KAAKmK,iBAA8B,IAAP1D,GAAyBA,EAAGpD,OACjE,GD/DD6I,QHQG,cAAsBrJ,EAOzBL,YAAYP,GAGR,GAFAW,MAAMX,GACNjC,KAAKkM,SAAU,EACS,oBAAbC,SAA0B,CACjC,MAAMC,EAAQ,WAAaD,SAASE,SACpC,IAAI5H,EAAO0H,SAAS1H,KAEfA,IACDA,EAAO2H,EAAQ,MAAQ,MAE3BpM,KAAK0G,GACoB,oBAAbyF,UACJlK,EAAKsC,WAAa4H,SAAS5H,UAC3BE,IAASxC,EAAKwC,IACzB,CAID,MAAMoE,EAAc5G,GAAQA,EAAK4G,YACjC7I,KAAK/E,eAAiBkL,IAAY0C,EAC9B7I,KAAKiC,KAAKgF,kBACVjH,KAAK+G,eAAYuF,EAExB,CACGxD,WACA,MAAO,SACV,CAOD1F,SACIpD,KAAKuM,MACR,CAODxI,MAAMC,GACFhE,KAAKmD,WAAa,UAClB,MAAMY,EAAQ,KACV/D,KAAKmD,WAAa,SAClBa,GAAS,EAEb,GAAIhE,KAAKkM,UAAYlM,KAAK8C,SAAU,CAChC,IAAI0J,EAAQ,EACRxM,KAAKkM,UACLM,IACAxM,KAAKG,KAAK,gBAAgB,aACpBqM,GAASzI,GAC/B,KAEiB/D,KAAK8C,WACN0J,IACAxM,KAAKG,KAAK,SAAS,aACbqM,GAASzI,GAC/B,IAES,MAEGA,GAEP,CAMDwI,OACIvM,KAAKkM,SAAU,EACflM,KAAKyM,SACLzM,KAAKgB,aAAa,OACrB,CAMD4C,OAAOvJ,GTpFW,EAACqS,EAAgBpQ,KACnC,MAAMqQ,EAAiBD,EAAejR,MAAM+B,GACtCiG,EAAU,GAChB,IAAK,IAAIvH,EAAI,EAAGA,EAAIyQ,EAAehQ,OAAQT,IAAK,CAC5C,MAAM0Q,EAAgBxQ,EAAauQ,EAAezQ,GAAII,GAEtD,GADAmH,EAAQvD,KAAK0M,GACc,UAAvBA,EAAcxS,KACd,KAEP,CACD,OAAOqJ,CAAO,ESyFVoJ,CAAcxS,EAAM2F,KAAKgD,OAAO1G,YAAYrC,SAd1B6D,IAMd,GAJI,YAAckC,KAAKmD,YAA8B,SAAhBrF,EAAO1D,MACxC4F,KAAK2D,SAGL,UAAY7F,EAAO1D,KAEnB,OADA4F,KAAKuD,QAAQ,CAAEb,YAAa,oCACrB,EAGX1C,KAAK6D,SAAS/F,EAAO,IAKrB,WAAakC,KAAKmD,aAElBnD,KAAKkM,SAAU,EACflM,KAAKgB,aAAa,gBACd,SAAWhB,KAAKmD,YAChBnD,KAAKuM,OAKhB,CAMDjJ,UACI,MAAMD,EAAQ,KACVrD,KAAK0D,MAAM,CAAC,CAAEtJ,KAAM,UAAW,EAE/B,SAAW4F,KAAKmD,WAChBE,IAKArD,KAAKG,KAAK,OAAQkD,EAEzB,CAODK,MAAMD,GACFzD,KAAK8C,UAAW,ETxJF,EAACW,EAASvI,KAE5B,MAAMyB,EAAS8G,EAAQ9G,OACjBgQ,EAAiB,IAAI5L,MAAMpE,GACjC,IAAImQ,EAAQ,EACZrJ,EAAQxJ,SAAQ,CAAC6D,EAAQ5B,KAErBlB,EAAa8C,GAAQ,GAAOzB,IACxBsQ,EAAezQ,GAAKG,IACdyQ,IAAUnQ,GACZzB,EAASyR,EAAe1G,KAAKzI,GAChC,GACH,GACJ,ES4IEuP,CAActJ,GAAUpJ,IACpB2F,KAAKgN,QAAQ3S,GAAM,KACf2F,KAAK8C,UAAW,EAChB9C,KAAKgB,aAAa,QAAQ,GAC5B,GAET,CAMDsF,MACI,MAAMpC,EAASlE,KAAKiC,KAAKyC,OAAS,QAAU,OACtC3B,EAAQ/C,KAAK+C,OAAS,GAQ5B,OANI,IAAU/C,KAAKiC,KAAK6H,oBACpB/G,EAAM/C,KAAKiC,KAAK8H,gBAAkBzE,KAEjCtF,KAAK/E,gBAAmB8H,EAAMkJ,MAC/BlJ,EAAMiH,IAAM,GAEThK,KAAKiE,UAAUC,EAAQnB,EACjC,CAODkK,QAAQhL,EAAO,IAEX,OADApI,OAAOqT,OAAOjL,EAAM,CAAEyE,GAAI1G,KAAK0G,GAAIK,UAAW/G,KAAK+G,WAAa/G,KAAKiC,MAC9D,IAAIoE,EAAQrG,KAAKsG,MAAOrE,EAClC,CAQD+K,QAAQ3S,EAAM0F,GACV,MAAMoN,EAAMnN,KAAKiN,QAAQ,CACrB1G,OAAQ,OACRlM,KAAMA,IAEV8S,EAAIvN,GAAG,UAAWG,GAClBoN,EAAIvN,GAAG,SAAS,CAACwN,EAAWzK,KACxB3C,KAAKiD,QAAQ,iBAAkBmK,EAAWzK,EAAQ,GAEzD,CAMD8J,SACI,MAAMU,EAAMnN,KAAKiN,UACjBE,EAAIvN,GAAG,OAAQI,KAAK4D,OAAOxB,KAAKpC,OAChCmN,EAAIvN,GAAG,SAAS,CAACwN,EAAWzK,KACxB3C,KAAKiD,QAAQ,iBAAkBmK,EAAWzK,EAAQ,IAEtD3C,KAAKqN,QAAUF,CAClB,IKzMCG,EAAK,sPACLC,EAAQ,CACV,SAAU,WAAY,YAAa,WAAY,OAAQ,WAAY,OAAQ,OAAQ,WAAY,OAAQ,YAAa,OAAQ,QAAS,UAElI,SAASC,EAAM3I,GAClB,MAAM4I,EAAM5I,EAAK6I,EAAI7I,EAAIL,QAAQ,KAAMuB,EAAIlB,EAAIL,QAAQ,MAC7C,GAANkJ,IAAiB,GAAN3H,IACXlB,EAAMA,EAAInI,UAAU,EAAGgR,GAAK7I,EAAInI,UAAUgR,EAAG3H,GAAG4H,QAAQ,KAAM,KAAO9I,EAAInI,UAAUqJ,EAAGlB,EAAIlI,SAE9F,IAAIiR,EAAIN,EAAGO,KAAKhJ,GAAO,IAAKyB,EAAM,CAAA,EAAIpK,EAAI,GAC1C,KAAOA,KACHoK,EAAIiH,EAAMrR,IAAM0R,EAAE1R,IAAM,GAU5B,OARU,GAANwR,IAAiB,GAAN3H,IACXO,EAAIwH,OAASL,EACbnH,EAAIyH,KAAOzH,EAAIyH,KAAKrR,UAAU,EAAG4J,EAAIyH,KAAKpR,OAAS,GAAGgR,QAAQ,KAAM,KACpErH,EAAI0H,UAAY1H,EAAI0H,UAAUL,QAAQ,IAAK,IAAIA,QAAQ,IAAK,IAAIA,QAAQ,KAAM,KAC9ErH,EAAI2H,SAAU,GAElB3H,EAAI4H,UAIR,SAAmBpT,EAAKuJ,GACpB,MAAM8J,EAAO,WAAYC,EAAQ/J,EAAKsJ,QAAQQ,EAAM,KAAK1S,MAAM,KACvC,KAApB4I,EAAK5E,MAAM,EAAG,IAA6B,IAAhB4E,EAAK1H,QAChCyR,EAAMxN,OAAO,EAAG,GAEE,KAAlByD,EAAK5E,OAAO,IACZ2O,EAAMxN,OAAOwN,EAAMzR,OAAS,EAAG,GAEnC,OAAOyR,CACX,CAboBF,CAAU5H,EAAKA,EAAU,MACzCA,EAAI+H,SAaR,SAAkB/H,EAAKvD,GACnB,MAAM1I,EAAO,CAAA,EAMb,OALA0I,EAAM4K,QAAQ,6BAA6B,SAAUW,EAAIC,EAAIC,GACrDD,IACAlU,EAAKkU,GAAMC,EAEvB,IACWnU,CACX,CArBmBgU,CAAS/H,EAAKA,EAAW,OACjCA,CACX,CClCO,MAAMmI,UAAe/O,EAOxB8C,YAAY8D,EAAKrE,EAAO,IACpBW,QACA5C,KAAK1D,WLJoB,cKKzB0D,KAAK0O,YAAc,GACfpI,GAAO,iBAAoBA,IAC3BrE,EAAOqE,EACPA,EAAM,MAENA,GACAA,EAAMkH,EAAMlH,GACZrE,EAAKsC,SAAW+B,EAAIyH,KACpB9L,EAAKyC,OAA0B,UAAjB4B,EAAI+F,UAAyC,QAAjB/F,EAAI+F,SAC9CpK,EAAKwC,KAAO6B,EAAI7B,KACZ6B,EAAIvD,QACJd,EAAKc,MAAQuD,EAAIvD,QAEhBd,EAAK8L,OACV9L,EAAKsC,SAAWiJ,EAAMvL,EAAK8L,MAAMA,MAErC/L,EAAsBhC,KAAMiC,GAC5BjC,KAAK0E,OACD,MAAQzC,EAAKyC,OACPzC,EAAKyC,OACe,oBAAbyH,UAA4B,WAAaA,SAASE,SAC/DpK,EAAKsC,WAAatC,EAAKwC,OAEvBxC,EAAKwC,KAAOzE,KAAK0E,OAAS,MAAQ,MAEtC1E,KAAKuE,SACDtC,EAAKsC,WACoB,oBAAb4H,SAA2BA,SAAS5H,SAAW,aAC/DvE,KAAKyE,KACDxC,EAAKwC,OACoB,oBAAb0H,UAA4BA,SAAS1H,KACvC0H,SAAS1H,KACTzE,KAAK0E,OACD,MACA,MAClB1E,KAAK2I,WAAa1G,EAAK0G,YAAc,CACjC,UACA,YACA,gBAEJ3I,KAAK0O,YAAc,GACnB1O,KAAK2O,cAAgB,EACrB3O,KAAKiC,KAAOpI,OAAOqT,OAAO,CACtB7I,KAAM,aACNuK,OAAO,EACP3H,iBAAiB,EACjB4H,SAAS,EACT9E,eAAgB,IAChB+E,iBAAiB,EACjBC,kBAAkB,EAClBC,oBAAoB,EACpBC,kBAAmB,CACfC,UAAW,MAEf9E,iBAAkB,CAAE,EACpB+E,qBAAqB,GACtBlN,GACHjC,KAAKiC,KAAKoC,KACNrE,KAAKiC,KAAKoC,KAAKsJ,QAAQ,MAAO,KACzB3N,KAAKiC,KAAK8M,iBAAmB,IAAM,IACb,iBAApB/O,KAAKiC,KAAKc,QACjB/C,KAAKiC,KAAKc,MVrDf,SAAgBqM,GACnB,IAAIC,EAAM,CAAA,EACNC,EAAQF,EAAG3T,MAAM,KACrB,IAAK,IAAIS,EAAI,EAAGqT,EAAID,EAAM3S,OAAQT,EAAIqT,EAAGrT,IAAK,CAC1C,IAAIsT,EAAOF,EAAMpT,GAAGT,MAAM,KAC1B4T,EAAII,mBAAmBD,EAAK,KAAOC,mBAAmBD,EAAK,GAC9D,CACD,OAAOH,CACX,CU6C8B9R,CAAOyC,KAAKiC,KAAKc,QAGvC/C,KAAK0P,GAAK,KACV1P,KAAK2P,SAAW,KAChB3P,KAAK4P,aAAe,KACpB5P,KAAK6P,YAAc,KAEnB7P,KAAK8P,iBAAmB,KACQ,mBAArBjQ,mBACHG,KAAKiC,KAAKkN,sBAIVnP,KAAK+P,0BAA4B,KACzB/P,KAAKmK,YAELnK,KAAKmK,UAAU3J,qBACfR,KAAKmK,UAAU9G,QAClB,EAELxD,iBAAiB,eAAgBG,KAAK+P,2BAA2B,IAE/C,cAAlB/P,KAAKuE,WACLvE,KAAKgQ,qBAAuB,KACxBhQ,KAAKuD,QAAQ,kBAAmB,CAC5Bb,YAAa,2BACf,EAEN7C,iBAAiB,UAAWG,KAAKgQ,sBAAsB,KAG/DhQ,KAAKkD,MACR,CAQD+M,gBAAgBnH,GACZ,MAAM/F,EAAQlJ,OAAOqT,OAAO,CAAE,EAAElN,KAAKiC,KAAKc,OAE1CA,EAAMmN,IfgCU,Ee9BhBnN,EAAMoH,UAAYrB,EAEd9I,KAAK0P,KACL3M,EAAMkJ,IAAMjM,KAAK0P,IACrB,MAAMzN,EAAOpI,OAAOqT,OAAO,CAAA,EAAIlN,KAAKiC,KAAM,CACtCc,QACAC,OAAQhD,KACRuE,SAAUvE,KAAKuE,SACfG,OAAQ1E,KAAK0E,OACbD,KAAMzE,KAAKyE,MACZzE,KAAKiC,KAAKmI,iBAAiBtB,IAC9B,OAAO,IAAIH,EAAWG,GAAM7G,EAC/B,CAMDiB,OACI,IAAIiH,EACJ,GAAInK,KAAKiC,KAAK6M,iBACVL,EAAO0B,wBACmC,IAA1CnQ,KAAK2I,WAAWnE,QAAQ,aACxB2F,EAAY,gBAEX,IAAI,IAAMnK,KAAK2I,WAAWhM,OAK3B,YAHAqD,KAAKmC,cAAa,KACdnC,KAAKgB,aAAa,QAAS,0BAA0B,GACtD,GAIHmJ,EAAYnK,KAAK2I,WAAW,EAC/B,CACD3I,KAAKmD,WAAa,UAElB,IACIgH,EAAYnK,KAAKiQ,gBAAgB9F,EACpC,CACD,MAAOpE,GAGH,OAFA/F,KAAK2I,WAAWpJ,aAChBS,KAAKkD,MAER,CACDiH,EAAUjH,OACVlD,KAAKoQ,aAAajG,EACrB,CAMDiG,aAAajG,GACLnK,KAAKmK,WACLnK,KAAKmK,UAAU3J,qBAGnBR,KAAKmK,UAAYA,EAEjBA,EACKvK,GAAG,QAASI,KAAKqQ,QAAQjO,KAAKpC,OAC9BJ,GAAG,SAAUI,KAAK6D,SAASzB,KAAKpC,OAChCJ,GAAG,QAASI,KAAKiD,QAAQb,KAAKpC,OAC9BJ,GAAG,SAAU6C,GAAWzC,KAAKuD,QAAQ,kBAAmBd,IAChE,CAOD6N,MAAMxH,GACF,IAAIqB,EAAYnK,KAAKiQ,gBAAgBnH,GACjCyH,GAAS,EACb9B,EAAO0B,uBAAwB,EAC/B,MAAMK,EAAkB,KAChBD,IAEJpG,EAAU3G,KAAK,CAAC,CAAEpJ,KAAM,OAAQC,KAAM,WACtC8P,EAAUhK,KAAK,UAAWsQ,IACtB,IAAIF,EAEJ,GAAI,SAAWE,EAAIrW,MAAQ,UAAYqW,EAAIpW,KAAM,CAG7C,GAFA2F,KAAK0Q,WAAY,EACjB1Q,KAAKgB,aAAa,YAAamJ,IAC1BA,EACD,OACJsE,EAAO0B,sBAAwB,cAAgBhG,EAAUrB,KACzD9I,KAAKmK,UAAUpG,OAAM,KACbwM,GAEA,WAAavQ,KAAKmD,aAEtByE,IACA5H,KAAKoQ,aAAajG,GAClBA,EAAU3G,KAAK,CAAC,CAAEpJ,KAAM,aACxB4F,KAAKgB,aAAa,UAAWmJ,GAC7BA,EAAY,KACZnK,KAAK0Q,WAAY,EACjB1Q,KAAK2Q,QAAO,GAEnB,KACI,CACD,MAAMhL,EAAM,IAAIpD,MAAM,eAEtBoD,EAAIwE,UAAYA,EAAUrB,KAC1B9I,KAAKgB,aAAa,eAAgB2E,EACrC,KACH,EAEN,SAASiL,IACDL,IAGJA,GAAS,EACT3I,IACAuC,EAAU9G,QACV8G,EAAY,KACf,CAED,MAAMP,EAAWjE,IACb,MAAMkL,EAAQ,IAAItO,MAAM,gBAAkBoD,GAE1CkL,EAAM1G,UAAYA,EAAUrB,KAC5B8H,IACA5Q,KAAKgB,aAAa,eAAgB6P,EAAM,EAE5C,SAASC,IACLlH,EAAQ,mBACX,CAED,SAASJ,IACLI,EAAQ,gBACX,CAED,SAASmH,EAAUC,GACX7G,GAAa6G,EAAGlI,OAASqB,EAAUrB,MACnC8H,GAEP,CAED,MAAMhJ,EAAU,KACZuC,EAAU5J,eAAe,OAAQiQ,GACjCrG,EAAU5J,eAAe,QAASqJ,GAClCO,EAAU5J,eAAe,QAASuQ,GAClC9Q,KAAKI,IAAI,QAASoJ,GAClBxJ,KAAKI,IAAI,YAAa2Q,EAAU,EAEpC5G,EAAUhK,KAAK,OAAQqQ,GACvBrG,EAAUhK,KAAK,QAASyJ,GACxBO,EAAUhK,KAAK,QAAS2Q,GACxB9Q,KAAKG,KAAK,QAASqJ,GACnBxJ,KAAKG,KAAK,YAAa4Q,IACwB,IAA3C/Q,KAAK2P,SAASnL,QAAQ,iBACb,iBAATsE,EAEA9I,KAAKmC,cAAa,KACToO,GACDpG,EAAUjH,MACb,GACF,KAGHiH,EAAUjH,MAEjB,CAMDS,SAOI,GANA3D,KAAKmD,WAAa,OAClBsL,EAAO0B,sBAAwB,cAAgBnQ,KAAKmK,UAAUrB,KAC9D9I,KAAKgB,aAAa,QAClBhB,KAAK2Q,QAGD,SAAW3Q,KAAKmD,YAAcnD,KAAKiC,KAAK4M,QAAS,CACjD,IAAI3S,EAAI,EACR,MAAMqT,EAAIvP,KAAK2P,SAAShT,OACxB,KAAOT,EAAIqT,EAAGrT,IACV8D,KAAKsQ,MAAMtQ,KAAK2P,SAASzT,GAEhC,CACJ,CAMD2H,SAAS/F,GACL,GAAI,YAAckC,KAAKmD,YACnB,SAAWnD,KAAKmD,YAChB,YAAcnD,KAAKmD,WAKnB,OAJAnD,KAAKgB,aAAa,SAAUlD,GAE5BkC,KAAKgB,aAAa,aAClBhB,KAAKiR,mBACGnT,EAAO1D,MACX,IAAK,OACD4F,KAAKkR,YAAYC,KAAK3D,MAAM1P,EAAOzD,OACnC,MACJ,IAAK,OACD2F,KAAKoR,WAAW,QAChBpR,KAAKgB,aAAa,QAClBhB,KAAKgB,aAAa,QAClB,MACJ,IAAK,QACD,MAAM2E,EAAM,IAAIpD,MAAM,gBAEtBoD,EAAI0L,KAAOvT,EAAOzD,KAClB2F,KAAKiD,QAAQ0C,GACb,MACJ,IAAK,UACD3F,KAAKgB,aAAa,OAAQlD,EAAOzD,MACjC2F,KAAKgB,aAAa,UAAWlD,EAAOzD,MAMnD,CAOD6W,YAAY7W,GACR2F,KAAKgB,aAAa,YAAa3G,GAC/B2F,KAAK0P,GAAKrV,EAAK4R,IACfjM,KAAKmK,UAAUpH,MAAMkJ,IAAM5R,EAAK4R,IAChCjM,KAAK2P,SAAW3P,KAAKsR,eAAejX,EAAKsV,UACzC3P,KAAK4P,aAAevV,EAAKuV,aACzB5P,KAAK6P,YAAcxV,EAAKwV,YACxB7P,KAAK2K,WAAatQ,EAAKsQ,WACvB3K,KAAK2D,SAED,WAAa3D,KAAKmD,YAEtBnD,KAAKiR,kBACR,CAMDA,mBACIjR,KAAKqC,eAAerC,KAAK8P,kBACzB9P,KAAK8P,iBAAmB9P,KAAKmC,cAAa,KACtCnC,KAAKuD,QAAQ,eAAe,GAC7BvD,KAAK4P,aAAe5P,KAAK6P,aACxB7P,KAAKiC,KAAKoH,WACVrJ,KAAK8P,iBAAiBvG,OAE7B,CAMD8G,UACIrQ,KAAK0O,YAAY9N,OAAO,EAAGZ,KAAK2O,eAIhC3O,KAAK2O,cAAgB,EACjB,IAAM3O,KAAK0O,YAAY/R,OACvBqD,KAAKgB,aAAa,SAGlBhB,KAAK2Q,OAEZ,CAMDA,QACI,GAAI,WAAa3Q,KAAKmD,YAClBnD,KAAKmK,UAAUrH,WACd9C,KAAK0Q,WACN1Q,KAAK0O,YAAY/R,OAAQ,CACzB,MAAM8G,EAAUzD,KAAKuR,qBACrBvR,KAAKmK,UAAU3G,KAAKC,GAGpBzD,KAAK2O,cAAgBlL,EAAQ9G,OAC7BqD,KAAKgB,aAAa,QACrB,CACJ,CAODuQ,qBAII,KAH+BvR,KAAK2K,YACR,YAAxB3K,KAAKmK,UAAUrB,MACf9I,KAAK0O,YAAY/R,OAAS,GAE1B,OAAOqD,KAAK0O,YAEhB,IAAI8C,EAAc,EAClB,IAAK,IAAItV,EAAI,EAAGA,EAAI8D,KAAK0O,YAAY/R,OAAQT,IAAK,CAC9C,MAAM7B,EAAO2F,KAAK0O,YAAYxS,GAAG7B,KAIjC,GAHIA,IACAmX,GZzZO,iBADI1W,EY0ZeT,GZnZ1C,SAAoBwK,GAChB,IAAI4M,EAAI,EAAG9U,EAAS,EACpB,IAAK,IAAIT,EAAI,EAAGqT,EAAI1K,EAAIlI,OAAQT,EAAIqT,EAAGrT,IACnCuV,EAAI5M,EAAI1I,WAAWD,GACfuV,EAAI,IACJ9U,GAAU,EAEL8U,EAAI,KACT9U,GAAU,EAEL8U,EAAI,OAAUA,GAAK,MACxB9U,GAAU,GAGVT,IACAS,GAAU,GAGlB,OAAOA,CACX,CAxBe+U,CAAW5W,GAGfsK,KAAKuM,KAPQ,MAOF7W,EAAIgB,YAAchB,EAAIwE,QYuZ5BpD,EAAI,GAAKsV,EAAcxR,KAAK2K,WAC5B,OAAO3K,KAAK0O,YAAYjP,MAAM,EAAGvD,GAErCsV,GAAe,CAClB,CZhaF,IAAoB1W,EYianB,OAAOkF,KAAK0O,WACf,CASDhL,MAAM+M,EAAKmB,EAAS7R,GAEhB,OADAC,KAAKoR,WAAW,UAAWX,EAAKmB,EAAS7R,GAClCC,IACV,CACDwD,KAAKiN,EAAKmB,EAAS7R,GAEf,OADAC,KAAKoR,WAAW,UAAWX,EAAKmB,EAAS7R,GAClCC,IACV,CAUDoR,WAAWhX,EAAMC,EAAMuX,EAAS7R,GAS5B,GARI,mBAAsB1F,IACtB0F,EAAK1F,EACLA,OAAOmM,GAEP,mBAAsBoL,IACtB7R,EAAK6R,EACLA,EAAU,MAEV,YAAc5R,KAAKmD,YAAc,WAAanD,KAAKmD,WACnD,QAEJyO,EAAUA,GAAW,IACbC,UAAW,IAAUD,EAAQC,SACrC,MAAM/T,EAAS,CACX1D,KAAMA,EACNC,KAAMA,EACNuX,QAASA,GAEb5R,KAAKgB,aAAa,eAAgBlD,GAClCkC,KAAK0O,YAAYxO,KAAKpC,GAClBiC,GACAC,KAAKG,KAAK,QAASJ,GACvBC,KAAK2Q,OACR,CAIDtN,QACI,MAAMA,EAAQ,KACVrD,KAAKuD,QAAQ,gBACbvD,KAAKmK,UAAU9G,OAAO,EAEpByO,EAAkB,KACpB9R,KAAKI,IAAI,UAAW0R,GACpB9R,KAAKI,IAAI,eAAgB0R,GACzBzO,GAAO,EAEL0O,EAAiB,KAEnB/R,KAAKG,KAAK,UAAW2R,GACrB9R,KAAKG,KAAK,eAAgB2R,EAAgB,EAqB9C,MAnBI,YAAc9R,KAAKmD,YAAc,SAAWnD,KAAKmD,aACjDnD,KAAKmD,WAAa,UACdnD,KAAK0O,YAAY/R,OACjBqD,KAAKG,KAAK,SAAS,KACXH,KAAK0Q,UACLqB,IAGA1O,GACH,IAGArD,KAAK0Q,UACVqB,IAGA1O,KAGDrD,IACV,CAMDiD,QAAQ0C,GACJ8I,EAAO0B,uBAAwB,EAC/BnQ,KAAKgB,aAAa,QAAS2E,GAC3B3F,KAAKuD,QAAQ,kBAAmBoC,EACnC,CAMDpC,QAAQd,EAAQC,GACR,YAAc1C,KAAKmD,YACnB,SAAWnD,KAAKmD,YAChB,YAAcnD,KAAKmD,aAEnBnD,KAAKqC,eAAerC,KAAK8P,kBAEzB9P,KAAKmK,UAAU3J,mBAAmB,SAElCR,KAAKmK,UAAU9G,QAEfrD,KAAKmK,UAAU3J,qBACoB,mBAAxBC,sBACPA,oBAAoB,eAAgBT,KAAK+P,2BAA2B,GACpEtP,oBAAoB,UAAWT,KAAKgQ,sBAAsB,IAG9DhQ,KAAKmD,WAAa,SAElBnD,KAAK0P,GAAK,KAEV1P,KAAKgB,aAAa,QAASyB,EAAQC,GAGnC1C,KAAK0O,YAAc,GACnB1O,KAAK2O,cAAgB,EAE5B,CAOD2C,eAAe3B,GACX,MAAMqC,EAAmB,GACzB,IAAI9V,EAAI,EACR,MAAMsD,EAAImQ,EAAShT,OACnB,KAAOT,EAAIsD,EAAGtD,KACL8D,KAAK2I,WAAWnE,QAAQmL,EAASzT,KAClC8V,EAAiB9R,KAAKyP,EAASzT,IAEvC,OAAO8V,CACV,EAELvD,EAAOpC,SfvbiB,EgB1JxB,MAAM1R,EAA+C,mBAAhBC,YAC/BC,EAAUC,GACyB,mBAAvBF,YAAYC,OACpBD,YAAYC,OAAOC,GACnBA,EAAIC,kBAAkBH,YAE1BH,GAAWZ,OAAOW,UAAUC,SAC5BH,GAAiC,mBAATC,MACT,oBAATA,MACoB,6BAAxBE,GAASC,KAAKH,MAChB0X,GAAiC,mBAATC,MACT,oBAATA,MACoB,6BAAxBzX,GAASC,KAAKwX,MAMf,SAASnH,GAASjQ,GACrB,OAASH,IAA0BG,aAAeF,aAAeC,EAAOC,KACnER,IAAkBQ,aAAeP,MACjC0X,IAAkBnX,aAAeoX,IAC1C,CACO,SAASC,GAAUrX,EAAKsX,GAC3B,IAAKtX,GAAsB,iBAARA,EACf,OAAO,EAEX,GAAIiG,MAAMsR,QAAQvX,GAAM,CACpB,IAAK,IAAIoB,EAAI,EAAGqT,EAAIzU,EAAI6B,OAAQT,EAAIqT,EAAGrT,IACnC,GAAIiW,GAAUrX,EAAIoB,IACd,OAAO,EAGf,OAAO,CACV,CACD,GAAI6O,GAASjQ,GACT,OAAO,EAEX,GAAIA,EAAIsX,QACkB,mBAAftX,EAAIsX,QACU,IAArB9R,UAAU3D,OACV,OAAOwV,GAAUrX,EAAIsX,UAAU,GAEnC,IAAK,MAAMlY,KAAOY,EACd,GAAIjB,OAAOW,UAAUkH,eAAehH,KAAKI,EAAKZ,IAAQiY,GAAUrX,EAAIZ,IAChE,OAAO,EAGf,OAAO,CACX,CCzCO,SAASoY,GAAkBxU,GAC9B,MAAMyU,EAAU,GACVC,EAAa1U,EAAOzD,KACpBoY,EAAO3U,EAGb,OAFA2U,EAAKpY,KAAOqY,GAAmBF,EAAYD,GAC3CE,EAAKE,YAAcJ,EAAQ5V,OACpB,CAAEmB,OAAQ2U,EAAMF,QAASA,EACpC,CACA,SAASG,GAAmBrY,EAAMkY,GAC9B,IAAKlY,EACD,OAAOA,EACX,GAAI0Q,GAAS1Q,GAAO,CAChB,MAAMuY,EAAc,CAAEC,cAAc,EAAM1N,IAAKoN,EAAQ5V,QAEvD,OADA4V,EAAQrS,KAAK7F,GACNuY,CACV,CACI,GAAI7R,MAAMsR,QAAQhY,GAAO,CAC1B,MAAMyY,EAAU,IAAI/R,MAAM1G,EAAKsC,QAC/B,IAAK,IAAIT,EAAI,EAAGA,EAAI7B,EAAKsC,OAAQT,IAC7B4W,EAAQ5W,GAAKwW,GAAmBrY,EAAK6B,GAAIqW,GAE7C,OAAOO,CACV,CACI,GAAoB,iBAATzY,KAAuBA,aAAgBmL,MAAO,CAC1D,MAAMsN,EAAU,CAAA,EAChB,IAAK,MAAM5Y,KAAOG,EACVR,OAAOW,UAAUkH,eAAehH,KAAKL,EAAMH,KAC3C4Y,EAAQ5Y,GAAOwY,GAAmBrY,EAAKH,GAAMqY,IAGrD,OAAOO,CACV,CACD,OAAOzY,CACX,CASO,SAAS0Y,GAAkBjV,EAAQyU,GAGtC,OAFAzU,EAAOzD,KAAO2Y,GAAmBlV,EAAOzD,KAAMkY,UACvCzU,EAAO6U,YACP7U,CACX,CACA,SAASkV,GAAmB3Y,EAAMkY,GAC9B,IAAKlY,EACD,OAAOA,EACX,GAAIA,IAA8B,IAAtBA,EAAKwY,aAAuB,CAIpC,GAHyC,iBAAbxY,EAAK8K,KAC7B9K,EAAK8K,KAAO,GACZ9K,EAAK8K,IAAMoN,EAAQ5V,OAEnB,OAAO4V,EAAQlY,EAAK8K,KAGpB,MAAM,IAAI5C,MAAM,sBAEvB,CACI,GAAIxB,MAAMsR,QAAQhY,GACnB,IAAK,IAAI6B,EAAI,EAAGA,EAAI7B,EAAKsC,OAAQT,IAC7B7B,EAAK6B,GAAK8W,GAAmB3Y,EAAK6B,GAAIqW,QAGzC,GAAoB,iBAATlY,EACZ,IAAK,MAAMH,KAAOG,EACVR,OAAOW,UAAUkH,eAAehH,KAAKL,EAAMH,KAC3CG,EAAKH,GAAO8Y,GAAmB3Y,EAAKH,GAAMqY,IAItD,OAAOlY,CACX,CC5EA,MAAM4Y,GAAkB,CACpB,UACA,gBACA,aACA,gBACA,cACA,kBAOS5G,GAAW,EACjB,IAAI6G,IACX,SAAWA,GACPA,EAAWA,EAAoB,QAAI,GAAK,UACxCA,EAAWA,EAAuB,WAAI,GAAK,aAC3CA,EAAWA,EAAkB,MAAI,GAAK,QACtCA,EAAWA,EAAgB,IAAI,GAAK,MACpCA,EAAWA,EAA0B,cAAI,GAAK,gBAC9CA,EAAWA,EAAyB,aAAI,GAAK,eAC7CA,EAAWA,EAAuB,WAAI,GAAK,YAC9C,CARD,CAQGA,KAAeA,GAAa,CAAE,IA0EjC,SAASC,GAAS1N,GACd,MAAiD,oBAA1C5L,OAAOW,UAAUC,SAASC,KAAK+K,EAC1C,CAMO,MAAM2N,WAAgB1T,EAMzB8C,YAAY6Q,GACRzQ,QACA5C,KAAKqT,QAAUA,CAClB,CAMDC,IAAIxY,GACA,IAAIgD,EACJ,GAAmB,iBAARhD,EAAkB,CACzB,GAAIkF,KAAKuT,cACL,MAAM,IAAIhR,MAAM,mDAEpBzE,EAASkC,KAAKwT,aAAa1Y,GAC3B,MAAM2Y,EAAgB3V,EAAO1D,OAAS8Y,GAAWQ,aAC7CD,GAAiB3V,EAAO1D,OAAS8Y,GAAWS,YAC5C7V,EAAO1D,KAAOqZ,EAAgBP,GAAWU,MAAQV,GAAWW,IAE5D7T,KAAKuT,cAAgB,IAAIO,GAAoBhW,GAElB,IAAvBA,EAAO6U,aACP/P,MAAM5B,aAAa,UAAWlD,IAKlC8E,MAAM5B,aAAa,UAAWlD,EAErC,KACI,KAAIiN,GAASjQ,KAAQA,EAAI+B,OAe1B,MAAM,IAAI0F,MAAM,iBAAmBzH,GAbnC,IAAKkF,KAAKuT,cACN,MAAM,IAAIhR,MAAM,oDAGhBzE,EAASkC,KAAKuT,cAAcQ,eAAejZ,GACvCgD,IAEAkC,KAAKuT,cAAgB,KACrB3Q,MAAM5B,aAAa,UAAWlD,GAMzC,CACJ,CAOD0V,aAAa3O,GACT,IAAI3I,EAAI,EAER,MAAMkB,EAAI,CACNhD,KAAMuK,OAAOE,EAAIrI,OAAO,KAE5B,QAA2BgK,IAAvB0M,GAAW9V,EAAEhD,MACb,MAAM,IAAImI,MAAM,uBAAyBnF,EAAEhD,MAG/C,GAAIgD,EAAEhD,OAAS8Y,GAAWQ,cACtBtW,EAAEhD,OAAS8Y,GAAWS,WAAY,CAClC,MAAMK,EAAQ9X,EAAI,EAClB,KAA2B,MAApB2I,EAAIrI,SAASN,IAAcA,GAAK2I,EAAIlI,SAC3C,MAAMsX,EAAMpP,EAAInI,UAAUsX,EAAO9X,GACjC,GAAI+X,GAAOtP,OAAOsP,IAA0B,MAAlBpP,EAAIrI,OAAON,GACjC,MAAM,IAAIqG,MAAM,uBAEpBnF,EAAEuV,YAAchO,OAAOsP,EAC1B,CAED,GAAI,MAAQpP,EAAIrI,OAAON,EAAI,GAAI,CAC3B,MAAM8X,EAAQ9X,EAAI,EAClB,OAASA,GAAG,CAER,GAAI,MADM2I,EAAIrI,OAAON,GAEjB,MACJ,GAAIA,IAAM2I,EAAIlI,OACV,KACP,CACDS,EAAE8W,IAAMrP,EAAInI,UAAUsX,EAAO9X,EAChC,MAEGkB,EAAE8W,IAAM,IAGZ,MAAMC,EAAOtP,EAAIrI,OAAON,EAAI,GAC5B,GAAI,KAAOiY,GAAQxP,OAAOwP,IAASA,EAAM,CACrC,MAAMH,EAAQ9X,EAAI,EAClB,OAASA,GAAG,CACR,MAAMuV,EAAI5M,EAAIrI,OAAON,GACrB,GAAI,MAAQuV,GAAK9M,OAAO8M,IAAMA,EAAG,GAC3BvV,EACF,KACH,CACD,GAAIA,IAAM2I,EAAIlI,OACV,KACP,CACDS,EAAEsS,GAAK/K,OAAOE,EAAInI,UAAUsX,EAAO9X,EAAI,GAC1C,CAED,GAAI2I,EAAIrI,SAASN,GAAI,CACjB,MAAMkY,EAAUpU,KAAKqU,SAASxP,EAAIyP,OAAOpY,IACzC,IAAIkX,GAAQmB,eAAenX,EAAEhD,KAAMga,GAI/B,MAAM,IAAI7R,MAAM,mBAHhBnF,EAAE/C,KAAO+Z,CAKhB,CACD,OAAOhX,CACV,CACDiX,SAASxP,GACL,IACI,OAAOsM,KAAK3D,MAAM3I,EAAK7E,KAAKqT,QAC/B,CACD,MAAOtN,GACH,OAAO,CACV,CACJ,CACDyO,sBAAsBpa,EAAMga,GACxB,OAAQha,GACJ,KAAK8Y,GAAWuB,QACZ,OAAOtB,GAASiB,GACpB,KAAKlB,GAAWwB,WACZ,YAAmBlO,IAAZ4N,EACX,KAAKlB,GAAWyB,cACZ,MAA0B,iBAAZP,GAAwBjB,GAASiB,GACnD,KAAKlB,GAAWU,MAChB,KAAKV,GAAWQ,aACZ,OAAQ3S,MAAMsR,QAAQ+B,KACK,iBAAfA,EAAQ,IACW,iBAAfA,EAAQ,KAC6B,IAAzCnB,GAAgBzO,QAAQ4P,EAAQ,KAChD,KAAKlB,GAAWW,IAChB,KAAKX,GAAWS,WACZ,OAAO5S,MAAMsR,QAAQ+B,GAEhC,CAIDQ,UACQ5U,KAAKuT,gBACLvT,KAAKuT,cAAcsB,yBACnB7U,KAAKuT,cAAgB,KAE5B,EAUL,MAAMO,GACFtR,YAAY1E,GACRkC,KAAKlC,OAASA,EACdkC,KAAKuS,QAAU,GACfvS,KAAK8U,UAAYhX,CACpB,CASDiW,eAAegB,GAEX,GADA/U,KAAKuS,QAAQrS,KAAK6U,GACd/U,KAAKuS,QAAQ5V,SAAWqD,KAAK8U,UAAUnC,YAAa,CAEpD,MAAM7U,EAASiV,GAAkB/S,KAAK8U,UAAW9U,KAAKuS,SAEtD,OADAvS,KAAK6U,yBACE/W,CACV,CACD,OAAO,IACV,CAID+W,yBACI7U,KAAK8U,UAAY,KACjB9U,KAAKuS,QAAU,EAClB,gDAlSmB,sCAcjB,MAMH/P,YAAYwS,GACRhV,KAAKgV,SAAWA,CACnB,CAOD5W,OAAOtD,GACH,OAAIA,EAAIV,OAAS8Y,GAAWU,OAAS9Y,EAAIV,OAAS8Y,GAAWW,MACrD1B,GAAUrX,GAWX,CAACkF,KAAKiV,eAAena,IAVbkF,KAAKkV,eAAe,CACvB9a,KAAMU,EAAIV,OAAS8Y,GAAWU,MACxBV,GAAWQ,aACXR,GAAWS,WACjBO,IAAKpZ,EAAIoZ,IACT7Z,KAAMS,EAAIT,KACVqV,GAAI5U,EAAI4U,IAKvB,CAIDuF,eAAena,GAEX,IAAI+J,EAAM,GAAK/J,EAAIV,KAmBnB,OAjBIU,EAAIV,OAAS8Y,GAAWQ,cACxB5Y,EAAIV,OAAS8Y,GAAWS,aACxB9O,GAAO/J,EAAI6X,YAAc,KAIzB7X,EAAIoZ,KAAO,MAAQpZ,EAAIoZ,MACvBrP,GAAO/J,EAAIoZ,IAAM,KAGjB,MAAQpZ,EAAI4U,KACZ7K,GAAO/J,EAAI4U,IAGX,MAAQ5U,EAAIT,OACZwK,GAAOsM,KAAKgE,UAAUra,EAAIT,KAAM2F,KAAKgV,WAElCnQ,CACV,CAMDqQ,eAAepa,GACX,MAAMsa,EAAiB9C,GAAkBxX,GACnC2X,EAAOzS,KAAKiV,eAAeG,EAAetX,QAC1CyU,EAAU6C,EAAe7C,QAE/B,OADAA,EAAQ8C,QAAQ5C,GACTF,CACV,gBCpGE,SAAS3S,GAAG9E,EAAK6O,EAAI5J,GAExB,OADAjF,EAAI8E,GAAG+J,EAAI5J,GACJ,WACHjF,EAAIsF,IAAIuJ,EAAI5J,EACpB,CACA,CCEA,MAAMkT,GAAkBpZ,OAAOyb,OAAO,CAClCC,QAAS,EACTC,cAAe,EACfC,WAAY,EACZC,cAAe,EAEfC,YAAa,EACbpV,eAAgB,IA0Bb,MAAMkO,WAAe/O,EAIxB8C,YAAYoT,EAAI1B,EAAKjS,GACjBW,QAeA5C,KAAK6V,WAAY,EAKjB7V,KAAK8V,WAAY,EAIjB9V,KAAK+V,cAAgB,GAIrB/V,KAAKgW,WAAa,GAOlBhW,KAAKiW,OAAS,GAKdjW,KAAKkW,UAAY,EACjBlW,KAAKmW,IAAM,EACXnW,KAAKoW,KAAO,GACZpW,KAAKqW,MAAQ,GACbrW,KAAK4V,GAAKA,EACV5V,KAAKkU,IAAMA,EACPjS,GAAQA,EAAKqU,OACbtW,KAAKsW,KAAOrU,EAAKqU,MAErBtW,KAAKuW,MAAQ1c,OAAOqT,OAAO,CAAE,EAAEjL,GAC3BjC,KAAK4V,GAAGY,cACRxW,KAAKkD,MACZ,CAeGuT,mBACA,OAAQzW,KAAK6V,SAChB,CAMDa,YACI,GAAI1W,KAAK2W,KACL,OACJ,MAAMf,EAAK5V,KAAK4V,GAChB5V,KAAK2W,KAAO,CACR/W,GAAGgW,EAAI,OAAQ5V,KAAKoJ,OAAOhH,KAAKpC,OAChCJ,GAAGgW,EAAI,SAAU5V,KAAK4W,SAASxU,KAAKpC,OACpCJ,GAAGgW,EAAI,QAAS5V,KAAK4J,QAAQxH,KAAKpC,OAClCJ,GAAGgW,EAAI,QAAS5V,KAAKwJ,QAAQpH,KAAKpC,OAEzC,CAkBG6W,aACA,QAAS7W,KAAK2W,IACjB,CAWDpB,UACI,OAAIvV,KAAK6V,YAET7V,KAAK0W,YACA1W,KAAK4V,GAAkB,eACxB5V,KAAK4V,GAAG1S,OACR,SAAWlD,KAAK4V,GAAGkB,aACnB9W,KAAKoJ,UALEpJ,IAOd,CAIDkD,OACI,OAAOlD,KAAKuV,SACf,CAgBD/R,QAAQ1C,GAGJ,OAFAA,EAAKuU,QAAQ,WACbrV,KAAKa,KAAKR,MAAML,KAAMc,GACfd,IACV,CAkBDa,KAAK8I,KAAO7I,GACR,GAAImS,GAAgBvR,eAAeiI,GAC/B,MAAM,IAAIpH,MAAM,IAAMoH,EAAGlP,WAAa,8BAG1C,GADAqG,EAAKuU,QAAQ1L,GACT3J,KAAKuW,MAAMQ,UAAY/W,KAAKqW,MAAMW,YAAchX,KAAKqW,MAAMY,SAE3D,OADAjX,KAAKkX,YAAYpW,GACVd,KAEX,MAAMlC,EAAS,CACX1D,KAAM8Y,GAAWU,MACjBvZ,KAAMyG,EAEVhD,QAAiB,IAGjB,GAFAA,EAAO8T,QAAQC,UAAmC,IAAxB7R,KAAKqW,MAAMxE,SAEjC,mBAAsB/Q,EAAKA,EAAKnE,OAAS,GAAI,CAC7C,MAAM+S,EAAK1P,KAAKmW,MACVgB,EAAMrW,EAAKsW,MACjBpX,KAAKqX,qBAAqB3H,EAAIyH,GAC9BrZ,EAAO4R,GAAKA,CACf,CACD,MAAM4H,EAAsBtX,KAAK4V,GAAG2B,QAChCvX,KAAK4V,GAAG2B,OAAOpN,WACfnK,KAAK4V,GAAG2B,OAAOpN,UAAUrH,SAY7B,OAXsB9C,KAAKqW,MAAMY,YAAcK,IAAwBtX,KAAK6V,aAGnE7V,KAAK6V,WACV7V,KAAKwX,wBAAwB1Z,GAC7BkC,KAAKlC,OAAOA,IAGZkC,KAAKgW,WAAW9V,KAAKpC,IAEzBkC,KAAKqW,MAAQ,GACNrW,IACV,CAIDqX,qBAAqB3H,EAAIyH,GACrB,IAAI1Q,EACJ,MAAMU,EAAwC,QAA7BV,EAAKzG,KAAKqW,MAAMlP,eAA4B,IAAPV,EAAgBA,EAAKzG,KAAKuW,MAAMkB,WACtF,QAAgBjR,IAAZW,EAEA,YADAnH,KAAKoW,KAAK1G,GAAMyH,GAIpB,MAAMO,EAAQ1X,KAAK4V,GAAGzT,cAAa,YACxBnC,KAAKoW,KAAK1G,GACjB,IAAK,IAAIxT,EAAI,EAAGA,EAAI8D,KAAKgW,WAAWrZ,OAAQT,IACpC8D,KAAKgW,WAAW9Z,GAAGwT,KAAOA,GAC1B1P,KAAKgW,WAAWpV,OAAO1E,EAAG,GAGlCib,EAAIzc,KAAKsF,KAAM,IAAIuC,MAAM,2BAA2B,GACrD4E,GACHnH,KAAKoW,KAAK1G,GAAM,IAAI5O,KAEhBd,KAAK4V,GAAGvT,eAAeqV,GACvBP,EAAI9W,MAAML,KAAM,CAAC,QAASc,GAAM,CAEvC,CAiBD6W,YAAYhO,KAAO7I,GAEf,MAAM8W,OAAiCpR,IAAvBxG,KAAKqW,MAAMlP,cAAmDX,IAA1BxG,KAAKuW,MAAMkB,WAC/D,OAAO,IAAItP,SAAQ,CAACC,EAASyP,KACzB/W,EAAKZ,MAAK,CAAC4X,EAAMC,IACTH,EACOE,EAAOD,EAAOC,GAAQ1P,EAAQ2P,GAG9B3P,EAAQ0P,KAGvB9X,KAAKa,KAAK8I,KAAO7I,EAAK,GAE7B,CAMDoW,YAAYpW,GACR,IAAIqW,EACiC,mBAA1BrW,EAAKA,EAAKnE,OAAS,KAC1Bwa,EAAMrW,EAAKsW,OAEf,MAAMtZ,EAAS,CACX4R,GAAI1P,KAAKkW,YACT8B,SAAU,EACVC,SAAS,EACTnX,OACAuV,MAAOxc,OAAOqT,OAAO,CAAE8J,WAAW,GAAQhX,KAAKqW,QAEnDvV,EAAKZ,MAAK,CAACyF,KAAQuS,KACf,GAAIpa,IAAWkC,KAAKiW,OAAO,GAEvB,OAkBJ,OAhByB,OAARtQ,EAET7H,EAAOka,SAAWhY,KAAKuW,MAAMQ,UAC7B/W,KAAKiW,OAAO1W,QACR4X,GACAA,EAAIxR,KAKZ3F,KAAKiW,OAAO1W,QACR4X,GACAA,EAAI,QAASe,IAGrBpa,EAAOma,SAAU,EACVjY,KAAKmY,aAAa,IAE7BnY,KAAKiW,OAAO/V,KAAKpC,GACjBkC,KAAKmY,aACR,CAODA,YAAYC,GAAQ,GAChB,IAAKpY,KAAK6V,WAAoC,IAAvB7V,KAAKiW,OAAOtZ,OAC/B,OAEJ,MAAMmB,EAASkC,KAAKiW,OAAO,GACvBnY,EAAOma,UAAYG,IAGvBta,EAAOma,SAAU,EACjBna,EAAOka,WACPhY,KAAKqW,MAAQvY,EAAOuY,MACpBrW,KAAKa,KAAKR,MAAML,KAAMlC,EAAOgD,MAChC,CAODhD,OAAOA,GACHA,EAAOoW,IAAMlU,KAAKkU,IAClBlU,KAAK4V,GAAGyC,QAAQva,EACnB,CAMDsL,SAC4B,mBAAbpJ,KAAKsW,KACZtW,KAAKsW,MAAMjc,IACP2F,KAAKsY,mBAAmBje,EAAK,IAIjC2F,KAAKsY,mBAAmBtY,KAAKsW,KAEpC,CAODgC,mBAAmBje,GACf2F,KAAKlC,OAAO,CACR1D,KAAM8Y,GAAWuB,QACjBpa,KAAM2F,KAAKuY,KACL1e,OAAOqT,OAAO,CAAEsL,IAAKxY,KAAKuY,KAAME,OAAQzY,KAAK0Y,aAAere,GAC5DA,GAEb,CAODuP,QAAQjE,GACC3F,KAAK6V,WACN7V,KAAKgB,aAAa,gBAAiB2E,EAE1C,CAQD6D,QAAQ/G,EAAQC,GACZ1C,KAAK6V,WAAY,SACV7V,KAAK0P,GACZ1P,KAAKgB,aAAa,aAAcyB,EAAQC,EAC3C,CAODkU,SAAS9Y,GAEL,GADsBA,EAAOoW,MAAQlU,KAAKkU,IAG1C,OAAQpW,EAAO1D,MACX,KAAK8Y,GAAWuB,QACR3W,EAAOzD,MAAQyD,EAAOzD,KAAK4R,IAC3BjM,KAAK2Y,UAAU7a,EAAOzD,KAAK4R,IAAKnO,EAAOzD,KAAKme,KAG5CxY,KAAKgB,aAAa,gBAAiB,IAAIuB,MAAM,8LAEjD,MACJ,KAAK2Q,GAAWU,MAChB,KAAKV,GAAWQ,aACZ1T,KAAK4Y,QAAQ9a,GACb,MACJ,KAAKoV,GAAWW,IAChB,KAAKX,GAAWS,WACZ3T,KAAK6Y,MAAM/a,GACX,MACJ,KAAKoV,GAAWwB,WACZ1U,KAAK8Y,eACL,MACJ,KAAK5F,GAAWyB,cACZ3U,KAAK4U,UACL,MAAMjP,EAAM,IAAIpD,MAAMzE,EAAOzD,KAAK0e,SAElCpT,EAAItL,KAAOyD,EAAOzD,KAAKA,KACvB2F,KAAKgB,aAAa,gBAAiB2E,GAG9C,CAODiT,QAAQ9a,GACJ,MAAMgD,EAAOhD,EAAOzD,MAAQ,GACxB,MAAQyD,EAAO4R,IACf5O,EAAKZ,KAAKF,KAAKmX,IAAIrZ,EAAO4R,KAE1B1P,KAAK6V,UACL7V,KAAKgZ,UAAUlY,GAGfd,KAAK+V,cAAc7V,KAAKrG,OAAOyb,OAAOxU,GAE7C,CACDkY,UAAUlY,GACN,GAAId,KAAKiZ,eAAiBjZ,KAAKiZ,cAActc,OAAQ,CACjD,MAAMsE,EAAYjB,KAAKiZ,cAAcxZ,QACrC,IAAK,MAAMyZ,KAAYjY,EACnBiY,EAAS7Y,MAAML,KAAMc,EAE5B,CACD8B,MAAM/B,KAAKR,MAAML,KAAMc,GACnBd,KAAKuY,MAAQzX,EAAKnE,QAA2C,iBAA1BmE,EAAKA,EAAKnE,OAAS,KACtDqD,KAAK0Y,YAAc5X,EAAKA,EAAKnE,OAAS,GAE7C,CAMDwa,IAAIzH,GACA,MAAMtO,EAAOpB,KACb,IAAImZ,GAAO,EACX,OAAO,YAAarY,GAEZqY,IAEJA,GAAO,EACP/X,EAAKtD,OAAO,CACR1D,KAAM8Y,GAAWW,IACjBnE,GAAIA,EACJrV,KAAMyG,IAEtB,CACK,CAOD+X,MAAM/a,GACF,MAAMqZ,EAAMnX,KAAKoW,KAAKtY,EAAO4R,IACzB,mBAAsByH,IACtBA,EAAI9W,MAAML,KAAMlC,EAAOzD,aAChB2F,KAAKoW,KAAKtY,EAAO4R,IAI/B,CAMDiJ,UAAUjJ,EAAI8I,GACVxY,KAAK0P,GAAKA,EACV1P,KAAK8V,UAAY0C,GAAOxY,KAAKuY,OAASC,EACtCxY,KAAKuY,KAAOC,EACZxY,KAAK6V,WAAY,EACjB7V,KAAKoZ,eACLpZ,KAAKgB,aAAa,WAClBhB,KAAKmY,aAAY,EACpB,CAMDiB,eACIpZ,KAAK+V,cAAc9b,SAAS6G,GAASd,KAAKgZ,UAAUlY,KACpDd,KAAK+V,cAAgB,GACrB/V,KAAKgW,WAAW/b,SAAS6D,IACrBkC,KAAKwX,wBAAwB1Z,GAC7BkC,KAAKlC,OAAOA,EAAO,IAEvBkC,KAAKgW,WAAa,EACrB,CAMD8C,eACI9Y,KAAK4U,UACL5U,KAAKwJ,QAAQ,uBAChB,CAQDoL,UACQ5U,KAAK2W,OAEL3W,KAAK2W,KAAK1c,SAASof,GAAeA,MAClCrZ,KAAK2W,UAAOnQ,GAEhBxG,KAAK4V,GAAa,SAAE5V,KACvB,CAiBDyV,aAUI,OATIzV,KAAK6V,WACL7V,KAAKlC,OAAO,CAAE1D,KAAM8Y,GAAWwB,aAGnC1U,KAAK4U,UACD5U,KAAK6V,WAEL7V,KAAKwJ,QAAQ,wBAEVxJ,IACV,CAMDqD,QACI,OAAOrD,KAAKyV,YACf,CAUD5D,SAASA,GAEL,OADA7R,KAAKqW,MAAMxE,SAAWA,EACf7R,IACV,CAUGiX,eAEA,OADAjX,KAAKqW,MAAMY,UAAW,EACfjX,IACV,CAcDmH,QAAQA,GAEJ,OADAnH,KAAKqW,MAAMlP,QAAUA,EACdnH,IACV,CAYDsZ,MAAMJ,GAGF,OAFAlZ,KAAKiZ,cAAgBjZ,KAAKiZ,eAAiB,GAC3CjZ,KAAKiZ,cAAc/Y,KAAKgZ,GACjBlZ,IACV,CAYDuZ,WAAWL,GAGP,OAFAlZ,KAAKiZ,cAAgBjZ,KAAKiZ,eAAiB,GAC3CjZ,KAAKiZ,cAAc5D,QAAQ6D,GACpBlZ,IACV,CAmBDwZ,OAAON,GACH,IAAKlZ,KAAKiZ,cACN,OAAOjZ,KAEX,GAAIkZ,EAAU,CACV,MAAMjY,EAAYjB,KAAKiZ,cACvB,IAAK,IAAI/c,EAAI,EAAGA,EAAI+E,EAAUtE,OAAQT,IAClC,GAAIgd,IAAajY,EAAU/E,GAEvB,OADA+E,EAAUL,OAAO1E,EAAG,GACb8D,IAGlB,MAEGA,KAAKiZ,cAAgB,GAEzB,OAAOjZ,IACV,CAKDyZ,eACI,OAAOzZ,KAAKiZ,eAAiB,EAChC,CAcDS,cAAcR,GAGV,OAFAlZ,KAAK2Z,sBAAwB3Z,KAAK2Z,uBAAyB,GAC3D3Z,KAAK2Z,sBAAsBzZ,KAAKgZ,GACzBlZ,IACV,CAcD4Z,mBAAmBV,GAGf,OAFAlZ,KAAK2Z,sBAAwB3Z,KAAK2Z,uBAAyB,GAC3D3Z,KAAK2Z,sBAAsBtE,QAAQ6D,GAC5BlZ,IACV,CAmBD6Z,eAAeX,GACX,IAAKlZ,KAAK2Z,sBACN,OAAO3Z,KAEX,GAAIkZ,EAAU,CACV,MAAMjY,EAAYjB,KAAK2Z,sBACvB,IAAK,IAAIzd,EAAI,EAAGA,EAAI+E,EAAUtE,OAAQT,IAClC,GAAIgd,IAAajY,EAAU/E,GAEvB,OADA+E,EAAUL,OAAO1E,EAAG,GACb8D,IAGlB,MAEGA,KAAK2Z,sBAAwB,GAEjC,OAAO3Z,IACV,CAKD8Z,uBACI,OAAO9Z,KAAK2Z,uBAAyB,EACxC,CAQDnC,wBAAwB1Z,GACpB,GAAIkC,KAAK2Z,uBAAyB3Z,KAAK2Z,sBAAsBhd,OAAQ,CACjE,MAAMsE,EAAYjB,KAAK2Z,sBAAsBla,QAC7C,IAAK,MAAMyZ,KAAYjY,EACnBiY,EAAS7Y,MAAML,KAAMlC,EAAOzD,KAEnC,CACJ,ECzzBE,SAAS0f,GAAQ9X,GACpBA,EAAOA,GAAQ,GACfjC,KAAKga,GAAK/X,EAAKgY,KAAO,IACtBja,KAAKka,IAAMjY,EAAKiY,KAAO,IACvBla,KAAKma,OAASlY,EAAKkY,QAAU,EAC7Bna,KAAKoa,OAASnY,EAAKmY,OAAS,GAAKnY,EAAKmY,QAAU,EAAInY,EAAKmY,OAAS,EAClEpa,KAAKqa,SAAW,CACpB,CAOAN,GAAQvf,UAAU8f,SAAW,WACzB,IAAIN,EAAKha,KAAKga,GAAK5U,KAAKgG,IAAIpL,KAAKma,OAAQna,KAAKqa,YAC9C,GAAIra,KAAKoa,OAAQ,CACb,IAAIG,EAAOnV,KAAKoV,SACZC,EAAYrV,KAAKC,MAAMkV,EAAOva,KAAKoa,OAASJ,GAChDA,EAAoC,IAAN,EAAxB5U,KAAKC,MAAa,GAAPkV,IAAuBP,EAAKS,EAAYT,EAAKS,CACjE,CACD,OAAgC,EAAzBrV,KAAK6U,IAAID,EAAIha,KAAKka,IAC7B,EAMAH,GAAQvf,UAAUkgB,MAAQ,WACtB1a,KAAKqa,SAAW,CACpB,EAMAN,GAAQvf,UAAUmgB,OAAS,SAAUV,GACjCja,KAAKga,GAAKC,CACd,EAMAF,GAAQvf,UAAUogB,OAAS,SAAUV,GACjCla,KAAKka,IAAMA,CACf,EAMAH,GAAQvf,UAAUqgB,UAAY,SAAUT,GACpCpa,KAAKoa,OAASA,CAClB,EC3DO,MAAMU,WAAgBpb,EACzB8C,YAAY8D,EAAKrE,GACb,IAAIwE,EACJ7D,QACA5C,KAAK+a,KAAO,GACZ/a,KAAK2W,KAAO,GACRrQ,GAAO,iBAAoBA,IAC3BrE,EAAOqE,EACPA,OAAME,IAEVvE,EAAOA,GAAQ,IACVoC,KAAOpC,EAAKoC,MAAQ,aACzBrE,KAAKiC,KAAOA,EACZD,EAAsBhC,KAAMiC,GAC5BjC,KAAKgb,cAAmC,IAAtB/Y,EAAK+Y,cACvBhb,KAAKib,qBAAqBhZ,EAAKgZ,sBAAwBC,KACvDlb,KAAKmb,kBAAkBlZ,EAAKkZ,mBAAqB,KACjDnb,KAAKob,qBAAqBnZ,EAAKmZ,sBAAwB,KACvDpb,KAAKqb,oBAAwD,QAAnC5U,EAAKxE,EAAKoZ,2BAAwC,IAAP5U,EAAgBA,EAAK,IAC1FzG,KAAKsb,QAAU,IAAIvB,GAAQ,CACvBE,IAAKja,KAAKmb,oBACVjB,IAAKla,KAAKob,uBACVhB,OAAQpa,KAAKqb,wBAEjBrb,KAAKmH,QAAQ,MAAQlF,EAAKkF,QAAU,IAAQlF,EAAKkF,SACjDnH,KAAK8W,YAAc,SACnB9W,KAAKsG,IAAMA,EACX,MAAMiV,EAAUtZ,EAAKuZ,QAAUA,GAC/Bxb,KAAKyb,QAAU,IAAIF,EAAQG,QAC3B1b,KAAK2b,QAAU,IAAIJ,EAAQnI,QAC3BpT,KAAKwW,cAAoC,IAArBvU,EAAK2Z,YACrB5b,KAAKwW,cACLxW,KAAKkD,MACZ,CACD8X,aAAaa,GACT,OAAKvb,UAAU3D,QAEfqD,KAAK8b,gBAAkBD,EAChB7b,MAFIA,KAAK8b,aAGnB,CACDb,qBAAqBY,GACjB,YAAUrV,IAANqV,EACO7b,KAAK+b,uBAChB/b,KAAK+b,sBAAwBF,EACtB7b,KACV,CACDmb,kBAAkBU,GACd,IAAIpV,EACJ,YAAUD,IAANqV,EACO7b,KAAKgc,oBAChBhc,KAAKgc,mBAAqBH,EACF,QAAvBpV,EAAKzG,KAAKsb,eAA4B,IAAP7U,GAAyBA,EAAGkU,OAAOkB,GAC5D7b,KACV,CACDqb,oBAAoBQ,GAChB,IAAIpV,EACJ,YAAUD,IAANqV,EACO7b,KAAKic,sBAChBjc,KAAKic,qBAAuBJ,EACJ,QAAvBpV,EAAKzG,KAAKsb,eAA4B,IAAP7U,GAAyBA,EAAGoU,UAAUgB,GAC/D7b,KACV,CACDob,qBAAqBS,GACjB,IAAIpV,EACJ,YAAUD,IAANqV,EACO7b,KAAKkc,uBAChBlc,KAAKkc,sBAAwBL,EACL,QAAvBpV,EAAKzG,KAAKsb,eAA4B,IAAP7U,GAAyBA,EAAGmU,OAAOiB,GAC5D7b,KACV,CACDmH,QAAQ0U,GACJ,OAAKvb,UAAU3D,QAEfqD,KAAKmc,SAAWN,EACT7b,MAFIA,KAAKmc,QAGnB,CAODC,wBAESpc,KAAKqc,eACNrc,KAAK8b,eACqB,IAA1B9b,KAAKsb,QAAQjB,UAEbra,KAAKsc,WAEZ,CAQDpZ,KAAKnD,GACD,IAAKC,KAAK8W,YAAYtS,QAAQ,QAC1B,OAAOxE,KACXA,KAAKuX,OAAS,IAAIgF,EAAOvc,KAAKsG,IAAKtG,KAAKiC,MACxC,MAAMe,EAAShD,KAAKuX,OACdnW,EAAOpB,KACbA,KAAK8W,YAAc,UACnB9W,KAAKwc,eAAgB,EAErB,MAAMC,EAAiB7c,GAAGoD,EAAQ,QAAQ,WACtC5B,EAAKgI,SACLrJ,GAAMA,GAClB,IACckD,EAAW0C,IACb3F,KAAK4H,UACL5H,KAAK8W,YAAc,SACnB9W,KAAKgB,aAAa,QAAS2E,GACvB5F,EACAA,EAAG4F,GAIH3F,KAAKoc,sBACR,EAGCM,EAAW9c,GAAGoD,EAAQ,QAASC,GACrC,IAAI,IAAUjD,KAAKmc,SAAU,CACzB,MAAMhV,EAAUnH,KAAKmc,SAEfzE,EAAQ1X,KAAKmC,cAAa,KAC5Bsa,IACAxZ,EAAQ,IAAIV,MAAM,YAClBS,EAAOK,OAAO,GACf8D,GACCnH,KAAKiC,KAAKoH,WACVqO,EAAMnO,QAEVvJ,KAAK2W,KAAKzW,MAAK,KACXF,KAAKqC,eAAeqV,EAAM,GAEjC,CAGD,OAFA1X,KAAK2W,KAAKzW,KAAKuc,GACfzc,KAAK2W,KAAKzW,KAAKwc,GACR1c,IACV,CAODuV,QAAQxV,GACJ,OAAOC,KAAKkD,KAAKnD,EACpB,CAMDqJ,SAEIpJ,KAAK4H,UAEL5H,KAAK8W,YAAc,OACnB9W,KAAKgB,aAAa,QAElB,MAAMgC,EAAShD,KAAKuX,OACpBvX,KAAK2W,KAAKzW,KAAKN,GAAGoD,EAAQ,OAAQhD,KAAK2c,OAAOva,KAAKpC,OAAQJ,GAAGoD,EAAQ,OAAQhD,KAAK4c,OAAOxa,KAAKpC,OAAQJ,GAAGoD,EAAQ,QAAShD,KAAK4J,QAAQxH,KAAKpC,OAAQJ,GAAGoD,EAAQ,QAAShD,KAAKwJ,QAAQpH,KAAKpC,OAAQJ,GAAGI,KAAK2b,QAAS,UAAW3b,KAAK6c,UAAUza,KAAKpC,OACtP,CAMD2c,SACI3c,KAAKgB,aAAa,OACrB,CAMD4b,OAAOviB,GACH,IACI2F,KAAK2b,QAAQrI,IAAIjZ,EACpB,CACD,MAAO0L,GACH/F,KAAKwJ,QAAQ,cAAezD,EAC/B,CACJ,CAMD8W,UAAU/e,GAENoK,GAAS,KACLlI,KAAKgB,aAAa,SAAUlD,EAAO,GACpCkC,KAAKmC,aACX,CAMDyH,QAAQjE,GACJ3F,KAAKgB,aAAa,QAAS2E,EAC9B,CAOD3C,OAAOkR,EAAKjS,GACR,IAAIe,EAAShD,KAAK+a,KAAK7G,GAQvB,OAPKlR,EAIIhD,KAAKwW,eAAiBxT,EAAO6T,QAClC7T,EAAOuS,WAJPvS,EAAS,IAAIyL,GAAOzO,KAAMkU,EAAKjS,GAC/BjC,KAAK+a,KAAK7G,GAAOlR,GAKdA,CACV,CAOD8Z,SAAS9Z,GACL,MAAM+X,EAAOlhB,OAAOG,KAAKgG,KAAK+a,MAC9B,IAAK,MAAM7G,KAAO6G,EAAM,CAEpB,GADe/a,KAAK+a,KAAK7G,GACd2C,OACP,MAEP,CACD7W,KAAK+c,QACR,CAOD1E,QAAQva,GACJ,MAAM6O,EAAiB3M,KAAKyb,QAAQrd,OAAON,GAC3C,IAAK,IAAI5B,EAAI,EAAGA,EAAIyQ,EAAehQ,OAAQT,IACvC8D,KAAKuX,OAAO7T,MAAMiJ,EAAezQ,GAAI4B,EAAO8T,QAEnD,CAMDhK,UACI5H,KAAK2W,KAAK1c,SAASof,GAAeA,MAClCrZ,KAAK2W,KAAKha,OAAS,EACnBqD,KAAK2b,QAAQ/G,SAChB,CAMDmI,SACI/c,KAAKwc,eAAgB,EACrBxc,KAAKqc,eAAgB,EACrBrc,KAAKwJ,QAAQ,gBACTxJ,KAAKuX,QACLvX,KAAKuX,OAAOlU,OACnB,CAMDoS,aACI,OAAOzV,KAAK+c,QACf,CAMDvT,QAAQ/G,EAAQC,GACZ1C,KAAK4H,UACL5H,KAAKsb,QAAQZ,QACb1a,KAAK8W,YAAc,SACnB9W,KAAKgB,aAAa,QAASyB,EAAQC,GAC/B1C,KAAK8b,gBAAkB9b,KAAKwc,eAC5Bxc,KAAKsc,WAEZ,CAMDA,YACI,GAAItc,KAAKqc,eAAiBrc,KAAKwc,cAC3B,OAAOxc,KACX,MAAMoB,EAAOpB,KACb,GAAIA,KAAKsb,QAAQjB,UAAYra,KAAK+b,sBAC9B/b,KAAKsb,QAAQZ,QACb1a,KAAKgB,aAAa,oBAClBhB,KAAKqc,eAAgB,MAEpB,CACD,MAAMW,EAAQhd,KAAKsb,QAAQhB,WAC3Bta,KAAKqc,eAAgB,EACrB,MAAM3E,EAAQ1X,KAAKmC,cAAa,KACxBf,EAAKob,gBAETxc,KAAKgB,aAAa,oBAAqBI,EAAKka,QAAQjB,UAEhDjZ,EAAKob,eAETpb,EAAK8B,MAAMyC,IACHA,GACAvE,EAAKib,eAAgB,EACrBjb,EAAKkb,YACLtc,KAAKgB,aAAa,kBAAmB2E,IAGrCvE,EAAK6b,aACR,IACH,GACHD,GACChd,KAAKiC,KAAKoH,WACVqO,EAAMnO,QAEVvJ,KAAK2W,KAAKzW,MAAK,KACXF,KAAKqC,eAAeqV,EAAM,GAEjC,CACJ,CAMDuF,cACI,MAAMC,EAAUld,KAAKsb,QAAQjB,SAC7Bra,KAAKqc,eAAgB,EACrBrc,KAAKsb,QAAQZ,QACb1a,KAAKgB,aAAa,YAAakc,EAClC,EC9VL,MAAMC,GAAQ,CAAA,EACd,SAASlhB,GAAOqK,EAAKrE,GACE,iBAARqE,IACPrE,EAAOqE,EACPA,OAAME,GAGV,MAAM4W,ECHH,SAAa9W,EAAKjC,EAAO,GAAIgZ,GAChC,IAAIviB,EAAMwL,EAEV+W,EAAMA,GAA4B,oBAAblR,UAA4BA,SAC7C,MAAQ7F,IACRA,EAAM+W,EAAIhR,SAAW,KAAOgR,EAAItP,MAEjB,iBAARzH,IACH,MAAQA,EAAI9J,OAAO,KAEf8J,EADA,MAAQA,EAAI9J,OAAO,GACb6gB,EAAIhR,SAAW/F,EAGf+W,EAAItP,KAAOzH,GAGpB,sBAAsBgX,KAAKhX,KAExBA,OADA,IAAuB+W,EACjBA,EAAIhR,SAAW,KAAO/F,EAGtB,WAAaA,GAI3BxL,EAAM0S,EAAMlH,IAGXxL,EAAI2J,OACD,cAAc6Y,KAAKxiB,EAAIuR,UACvBvR,EAAI2J,KAAO,KAEN,eAAe6Y,KAAKxiB,EAAIuR,YAC7BvR,EAAI2J,KAAO,QAGnB3J,EAAIuJ,KAAOvJ,EAAIuJ,MAAQ,IACvB,MACM0J,GADkC,IAA3BjT,EAAIiT,KAAKvJ,QAAQ,KACV,IAAM1J,EAAIiT,KAAO,IAAMjT,EAAIiT,KAS/C,OAPAjT,EAAI4U,GAAK5U,EAAIuR,SAAW,MAAQ0B,EAAO,IAAMjT,EAAI2J,KAAOJ,EAExDvJ,EAAIyiB,KACAziB,EAAIuR,SACA,MACA0B,GACCsP,GAAOA,EAAI5Y,OAAS3J,EAAI2J,KAAO,GAAK,IAAM3J,EAAI2J,MAChD3J,CACX,CD7CmB0iB,CAAIlX,GADnBrE,EAAOA,GAAQ,IACcoC,MAAQ,cAC/ByJ,EAASsP,EAAOtP,OAChB4B,EAAK0N,EAAO1N,GACZrL,EAAO+Y,EAAO/Y,KACdoZ,EAAgBN,GAAMzN,IAAOrL,KAAQ8Y,GAAMzN,GAAU,KAK3D,IAAIkG,EAaJ,OAjBsB3T,EAAKyb,UACvBzb,EAAK,0BACL,IAAUA,EAAK0b,WACfF,EAGA7H,EAAK,IAAIkF,GAAQhN,EAAQ7L,IAGpBkb,GAAMzN,KACPyN,GAAMzN,GAAM,IAAIoL,GAAQhN,EAAQ7L,IAEpC2T,EAAKuH,GAAMzN,IAEX0N,EAAOra,QAAUd,EAAKc,QACtBd,EAAKc,MAAQqa,EAAO/O,UAEjBuH,EAAG5S,OAAOoa,EAAO/Y,KAAMpC,EAClC,CAGApI,OAAOqT,OAAOjR,GAAQ,CAClB6e,WACArM,UACAmH,GAAI3Z,GACJsZ,QAAStZ"} \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.js b/packages/puter-dot-js/src/lib/socket.io/socket.io.js new file mode 100644 index 000000000..5a92745c2 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.js @@ -0,0 +1,4385 @@ +/*! + * Socket.IO v4.7.2 + * (c) 2014-2023 Guillermo Rauch + * Released under the MIT License. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.io = factory()); +})(this, (function () { 'use strict'; + + 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 _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + Object.defineProperty(subClass, "prototype", { + writable: false + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); + } + return _assertThisInitialized(self); + } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; + } + function _get() { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get.bind(); + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(arguments.length < 3 ? target : receiver); + } + return desc.value; + }; + } + return _get.apply(this, arguments); + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelper(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (!it) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + var F = function () {}; + return { + s: F, + n: function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }, + e: function (e) { + throw e; + }, + f: F + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var normalCompletion = true, + didErr = false, + err; + return { + s: function () { + it = it.call(o); + }, + n: function () { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function (e) { + didErr = true; + err = e; + }, + f: function () { + try { + if (!normalCompletion && it.return != null) it.return(); + } finally { + if (didErr) throw err; + } + } + }; + } + 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); + } + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); + } + + var 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"; + var PACKET_TYPES_REVERSE = Object.create(null); + Object.keys(PACKET_TYPES).forEach(function (key) { + PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key; + }); + var ERROR_PACKET = { + type: "error", + data: "parser error" + }; + + var withNativeBlob$1 = typeof Blob === "function" || typeof Blob !== "undefined" && Object.prototype.toString.call(Blob) === "[object BlobConstructor]"; + var withNativeArrayBuffer$2 = typeof ArrayBuffer === "function"; + // ArrayBuffer.isView method is not defined in IE10 + var isView$1 = function isView(obj) { + return typeof ArrayBuffer.isView === "function" ? ArrayBuffer.isView(obj) : obj && obj.buffer instanceof ArrayBuffer; + }; + var encodePacket = function encodePacket(_ref, supportsBinary, callback) { + var type = _ref.type, + data = _ref.data; + if (withNativeBlob$1 && data instanceof Blob) { + if (supportsBinary) { + return callback(data); + } else { + return encodeBlobAsBase64(data, callback); + } + } else if (withNativeArrayBuffer$2 && (data instanceof ArrayBuffer || isView$1(data))) { + if (supportsBinary) { + return callback(data); + } else { + return encodeBlobAsBase64(new Blob([data]), callback); + } + } + // plain string + return callback(PACKET_TYPES[type] + (data || "")); + }; + var encodeBlobAsBase64 = function encodeBlobAsBase64(data, callback) { + var fileReader = new FileReader(); + fileReader.onload = function () { + var content = fileReader.result.split(",")[1]; + callback("b" + (content || "")); + }; + return fileReader.readAsDataURL(data); + }; + function toArray(data) { + if (data instanceof Uint8Array) { + return data; + } else if (data instanceof ArrayBuffer) { + return new Uint8Array(data); + } else { + return new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + } + } + var TEXT_ENCODER; + function encodePacketToBinary(packet, callback) { + if (withNativeBlob$1 && packet.data instanceof Blob) { + return packet.data.arrayBuffer().then(toArray).then(callback); + } else if (withNativeArrayBuffer$2 && (packet.data instanceof ArrayBuffer || isView$1(packet.data))) { + return callback(toArray(packet.data)); + } + encodePacket(packet, false, function (encoded) { + if (!TEXT_ENCODER) { + TEXT_ENCODER = new TextEncoder(); + } + callback(TEXT_ENCODER.encode(encoded)); + }); + } + + // imported from https://github.com/socketio/base64-arraybuffer + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // Use a lookup table to find the index. + var lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + for (var i$1 = 0; i$1 < chars.length; i$1++) { + lookup$1[chars.charCodeAt(i$1)] = i$1; + } + var decode$1 = function decode(base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + if (base64[base64.length - 1] === '=') { + bufferLength--; + if (base64[base64.length - 2] === '=') { + bufferLength--; + } + } + var arraybuffer = new ArrayBuffer(bufferLength), + bytes = new Uint8Array(arraybuffer); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1[base64.charCodeAt(i)]; + encoded2 = lookup$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1[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; + }; + + var withNativeArrayBuffer$1 = typeof ArrayBuffer === "function"; + var decodePacket = function decodePacket(encodedPacket, binaryType) { + if (typeof encodedPacket !== "string") { + return { + type: "message", + data: mapBinary(encodedPacket, binaryType) + }; + } + var type = encodedPacket.charAt(0); + if (type === "b") { + return { + type: "message", + data: decodeBase64Packet(encodedPacket.substring(1), binaryType) + }; + } + var packetType = PACKET_TYPES_REVERSE[type]; + if (!packetType) { + return ERROR_PACKET; + } + return encodedPacket.length > 1 ? { + type: PACKET_TYPES_REVERSE[type], + data: encodedPacket.substring(1) + } : { + type: PACKET_TYPES_REVERSE[type] + }; + }; + var decodeBase64Packet = function decodeBase64Packet(data, binaryType) { + if (withNativeArrayBuffer$1) { + var decoded = decode$1(data); + return mapBinary(decoded, binaryType); + } else { + return { + base64: true, + data: data + }; // fallback for old browsers + } + }; + + var mapBinary = function mapBinary(data, binaryType) { + switch (binaryType) { + case "blob": + if (data instanceof Blob) { + // from WebSocket + binaryType "blob" + return data; + } else { + // from HTTP long-polling or WebTransport + return new Blob([data]); + } + case "arraybuffer": + default: + if (data instanceof ArrayBuffer) { + // from HTTP long-polling (base64) or WebSocket + binaryType "arraybuffer" + return data; + } else { + // from WebTransport (Uint8Array) + return data.buffer; + } + } + }; + + var SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text + var encodePayload = function encodePayload(packets, callback) { + // some packets may be added to the array while encoding, so the initial length must be saved + var length = packets.length; + var encodedPackets = new Array(length); + var count = 0; + packets.forEach(function (packet, i) { + // force base64 encoding for binary packets + encodePacket(packet, false, function (encodedPacket) { + encodedPackets[i] = encodedPacket; + if (++count === length) { + callback(encodedPackets.join(SEPARATOR)); + } + }); + }); + }; + var decodePayload = function decodePayload(encodedPayload, binaryType) { + var encodedPackets = encodedPayload.split(SEPARATOR); + var packets = []; + for (var i = 0; i < encodedPackets.length; i++) { + var decodedPacket = decodePacket(encodedPackets[i], binaryType); + packets.push(decodedPacket); + if (decodedPacket.type === "error") { + break; + } + } + return packets; + }; + function createPacketEncoderStream() { + return new TransformStream({ + transform: function transform(packet, controller) { + encodePacketToBinary(packet, function (encodedPacket) { + var payloadLength = encodedPacket.length; + var header; + // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length + if (payloadLength < 126) { + header = new Uint8Array(1); + new DataView(header.buffer).setUint8(0, payloadLength); + } else if (payloadLength < 65536) { + header = new Uint8Array(3); + var view = new DataView(header.buffer); + view.setUint8(0, 126); + view.setUint16(1, payloadLength); + } else { + header = new Uint8Array(9); + var _view = new DataView(header.buffer); + _view.setUint8(0, 127); + _view.setBigUint64(1, BigInt(payloadLength)); + } + // first bit indicates whether the payload is plain text (0) or binary (1) + if (packet.data && typeof packet.data !== "string") { + header[0] |= 0x80; + } + controller.enqueue(header); + controller.enqueue(encodedPacket); + }); + } + }); + } + var TEXT_DECODER; + function totalLength(chunks) { + return chunks.reduce(function (acc, chunk) { + return acc + chunk.length; + }, 0); + } + function concatChunks(chunks, size) { + if (chunks[0].length === size) { + return chunks.shift(); + } + var buffer = new Uint8Array(size); + var j = 0; + for (var i = 0; i < size; i++) { + buffer[i] = chunks[0][j++]; + if (j === chunks[0].length) { + chunks.shift(); + j = 0; + } + } + if (chunks.length && j < chunks[0].length) { + chunks[0] = chunks[0].slice(j); + } + return buffer; + } + function createPacketDecoderStream(maxPayload, binaryType) { + if (!TEXT_DECODER) { + TEXT_DECODER = new TextDecoder(); + } + var chunks = []; + var state = 0 /* READ_HEADER */; + var expectedLength = -1; + var isBinary = false; + return new TransformStream({ + transform: function transform(chunk, controller) { + chunks.push(chunk); + while (true) { + if (state === 0 /* READ_HEADER */) { + if (totalLength(chunks) < 1) { + break; + } + var header = concatChunks(chunks, 1); + isBinary = (header[0] & 0x80) === 0x80; + expectedLength = header[0] & 0x7f; + if (expectedLength < 126) { + state = 3 /* READ_PAYLOAD */; + } else if (expectedLength === 126) { + state = 1 /* READ_EXTENDED_LENGTH_16 */; + } else { + state = 2 /* READ_EXTENDED_LENGTH_64 */; + } + } else if (state === 1 /* READ_EXTENDED_LENGTH_16 */) { + if (totalLength(chunks) < 2) { + break; + } + var headerArray = concatChunks(chunks, 2); + expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0); + state = 3 /* READ_PAYLOAD */; + } else if (state === 2 /* READ_EXTENDED_LENGTH_64 */) { + if (totalLength(chunks) < 8) { + break; + } + var _headerArray = concatChunks(chunks, 8); + var view = new DataView(_headerArray.buffer, _headerArray.byteOffset, _headerArray.length); + var n = view.getUint32(0); + if (n > Math.pow(2, 53 - 32) - 1) { + // the maximum safe integer in JavaScript is 2^53 - 1 + controller.enqueue(ERROR_PACKET); + break; + } + expectedLength = n * Math.pow(2, 32) + view.getUint32(4); + state = 3 /* READ_PAYLOAD */; + } else { + if (totalLength(chunks) < expectedLength) { + break; + } + var data = concatChunks(chunks, expectedLength); + controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType)); + state = 0 /* READ_HEADER */; + } + + if (expectedLength === 0 || expectedLength > maxPayload) { + controller.enqueue(ERROR_PACKET); + break; + } + } + } + }); + } + var protocol$1 = 4; + + /** + * 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; + }; + + var globalThisShim = function () { + if (typeof self !== "undefined") { + return self; + } else if (typeof window !== "undefined") { + return window; + } else { + return Function("return this")(); + } + }(); + + function pick(obj) { + for (var _len = arguments.length, attr = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + attr[_key - 1] = arguments[_key]; + } + return attr.reduce(function (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 + var NATIVE_SET_TIMEOUT = globalThisShim.setTimeout; + var NATIVE_CLEAR_TIMEOUT = globalThisShim.clearTimeout; + function installTimerFunctions(obj, opts) { + if (opts.useNativeTimers) { + obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThisShim); + obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThisShim); + } else { + obj.setTimeoutFn = globalThisShim.setTimeout.bind(globalThisShim); + obj.clearTimeoutFn = globalThisShim.clearTimeout.bind(globalThisShim); + } + } + // base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64) + var 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) { + var c = 0, + length = 0; + for (var 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; + } + + // imported from https://github.com/galkn/querystring + /** + * Compiles a querystring + * Returns string representation of the object + * + * @param {Object} + * @api private + */ + function encode$1(obj) { + var str = ''; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + if (str.length) str += '&'; + str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]); + } + } + return str; + } + /** + * Parses a simple querystring into an object + * + * @param {String} qs + * @api private + */ + function decode(qs) { + var qry = {}; + var pairs = qs.split('&'); + for (var i = 0, l = pairs.length; i < l; i++) { + var pair = pairs[i].split('='); + qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); + } + return qry; + } + + var TransportError = /*#__PURE__*/function (_Error) { + _inherits(TransportError, _Error); + var _super = _createSuper(TransportError); + function TransportError(reason, description, context) { + var _this; + _classCallCheck(this, TransportError); + _this = _super.call(this, reason); + _this.description = description; + _this.context = context; + _this.type = "TransportError"; + return _this; + } + return _createClass(TransportError); + }( /*#__PURE__*/_wrapNativeSuper(Error)); + var Transport = /*#__PURE__*/function (_Emitter) { + _inherits(Transport, _Emitter); + var _super2 = _createSuper(Transport); + /** + * Transport abstract constructor. + * + * @param {Object} opts - options + * @protected + */ + function Transport(opts) { + var _this2; + _classCallCheck(this, Transport); + _this2 = _super2.call(this); + _this2.writable = false; + installTimerFunctions(_assertThisInitialized(_this2), opts); + _this2.opts = opts; + _this2.query = opts.query; + _this2.socket = opts.socket; + return _this2; + } + /** + * Emits an error. + * + * @param {String} reason + * @param description + * @param context - the error context + * @return {Transport} for chaining + * @protected + */ + _createClass(Transport, [{ + key: "onError", + value: function onError(reason, description, context) { + _get(_getPrototypeOf(Transport.prototype), "emitReserved", this).call(this, "error", new TransportError(reason, description, context)); + return this; + } + /** + * Opens the transport. + */ + }, { + key: "open", + value: function open() { + this.readyState = "opening"; + this.doOpen(); + return this; + } + /** + * Closes the transport. + */ + }, { + key: "close", + value: function close() { + if (this.readyState === "opening" || this.readyState === "open") { + this.doClose(); + this.onClose(); + } + return this; + } + /** + * Sends multiple packets. + * + * @param {Array} packets + */ + }, { + key: "send", + value: function send(packets) { + if (this.readyState === "open") { + this.write(packets); + } + } + /** + * Called upon open + * + * @protected + */ + }, { + key: "onOpen", + value: function onOpen() { + this.readyState = "open"; + this.writable = true; + _get(_getPrototypeOf(Transport.prototype), "emitReserved", this).call(this, "open"); + } + /** + * Called with data. + * + * @param {String} data + * @protected + */ + }, { + key: "onData", + value: function onData(data) { + var packet = decodePacket(data, this.socket.binaryType); + this.onPacket(packet); + } + /** + * Called with a decoded packet. + * + * @protected + */ + }, { + key: "onPacket", + value: function onPacket(packet) { + _get(_getPrototypeOf(Transport.prototype), "emitReserved", this).call(this, "packet", packet); + } + /** + * Called upon close. + * + * @protected + */ + }, { + key: "onClose", + value: function onClose(details) { + this.readyState = "closed"; + _get(_getPrototypeOf(Transport.prototype), "emitReserved", this).call(this, "close", details); + } + /** + * Pauses the transport, in order not to lose packets during an upgrade. + * + * @param onPause + */ + }, { + key: "pause", + value: function pause(onPause) {} + }, { + key: "createUri", + value: function createUri(schema) { + var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + return schema + "://" + this._hostname() + this._port() + this.opts.path + this._query(query); + } + }, { + key: "_hostname", + value: function _hostname() { + var hostname = this.opts.hostname; + return hostname.indexOf(":") === -1 ? hostname : "[" + hostname + "]"; + } + }, { + key: "_port", + value: function _port() { + if (this.opts.port && (this.opts.secure && Number(this.opts.port !== 443) || !this.opts.secure && Number(this.opts.port) !== 80)) { + return ":" + this.opts.port; + } else { + return ""; + } + } + }, { + key: "_query", + value: function _query(query) { + var encodedQuery = encode$1(query); + return encodedQuery.length ? "?" + encodedQuery : ""; + } + }]); + return Transport; + }(Emitter); + + // imported from https://github.com/unshiftio/yeast + + var alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split(''), + length = 64, + map = {}; + var seed = 0, + i = 0, + prev; + /** + * Return a string representing the specified number. + * + * @param {Number} num The number to convert. + * @returns {String} The string representation of the number. + * @api public + */ + function encode(num) { + var encoded = ''; + do { + encoded = alphabet[num % length] + encoded; + num = Math.floor(num / length); + } while (num > 0); + return encoded; + } + /** + * Yeast: A tiny growing id generator. + * + * @returns {String} A unique id. + * @api public + */ + function yeast() { + var now = encode(+new Date()); + if (now !== prev) return seed = 0, prev = now; + return now + '.' + encode(seed++); + } + // + // Map each character to its index. + // + for (; i < length; i++) map[alphabet[i]] = i; + + // imported from https://github.com/component/has-cors + var 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 + } + var hasCORS = value; + + // browser shim for xmlhttprequest module + function XHR(opts) { + var xdomain = opts.xdomain; + // XMLHttpRequest can be disabled on IE + try { + if ("undefined" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) { + return new XMLHttpRequest(); + } + } catch (e) {} + if (!xdomain) { + try { + return new globalThisShim[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP"); + } catch (e) {} + } + } + function createCookieJar() {} + + function empty() {} + var hasXHR2 = function () { + var xhr = new XHR({ + xdomain: false + }); + return null != xhr.responseType; + }(); + var Polling = /*#__PURE__*/function (_Transport) { + _inherits(Polling, _Transport); + var _super = _createSuper(Polling); + /** + * XHR Polling constructor. + * + * @param {Object} opts + * @package + */ + function Polling(opts) { + var _this; + _classCallCheck(this, Polling); + _this = _super.call(this, opts); + _this.polling = false; + if (typeof location !== "undefined") { + var isSSL = "https:" === location.protocol; + var 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; + } + /** + * XHR supports binary + */ + var forceBase64 = opts && opts.forceBase64; + _this.supportsBinary = hasXHR2 && !forceBase64; + if (_this.opts.withCredentials) { + _this.cookieJar = createCookieJar(); + } + return _this; + } + _createClass(Polling, [{ + key: "name", + get: function get() { + return "polling"; + } + /** + * Opens the socket (triggers polling). We write a PING message to determine + * when the transport is open. + * + * @protected + */ + }, { + key: "doOpen", + value: function doOpen() { + this.poll(); + } + /** + * Pauses polling. + * + * @param {Function} onPause - callback upon buffers are flushed and transport is paused + * @package + */ + }, { + key: "pause", + value: function pause(onPause) { + var _this2 = this; + this.readyState = "pausing"; + var pause = function pause() { + _this2.readyState = "paused"; + onPause(); + }; + if (this.polling || !this.writable) { + var 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 + */ + }, { + key: "poll", + value: function poll() { + this.polling = true; + this.doPoll(); + this.emitReserved("poll"); + } + /** + * Overloads onData to detect payloads. + * + * @protected + */ + }, { + key: "onData", + value: function onData(data) { + var _this3 = this; + var callback = function callback(packet) { + // if its the first message we consider the transport open + if ("opening" === _this3.readyState && packet.type === "open") { + _this3.onOpen(); + } + // if its a close packet, we close the ongoing requests + if ("close" === packet.type) { + _this3.onClose({ + description: "transport closed by the server" + }); + return false; + } + // otherwise bypass onData and handle the message + _this3.onPacket(packet); + }; + // decode payload + 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(); + } + } + } + /** + * For polling, send a close packet. + * + * @protected + */ + }, { + key: "doClose", + value: function doClose() { + var _this4 = this; + var close = function close() { + _this4.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 + */ + }, { + key: "write", + value: function write(packets) { + var _this5 = this; + this.writable = false; + encodePayload(packets, function (data) { + _this5.doWrite(data, function () { + _this5.writable = true; + _this5.emitReserved("drain"); + }); + }); + } + /** + * Generates uri for connection. + * + * @private + */ + }, { + key: "uri", + value: function uri() { + var schema = this.opts.secure ? "https" : "http"; + var query = this.query || {}; + // cache busting is forced + if (false !== this.opts.timestampRequests) { + query[this.opts.timestampParam] = yeast(); + } + if (!this.supportsBinary && !query.sid) { + query.b64 = 1; + } + return this.createUri(schema, query); + } + /** + * Creates a request. + * + * @param {String} method + * @private + */ + }, { + key: "request", + value: function request() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _extends(opts, { + xd: this.xd, + cookieJar: this.cookieJar + }, this.opts); + return new Request(this.uri(), opts); + } + /** + * Sends data. + * + * @param {String} data to send. + * @param {Function} called upon flush. + * @private + */ + }, { + key: "doWrite", + value: function doWrite(data, fn) { + var _this6 = this; + var req = this.request({ + method: "POST", + data: data + }); + req.on("success", fn); + req.on("error", function (xhrStatus, context) { + _this6.onError("xhr post error", xhrStatus, context); + }); + } + /** + * Starts a poll cycle. + * + * @private + */ + }, { + key: "doPoll", + value: function doPoll() { + var _this7 = this; + var req = this.request(); + req.on("data", this.onData.bind(this)); + req.on("error", function (xhrStatus, context) { + _this7.onError("xhr poll error", xhrStatus, context); + }); + this.pollXhr = req; + } + }]); + return Polling; + }(Transport); + var Request = /*#__PURE__*/function (_Emitter) { + _inherits(Request, _Emitter); + var _super2 = _createSuper(Request); + /** + * Request constructor + * + * @param {Object} options + * @package + */ + function Request(uri, opts) { + var _this8; + _classCallCheck(this, Request); + _this8 = _super2.call(this); + installTimerFunctions(_assertThisInitialized(_this8), opts); + _this8.opts = opts; + _this8.method = opts.method || "GET"; + _this8.uri = uri; + _this8.data = undefined !== opts.data ? opts.data : null; + _this8.create(); + return _this8; + } + /** + * Creates the XHR object and sends the request. + * + * @private + */ + _createClass(Request, [{ + key: "create", + value: function create() { + var _this9 = this; + var _a; + var opts = pick(this.opts, "agent", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "autoUnref"); + opts.xdomain = !!this.opts.xd; + var xhr = this.xhr = new XHR(opts); + try { + xhr.open(this.method, this.uri, true); + try { + if (this.opts.extraHeaders) { + xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true); + for (var 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) {} + (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr); + // ie6 check + if ("withCredentials" in xhr) { + xhr.withCredentials = this.opts.withCredentials; + } + if (this.opts.requestTimeout) { + xhr.timeout = this.opts.requestTimeout; + } + xhr.onreadystatechange = function () { + var _a; + if (xhr.readyState === 3) { + (_a = _this9.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr); + } + if (4 !== xhr.readyState) return; + if (200 === xhr.status || 1223 === xhr.status) { + _this9.onLoad(); + } else { + // make sure the `error` event handler that's user-set + // does not throw in the same tick and gets caught here + _this9.setTimeoutFn(function () { + _this9.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(function () { + _this9.onError(e); + }, 0); + return; + } + if (typeof document !== "undefined") { + this.index = Request.requestsCount++; + Request.requests[this.index] = this; + } + } + /** + * Called upon error. + * + * @private + */ + }, { + key: "onError", + value: function onError(err) { + this.emitReserved("error", err, this.xhr); + this.cleanup(true); + } + /** + * Cleans up house. + * + * @private + */ + }, { + key: "cleanup", + value: function 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 + */ + }, { + key: "onLoad", + value: function onLoad() { + var data = this.xhr.responseText; + if (data !== null) { + this.emitReserved("data", data); + this.emitReserved("success"); + this.cleanup(); + } + } + /** + * Aborts the request. + * + * @package + */ + }, { + key: "abort", + value: function abort() { + this.cleanup(); + } + }]); + return Request; + }(Emitter); + 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") { + var terminationEvent = "onpagehide" in globalThisShim ? "pagehide" : "unload"; + addEventListener(terminationEvent, unloadHandler, false); + } + } + function unloadHandler() { + for (var i in Request.requests) { + if (Request.requests.hasOwnProperty(i)) { + Request.requests[i].abort(); + } + } + } + + var nextTick = function () { + var isPromiseAvailable = typeof Promise === "function" && typeof Promise.resolve === "function"; + if (isPromiseAvailable) { + return function (cb) { + return Promise.resolve().then(cb); + }; + } else { + return function (cb, setTimeoutFn) { + return setTimeoutFn(cb, 0); + }; + } + }(); + var WebSocket = globalThisShim.WebSocket || globalThisShim.MozWebSocket; + var usingBrowserWebSocket = true; + var defaultBinaryType = "arraybuffer"; + + // detect ReactNative environment + var isReactNative = typeof navigator !== "undefined" && typeof navigator.product === "string" && navigator.product.toLowerCase() === "reactnative"; + var WS = /*#__PURE__*/function (_Transport) { + _inherits(WS, _Transport); + var _super = _createSuper(WS); + /** + * WebSocket transport constructor. + * + * @param {Object} opts - connection options + * @protected + */ + function WS(opts) { + var _this; + _classCallCheck(this, WS); + _this = _super.call(this, opts); + _this.supportsBinary = !opts.forceBase64; + return _this; + } + _createClass(WS, [{ + key: "name", + get: function get() { + return "websocket"; + } + }, { + key: "doOpen", + value: function doOpen() { + if (!this.check()) { + // let probe timeout + return; + } + var uri = this.uri(); + var protocols = this.opts.protocols; + // React Native only supports the 'headers' option, and will print a warning if anything else is passed + var opts = isReactNative ? {} : 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 = usingBrowserWebSocket && !isReactNative ? protocols ? new WebSocket(uri, protocols) : new WebSocket(uri) : new WebSocket(uri, protocols, opts); + } catch (err) { + return this.emitReserved("error", err); + } + this.ws.binaryType = this.socket.binaryType; + this.addEventListeners(); + } + /** + * Adds event listeners to the socket + * + * @private + */ + }, { + key: "addEventListeners", + value: function addEventListeners() { + var _this2 = this; + this.ws.onopen = function () { + if (_this2.opts.autoUnref) { + _this2.ws._socket.unref(); + } + _this2.onOpen(); + }; + this.ws.onclose = function (closeEvent) { + return _this2.onClose({ + description: "websocket connection closed", + context: closeEvent + }); + }; + this.ws.onmessage = function (ev) { + return _this2.onData(ev.data); + }; + this.ws.onerror = function (e) { + return _this2.onError("websocket error", e); + }; + } + }, { + key: "write", + value: function write(packets) { + var _this3 = this; + this.writable = false; + // encodePacket efficient as it uses WS framing + // no need for encodePayload + var _loop = function _loop() { + var packet = packets[i]; + var lastPacket = i === packets.length - 1; + encodePacket(packet, _this3.supportsBinary, function (data) { + // always create a new object (GH-437) + var opts = {}; + // 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 (usingBrowserWebSocket) { + // TypeError is thrown when passing the second argument on Safari + _this3.ws.send(data); + } + } catch (e) {} + if (lastPacket) { + // fake drain + // defer to next tick to allow Socket to clear writeBuffer + nextTick(function () { + _this3.writable = true; + _this3.emitReserved("drain"); + }, _this3.setTimeoutFn); + } + }); + }; + for (var i = 0; i < packets.length; i++) { + _loop(); + } + } + }, { + key: "doClose", + value: function doClose() { + if (typeof this.ws !== "undefined") { + this.ws.close(); + this.ws = null; + } + } + /** + * Generates uri for connection. + * + * @private + */ + }, { + key: "uri", + value: function uri() { + var schema = this.opts.secure ? "wss" : "ws"; + var query = this.query || {}; + // append timestamp to URI + if (this.opts.timestampRequests) { + query[this.opts.timestampParam] = yeast(); + } + // communicate binary support capabilities + if (!this.supportsBinary) { + query.b64 = 1; + } + return this.createUri(schema, query); + } + /** + * Feature detection for WebSocket. + * + * @return {Boolean} whether this transport is available. + * @private + */ + }, { + key: "check", + value: function check() { + return !!WebSocket; + } + }]); + return WS; + }(Transport); + + var WT = /*#__PURE__*/function (_Transport) { + _inherits(WT, _Transport); + var _super = _createSuper(WT); + function WT() { + _classCallCheck(this, WT); + return _super.apply(this, arguments); + } + _createClass(WT, [{ + key: "name", + get: function get() { + return "webtransport"; + } + }, { + key: "doOpen", + value: function doOpen() { + var _this = this; + // @ts-ignore + if (typeof WebTransport !== "function") { + return; + } + // @ts-ignore + this.transport = new WebTransport(this.createUri("https"), this.opts.transportOptions[this.name]); + this.transport.closed.then(function () { + _this.onClose(); + })["catch"](function (err) { + _this.onError("webtransport error", err); + }); + // note: we could have used async/await, but that would require some additional polyfills + this.transport.ready.then(function () { + _this.transport.createBidirectionalStream().then(function (stream) { + var decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, _this.socket.binaryType); + var reader = stream.readable.pipeThrough(decoderStream).getReader(); + var encoderStream = createPacketEncoderStream(); + encoderStream.readable.pipeTo(stream.writable); + _this.writer = encoderStream.writable.getWriter(); + var read = function read() { + reader.read().then(function (_ref) { + var done = _ref.done, + value = _ref.value; + if (done) { + return; + } + _this.onPacket(value); + read(); + })["catch"](function (err) {}); + }; + read(); + var packet = { + type: "open" + }; + if (_this.query.sid) { + packet.data = "{\"sid\":\"".concat(_this.query.sid, "\"}"); + } + _this.writer.write(packet).then(function () { + return _this.onOpen(); + }); + }); + }); + } + }, { + key: "write", + value: function write(packets) { + var _this2 = this; + this.writable = false; + var _loop = function _loop() { + var packet = packets[i]; + var lastPacket = i === packets.length - 1; + _this2.writer.write(packet).then(function () { + if (lastPacket) { + nextTick(function () { + _this2.writable = true; + _this2.emitReserved("drain"); + }, _this2.setTimeoutFn); + } + }); + }; + for (var i = 0; i < packets.length; i++) { + _loop(); + } + } + }, { + key: "doClose", + value: function doClose() { + var _a; + (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close(); + } + }]); + return WT; + }(Transport); + + var transports = { + websocket: WS, + webtransport: WT, + polling: Polling + }; + + // 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 (MIT license) + * @api private + */ + var re = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor']; + function parse(str) { + var src = str, + b = str.indexOf('['), + e = str.indexOf(']'); + if (b != -1 && e != -1) { + str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length); + } + var m = re.exec(str || ''), + uri = {}, + i = 14; + while (i--) { + uri[parts[i]] = m[i] || ''; + } + if (b != -1 && e != -1) { + uri.source = src; + uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':'); + uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':'); + uri.ipv6uri = true; + } + uri.pathNames = pathNames(uri, uri['path']); + uri.queryKey = queryKey(uri, uri['query']); + return uri; + } + function pathNames(obj, path) { + var 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) { + var data = {}; + query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) { + if ($1) { + data[$1] = $2; + } + }); + return data; + } + + var Socket$1 = /*#__PURE__*/function (_Emitter) { + _inherits(Socket, _Emitter); + var _super = _createSuper(Socket); + /** + * Socket constructor. + * + * @param {String|Object} uri - uri or options + * @param {Object} opts - options + */ + function Socket(uri) { + var _this; + var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + _classCallCheck(this, Socket); + _this = _super.call(this); + _this.binaryType = defaultBinaryType; + _this.writeBuffer = []; + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = null; + } + if (uri) { + uri = 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 = parse(opts.host).host; + } + installTimerFunctions(_assertThisInitialized(_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", "webtransport"]; + _this.writeBuffer = []; + _this.prevBufferLen = 0; + _this.opts = _extends({ + path: "/engine.io", + agent: false, + withCredentials: false, + upgrade: true, + timestampParam: "t", + rememberUpgrade: false, + addTrailingSlash: true, + rejectUnauthorized: true, + perMessageDeflate: { + threshold: 1024 + }, + transportOptions: {}, + closeOnBeforeunload: false + }, opts); + _this.opts.path = _this.opts.path.replace(/\/$/, "") + (_this.opts.addTrailingSlash ? "/" : ""); + if (typeof _this.opts.query === "string") { + _this.opts.query = 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 = function () { + if (_this.transport) { + // silently close the transport + _this.transport.removeAllListeners(); + _this.transport.close(); + } + }; + addEventListener("beforeunload", _this.beforeunloadEventListener, false); + } + if (_this.hostname !== "localhost") { + _this.offlineEventListener = function () { + _this.onClose("transport close", { + description: "network connection lost" + }); + }; + addEventListener("offline", _this.offlineEventListener, false); + } + } + _this.open(); + return _this; + } + /** + * Creates transport of the given type. + * + * @param {String} name - transport name + * @return {Transport} + * @private + */ + _createClass(Socket, [{ + key: "createTransport", + value: function createTransport(name) { + var query = _extends({}, this.opts.query); + // append engine.io protocol identifier + query.EIO = protocol$1; + // transport name + query.transport = name; + // session id if we already have one + if (this.id) query.sid = this.id; + var opts = _extends({}, this.opts, { + query: query, + socket: this, + hostname: this.hostname, + secure: this.secure, + port: this.port + }, this.opts.transportOptions[name]); + return new transports[name](opts); + } + /** + * Initializes transport to use and starts probe. + * + * @private + */ + }, { + key: "open", + value: function open() { + var _this2 = this; + var 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(function () { + _this2.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 + */ + }, { + key: "setTransport", + value: function setTransport(transport) { + var _this3 = this; + 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", function (reason) { + return _this3.onClose("transport close", reason); + }); + } + /** + * Probes a transport. + * + * @param {String} name - transport name + * @private + */ + }, { + key: "probe", + value: function probe(name) { + var _this4 = this; + var transport = this.createTransport(name); + var failed = false; + Socket.priorWebsocketSuccess = false; + var onTransportOpen = function onTransportOpen() { + if (failed) return; + transport.send([{ + type: "ping", + data: "probe" + }]); + transport.once("packet", function (msg) { + if (failed) return; + if ("pong" === msg.type && "probe" === msg.data) { + _this4.upgrading = true; + _this4.emitReserved("upgrading", transport); + if (!transport) return; + Socket.priorWebsocketSuccess = "websocket" === transport.name; + _this4.transport.pause(function () { + if (failed) return; + if ("closed" === _this4.readyState) return; + cleanup(); + _this4.setTransport(transport); + transport.send([{ + type: "upgrade" + }]); + _this4.emitReserved("upgrade", transport); + transport = null; + _this4.upgrading = false; + _this4.flush(); + }); + } else { + var err = new Error("probe error"); + // @ts-ignore + err.transport = transport.name; + _this4.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 + var onerror = function onerror(err) { + var error = new Error("probe error: " + err); + // @ts-ignore + error.transport = transport.name; + freezeTransport(); + _this4.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 + var cleanup = function cleanup() { + transport.removeListener("open", onTransportOpen); + transport.removeListener("error", onerror); + transport.removeListener("close", onTransportClose); + _this4.off("close", onclose); + _this4.off("upgrading", onupgrade); + }; + transport.once("open", onTransportOpen); + transport.once("error", onerror); + transport.once("close", onTransportClose); + this.once("close", onclose); + this.once("upgrading", onupgrade); + if (this.upgrades.indexOf("webtransport") !== -1 && name !== "webtransport") { + // favor WebTransport + this.setTimeoutFn(function () { + if (!failed) { + transport.open(); + } + }, 200); + } else { + transport.open(); + } + } + /** + * Called when connection is deemed open. + * + * @private + */ + }, { + key: "onOpen", + value: function 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) { + var i = 0; + var l = this.upgrades.length; + for (; i < l; i++) { + this.probe(this.upgrades[i]); + } + } + } + /** + * Handles a packet. + * + * @private + */ + }, { + key: "onPacket", + value: function 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"); + this.resetPingTimeout(); + switch (packet.type) { + case "open": + this.onHandshake(JSON.parse(packet.data)); + break; + case "ping": + this.sendPacket("pong"); + this.emitReserved("ping"); + this.emitReserved("pong"); + break; + case "error": + var 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; + } + } + } + /** + * Called upon handshake completion. + * + * @param {Object} data - handshake obj + * @private + */ + }, { + key: "onHandshake", + value: function 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 + */ + }, { + key: "resetPingTimeout", + value: function resetPingTimeout() { + var _this5 = this; + this.clearTimeoutFn(this.pingTimeoutTimer); + this.pingTimeoutTimer = this.setTimeoutFn(function () { + _this5.onClose("ping timeout"); + }, this.pingInterval + this.pingTimeout); + if (this.opts.autoUnref) { + this.pingTimeoutTimer.unref(); + } + } + /** + * Called on `drain` event + * + * @private + */ + }, { + key: "onDrain", + value: function 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 + */ + }, { + key: "flush", + value: function flush() { + if ("closed" !== this.readyState && this.transport.writable && !this.upgrading && this.writeBuffer.length) { + var 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 + */ + }, { + key: "getWritablePackets", + value: function getWritablePackets() { + var shouldCheckPayloadSize = this.maxPayload && this.transport.name === "polling" && this.writeBuffer.length > 1; + if (!shouldCheckPayloadSize) { + return this.writeBuffer; + } + var payloadSize = 1; // first packet type + for (var i = 0; i < this.writeBuffer.length; i++) { + var data = this.writeBuffer[i].data; + if (data) { + payloadSize += 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. + */ + }, { + key: "write", + value: function write(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + } + }, { + key: "send", + value: function 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 + */ + }, { + key: "sendPacket", + value: function 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; + var 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. + */ + }, { + key: "close", + value: function close() { + var _this6 = this; + var close = function close() { + _this6.onClose("forced close"); + _this6.transport.close(); + }; + var cleanupAndClose = function cleanupAndClose() { + _this6.off("upgrade", cleanupAndClose); + _this6.off("upgradeError", cleanupAndClose); + close(); + }; + var waitForUpgrade = function waitForUpgrade() { + // wait for upgrade to finish since we can't send packets while pausing a transport + _this6.once("upgrade", cleanupAndClose); + _this6.once("upgradeError", cleanupAndClose); + }; + if ("opening" === this.readyState || "open" === this.readyState) { + this.readyState = "closing"; + if (this.writeBuffer.length) { + this.once("drain", function () { + if (_this6.upgrading) { + waitForUpgrade(); + } else { + close(); + } + }); + } else if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + } + return this; + } + /** + * Called upon transport error + * + * @private + */ + }, { + key: "onError", + value: function onError(err) { + Socket.priorWebsocketSuccess = false; + this.emitReserved("error", err); + this.onClose("transport error", err); + } + /** + * Called upon transport close. + * + * @private + */ + }, { + key: "onClose", + value: function 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 + */ + }, { + key: "filterUpgrades", + value: function filterUpgrades(upgrades) { + var filteredUpgrades = []; + var i = 0; + var j = upgrades.length; + for (; i < j; i++) { + if (~this.transports.indexOf(upgrades[i])) filteredUpgrades.push(upgrades[i]); + } + return filteredUpgrades; + } + }]); + return Socket; + }(Emitter); + Socket$1.protocol = protocol$1; + + Socket$1.protocol; + + /** + * 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) { + var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; + var loc = arguments.length > 2 ? arguments[2] : undefined; + var 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 = 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 || "/"; + var ipv6 = obj.host.indexOf(":") !== -1; + var 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; + } + + var withNativeArrayBuffer = typeof ArrayBuffer === "function"; + var isView = function isView(obj) { + return typeof ArrayBuffer.isView === "function" ? ArrayBuffer.isView(obj) : obj.buffer instanceof ArrayBuffer; + }; + var toString = Object.prototype.toString; + var withNativeBlob = typeof Blob === "function" || typeof Blob !== "undefined" && toString.call(Blob) === "[object BlobConstructor]"; + var 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 (var 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 (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) { + return true; + } + } + return false; + } + + /** + * 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) { + var buffers = []; + var packetData = packet.data; + var pack = packet; + pack.data = _deconstructPacket(packetData, buffers); + pack.attachments = buffers.length; // number of binary 'attachments' + return { + packet: pack, + buffers: buffers + }; + } + function _deconstructPacket(data, buffers) { + if (!data) return data; + if (isBinary(data)) { + var placeholder = { + _placeholder: true, + num: buffers.length + }; + buffers.push(data); + return placeholder; + } else if (Array.isArray(data)) { + var newData = new Array(data.length); + for (var i = 0; i < data.length; i++) { + newData[i] = _deconstructPacket(data[i], buffers); + } + return newData; + } else if (_typeof(data) === "object" && !(data instanceof Date)) { + var _newData = {}; + for (var key in data) { + 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) { + var 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 (var i = 0; i < data.length; i++) { + data[i] = _reconstructPacket(data[i], buffers); + } + } else if (_typeof(data) === "object") { + for (var key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + data[key] = _reconstructPacket(data[key], buffers); + } + } + } + return data; + } + + /** + * These strings must not be used as event names, as they have a special meaning. + */ + var RESERVED_EVENTS$1 = ["connect", "connect_error", "disconnect", "disconnecting", "newListener", "removeListener" // used by the Node.js EventEmitter + ]; + /** + * Protocol version. + * + * @public + */ + var 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 + */ + var Encoder = /*#__PURE__*/function () { + /** + * Encoder constructor + * + * @param {function} replacer - custom replacer to pass down to JSON.parse + */ + function Encoder(replacer) { + _classCallCheck(this, Encoder); + 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 + */ + _createClass(Encoder, [{ + key: "encode", + value: function encode(obj) { + if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) { + if (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. + */ + }, { + key: "encodeAsString", + value: function encodeAsString(obj) { + // first is type + var 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. + */ + }, { + key: "encodeAsBinary", + value: function encodeAsBinary(obj) { + var deconstruction = deconstructPacket(obj); + var pack = this.encodeAsString(deconstruction.packet); + var buffers = deconstruction.buffers; + buffers.unshift(pack); // add packet info to beginning of data list + return buffers; // write all the buffers + } + }]); + return Encoder; + }(); + // see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript + function isObject(value) { + return Object.prototype.toString.call(value) === "[object Object]"; + } + /** + * A socket.io Decoder instance + * + * @return {Object} decoder + */ + var Decoder = /*#__PURE__*/function (_Emitter) { + _inherits(Decoder, _Emitter); + var _super = _createSuper(Decoder); + /** + * Decoder constructor + * + * @param {function} reviver - custom reviver to pass down to JSON.stringify + */ + function Decoder(reviver) { + var _this; + _classCallCheck(this, Decoder); + _this = _super.call(this); + _this.reviver = reviver; + return _this; + } + /** + * Decodes an encoded packet string into packet JSON. + * + * @param {String} obj - encoded packet + */ + _createClass(Decoder, [{ + key: "add", + value: function add(obj) { + var packet; + if (typeof obj === "string") { + if (this.reconstructor) { + throw new Error("got plaintext data when reconstructing a packet"); + } + packet = this.decodeString(obj); + var 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) { + _get(_getPrototypeOf(Decoder.prototype), "emitReserved", this).call(this, "decoded", packet); + } + } else { + // non-binary full packet + _get(_getPrototypeOf(Decoder.prototype), "emitReserved", this).call(this, "decoded", packet); + } + } else if (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; + _get(_getPrototypeOf(Decoder.prototype), "emitReserved", this).call(this, "decoded", packet); + } + } + } else { + throw new Error("Unknown type: " + obj); + } + } + /** + * Decode a packet String (JSON data) + * + * @param {String} str + * @return {Object} packet + */ + }, { + key: "decodeString", + value: function decodeString(str) { + var i = 0; + // look up type + var 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) { + var start = i + 1; + while (str.charAt(++i) !== "-" && i != str.length) {} + var 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)) { + var _start = i + 1; + while (++i) { + var c = str.charAt(i); + if ("," === c) break; + if (i === str.length) break; + } + p.nsp = str.substring(_start, i); + } else { + p.nsp = "/"; + } + // look up id + var next = str.charAt(i + 1); + if ("" !== next && Number(next) == next) { + var _start2 = i + 1; + while (++i) { + var _c = str.charAt(i); + if (null == _c || Number(_c) != _c) { + --i; + break; + } + if (i === str.length) break; + } + p.id = Number(str.substring(_start2, i + 1)); + } + // look up json data + if (str.charAt(++i)) { + var payload = this.tryParse(str.substr(i)); + if (Decoder.isPayloadValid(p.type, payload)) { + p.data = payload; + } else { + throw new Error("invalid payload"); + } + } + return p; + } + }, { + key: "tryParse", + value: function tryParse(str) { + try { + return JSON.parse(str, this.reviver); + } catch (e) { + return false; + } + } + }, { + key: "destroy", + value: + /** + * Deallocates a parser's resources + */ + function destroy() { + if (this.reconstructor) { + this.reconstructor.finishedReconstruction(); + this.reconstructor = null; + } + } + }], [{ + key: "isPayloadValid", + value: function isPayloadValid(type, payload) { + switch (type) { + case PacketType.CONNECT: + return isObject(payload); + case PacketType.DISCONNECT: + return payload === undefined; + case PacketType.CONNECT_ERROR: + return typeof payload === "string" || isObject(payload); + case PacketType.EVENT: + case PacketType.BINARY_EVENT: + return Array.isArray(payload) && (typeof payload[0] === "number" || typeof payload[0] === "string" && RESERVED_EVENTS$1.indexOf(payload[0]) === -1); + case PacketType.ACK: + case PacketType.BINARY_ACK: + return Array.isArray(payload); + } + } + }]); + return Decoder; + }(Emitter); + /** + * 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 + */ + var BinaryReconstructor = /*#__PURE__*/function () { + function BinaryReconstructor(packet) { + _classCallCheck(this, BinaryReconstructor); + 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. + */ + _createClass(BinaryReconstructor, [{ + key: "takeBinaryData", + value: function takeBinaryData(binData) { + this.buffers.push(binData); + if (this.buffers.length === this.reconPack.attachments) { + // done with buffer list + var packet = reconstructPacket(this.reconPack, this.buffers); + this.finishedReconstruction(); + return packet; + } + return null; + } + /** + * Cleans up binary packet reconstruction variables. + */ + }, { + key: "finishedReconstruction", + value: function finishedReconstruction() { + this.reconPack = null; + this.buffers = []; + } + }]); + return BinaryReconstructor; + }(); + + var parser = /*#__PURE__*/Object.freeze({ + __proto__: null, + protocol: protocol, + get PacketType () { return PacketType; }, + Encoder: Encoder, + Decoder: Decoder + }); + + function on(obj, ev, fn) { + obj.on(ev, fn); + return function subDestroy() { + obj.off(ev, fn); + }; + } + + /** + * Internal events. + * These events can't be emitted by the user. + */ + var 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}`); + * }); + */ + var Socket = /*#__PURE__*/function (_Emitter) { + _inherits(Socket, _Emitter); + var _super = _createSuper(Socket); + /** + * `Socket` constructor. + */ + function Socket(io, nsp, opts) { + var _this; + _classCallCheck(this, Socket); + _this = _super.call(this); + /** + * 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 = _extends({}, opts); + if (_this.io._autoConnect) _this.open(); + return _this; + } + /** + * 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 + * }); + */ + _createClass(Socket, [{ + key: "disconnected", + get: function get() { + return !this.connected; + } + /** + * Subscribe to open, close and packet events + * + * @private + */ + }, { + key: "subEvents", + value: function subEvents() { + if (this.subs) return; + var io = this.io; + this.subs = [on(io, "open", this.onopen.bind(this)), on(io, "packet", this.onpacket.bind(this)), on(io, "error", this.onerror.bind(this)), 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 + * }); + */ + }, { + key: "active", + get: function get() { + return !!this.subs; + } + /** + * "Opens" the socket. + * + * @example + * const socket = io({ + * autoConnect: false + * }); + * + * socket.connect(); + */ + }, { + key: "connect", + value: function 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()}. + */ + }, { + key: "open", + value: function 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 + */ + }, { + key: "send", + value: function send() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + 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 + */ + }, { + key: "emit", + value: function emit(ev) { + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev.toString() + '" is a reserved event name'); + } + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + args.unshift(ev); + if (this._opts.retries && !this.flags.fromQueue && !this.flags["volatile"]) { + this._addToQueue(args); + return this; + } + var packet = { + type: PacketType.EVENT, + data: args + }; + packet.options = {}; + packet.options.compress = this.flags.compress !== false; + // event ack callback + if ("function" === typeof args[args.length - 1]) { + var id = this.ids++; + var ack = args.pop(); + this._registerAckCallback(id, ack); + packet.id = id; + } + var isTransportWritable = this.io.engine && this.io.engine.transport && this.io.engine.transport.writable; + var 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 + */ + }, { + key: "_registerAckCallback", + value: function _registerAckCallback(id, ack) { + var _this2 = this; + var _a; + var timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout; + if (timeout === undefined) { + this.acks[id] = ack; + return; + } + // @ts-ignore + var timer = this.io.setTimeoutFn(function () { + delete _this2.acks[id]; + for (var i = 0; i < _this2.sendBuffer.length; i++) { + if (_this2.sendBuffer[i].id === id) { + _this2.sendBuffer.splice(i, 1); + } + } + ack.call(_this2, new Error("operation has timed out")); + }, timeout); + this.acks[id] = function () { + // @ts-ignore + _this2.io.clearTimeoutFn(timer); + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + ack.apply(_this2, [null].concat(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 + */ + }, { + key: "emitWithAck", + value: function emitWithAck(ev) { + var _this3 = this; + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + // the timeout flag is optional + var withErr = this.flags.timeout !== undefined || this._opts.ackTimeout !== undefined; + return new Promise(function (resolve, reject) { + args.push(function (arg1, arg2) { + if (withErr) { + return arg1 ? reject(arg1) : resolve(arg2); + } else { + return resolve(arg1); + } + }); + _this3.emit.apply(_this3, [ev].concat(args)); + }); + } + /** + * Add the packet to the queue. + * @param args + * @private + */ + }, { + key: "_addToQueue", + value: function _addToQueue(args) { + var _this4 = this; + var ack; + if (typeof args[args.length - 1] === "function") { + ack = args.pop(); + } + var packet = { + id: this._queueSeq++, + tryCount: 0, + pending: false, + args: args, + flags: _extends({ + fromQueue: true + }, this.flags) + }; + args.push(function (err) { + if (packet !== _this4._queue[0]) { + // the packet has already been acknowledged + return; + } + var hasError = err !== null; + if (hasError) { + if (packet.tryCount > _this4._opts.retries) { + _this4._queue.shift(); + if (ack) { + ack(err); + } + } + } else { + _this4._queue.shift(); + if (ack) { + for (var _len5 = arguments.length, responseArgs = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + responseArgs[_key5 - 1] = arguments[_key5]; + } + ack.apply(void 0, [null].concat(responseArgs)); + } + } + packet.pending = false; + return _this4._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 + */ + }, { + key: "_drainQueue", + value: function _drainQueue() { + var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + if (!this.connected || this._queue.length === 0) { + return; + } + var 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 + */ + }, { + key: "packet", + value: function packet(_packet) { + _packet.nsp = this.nsp; + this.io._packet(_packet); + } + /** + * Called upon engine `open`. + * + * @private + */ + }, { + key: "onopen", + value: function onopen() { + var _this5 = this; + if (typeof this.auth == "function") { + this.auth(function (data) { + _this5._sendConnectPacket(data); + }); + } else { + this._sendConnectPacket(this.auth); + } + } + /** + * Sends a CONNECT packet to initiate the Socket.IO session. + * + * @param data + * @private + */ + }, { + key: "_sendConnectPacket", + value: function _sendConnectPacket(data) { + this.packet({ + type: PacketType.CONNECT, + data: this._pid ? _extends({ + pid: this._pid, + offset: this._lastOffset + }, data) : data + }); + } + /** + * Called upon engine or manager `error`. + * + * @param err + * @private + */ + }, { + key: "onerror", + value: function onerror(err) { + if (!this.connected) { + this.emitReserved("connect_error", err); + } + } + /** + * Called upon engine `close`. + * + * @param reason + * @param description + * @private + */ + }, { + key: "onclose", + value: function onclose(reason, description) { + this.connected = false; + delete this.id; + this.emitReserved("disconnect", reason, description); + } + /** + * Called with socket packet. + * + * @param packet + * @private + */ + }, { + key: "onpacket", + value: function onpacket(packet) { + var sameNamespace = packet.nsp === this.nsp; + if (!sameNamespace) return; + switch (packet.type) { + case 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 PacketType.EVENT: + case PacketType.BINARY_EVENT: + this.onevent(packet); + break; + case PacketType.ACK: + case PacketType.BINARY_ACK: + this.onack(packet); + break; + case PacketType.DISCONNECT: + this.ondisconnect(); + break; + case PacketType.CONNECT_ERROR: + this.destroy(); + var 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 + */ + }, { + key: "onevent", + value: function onevent(packet) { + var 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)); + } + } + }, { + key: "emitEvent", + value: function emitEvent(args) { + if (this._anyListeners && this._anyListeners.length) { + var listeners = this._anyListeners.slice(); + var _iterator = _createForOfIteratorHelper(listeners), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var listener = _step.value; + listener.apply(this, args); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + } + _get(_getPrototypeOf(Socket.prototype), "emit", this).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 + */ + }, { + key: "ack", + value: function ack(id) { + var self = this; + var sent = false; + return function () { + // prevent double callbacks + if (sent) return; + sent = true; + for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + args[_key6] = arguments[_key6]; + } + self.packet({ + type: PacketType.ACK, + id: id, + data: args + }); + }; + } + /** + * Called upon a server acknowlegement. + * + * @param packet + * @private + */ + }, { + key: "onack", + value: function onack(packet) { + var ack = this.acks[packet.id]; + if ("function" === typeof ack) { + ack.apply(this, packet.data); + delete this.acks[packet.id]; + } + } + /** + * Called upon server connect. + * + * @private + */ + }, { + key: "onconnect", + value: function 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 + */ + }, { + key: "emitBuffered", + value: function emitBuffered() { + var _this6 = this; + this.receiveBuffer.forEach(function (args) { + return _this6.emitEvent(args); + }); + this.receiveBuffer = []; + this.sendBuffer.forEach(function (packet) { + _this6.notifyOutgoingListeners(packet); + _this6.packet(packet); + }); + this.sendBuffer = []; + } + /** + * Called upon server disconnect. + * + * @private + */ + }, { + key: "ondisconnect", + value: function 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 + */ + }, { + key: "destroy", + value: function destroy() { + if (this.subs) { + // clean subscriptions to avoid reconnections + this.subs.forEach(function (subDestroy) { + return 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 + */ + }, { + key: "disconnect", + value: function disconnect() { + if (this.connected) { + this.packet({ + type: 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 + */ + }, { + key: "close", + value: function close() { + return this.disconnect(); + } + /** + * Sets the compress flag. + * + * @example + * socket.compress(false).emit("hello"); + * + * @param compress - if `true`, compresses the sending data + * @return self + */ + }, { + key: "compress", + value: function 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 + */ + }, { + key: "volatile", + get: function get() { + 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 + */ + }, { + key: "timeout", + value: function 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 + */ + }, { + key: "onAny", + value: function 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 + */ + }, { + key: "prependAny", + value: function 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 + */ + }, { + key: "offAny", + value: function offAny(listener) { + if (!this._anyListeners) { + return this; + } + if (listener) { + var listeners = this._anyListeners; + for (var 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. + */ + }, { + key: "listenersAny", + value: function 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 + */ + }, { + key: "onAnyOutgoing", + value: function 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 + */ + }, { + key: "prependAnyOutgoing", + value: function 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) + */ + }, { + key: "offAnyOutgoing", + value: function offAnyOutgoing(listener) { + if (!this._anyOutgoingListeners) { + return this; + } + if (listener) { + var listeners = this._anyOutgoingListeners; + for (var 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. + */ + }, { + key: "listenersAnyOutgoing", + value: function listenersAnyOutgoing() { + return this._anyOutgoingListeners || []; + } + /** + * Notify the listeners for each packet sent + * + * @param packet + * + * @private + */ + }, { + key: "notifyOutgoingListeners", + value: function notifyOutgoingListeners(packet) { + if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) { + var listeners = this._anyOutgoingListeners.slice(); + var _iterator2 = _createForOfIteratorHelper(listeners), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var listener = _step2.value; + listener.apply(this, packet.data); + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + } + } + }]); + return Socket; + }(Emitter); + + /** + * 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; + }; + + var Manager = /*#__PURE__*/function (_Emitter) { + _inherits(Manager, _Emitter); + var _super = _createSuper(Manager); + function Manager(uri, opts) { + var _this; + _classCallCheck(this, Manager); + var _a; + _this = _super.call(this); + _this.nsps = {}; + _this.subs = []; + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = undefined; + } + opts = opts || {}; + opts.path = opts.path || "/socket.io"; + _this.opts = opts; + installTimerFunctions(_assertThisInitialized(_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 Backoff({ + min: _this.reconnectionDelay(), + max: _this.reconnectionDelayMax(), + jitter: _this.randomizationFactor() + }); + _this.timeout(null == opts.timeout ? 20000 : opts.timeout); + _this._readyState = "closed"; + _this.uri = uri; + var _parser = opts.parser || parser; + _this.encoder = new _parser.Encoder(); + _this.decoder = new _parser.Decoder(); + _this._autoConnect = opts.autoConnect !== false; + if (_this._autoConnect) _this.open(); + return _this; + } + _createClass(Manager, [{ + key: "reconnection", + value: function reconnection(v) { + if (!arguments.length) return this._reconnection; + this._reconnection = !!v; + return this; + } + }, { + key: "reconnectionAttempts", + value: function reconnectionAttempts(v) { + if (v === undefined) return this._reconnectionAttempts; + this._reconnectionAttempts = v; + return this; + } + }, { + key: "reconnectionDelay", + value: function 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; + } + }, { + key: "randomizationFactor", + value: function 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; + } + }, { + key: "reconnectionDelayMax", + value: function 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; + } + }, { + key: "timeout", + value: function 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 + */ + }, { + key: "maybeReconnectOnOpen", + value: function 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 + */ + }, { + key: "open", + value: function open(fn) { + var _this2 = this; + if (~this._readyState.indexOf("open")) return this; + this.engine = new Socket$1(this.uri, this.opts); + var socket = this.engine; + var self = this; + this._readyState = "opening"; + this.skipReconnect = false; + // emit `open` + var openSubDestroy = on(socket, "open", function () { + self.onopen(); + fn && fn(); + }); + var onError = function onError(err) { + _this2.cleanup(); + _this2._readyState = "closed"; + _this2.emitReserved("error", err); + if (fn) { + fn(err); + } else { + // Only do this if there is no fn to handle the error + _this2.maybeReconnectOnOpen(); + } + }; + // emit `error` + var errorSub = on(socket, "error", onError); + if (false !== this._timeout) { + var timeout = this._timeout; + // set timer + var timer = this.setTimeoutFn(function () { + openSubDestroy(); + onError(new Error("timeout")); + socket.close(); + }, timeout); + if (this.opts.autoUnref) { + timer.unref(); + } + this.subs.push(function () { + _this2.clearTimeoutFn(timer); + }); + } + this.subs.push(openSubDestroy); + this.subs.push(errorSub); + return this; + } + /** + * Alias for open() + * + * @return self + * @public + */ + }, { + key: "connect", + value: function connect(fn) { + return this.open(fn); + } + /** + * Called upon transport open. + * + * @private + */ + }, { + key: "onopen", + value: function onopen() { + // clear old subs + this.cleanup(); + // mark as open + this._readyState = "open"; + this.emitReserved("open"); + // add new subs + var socket = this.engine; + 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))); + } + /** + * Called upon a ping. + * + * @private + */ + }, { + key: "onping", + value: function onping() { + this.emitReserved("ping"); + } + /** + * Called with data. + * + * @private + */ + }, { + key: "ondata", + value: function ondata(data) { + try { + this.decoder.add(data); + } catch (e) { + this.onclose("parse error", e); + } + } + /** + * Called when parser fully decodes a packet. + * + * @private + */ + }, { + key: "ondecoded", + value: function ondecoded(packet) { + var _this3 = this; + // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a "parse error" + nextTick(function () { + _this3.emitReserved("packet", packet); + }, this.setTimeoutFn); + } + /** + * Called upon socket error. + * + * @private + */ + }, { + key: "onerror", + value: function onerror(err) { + this.emitReserved("error", err); + } + /** + * Creates a new socket for the given `nsp`. + * + * @return {Socket} + * @public + */ + }, { + key: "socket", + value: function socket(nsp, opts) { + var socket = this.nsps[nsp]; + if (!socket) { + socket = new 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 + */ + }, { + key: "_destroy", + value: function _destroy(socket) { + var nsps = Object.keys(this.nsps); + for (var _i = 0, _nsps = nsps; _i < _nsps.length; _i++) { + var nsp = _nsps[_i]; + var _socket = this.nsps[nsp]; + if (_socket.active) { + return; + } + } + this._close(); + } + /** + * Writes a packet. + * + * @param packet + * @private + */ + }, { + key: "_packet", + value: function _packet(packet) { + var encodedPackets = this.encoder.encode(packet); + for (var i = 0; i < encodedPackets.length; i++) { + this.engine.write(encodedPackets[i], packet.options); + } + } + /** + * Clean up transport subscriptions and packet buffer. + * + * @private + */ + }, { + key: "cleanup", + value: function cleanup() { + this.subs.forEach(function (subDestroy) { + return subDestroy(); + }); + this.subs.length = 0; + this.decoder.destroy(); + } + /** + * Close the current socket. + * + * @private + */ + }, { + key: "_close", + value: function _close() { + this.skipReconnect = true; + this._reconnecting = false; + this.onclose("forced close"); + if (this.engine) this.engine.close(); + } + /** + * Alias for close() + * + * @private + */ + }, { + key: "disconnect", + value: function disconnect() { + return this._close(); + } + /** + * Called upon engine close. + * + * @private + */ + }, { + key: "onclose", + value: function 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 + */ + }, { + key: "reconnect", + value: function reconnect() { + var _this4 = this; + if (this._reconnecting || this.skipReconnect) return this; + var self = this; + if (this.backoff.attempts >= this._reconnectionAttempts) { + this.backoff.reset(); + this.emitReserved("reconnect_failed"); + this._reconnecting = false; + } else { + var delay = this.backoff.duration(); + this._reconnecting = true; + var timer = this.setTimeoutFn(function () { + if (self.skipReconnect) return; + _this4.emitReserved("reconnect_attempt", self.backoff.attempts); + // check again for the case socket closed in above events + if (self.skipReconnect) return; + self.open(function (err) { + if (err) { + self._reconnecting = false; + self.reconnect(); + _this4.emitReserved("reconnect_error", err); + } else { + self.onreconnect(); + } + }); + }, delay); + if (this.opts.autoUnref) { + timer.unref(); + } + this.subs.push(function () { + _this4.clearTimeoutFn(timer); + }); + } + } + /** + * Called upon successful reconnect. + * + * @private + */ + }, { + key: "onreconnect", + value: function onreconnect() { + var attempt = this.backoff.attempts; + this._reconnecting = false; + this.backoff.reset(); + this.emitReserved("reconnect", attempt); + } + }]); + return Manager; + }(Emitter); + + /** + * Managers cache. + */ + var cache = {}; + function lookup(uri, opts) { + if (_typeof(uri) === "object") { + opts = uri; + uri = undefined; + } + opts = opts || {}; + var parsed = url(uri, opts.path || "/socket.io"); + var source = parsed.source; + var id = parsed.id; + var path = parsed.path; + var sameNamespace = cache[id] && path in cache[id]["nsps"]; + var newConnection = opts.forceNew || opts["force new connection"] || false === opts.multiplex || sameNamespace; + var io; + if (newConnection) { + io = new Manager(source, opts); + } else { + if (!cache[id]) { + cache[id] = new 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 + _extends(lookup, { + Manager: Manager, + Socket: Socket, + io: lookup, + connect: lookup + }); + + return lookup; + +})); +//# sourceMappingURL=socket.io.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.js.map b/packages/puter-dot-js/src/lib/socket.io/socket.io.js.map new file mode 100644 index 000000000..a8d418a09 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.io.js","sources":["../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/index.js","../node_modules/@socket.io/component-emitter/index.mjs","../node_modules/engine.io-client/build/esm/globalThis.browser.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/contrib/yeast.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/engine.io-client/build/esm/index.js","../build/esm/url.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-parser/build/esm/index.js","../build/esm/on.js","../build/esm/socket.js","../build/esm/contrib/backo2.js","../build/esm/manager.js","../build/esm/index.js"],"sourcesContent":["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","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};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data\n .arrayBuffer()\n .then(toArray)\n .then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, encoded => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\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\";\nexport const 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 if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET } from \"./commons.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 function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, encodedPacket => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n }\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* READ_PAYLOAD */;\n }\n else if (state === 2 /* READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n }\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","/**\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","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 { 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","// 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","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.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 createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\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","// 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","// 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}\nexport function createCookieJar() { }\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { createCookieJar, 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 }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n if (this.opts.withCredentials) {\n this.cookieJar = createCookieJar();\n }\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 const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\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 return this.createUri(schema, query);\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, cookieJar: this.cookieJar }, 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.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 var _a;\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, true);\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 (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\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 var _a;\n if (xhr.readyState === 3) {\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr);\n }\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 { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { 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;\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 const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\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 return this.createUri(schema, query);\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","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"./websocket-constructor.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n // @ts-ignore\n if (typeof WebTransport !== \"function\") {\n return;\n }\n // @ts-ignore\n this.transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n this.transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this.transport.ready.then(() => {\n this.transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this.writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this.writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this.writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: Polling,\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 (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","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\";\nimport { defaultBinaryType } from \"./transports/websocket-constructor.js\";\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.binaryType = defaultBinaryType;\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 || [\n \"polling\",\n \"websocket\",\n \"webtransport\",\n ];\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: false,\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, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\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 if (this.upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\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 this.resetPingTimeout();\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\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 { 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 { 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","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","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 * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\",\n \"connect_error\",\n \"disconnect\",\n \"disconnecting\",\n \"newListener\",\n \"removeListener\", // used by the Node.js EventEmitter\n];\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// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\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 isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\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","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","/**\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 { 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 const onError = (err) => {\n this.cleanup();\n this._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 this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(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(() => {\n this.clearTimeoutFn(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","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"],"names":["PACKET_TYPES","Object","create","PACKET_TYPES_REVERSE","keys","forEach","key","ERROR_PACKET","type","data","withNativeBlob","Blob","prototype","toString","call","withNativeArrayBuffer","ArrayBuffer","isView","obj","buffer","encodePacket","_ref","supportsBinary","callback","encodeBlobAsBase64","fileReader","FileReader","onload","content","result","split","readAsDataURL","toArray","Uint8Array","byteOffset","byteLength","TEXT_ENCODER","encodePacketToBinary","packet","arrayBuffer","then","encoded","TextEncoder","encode","chars","lookup","i","length","charCodeAt","decode","base64","bufferLength","len","p","encoded1","encoded2","encoded3","encoded4","arraybuffer","bytes","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","substring","packetType","decoded","SEPARATOR","String","fromCharCode","encodePayload","packets","encodedPackets","Array","count","join","decodePayload","encodedPayload","decodedPacket","push","createPacketEncoderStream","TransformStream","transform","controller","payloadLength","header","DataView","setUint8","view","setUint16","setBigUint64","BigInt","enqueue","TEXT_DECODER","totalLength","chunks","reduce","acc","chunk","concatChunks","size","shift","j","slice","createPacketDecoderStream","maxPayload","TextDecoder","state","expectedLength","isBinary","headerArray","getUint16","n","getUint32","Math","pow","protocol","Emitter","mixin","on","addEventListener","event","fn","_callbacks","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","callbacks","cb","splice","emit","args","emitReserved","listeners","hasListeners","globalThisShim","self","window","Function","pick","_len","attr","_key","k","hasOwnProperty","NATIVE_SET_TIMEOUT","globalThis","setTimeout","NATIVE_CLEAR_TIMEOUT","clearTimeout","installTimerFunctions","opts","useNativeTimers","setTimeoutFn","bind","clearTimeoutFn","BASE64_OVERHEAD","utf8Length","ceil","str","c","l","encodeURIComponent","qs","qry","pairs","pair","decodeURIComponent","TransportError","_Error","_inherits","_super","_createSuper","reason","description","context","_this","_classCallCheck","_createClass","_wrapNativeSuper","Error","Transport","_Emitter","_super2","_this2","writable","_assertThisInitialized","query","socket","value","onError","_get","_getPrototypeOf","open","readyState","doOpen","close","doClose","onClose","send","write","onOpen","onData","onPacket","details","pause","onPause","createUri","schema","undefined","_hostname","_port","path","_query","hostname","indexOf","port","secure","Number","encodedQuery","alphabet","map","seed","prev","num","floor","yeast","now","Date","XMLHttpRequest","err","hasCORS","XHR","xdomain","e","concat","createCookieJar","empty","hasXHR2","xhr","responseType","Polling","_Transport","polling","location","isSSL","xd","forceBase64","withCredentials","cookieJar","get","poll","total","doPoll","_this3","_this4","_this5","doWrite","uri","timestampRequests","timestampParam","sid","b64","request","_extends","Request","_this6","req","method","xhrStatus","_this7","pollXhr","_this8","_this9","_a","extraHeaders","setDisableHeaderCheck","setRequestHeader","addCookies","requestTimeout","timeout","onreadystatechange","parseCookies","status","onLoad","document","index","requestsCount","requests","cleanup","fromError","abort","responseText","attachEvent","unloadHandler","terminationEvent","nextTick","isPromiseAvailable","Promise","resolve","WebSocket","MozWebSocket","usingBrowserWebSocket","defaultBinaryType","isReactNative","navigator","product","toLowerCase","WS","check","protocols","headers","ws","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","onmessage","ev","onerror","_loop","lastPacket","WT","WebTransport","transport","transportOptions","name","closed","ready","createBidirectionalStream","stream","decoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","writer","getWriter","read","done","transports","websocket","webtransport","re","parts","parse","src","b","replace","m","exec","source","host","authority","ipv6uri","pathNames","queryKey","regx","names","$0","$1","$2","Socket","writeBuffer","_typeof","prevBufferLen","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","beforeunloadEventListener","offlineEventListener","createTransport","EIO","priorWebsocketSuccess","setTransport","onDrain","probe","failed","onTransportOpen","msg","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","resetPingTimeout","onHandshake","JSON","sendPacket","code","filterUpgrades","getWritablePackets","shouldCheckPayloadSize","payloadSize","options","compress","cleanupAndClose","waitForUpgrade","filteredUpgrades","url","loc","test","ipv6","href","withNativeFile","File","hasBinary","toJSON","isArray","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","isIndexValid","RESERVED_EVENTS","PacketType","Encoder","replacer","EVENT","ACK","encodeAsBinary","BINARY_EVENT","BINARY_ACK","nsp","encodeAsString","stringify","deconstruction","unshift","isObject","Decoder","reviver","add","reconstructor","decodeString","isBinaryEvent","BinaryReconstructor","takeBinaryData","start","buf","next","payload","tryParse","substr","isPayloadValid","destroy","finishedReconstruction","CONNECT","DISCONNECT","CONNECT_ERROR","reconPack","binData","subDestroy","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","flags","auth","_opts","_autoConnect","subEvents","subs","onpacket","_readyState","_len2","_key2","retries","fromQueue","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","discardPacket","notifyOutgoingListeners","ackTimeout","timer","_len3","_key3","emitWithAck","_len4","_key4","withErr","reject","arg1","arg2","tryCount","pending","hasError","_len5","responseArgs","_key5","_drainQueue","force","_packet","_sendConnectPacket","_pid","pid","offset","_lastOffset","sameNamespace","onconnect","onevent","onack","ondisconnect","message","emitEvent","_anyListeners","_iterator","_createForOfIteratorHelper","_step","s","listener","f","sent","_len6","_key6","emitBuffered","onAny","prependAny","offAny","listenersAny","onAnyOutgoing","_anyOutgoingListeners","prependAnyOutgoing","offAnyOutgoing","listenersAnyOutgoing","_iterator2","_step2","Backoff","ms","min","max","factor","jitter","attempts","duration","rand","random","deviation","reset","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","decoder","autoConnect","v","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","maybeReconnectOnOpen","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","errorSub","onping","ondata","ondecoded","active","_destroy","_i","_nsps","_close","delay","onreconnect","attempt","cache","parsed","newConnection","forceNew","multiplex"],"mappings":"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"} \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js b/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js new file mode 100644 index 000000000..f39af5c95 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js @@ -0,0 +1,7 @@ +/*! + * Socket.IO v4.7.2 + * (c) 2014-2023 Guillermo Rauch + * Released under the MIT License. + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).io=e()}(this,(function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}var v=Object.create(null);v.open="0",v.close="1",v.ping="2",v.pong="3",v.message="4",v.upgrade="5",v.noop="6";var g=Object.create(null);Object.keys(v).forEach((function(t){g[v[t]]=t}));var m,b={type:"error",data:"parser error"},k="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),w="function"==typeof ArrayBuffer,_=function(t){return"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer},A=function(t,e,n){var r=t.type,i=t.data;return k&&i instanceof Blob?e?n(i):O(i,n):w&&(i instanceof ArrayBuffer||_(i))?e?n(i):O(new Blob([i]),n):n(v[r]+(i||""))},O=function(t,e){var n=new FileReader;return n.onload=function(){var t=n.result.split(",")[1];e("b"+(t||""))},n.readAsDataURL(t)};function E(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}for(var T="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",R="undefined"==typeof Uint8Array?[]:new Uint8Array(256),C=0;C<64;C++)R[T.charCodeAt(C)]=C;var B,S="function"==typeof ArrayBuffer,N=function(t,e){if("string"!=typeof t)return{type:"message",data:x(t,e)};var n=t.charAt(0);return"b"===n?{type:"message",data:L(t.substring(1),e)}:g[n]?t.length>1?{type:g[n],data:t.substring(1)}:{type:g[n]}:b},L=function(t,e){if(S){var n=function(t){var e,n,r,i,o,s=.75*t.length,a=t.length,u=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var c=new ArrayBuffer(s),h=new Uint8Array(c);for(e=0;e>4,h[u++]=(15&r)<<4|i>>2,h[u++]=(3&i)<<6|63&o;return c}(t);return x(n,e)}return{base64:!0,data:t}},x=function(t,e){return"blob"===e?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer},P=String.fromCharCode(30);function q(){return new TransformStream({transform:function(t,e){!function(t,e){k&&t.data instanceof Blob?t.data.arrayBuffer().then(E).then(e):w&&(t.data instanceof ArrayBuffer||_(t.data))?e(E(t.data)):A(t,!1,(function(t){m||(m=new TextEncoder),e(m.encode(t))}))}(t,(function(n){var r,i=n.length;if(i<126)r=new Uint8Array(1),new DataView(r.buffer).setUint8(0,i);else if(i<65536){r=new Uint8Array(3);var o=new DataView(r.buffer);o.setUint8(0,126),o.setUint16(1,i)}else{r=new Uint8Array(9);var s=new DataView(r.buffer);s.setUint8(0,127),s.setBigUint64(1,BigInt(i))}t.data&&"string"!=typeof t.data&&(r[0]|=128),e.enqueue(r),e.enqueue(n)}))}})}function j(t){return t.reduce((function(t,e){return t+e.length}),0)}function D(t,e){if(t[0].length===e)return t.shift();for(var n=new Uint8Array(e),r=0,i=0;i1?e-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return t+"://"+this._hostname()+this._port()+this.opts.path+this._query(e)}},{key:"_hostname",value:function(){var t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}},{key:"_port",value:function(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}},{key:"_query",value:function(t){var e=function(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e}(t);return e.length?"?"+e:""}}]),i}(U),z="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),J=64,$={},Q=0,X=0;function G(t){var e="";do{e=z[t%J]+e,t=Math.floor(t/J)}while(t>0);return e}function Z(){var t=G(+new Date);return t!==K?(Q=0,K=t):t+"."+G(Q++)}for(;X0&&void 0!==arguments[0]?arguments[0]:{};return i(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new st(this.uri(),t)}},{key:"doWrite",value:function(t,e){var n=this,r=this.request({method:"POST",data:t});r.on("success",e),r.on("error",(function(t,e){n.onError("xhr post error",t,e)}))}},{key:"doPoll",value:function(){var t=this,e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(function(e,n){t.onError("xhr poll error",e,n)})),this.pollXhr=e}}]),s}(W),st=function(t){o(i,t);var n=l(i);function i(t,r){var o;return e(this,i),H(f(o=n.call(this)),r),o.opts=r,o.method=r.method||"GET",o.uri=t,o.data=void 0!==r.data?r.data:null,o.create(),o}return r(i,[{key:"create",value:function(){var t,e=this,n=F(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");n.xdomain=!!this.opts.xd;var r=this.xhr=new nt(n);try{r.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders)for(var o in r.setDisableHeaderCheck&&r.setDisableHeaderCheck(!0),this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(o)&&r.setRequestHeader(o,this.opts.extraHeaders[o])}catch(t){}if("POST"===this.method)try{r.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{r.setRequestHeader("Accept","*/*")}catch(t){}null===(t=this.opts.cookieJar)||void 0===t||t.addCookies(r),"withCredentials"in r&&(r.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(r.timeout=this.opts.requestTimeout),r.onreadystatechange=function(){var t;3===r.readyState&&(null===(t=e.opts.cookieJar)||void 0===t||t.parseCookies(r)),4===r.readyState&&(200===r.status||1223===r.status?e.onLoad():e.setTimeoutFn((function(){e.onError("number"==typeof r.status?r.status:0)}),0))},r.send(this.data)}catch(t){return void this.setTimeoutFn((function(){e.onError(t)}),0)}"undefined"!=typeof document&&(this.index=i.requestsCount++,i.requests[this.index]=this)}},{key:"onError",value:function(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}},{key:"cleanup",value:function(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=rt,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete i.requests[this.index],this.xhr=null}}},{key:"onLoad",value:function(){var t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}},{key:"abort",value:function(){this.cleanup()}}]),i}(U);if(st.requestsCount=0,st.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",at);else if("function"==typeof addEventListener){addEventListener("onpagehide"in I?"pagehide":"unload",at,!1)}function at(){for(var t in st.requests)st.requests.hasOwnProperty(t)&&st.requests[t].abort()}var ut="function"==typeof Promise&&"function"==typeof Promise.resolve?function(t){return Promise.resolve().then(t)}:function(t,e){return e(t,0)},ct=I.WebSocket||I.MozWebSocket,ht="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),ft=function(t){o(i,t);var n=l(i);function i(t){var r;return e(this,i),(r=n.call(this,t)).supportsBinary=!t.forceBase64,r}return r(i,[{key:"name",get:function(){return"websocket"}},{key:"doOpen",value:function(){if(this.check()){var t=this.uri(),e=this.opts.protocols,n=ht?{}:F(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=ht?new ct(t,e,n):e?new ct(t,e):new ct(t)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}}},{key:"addEventListeners",value:function(){var t=this;this.ws.onopen=function(){t.opts.autoUnref&&t.ws._socket.unref(),t.onOpen()},this.ws.onclose=function(e){return t.onClose({description:"websocket connection closed",context:e})},this.ws.onmessage=function(e){return t.onData(e.data)},this.ws.onerror=function(e){return t.onError("websocket error",e)}}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(){var n=t[r],i=r===t.length-1;A(n,e.supportsBinary,(function(t){try{e.ws.send(t)}catch(t){}i&&ut((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;rMath.pow(2,21)-1){a.enqueue(b);break}i=l*Math.pow(2,32)+f.getUint32(4),r=3}else{if(j(n)t){a.enqueue(b);break}}}})}(Number.MAX_SAFE_INTEGER,t.socket.binaryType),r=e.readable.pipeThrough(n).getReader(),i=q();i.readable.pipeTo(e.writable),t.writer=i.writable.getWriter();!function e(){r.read().then((function(n){var r=n.done,i=n.value;r||(t.onPacket(i),e())})).catch((function(t){}))}();var o={type:"open"};t.query.sid&&(o.data='{"sid":"'.concat(t.query.sid,'"}')),t.writer.write(o).then((function(){return t.onOpen()}))}))})))}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(){var n=t[r],i=r===t.length-1;e.writer.write(n).then((function(){i&&ut((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;r1&&void 0!==arguments[1]?arguments[1]:{};return e(this,a),(r=s.call(this)).binaryType="arraybuffer",r.writeBuffer=[],n&&"object"===t(n)&&(o=n,n=null),n?(n=vt(n),o.hostname=n.host,o.secure="https"===n.protocol||"wss"===n.protocol,o.port=n.port,n.query&&(o.query=n.query)):o.host&&(o.hostname=vt(o.host).host),H(f(r),o),r.secure=null!=o.secure?o.secure:"undefined"!=typeof location&&"https:"===location.protocol,o.hostname&&!o.port&&(o.port=r.secure?"443":"80"),r.hostname=o.hostname||("undefined"!=typeof location?location.hostname:"localhost"),r.port=o.port||("undefined"!=typeof location&&location.port?location.port:r.secure?"443":"80"),r.transports=o.transports||["polling","websocket","webtransport"],r.writeBuffer=[],r.prevBufferLen=0,r.opts=i({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},o),r.opts.path=r.opts.path.replace(/\/$/,"")+(r.opts.addTrailingSlash?"/":""),"string"==typeof r.opts.query&&(r.opts.query=function(t){for(var e={},n=t.split("&"),r=0,i=n.length;r1))return this.writeBuffer;for(var t,e=1,n=0;n=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))),n>0&&e>this.maxPayload)return this.writeBuffer.slice(0,n);e+=2}return this.writeBuffer}},{key:"write",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"send",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"sendPacket",value:function(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"!==this.readyState&&"closed"!==this.readyState){(n=n||{}).compress=!1!==n.compress;var i={type:t,data:e,options:n};this.emitReserved("packetCreate",i),this.writeBuffer.push(i),r&&this.once("flush",r),this.flush()}}},{key:"close",value:function(){var t=this,e=function(){t.onClose("forced close"),t.transport.close()},n=function n(){t.off("upgrade",n),t.off("upgradeError",n),e()},r=function(){t.once("upgrade",n),t.once("upgradeError",n)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(function(){t.upgrading?r():e()})):this.upgrading?r():e()),this}},{key:"onError",value:function(t){a.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}},{key:"onClose",value:function(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}},{key:"filterUpgrades",value:function(t){for(var e=[],n=0,r=t.length;n=0&&e.num1?e-1:0),r=1;r1?n-1:0),i=1;in._opts.retries&&(n._queue.shift(),e&&e(t));else if(n._queue.shift(),e){for(var i=arguments.length,o=new Array(i>1?i-1:0),s=1;s0&&void 0!==arguments[0]&&arguments[0];if(this.connected&&0!==this._queue.length){var e=this._queue[0];e.pending&&!t||(e.pending=!0,e.tryCount++,this.flags=e.flags,this.emit.apply(this,e.args))}}},{key:"packet",value:function(t){t.nsp=this.nsp,this.io._packet(t)}},{key:"onopen",value:function(){var t=this;"function"==typeof this.auth?this.auth((function(e){t._sendConnectPacket(e)})):this._sendConnectPacket(this.auth)}},{key:"_sendConnectPacket",value:function(t){this.packet({type:Bt.CONNECT,data:this._pid?i({pid:this._pid,offset:this._lastOffset},t):t})}},{key:"onerror",value:function(t){this.connected||this.emitReserved("connect_error",t)}},{key:"onclose",value:function(t,e){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e)}},{key:"onpacket",value:function(t){if(t.nsp===this.nsp)switch(t.type){case Bt.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):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 Bt.EVENT:case Bt.BINARY_EVENT:this.onevent(t);break;case Bt.ACK:case Bt.BINARY_ACK:this.onack(t);break;case Bt.DISCONNECT:this.ondisconnect();break;case Bt.CONNECT_ERROR:this.destroy();var e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}},{key:"onevent",value:function(t){var e=t.data||[];null!=t.id&&e.push(this.ack(t.id)),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}},{key:"emitEvent",value:function(t){if(this._anyListeners&&this._anyListeners.length){var e,n=y(this._anyListeners.slice());try{for(n.s();!(e=n.n()).done;){e.value.apply(this,t)}}catch(t){n.e(t)}finally{n.f()}}p(s(a.prototype),"emit",this).apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}},{key:"ack",value:function(t){var e=this,n=!1;return function(){if(!n){n=!0;for(var r=arguments.length,i=new Array(r),o=0;o0&&t.jitter<=1?t.jitter:0,this.attempts=0}It.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},It.prototype.reset=function(){this.attempts=0},It.prototype.setMin=function(t){this.ms=t},It.prototype.setMax=function(t){this.max=t},It.prototype.setJitter=function(t){this.jitter=t};var Ft=function(n){o(s,n);var i=l(s);function s(n,r){var o,a;e(this,s),(o=i.call(this)).nsps={},o.subs=[],n&&"object"===t(n)&&(r=n,n=void 0),(r=r||{}).path=r.path||"/socket.io",o.opts=r,H(f(o),r),o.reconnection(!1!==r.reconnection),o.reconnectionAttempts(r.reconnectionAttempts||1/0),o.reconnectionDelay(r.reconnectionDelay||1e3),o.reconnectionDelayMax(r.reconnectionDelayMax||5e3),o.randomizationFactor(null!==(a=r.randomizationFactor)&&void 0!==a?a:.5),o.backoff=new It({min:o.reconnectionDelay(),max:o.reconnectionDelayMax(),jitter:o.randomizationFactor()}),o.timeout(null==r.timeout?2e4:r.timeout),o._readyState="closed",o.uri=n;var u=r.parser||qt;return o.encoder=new u.Encoder,o.decoder=new u.Decoder,o._autoConnect=!1!==r.autoConnect,o._autoConnect&&o.open(),o}return r(s,[{key:"reconnection",value:function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}},{key:"reconnectionAttempts",value:function(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}},{key:"reconnectionDelay",value:function(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}},{key:"randomizationFactor",value:function(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}},{key:"reconnectionDelayMax",value:function(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}},{key:"timeout",value:function(t){return arguments.length?(this._timeout=t,this):this._timeout}},{key:"maybeReconnectOnOpen",value:function(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}},{key:"open",value:function(t){var e=this;if(~this._readyState.indexOf("open"))return this;this.engine=new gt(this.uri,this.opts);var n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;var i=jt(n,"open",(function(){r.onopen(),t&&t()})),o=function(n){e.cleanup(),e._readyState="closed",e.emitReserved("error",n),t?t(n):e.maybeReconnectOnOpen()},s=jt(n,"error",o);if(!1!==this._timeout){var a=this._timeout,u=this.setTimeoutFn((function(){i(),o(new Error("timeout")),n.close()}),a);this.opts.autoUnref&&u.unref(),this.subs.push((function(){e.clearTimeoutFn(u)}))}return this.subs.push(i),this.subs.push(s),this}},{key:"connect",value:function(t){return this.open(t)}},{key:"onopen",value:function(){this.cleanup(),this._readyState="open",this.emitReserved("open");var t=this.engine;this.subs.push(jt(t,"ping",this.onping.bind(this)),jt(t,"data",this.ondata.bind(this)),jt(t,"error",this.onerror.bind(this)),jt(t,"close",this.onclose.bind(this)),jt(this.decoder,"decoded",this.ondecoded.bind(this)))}},{key:"onping",value:function(){this.emitReserved("ping")}},{key:"ondata",value:function(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}},{key:"ondecoded",value:function(t){var e=this;ut((function(){e.emitReserved("packet",t)}),this.setTimeoutFn)}},{key:"onerror",value:function(t){this.emitReserved("error",t)}},{key:"socket",value:function(t,e){var n=this.nsps[t];return n?this._autoConnect&&!n.active&&n.connect():(n=new Ut(this,t,e),this.nsps[t]=n),n}},{key:"_destroy",value:function(t){for(var e=0,n=Object.keys(this.nsps);e=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{var n=this.backoff.duration();this._reconnecting=!0;var r=this.setTimeoutFn((function(){e.skipReconnect||(t.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open((function(n){n?(e._reconnecting=!1,e.reconnect(),t.emitReserved("reconnect_error",n)):e.onreconnect()})))}),n);this.opts.autoUnref&&r.unref(),this.subs.push((function(){t.clearTimeoutFn(r)}))}}},{key:"onreconnect",value:function(){var t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}]),s}(U),Mt={};function Vt(e,n){"object"===t(e)&&(n=e,e=void 0);var r,i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(t=void 0!==n?n.protocol+"//"+t:"https://"+t),r=vt(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";var i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}(e,(n=n||{}).path||"/socket.io"),o=i.source,s=i.id,a=i.path,u=Mt[s]&&a in Mt[s].nsps;return n.forceNew||n["force new connection"]||!1===n.multiplex||u?r=new Ft(o,n):(Mt[s]||(Mt[s]=new Ft(o,n)),r=Mt[s]),i.query&&!n.query&&(n.query=i.queryKey),r.socket(i.path,n)}return i(Vt,{Manager:Ft,Socket:Ut,io:Vt,connect:Vt}),Vt})); +//# sourceMappingURL=socket.io.min.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map b/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map new file mode 100644 index 000000000..6a27b095e --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.io.min.js","sources":["../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/index.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/@socket.io/component-emitter/index.mjs","../node_modules/engine.io-client/build/esm/globalThis.browser.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/contrib/yeast.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/engine.io-client/build/esm/index.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-parser/build/esm/index.js","../build/esm/on.js","../build/esm/socket.js","../build/esm/contrib/backo2.js","../build/esm/manager.js","../build/esm/index.js","../build/esm/url.js"],"sourcesContent":["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","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};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data\n .arrayBuffer()\n .then(toArray)\n .then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, encoded => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\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 { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET } from \"./commons.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 function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, encodedPacket => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n }\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* READ_PAYLOAD */;\n }\n else if (state === 2 /* READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n }\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const 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 if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","/**\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","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 { 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","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.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 createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\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","// 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/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","// 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}\nexport function createCookieJar() { }\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { createCookieJar, 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 }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n if (this.opts.withCredentials) {\n this.cookieJar = createCookieJar();\n }\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 const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\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 return this.createUri(schema, query);\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, cookieJar: this.cookieJar }, 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.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 var _a;\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, true);\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 (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\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 var _a;\n if (xhr.readyState === 3) {\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr);\n }\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 { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { 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;\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 const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\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 return this.createUri(schema, query);\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","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"./websocket-constructor.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n // @ts-ignore\n if (typeof WebTransport !== \"function\") {\n return;\n }\n // @ts-ignore\n this.transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n this.transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this.transport.ready.then(() => {\n this.transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this.writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this.writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this.writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: Polling,\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 (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","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\";\nimport { defaultBinaryType } from \"./transports/websocket-constructor.js\";\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.binaryType = defaultBinaryType;\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 || [\n \"polling\",\n \"websocket\",\n \"webtransport\",\n ];\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: false,\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, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\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 if (this.upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\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 this.resetPingTimeout();\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\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 { 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","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","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 * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\",\n \"connect_error\",\n \"disconnect\",\n \"disconnecting\",\n \"newListener\",\n \"removeListener\", // used by the Node.js EventEmitter\n];\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// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\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 isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\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","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","/**\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 { 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 const onError = (err) => {\n this.cleanup();\n this._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 this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(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(() => {\n this.clearTimeoutFn(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","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 { 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"],"names":["PACKET_TYPES","Object","create","PACKET_TYPES_REVERSE","keys","forEach","key","TEXT_ENCODER","ERROR_PACKET","type","data","withNativeBlob","Blob","prototype","toString","call","withNativeArrayBuffer","ArrayBuffer","isView","obj","buffer","encodePacket","_ref","supportsBinary","callback","encodeBlobAsBase64","fileReader","FileReader","onload","content","result","split","readAsDataURL","toArray","Uint8Array","byteOffset","byteLength","chars","lookup","i","charCodeAt","TEXT_DECODER","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","substring","length","decoded","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","len","p","arraybuffer","bytes","decode","SEPARATOR","String","fromCharCode","createPacketEncoderStream","TransformStream","transform","packet","controller","arrayBuffer","then","encoded","TextEncoder","encode","encodePacketToBinary","header","payloadLength","DataView","setUint8","view","setUint16","setBigUint64","BigInt","enqueue","totalLength","chunks","reduce","acc","chunk","concatChunks","size","shift","j","slice","Emitter","mixin","on","addEventListener","event","fn","this","_callbacks","push","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","cb","callbacks","splice","emit","args","Array","emitReserved","listeners","hasListeners","globalThisShim","self","window","Function","pick","_len","attr","_key","k","hasOwnProperty","NATIVE_SET_TIMEOUT","globalThis","setTimeout","NATIVE_CLEAR_TIMEOUT","clearTimeout","installTimerFunctions","opts","useNativeTimers","setTimeoutFn","bind","clearTimeoutFn","prev","TransportError","_Error","_inherits","_super","_createSuper","reason","description","context","_this","_classCallCheck","_createClass","_wrapNativeSuper","Error","Transport","_Emitter","_super2","_this2","writable","_assertThisInitialized","query","socket","value","_get","_getPrototypeOf","readyState","doOpen","doClose","onClose","packets","write","onPacket","details","onPause","schema","undefined","_hostname","_port","path","_query","hostname","indexOf","port","secure","Number","encodedQuery","str","encodeURIComponent","alphabet","map","seed","num","Math","floor","yeast","now","Date","XMLHttpRequest","err","hasCORS","XHR","xdomain","e","concat","join","empty","hasXHR2","responseType","Polling","_Transport","polling","location","isSSL","protocol","xd","forceBase64","withCredentials","cookieJar","createCookieJar","get","poll","pause","total","doPoll","_this3","encodedPayload","encodedPackets","decodedPacket","decodePayload","onOpen","_this4","close","_this5","count","encodePayload","doWrite","timestampRequests","timestampParam","sid","b64","createUri","_extends","Request","uri","_this6","req","request","method","xhrStatus","onError","_this7","onData","pollXhr","_this8","_a","_this9","xhr","open","extraHeaders","setDisableHeaderCheck","setRequestHeader","addCookies","requestTimeout","timeout","onreadystatechange","parseCookies","status","onLoad","send","document","index","requestsCount","requests","cleanup","fromError","abort","responseText","attachEvent","unloadHandler","nextTick","Promise","resolve","WebSocket","MozWebSocket","isReactNative","navigator","product","toLowerCase","WS","check","protocols","headers","ws","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","onmessage","ev","onerror","_loop","lastPacket","WT","WebTransport","transport","transportOptions","name","closed","ready","createBidirectionalStream","stream","decoderStream","maxPayload","TextDecoder","state","expectedLength","isBinary","headerArray","getUint16","n","getUint32","pow","createPacketDecoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","writer","getWriter","read","done","transports","websocket","webtransport","re","parts","parse","src","b","replace","m","exec","source","host","authority","ipv6uri","pathNames","regx","names","queryKey","$0","$1","$2","Socket","writeBuffer","_typeof","prevBufferLen","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","qs","qry","pairs","l","pair","decodeURIComponent","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","beforeunloadEventListener","offlineEventListener","EIO","priorWebsocketSuccess","createTransport","setTransport","onDrain","failed","onTransportOpen","msg","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","probe","resetPingTimeout","onHandshake","JSON","sendPacket","code","filterUpgrades","getWritablePackets","payloadSize","c","utf8Length","ceil","options","compress","cleanupAndClose","waitForUpgrade","filteredUpgrades","Socket$1","withNativeFile","File","hasBinary","toJSON","isArray","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","PacketType","RESERVED_EVENTS","Encoder","replacer","EVENT","ACK","encodeAsString","encodeAsBinary","BINARY_EVENT","BINARY_ACK","nsp","stringify","deconstruction","unshift","isObject","Decoder","reviver","reconstructor","isBinaryEvent","decodeString","BinaryReconstructor","takeBinaryData","start","buf","next","payload","tryParse","substr","isPayloadValid","finishedReconstruction","CONNECT","DISCONNECT","CONNECT_ERROR","reconPack","binData","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","flags","auth","_opts","_autoConnect","subs","onpacket","subEvents","_readyState","_len2","_key2","retries","fromQueue","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","notifyOutgoingListeners","ackTimeout","timer","_len3","_key3","_len4","_key4","withErr","reject","arg1","arg2","tryCount","pending","_len5","responseArgs","_key5","_drainQueue","force","_packet","_sendConnectPacket","_pid","pid","offset","_lastOffset","onconnect","onevent","onack","ondisconnect","destroy","message","emitEvent","_anyListeners","_step","_iterator","_createForOfIteratorHelper","s","f","sent","_len6","_key6","emitBuffered","subDestroy","listener","_anyOutgoingListeners","_step2","_iterator2","Backoff","ms","min","max","factor","jitter","attempts","duration","rand","random","deviation","reset","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","decoder","autoConnect","v","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","maybeReconnectOnOpen","errorSub","onping","ondata","ondecoded","add","active","_i","_nsps","_close","delay","onreconnect","attempt","cache","parsed","loc","test","href","url","sameNamespace","forceNew","multiplex"],"mappings":"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"} \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js b/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js new file mode 100644 index 000000000..e10352099 --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js @@ -0,0 +1,7 @@ +/*! + * Socket.IO v4.7.2 + * (c) 2014-2023 Guillermo Rauch + * Released under the MIT License. + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).io=e()}(this,(function(){"use strict";function t(t,e){return e.forEach((function(e){e&&"string"!=typeof e&&!Array.isArray(e)&&Object.keys(e).forEach((function(n){if("default"!==n&&!(n in t)){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}}))})),Object.freeze(t)}function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}var g=Object.create(null);g.open="0",g.close="1",g.ping="2",g.pong="3",g.message="4",g.upgrade="5",g.noop="6";var m=Object.create(null);Object.keys(g).forEach((function(t){m[g[t]]=t}));var _,b={type:"error",data:"parser error"},k="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),w="function"==typeof ArrayBuffer,O=function(t){return"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer instanceof ArrayBuffer},E=function(t,e,n){var r=t.type,i=t.data;return k&&i instanceof Blob?e?n(i):T(i,n):w&&(i instanceof ArrayBuffer||O(i))?e?n(i):T(new Blob([i]),n):n(g[r]+(i||""))},T=function(t,e){var n=new FileReader;return n.onload=function(){var t=n.result.split(",")[1];e("b"+(t||""))},n.readAsDataURL(t)};function C(t){return t instanceof Uint8Array?t:t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}for(var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",R="undefined"==typeof Uint8Array?[]:new Uint8Array(256),S=0;S<64;S++)R[A.charCodeAt(S)]=S;var L,U="function"==typeof ArrayBuffer,x=function(t,e){if("string"!=typeof t)return{type:"message",data:q(t,e)};var n=t.charAt(0);return"b"===n?{type:"message",data:B(t.substring(1),e)}:m[n]?t.length>1?{type:m[n],data:t.substring(1)}:{type:m[n]}:b},B=function(t,e){if(U){var n=function(t){var e,n,r,i,o,s=.75*t.length,a=t.length,u=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var c=new ArrayBuffer(s),h=new Uint8Array(c);for(e=0;e>4,h[u++]=(15&r)<<4|i>>2,h[u++]=(3&i)<<6|63&o;return c}(t);return q(n,e)}return{base64:!0,data:t}},q=function(t,e){return"blob"===e?t instanceof Blob?t:new Blob([t]):t instanceof ArrayBuffer?t:t.buffer},P=String.fromCharCode(30);function j(){return new TransformStream({transform:function(t,e){!function(t,e){k&&t.data instanceof Blob?t.data.arrayBuffer().then(C).then(e):w&&(t.data instanceof ArrayBuffer||O(t.data))?e(C(t.data)):E(t,!1,(function(t){_||(_=new TextEncoder),e(_.encode(t))}))}(t,(function(n){var r,i=n.length;if(i<126)r=new Uint8Array(1),new DataView(r.buffer).setUint8(0,i);else if(i<65536){r=new Uint8Array(3);var o=new DataView(r.buffer);o.setUint8(0,126),o.setUint16(1,i)}else{r=new Uint8Array(9);var s=new DataView(r.buffer);s.setUint8(0,127),s.setBigUint64(1,BigInt(i))}t.data&&"string"!=typeof t.data&&(r[0]|=128),e.enqueue(r),e.enqueue(n)}))}})}function D(t){return t.reduce((function(t,e){return t+e.length}),0)}function N(t,e){if(t[0].length===e)return t.shift();for(var n=new Uint8Array(e),r=0,i=0;i1?e-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{};return t+"://"+this._hostname()+this._port()+this.opts.path+this._query(e)}},{key:"_hostname",value:function(){var t=this.opts.hostname;return-1===t.indexOf(":")?t:"["+t+"]"}},{key:"_port",value:function(){return this.opts.port&&(this.opts.secure&&Number(443!==this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}},{key:"_query",value:function(t){var e=function(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e}(t);return e.length?"?"+e:""}}]),r}(M),Q="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),X=64,K={},G=0,Y=0;function Z(t){var e="";do{e=Q[t%X]+e,t=Math.floor(t/X)}while(t>0);return e}function tt(){var t=Z(+new Date);return t!==W?(G=0,W=t):t+"."+Z(G++)}for(;Y0&&void 0!==arguments[0]?arguments[0]:{};return o(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new at(this.uri(),t)}},{key:"doWrite",value:function(t,e){var n=this,r=this.request({method:"POST",data:t});r.on("success",e),r.on("error",(function(t,e){n.onError("xhr post error",t,e)}))}},{key:"doPoll",value:function(){var t=this,e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(function(e,n){t.onError("xhr poll error",e,n)})),this.pollXhr=e}}]),r}(J),at=function(t){s(r,t);var e=p(r);function r(t,i){var o;return n(this,r),V(l(o=e.call(this)),i),o.opts=i,o.method=i.method||"GET",o.uri=t,o.data=void 0!==i.data?i.data:null,o.create(),o}return i(r,[{key:"create",value:function(){var t,e=this,n=F(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");n.xdomain=!!this.opts.xd;var i=this.xhr=new rt(n);try{i.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders)for(var o in i.setDisableHeaderCheck&&i.setDisableHeaderCheck(!0),this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(o)&&i.setRequestHeader(o,this.opts.extraHeaders[o])}catch(t){}if("POST"===this.method)try{i.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{i.setRequestHeader("Accept","*/*")}catch(t){}null===(t=this.opts.cookieJar)||void 0===t||t.addCookies(i),"withCredentials"in i&&(i.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(i.timeout=this.opts.requestTimeout),i.onreadystatechange=function(){var t;3===i.readyState&&(null===(t=e.opts.cookieJar)||void 0===t||t.parseCookies(i)),4===i.readyState&&(200===i.status||1223===i.status?e.onLoad():e.setTimeoutFn((function(){e.onError("number"==typeof i.status?i.status:0)}),0))},i.send(this.data)}catch(t){return void this.setTimeoutFn((function(){e.onError(t)}),0)}"undefined"!=typeof document&&(this.index=r.requestsCount++,r.requests[this.index]=this)}},{key:"onError",value:function(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}},{key:"cleanup",value:function(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=it,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete r.requests[this.index],this.xhr=null}}},{key:"onLoad",value:function(){var t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}},{key:"abort",value:function(){this.cleanup()}}]),r}(M);if(at.requestsCount=0,at.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",ut);else if("function"==typeof addEventListener){addEventListener("onpagehide"in I?"pagehide":"unload",ut,!1)}function ut(){for(var t in at.requests)at.requests.hasOwnProperty(t)&&at.requests[t].abort()}var ct="function"==typeof Promise&&"function"==typeof Promise.resolve?function(t){return Promise.resolve().then(t)}:function(t,e){return e(t,0)},ht=I.WebSocket||I.MozWebSocket,ft="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),lt=function(t){s(r,t);var e=p(r);function r(t){var i;return n(this,r),(i=e.call(this,t)).supportsBinary=!t.forceBase64,i}return i(r,[{key:"name",get:function(){return"websocket"}},{key:"doOpen",value:function(){if(this.check()){var t=this.uri(),e=this.opts.protocols,n=ft?{}:F(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=ft?new ht(t,e,n):e?new ht(t,e):new ht(t)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}}},{key:"addEventListeners",value:function(){var t=this;this.ws.onopen=function(){t.opts.autoUnref&&t.ws._socket.unref(),t.onOpen()},this.ws.onclose=function(e){return t.onClose({description:"websocket connection closed",context:e})},this.ws.onmessage=function(e){return t.onData(e.data)},this.ws.onerror=function(e){return t.onError("websocket error",e)}}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(){var n=t[r],i=r===t.length-1;E(n,e.supportsBinary,(function(t){try{e.ws.send(t)}catch(t){}i&&ct((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;rMath.pow(2,21)-1){a.enqueue(b);break}i=l*Math.pow(2,32)+f.getUint32(4),r=3}else{if(D(n)t){a.enqueue(b);break}}}})}(Number.MAX_SAFE_INTEGER,t.socket.binaryType),r=e.readable.pipeThrough(n).getReader(),i=j();i.readable.pipeTo(e.writable),t.writer=i.writable.getWriter();!function e(){r.read().then((function(n){var r=n.done,i=n.value;r||(t.onPacket(i),e())})).catch((function(t){}))}();var o={type:"open"};t.query.sid&&(o.data='{"sid":"'.concat(t.query.sid,'"}')),t.writer.write(o).then((function(){return t.onOpen()}))}))})))}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(){var n=t[r],i=r===t.length-1;e.writer.write(n).then((function(){i&&ct((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;r1&&void 0!==arguments[1]?arguments[1]:{};return n(this,a),(i=r.call(this)).binaryType="arraybuffer",i.writeBuffer=[],t&&"object"===e(t)&&(s=t,t=null),t?(t=gt(t),s.hostname=t.host,s.secure="https"===t.protocol||"wss"===t.protocol,s.port=t.port,t.query&&(s.query=t.query)):s.host&&(s.hostname=gt(s.host).host),V(l(i),s),i.secure=null!=s.secure?s.secure:"undefined"!=typeof location&&"https:"===location.protocol,s.hostname&&!s.port&&(s.port=i.secure?"443":"80"),i.hostname=s.hostname||("undefined"!=typeof location?location.hostname:"localhost"),i.port=s.port||("undefined"!=typeof location&&location.port?location.port:i.secure?"443":"80"),i.transports=s.transports||["polling","websocket","webtransport"],i.writeBuffer=[],i.prevBufferLen=0,i.opts=o({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},s),i.opts.path=i.opts.path.replace(/\/$/,"")+(i.opts.addTrailingSlash?"/":""),"string"==typeof i.opts.query&&(i.opts.query=function(t){for(var e={},n=t.split("&"),r=0,i=n.length;r1))return this.writeBuffer;for(var t,e=1,n=0;n=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))),n>0&&e>this.maxPayload)return this.writeBuffer.slice(0,n);e+=2}return this.writeBuffer}},{key:"write",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"send",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"sendPacket",value:function(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"!==this.readyState&&"closed"!==this.readyState){(n=n||{}).compress=!1!==n.compress;var i={type:t,data:e,options:n};this.emitReserved("packetCreate",i),this.writeBuffer.push(i),r&&this.once("flush",r),this.flush()}}},{key:"close",value:function(){var t=this,e=function(){t.onClose("forced close"),t.transport.close()},n=function n(){t.off("upgrade",n),t.off("upgradeError",n),e()},r=function(){t.once("upgrade",n),t.once("upgradeError",n)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(function(){t.upgrading?r():e()})):this.upgrading?r():e()),this}},{key:"onError",value:function(t){a.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}},{key:"onClose",value:function(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}},{key:"filterUpgrades",value:function(t){for(var e=[],n=0,r=t.length;n>6),t.setUint8(e++,128|63&r)):r<55296||r>=57344?(t.setUint8(e++,224|r>>12),t.setUint8(e++,128|r>>6&63),t.setUint8(e++,128|63&r)):(i++,r=65536+((1023&r)<<10|1023&n.charCodeAt(i)),t.setUint8(e++,240|r>>18),t.setUint8(e++,128|r>>12&63),t.setUint8(e++,128|r>>6&63),t.setUint8(e++,128|63&r))}function wt(t,n,r){var i=e(r),o=0,s=0,a=0,u=0,c=0,h=0;if("string"===i){if(c=function(t){for(var e=0,n=0,r=0,i=t.length;r=57344?n+=3:(r++,n+=4);return n}(r),c<32)t.push(160|c),h=1;else if(c<256)t.push(217,c),h=2;else if(c<65536)t.push(218,c>>8,c),h=3;else{if(!(c<4294967296))throw new Error("String too long");t.push(219,c>>24,c>>16,c>>8,c),h=5}return n.push({_str:r,_length:c,_offset:t.length}),h+c}if("number"===i)return Math.floor(r)===r&&isFinite(r)?r>=0?r<128?(t.push(r),1):r<256?(t.push(204,r),2):r<65536?(t.push(205,r>>8,r),3):r<4294967296?(t.push(206,r>>24,r>>16,r>>8,r),5):(a=r/Math.pow(2,32)>>0,u=r>>>0,t.push(207,a>>24,a>>16,a>>8,a,u>>24,u>>16,u>>8,u),9):r>=-32?(t.push(r),1):r>=-128?(t.push(208,r),2):r>=-32768?(t.push(209,r>>8,r),3):r>=-2147483648?(t.push(210,r>>24,r>>16,r>>8,r),5):(a=Math.floor(r/Math.pow(2,32)),u=r>>>0,t.push(211,a>>24,a>>16,a>>8,a,u>>24,u>>16,u>>8,u),9):(t.push(203),n.push({_float:r,_length:8,_offset:t.length}),9);if("object"===i){if(null===r)return t.push(192),1;if(Array.isArray(r)){if((c=r.length)<16)t.push(144|c),h=1;else if(c<65536)t.push(220,c>>8,c),h=3;else{if(!(c<4294967296))throw new Error("Array too large");t.push(221,c>>24,c>>16,c>>8,c),h=5}for(o=0;o>>0,t.push(215,0,a>>24,a>>16,a>>8,a,u>>24,u>>16,u>>8,u),10}if(r instanceof ArrayBuffer){if((c=r.byteLength)<256)t.push(196,c),h=2;else if(c<65536)t.push(197,c>>8,c),h=3;else{if(!(c<4294967296))throw new Error("Buffer too large");t.push(198,c>>24,c>>16,c>>8,c),h=5}return n.push({_bin:r,_length:c,_offset:t.length}),h+c}if("function"==typeof r.toJSON)return wt(t,n,r.toJSON());var l=[],p="",d=Object.keys(r);for(o=0,s=d.length;o>8,c),h=3;else{if(!(c<4294967296))throw new Error("Object too large");t.push(223,c>>24,c>>16,c>>8,c),h=5}for(o=0;o0&&(u=n[0]._offset);for(var c,h=0,f=0,l=0,p=e.length;l=65536?(i-=65536,r+=String.fromCharCode(55296+(i>>>10),56320+(1023&i))):r+=String.fromCharCode(i)}else r+=String.fromCharCode((15&a)<<12|(63&t.getUint8(++o))<<6|(63&t.getUint8(++o))<<0);else r+=String.fromCharCode((31&a)<<6|63&t.getUint8(++o));else r+=String.fromCharCode(a)}return r}(this._view,this._offset,t);return this._offset+=t,e},Et.prototype._bin=function(t){var e=this._buffer.slice(this._offset,this._offset+t);return this._offset+=t,e},Et.prototype._parse=function(){var t,e=this._view.getUint8(this._offset++),n=0,r=0,i=0,o=0;if(e<192)return e<128?e:e<144?this._map(15&e):e<160?this._array(15&e):this._str(31&e);if(e>223)return-1*(255-e+1);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return n=this._view.getUint8(this._offset),this._offset+=1,this._bin(n);case 197:return n=this._view.getUint16(this._offset),this._offset+=2,this._bin(n);case 198:return n=this._view.getUint32(this._offset),this._offset+=4,this._bin(n);case 199:return n=this._view.getUint8(this._offset),r=this._view.getInt8(this._offset+1),this._offset+=2,[r,this._bin(n)];case 200:return n=this._view.getUint16(this._offset),r=this._view.getInt8(this._offset+2),this._offset+=3,[r,this._bin(n)];case 201:return n=this._view.getUint32(this._offset),r=this._view.getInt8(this._offset+4),this._offset+=5,[r,this._bin(n)];case 202:return t=this._view.getFloat32(this._offset),this._offset+=4,t;case 203:return t=this._view.getFloat64(this._offset),this._offset+=8,t;case 204:return t=this._view.getUint8(this._offset),this._offset+=1,t;case 205:return t=this._view.getUint16(this._offset),this._offset+=2,t;case 206:return t=this._view.getUint32(this._offset),this._offset+=4,t;case 207:return i=this._view.getUint32(this._offset)*Math.pow(2,32),o=this._view.getUint32(this._offset+4),this._offset+=8,i+o;case 208:return t=this._view.getInt8(this._offset),this._offset+=1,t;case 209:return t=this._view.getInt16(this._offset),this._offset+=2,t;case 210:return t=this._view.getInt32(this._offset),this._offset+=4,t;case 211:return i=this._view.getInt32(this._offset)*Math.pow(2,32),o=this._view.getUint32(this._offset+4),this._offset+=8,i+o;case 212:return r=this._view.getInt8(this._offset),this._offset+=1,0===r?void(this._offset+=1):[r,this._bin(1)];case 213:return r=this._view.getInt8(this._offset),this._offset+=1,[r,this._bin(2)];case 214:return r=this._view.getInt8(this._offset),this._offset+=1,[r,this._bin(4)];case 215:return r=this._view.getInt8(this._offset),this._offset+=1,0===r?(i=this._view.getInt32(this._offset)*Math.pow(2,32),o=this._view.getUint32(this._offset+4),this._offset+=8,new Date(i+o)):[r,this._bin(8)];case 216:return r=this._view.getInt8(this._offset),this._offset+=1,[r,this._bin(16)];case 217:return n=this._view.getUint8(this._offset),this._offset+=1,this._str(n);case 218:return n=this._view.getUint16(this._offset),this._offset+=2,this._str(n);case 219:return n=this._view.getUint32(this._offset),this._offset+=4,this._str(n);case 220:return n=this._view.getUint16(this._offset),this._offset+=2,this._array(n);case 221:return n=this._view.getUint32(this._offset),this._offset+=4,this._array(n);case 222:return n=this._view.getUint16(this._offset),this._offset+=2,this._map(n);case 223:return n=this._view.getUint32(this._offset),this._offset+=4,this._map(n)}throw new Error("Could not parse")};var Tt=function(t){var e=new Et(t),n=e._parse();if(e._offset!==t.byteLength)throw new Error(t.byteLength-e._offset+" trailing bytes");return n};bt.encode=Ot,bt.decode=Tt;var Ct,At={exports:{}};!function(t){function e(t){if(t)return function(t){for(var n in e.prototype)t[n]=e.prototype[n];return t}(t)}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},e.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var i=0;i=Ut.CONNECT&&t.type<=Ut.CONNECT_ERROR))throw new Error("invalid packet type");if(!Bt(t.nsp))throw new Error("invalid namespace");if(!function(t){switch(t.type){case Ut.CONNECT:return void 0===t.data||qt(t.data);case Ut.DISCONNECT:return void 0===t.data;case Ut.CONNECT_ERROR:return Bt(t.data)||qt(t.data);default:return Array.isArray(t.data)}}(t))throw new Error("invalid payload");if(!(void 0===t.id||xt(t.id)))throw new Error("invalid packet id")},jt.prototype.destroy=function(){};var Dt=_t.Encoder=Pt,Nt=_t.Decoder=jt,Mt=t({__proto__:null,default:_t,protocol:Lt,get PacketType(){return Ct},Encoder:Dt,Decoder:Nt},[_t]);function It(t,e,n){return t.on(e,n),function(){t.off(e,n)}}var Ft=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1}),Ht=function(t){s(r,t);var e=p(r);function r(t,i,s){var a;return n(this,r),(a=e.call(this)).connected=!1,a.recovered=!1,a.receiveBuffer=[],a.sendBuffer=[],a._queue=[],a._queueSeq=0,a.ids=0,a.acks={},a.flags={},a.io=t,a.nsp=i,s&&s.auth&&(a.auth=s.auth),a._opts=o({},s),a.io._autoConnect&&a.open(),a}return i(r,[{key:"disconnected",get:function(){return!this.connected}},{key:"subEvents",value:function(){if(!this.subs){var t=this.io;this.subs=[It(t,"open",this.onopen.bind(this)),It(t,"packet",this.onpacket.bind(this)),It(t,"error",this.onerror.bind(this)),It(t,"close",this.onclose.bind(this))]}}},{key:"active",get:function(){return!!this.subs}},{key:"connect",value:function(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}},{key:"open",value:function(){return this.connect()}},{key:"send",value:function(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r1?n-1:0),i=1;in._opts.retries&&(n._queue.shift(),e&&e(t));else if(n._queue.shift(),e){for(var i=arguments.length,o=new Array(i>1?i-1:0),s=1;s0&&void 0!==arguments[0]&&arguments[0];if(this.connected&&0!==this._queue.length){var e=this._queue[0];e.pending&&!t||(e.pending=!0,e.tryCount++,this.flags=e.flags,this.emit.apply(this,e.args))}}},{key:"packet",value:function(t){t.nsp=this.nsp,this.io._packet(t)}},{key:"onopen",value:function(){var t=this;"function"==typeof this.auth?this.auth((function(e){t._sendConnectPacket(e)})):this._sendConnectPacket(this.auth)}},{key:"_sendConnectPacket",value:function(t){this.packet({type:Ct.CONNECT,data:this._pid?o({pid:this._pid,offset:this._lastOffset},t):t})}},{key:"onerror",value:function(t){this.connected||this.emitReserved("connect_error",t)}},{key:"onclose",value:function(t,e){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e)}},{key:"onpacket",value:function(t){if(t.nsp===this.nsp)switch(t.type){case Ct.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):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 Ct.EVENT:case Ct.BINARY_EVENT:this.onevent(t);break;case Ct.ACK:case Ct.BINARY_ACK:this.onack(t);break;case Ct.DISCONNECT:this.ondisconnect();break;case Ct.CONNECT_ERROR:this.destroy();var e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}},{key:"onevent",value:function(t){var e=t.data||[];null!=t.id&&e.push(this.ack(t.id)),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}},{key:"emitEvent",value:function(t){if(this._anyListeners&&this._anyListeners.length){var e,n=v(this._anyListeners.slice());try{for(n.s();!(e=n.n()).done;){e.value.apply(this,t)}}catch(t){n.e(t)}finally{n.f()}}d(a(r.prototype),"emit",this).apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}},{key:"ack",value:function(t){var e=this,n=!1;return function(){if(!n){n=!0;for(var r=arguments.length,i=new Array(r),o=0;o0&&t.jitter<=1?t.jitter:0,this.attempts=0}$t.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},$t.prototype.reset=function(){this.attempts=0},$t.prototype.setMin=function(t){this.ms=t},$t.prototype.setMax=function(t){this.max=t},$t.prototype.setJitter=function(t){this.jitter=t};var Vt=function(t){s(o,t);var r=p(o);function o(t,i){var s,a;n(this,o),(s=r.call(this)).nsps={},s.subs=[],t&&"object"===e(t)&&(i=t,t=void 0),(i=i||{}).path=i.path||"/socket.io",s.opts=i,V(l(s),i),s.reconnection(!1!==i.reconnection),s.reconnectionAttempts(i.reconnectionAttempts||1/0),s.reconnectionDelay(i.reconnectionDelay||1e3),s.reconnectionDelayMax(i.reconnectionDelayMax||5e3),s.randomizationFactor(null!==(a=i.randomizationFactor)&&void 0!==a?a:.5),s.backoff=new $t({min:s.reconnectionDelay(),max:s.reconnectionDelayMax(),jitter:s.randomizationFactor()}),s.timeout(null==i.timeout?2e4:i.timeout),s._readyState="closed",s.uri=t;var u=i.parser||Mt;return s.encoder=new u.Encoder,s.decoder=new u.Decoder,s._autoConnect=!1!==i.autoConnect,s._autoConnect&&s.open(),s}return i(o,[{key:"reconnection",value:function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}},{key:"reconnectionAttempts",value:function(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}},{key:"reconnectionDelay",value:function(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}},{key:"randomizationFactor",value:function(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}},{key:"reconnectionDelayMax",value:function(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}},{key:"timeout",value:function(t){return arguments.length?(this._timeout=t,this):this._timeout}},{key:"maybeReconnectOnOpen",value:function(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}},{key:"open",value:function(t){var e=this;if(~this._readyState.indexOf("open"))return this;this.engine=new mt(this.uri,this.opts);var n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;var i=It(n,"open",(function(){r.onopen(),t&&t()})),o=function(n){e.cleanup(),e._readyState="closed",e.emitReserved("error",n),t?t(n):e.maybeReconnectOnOpen()},s=It(n,"error",o);if(!1!==this._timeout){var a=this._timeout,u=this.setTimeoutFn((function(){i(),o(new Error("timeout")),n.close()}),a);this.opts.autoUnref&&u.unref(),this.subs.push((function(){e.clearTimeoutFn(u)}))}return this.subs.push(i),this.subs.push(s),this}},{key:"connect",value:function(t){return this.open(t)}},{key:"onopen",value:function(){this.cleanup(),this._readyState="open",this.emitReserved("open");var t=this.engine;this.subs.push(It(t,"ping",this.onping.bind(this)),It(t,"data",this.ondata.bind(this)),It(t,"error",this.onerror.bind(this)),It(t,"close",this.onclose.bind(this)),It(this.decoder,"decoded",this.ondecoded.bind(this)))}},{key:"onping",value:function(){this.emitReserved("ping")}},{key:"ondata",value:function(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}},{key:"ondecoded",value:function(t){var e=this;ct((function(){e.emitReserved("packet",t)}),this.setTimeoutFn)}},{key:"onerror",value:function(t){this.emitReserved("error",t)}},{key:"socket",value:function(t,e){var n=this.nsps[t];return n?this._autoConnect&&!n.active&&n.connect():(n=new Ht(this,t,e),this.nsps[t]=n),n}},{key:"_destroy",value:function(t){for(var e=0,n=Object.keys(this.nsps);e=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{var n=this.backoff.duration();this._reconnecting=!0;var r=this.setTimeoutFn((function(){e.skipReconnect||(t.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open((function(n){n?(e._reconnecting=!1,e.reconnect(),t.emitReserved("reconnect_error",n)):e.onreconnect()})))}),n);this.opts.autoUnref&&r.unref(),this.subs.push((function(){t.clearTimeoutFn(r)}))}}},{key:"onreconnect",value:function(){var t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}]),o}(M),Wt={};function zt(t,n){"object"===e(t)&&(n=t,t=void 0);var r,i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(t=void 0!==n?n.protocol+"//"+t:"https://"+t),r=gt(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";var i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}(t,(n=n||{}).path||"/socket.io"),o=i.source,s=i.id,a=i.path,u=Wt[s]&&a in Wt[s].nsps;return n.forceNew||n["force new connection"]||!1===n.multiplex||u?r=new Vt(o,n):(Wt[s]||(Wt[s]=new Vt(o,n)),r=Wt[s]),i.query&&!n.query&&(n.query=i.queryKey),r.socket(i.path,n)}return o(zt,{Manager:Vt,Socket:Ht,io:zt,connect:zt}),zt})); +//# sourceMappingURL=socket.io.msgpack.min.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map b/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map new file mode 100644 index 000000000..0244c60ca --- /dev/null +++ b/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"socket.io.msgpack.min.js","sources":["../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/index.js","../node_modules/engine.io-client/node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/@socket.io/component-emitter/index.mjs","../node_modules/engine.io-client/build/esm/globalThis.browser.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/contrib/yeast.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/engine.io-client/build/esm/index.js","../node_modules/notepack.io/browser/encode.js","../node_modules/notepack.io/browser/decode.js","../node_modules/notepack.io/lib/index.js","../node_modules/component-emitter/index.js","../node_modules/socket.io-msgpack-parser/index.js","../build/esm/on.js","../build/esm/socket.js","../build/esm/contrib/backo2.js","../build/esm/manager.js","../build/esm/index.js","../build/esm/url.js"],"sourcesContent":["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","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};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data\n .arrayBuffer()\n .then(toArray)\n .then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, encoded => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\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 { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET } from \"./commons.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 function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, encodedPacket => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n }\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* READ_PAYLOAD */;\n }\n else if (state === 2 /* READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n }\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload };\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const 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 if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","/**\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","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 { 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","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.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 createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\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","// 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/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","// 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}\nexport function createCookieJar() { }\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { createCookieJar, 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 }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n if (this.opts.withCredentials) {\n this.cookieJar = createCookieJar();\n }\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 const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\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 return this.createUri(schema, query);\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, cookieJar: this.cookieJar }, 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.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 var _a;\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, true);\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 (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\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 var _a;\n if (xhr.readyState === 3) {\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr);\n }\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 { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { 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;\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 const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\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 return this.createUri(schema, query);\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","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"./websocket-constructor.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n // @ts-ignore\n if (typeof WebTransport !== \"function\") {\n return;\n }\n // @ts-ignore\n this.transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n this.transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this.transport.ready.then(() => {\n this.transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this.writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this.writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this.writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: Polling,\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 (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","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\";\nimport { defaultBinaryType } from \"./transports/websocket-constructor.js\";\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.binaryType = defaultBinaryType;\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 || [\n \"polling\",\n \"websocket\",\n \"webtransport\",\n ];\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: false,\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, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\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 if (this.upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\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 this.resetPingTimeout();\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\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 { 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","'use strict';\n\nfunction utf8Write(view, offset, str) {\n var c = 0;\n for (var i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n view.setUint8(offset++, c);\n }\n else if (c < 0x800) {\n view.setUint8(offset++, 0xc0 | (c >> 6));\n view.setUint8(offset++, 0x80 | (c & 0x3f));\n }\n else if (c < 0xd800 || c >= 0xe000) {\n view.setUint8(offset++, 0xe0 | (c >> 12));\n view.setUint8(offset++, 0x80 | (c >> 6) & 0x3f);\n view.setUint8(offset++, 0x80 | (c & 0x3f));\n }\n else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n view.setUint8(offset++, 0xf0 | (c >> 18));\n view.setUint8(offset++, 0x80 | (c >> 12) & 0x3f);\n view.setUint8(offset++, 0x80 | (c >> 6) & 0x3f);\n view.setUint8(offset++, 0x80 | (c & 0x3f));\n }\n }\n}\n\nfunction utf8Length(str) {\n var c = 0, length = 0;\n for (var 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\nfunction _encode(bytes, defers, value) {\n var type = typeof value, i = 0, l = 0, hi = 0, lo = 0, length = 0, size = 0;\n\n if (type === 'string') {\n length = utf8Length(value);\n\n // fixstr\n if (length < 0x20) {\n bytes.push(length | 0xa0);\n size = 1;\n }\n // str 8\n else if (length < 0x100) {\n bytes.push(0xd9, length);\n size = 2;\n }\n // str 16\n else if (length < 0x10000) {\n bytes.push(0xda, length >> 8, length);\n size = 3;\n }\n // str 32\n else if (length < 0x100000000) {\n bytes.push(0xdb, length >> 24, length >> 16, length >> 8, length);\n size = 5;\n } else {\n throw new Error('String too long');\n }\n defers.push({ _str: value, _length: length, _offset: bytes.length });\n return size + length;\n }\n if (type === 'number') {\n // TODO: encode to float 32?\n\n // float 64\n if (Math.floor(value) !== value || !isFinite(value)) {\n bytes.push(0xcb);\n defers.push({ _float: value, _length: 8, _offset: bytes.length });\n return 9;\n }\n\n if (value >= 0) {\n // positive fixnum\n if (value < 0x80) {\n bytes.push(value);\n return 1;\n }\n // uint 8\n if (value < 0x100) {\n bytes.push(0xcc, value);\n return 2;\n }\n // uint 16\n if (value < 0x10000) {\n bytes.push(0xcd, value >> 8, value);\n return 3;\n }\n // uint 32\n if (value < 0x100000000) {\n bytes.push(0xce, value >> 24, value >> 16, value >> 8, value);\n return 5;\n }\n // uint 64\n hi = (value / Math.pow(2, 32)) >> 0;\n lo = value >>> 0;\n bytes.push(0xcf, hi >> 24, hi >> 16, hi >> 8, hi, lo >> 24, lo >> 16, lo >> 8, lo);\n return 9;\n } else {\n // negative fixnum\n if (value >= -0x20) {\n bytes.push(value);\n return 1;\n }\n // int 8\n if (value >= -0x80) {\n bytes.push(0xd0, value);\n return 2;\n }\n // int 16\n if (value >= -0x8000) {\n bytes.push(0xd1, value >> 8, value);\n return 3;\n }\n // int 32\n if (value >= -0x80000000) {\n bytes.push(0xd2, value >> 24, value >> 16, value >> 8, value);\n return 5;\n }\n // int 64\n hi = Math.floor(value / Math.pow(2, 32));\n lo = value >>> 0;\n bytes.push(0xd3, hi >> 24, hi >> 16, hi >> 8, hi, lo >> 24, lo >> 16, lo >> 8, lo);\n return 9;\n }\n }\n if (type === 'object') {\n // nil\n if (value === null) {\n bytes.push(0xc0);\n return 1;\n }\n\n if (Array.isArray(value)) {\n length = value.length;\n\n // fixarray\n if (length < 0x10) {\n bytes.push(length | 0x90);\n size = 1;\n }\n // array 16\n else if (length < 0x10000) {\n bytes.push(0xdc, length >> 8, length);\n size = 3;\n }\n // array 32\n else if (length < 0x100000000) {\n bytes.push(0xdd, length >> 24, length >> 16, length >> 8, length);\n size = 5;\n } else {\n throw new Error('Array too large');\n }\n for (i = 0; i < length; i++) {\n size += _encode(bytes, defers, value[i]);\n }\n return size;\n }\n\n // fixext 8 / Date\n if (value instanceof Date) {\n var time = value.getTime();\n hi = Math.floor(time / Math.pow(2, 32));\n lo = time >>> 0;\n bytes.push(0xd7, 0, hi >> 24, hi >> 16, hi >> 8, hi, lo >> 24, lo >> 16, lo >> 8, lo);\n return 10;\n }\n\n if (value instanceof ArrayBuffer) {\n length = value.byteLength;\n\n // bin 8\n if (length < 0x100) {\n bytes.push(0xc4, length);\n size = 2;\n } else\n // bin 16\n if (length < 0x10000) {\n bytes.push(0xc5, length >> 8, length);\n size = 3;\n } else\n // bin 32\n if (length < 0x100000000) {\n bytes.push(0xc6, length >> 24, length >> 16, length >> 8, length);\n size = 5;\n } else {\n throw new Error('Buffer too large');\n }\n defers.push({ _bin: value, _length: length, _offset: bytes.length });\n return size + length;\n }\n\n if (typeof value.toJSON === 'function') {\n return _encode(bytes, defers, value.toJSON());\n }\n\n var keys = [], key = '';\n\n var allKeys = Object.keys(value);\n for (i = 0, l = allKeys.length; i < l; i++) {\n key = allKeys[i];\n if (typeof value[key] !== 'function') {\n keys.push(key);\n }\n }\n length = keys.length;\n\n // fixmap\n if (length < 0x10) {\n bytes.push(length | 0x80);\n size = 1;\n }\n // map 16\n else if (length < 0x10000) {\n bytes.push(0xde, length >> 8, length);\n size = 3;\n }\n // map 32\n else if (length < 0x100000000) {\n bytes.push(0xdf, length >> 24, length >> 16, length >> 8, length);\n size = 5;\n } else {\n throw new Error('Object too large');\n }\n\n for (i = 0; i < length; i++) {\n key = keys[i];\n size += _encode(bytes, defers, key);\n size += _encode(bytes, defers, value[key]);\n }\n return size;\n }\n // false/true\n if (type === 'boolean') {\n bytes.push(value ? 0xc3 : 0xc2);\n return 1;\n }\n // fixext 1 / undefined\n if (type === 'undefined') {\n bytes.push(0xd4, 0, 0);\n return 3;\n }\n throw new Error('Could not encode');\n}\n\nfunction encode(value) {\n var bytes = [];\n var defers = [];\n var size = _encode(bytes, defers, value);\n var buf = new ArrayBuffer(size);\n var view = new DataView(buf);\n\n var deferIndex = 0;\n var deferWritten = 0;\n var nextOffset = -1;\n if (defers.length > 0) {\n nextOffset = defers[0]._offset;\n }\n\n var defer, deferLength = 0, offset = 0;\n for (var i = 0, l = bytes.length; i < l; i++) {\n view.setUint8(deferWritten + i, bytes[i]);\n if (i + 1 !== nextOffset) { continue; }\n defer = defers[deferIndex];\n deferLength = defer._length;\n offset = deferWritten + nextOffset;\n if (defer._bin) {\n var bin = new Uint8Array(defer._bin);\n for (var j = 0; j < deferLength; j++) {\n view.setUint8(offset + j, bin[j]);\n }\n } else if (defer._str) {\n utf8Write(view, offset, defer._str);\n } else if (defer._float !== undefined) {\n view.setFloat64(offset, defer._float);\n }\n deferIndex++;\n deferWritten += deferLength;\n if (defers[deferIndex]) {\n nextOffset = defers[deferIndex]._offset;\n }\n }\n return buf;\n}\n\nmodule.exports = encode;\n","'use strict';\n\nfunction Decoder(buffer) {\n this._offset = 0;\n if (buffer instanceof ArrayBuffer) {\n this._buffer = buffer;\n this._view = new DataView(this._buffer);\n } else if (ArrayBuffer.isView(buffer)) {\n this._buffer = buffer.buffer;\n this._view = new DataView(this._buffer, buffer.byteOffset, buffer.byteLength);\n } else {\n throw new Error('Invalid argument');\n }\n}\n\nfunction utf8Read(view, offset, length) {\n var string = '', chr = 0;\n for (var i = offset, end = offset + length; i < end; i++) {\n var byte = view.getUint8(i);\n if ((byte & 0x80) === 0x00) {\n string += String.fromCharCode(byte);\n continue;\n }\n if ((byte & 0xe0) === 0xc0) {\n string += String.fromCharCode(\n ((byte & 0x1f) << 6) |\n (view.getUint8(++i) & 0x3f)\n );\n continue;\n }\n if ((byte & 0xf0) === 0xe0) {\n string += String.fromCharCode(\n ((byte & 0x0f) << 12) |\n ((view.getUint8(++i) & 0x3f) << 6) |\n ((view.getUint8(++i) & 0x3f) << 0)\n );\n continue;\n }\n if ((byte & 0xf8) === 0xf0) {\n chr = ((byte & 0x07) << 18) |\n ((view.getUint8(++i) & 0x3f) << 12) |\n ((view.getUint8(++i) & 0x3f) << 6) |\n ((view.getUint8(++i) & 0x3f) << 0);\n if (chr >= 0x010000) { // surrogate pair\n chr -= 0x010000;\n string += String.fromCharCode((chr >>> 10) + 0xD800, (chr & 0x3FF) + 0xDC00);\n } else {\n string += String.fromCharCode(chr);\n }\n continue;\n }\n throw new Error('Invalid byte ' + byte.toString(16));\n }\n return string;\n}\n\nDecoder.prototype._array = function (length) {\n var value = new Array(length);\n for (var i = 0; i < length; i++) {\n value[i] = this._parse();\n }\n return value;\n};\n\nDecoder.prototype._map = function (length) {\n var key = '', value = {};\n for (var i = 0; i < length; i++) {\n key = this._parse();\n value[key] = this._parse();\n }\n return value;\n};\n\nDecoder.prototype._str = function (length) {\n var value = utf8Read(this._view, this._offset, length);\n this._offset += length;\n return value;\n};\n\nDecoder.prototype._bin = function (length) {\n var value = this._buffer.slice(this._offset, this._offset + length);\n this._offset += length;\n return value;\n};\n\nDecoder.prototype._parse = function () {\n var prefix = this._view.getUint8(this._offset++);\n var value, length = 0, type = 0, hi = 0, lo = 0;\n\n if (prefix < 0xc0) {\n // positive fixint\n if (prefix < 0x80) {\n return prefix;\n }\n // fixmap\n if (prefix < 0x90) {\n return this._map(prefix & 0x0f);\n }\n // fixarray\n if (prefix < 0xa0) {\n return this._array(prefix & 0x0f);\n }\n // fixstr\n return this._str(prefix & 0x1f);\n }\n\n // negative fixint\n if (prefix > 0xdf) {\n return (0xff - prefix + 1) * -1;\n }\n\n switch (prefix) {\n // nil\n case 0xc0:\n return null;\n // false\n case 0xc2:\n return false;\n // true\n case 0xc3:\n return true;\n\n // bin\n case 0xc4:\n length = this._view.getUint8(this._offset);\n this._offset += 1;\n return this._bin(length);\n case 0xc5:\n length = this._view.getUint16(this._offset);\n this._offset += 2;\n return this._bin(length);\n case 0xc6:\n length = this._view.getUint32(this._offset);\n this._offset += 4;\n return this._bin(length);\n\n // ext\n case 0xc7:\n length = this._view.getUint8(this._offset);\n type = this._view.getInt8(this._offset + 1);\n this._offset += 2;\n return [type, this._bin(length)];\n case 0xc8:\n length = this._view.getUint16(this._offset);\n type = this._view.getInt8(this._offset + 2);\n this._offset += 3;\n return [type, this._bin(length)];\n case 0xc9:\n length = this._view.getUint32(this._offset);\n type = this._view.getInt8(this._offset + 4);\n this._offset += 5;\n return [type, this._bin(length)];\n\n // float\n case 0xca:\n value = this._view.getFloat32(this._offset);\n this._offset += 4;\n return value;\n case 0xcb:\n value = this._view.getFloat64(this._offset);\n this._offset += 8;\n return value;\n\n // uint\n case 0xcc:\n value = this._view.getUint8(this._offset);\n this._offset += 1;\n return value;\n case 0xcd:\n value = this._view.getUint16(this._offset);\n this._offset += 2;\n return value;\n case 0xce:\n value = this._view.getUint32(this._offset);\n this._offset += 4;\n return value;\n case 0xcf:\n hi = this._view.getUint32(this._offset) * Math.pow(2, 32);\n lo = this._view.getUint32(this._offset + 4);\n this._offset += 8;\n return hi + lo;\n\n // int\n case 0xd0:\n value = this._view.getInt8(this._offset);\n this._offset += 1;\n return value;\n case 0xd1:\n value = this._view.getInt16(this._offset);\n this._offset += 2;\n return value;\n case 0xd2:\n value = this._view.getInt32(this._offset);\n this._offset += 4;\n return value;\n case 0xd3:\n hi = this._view.getInt32(this._offset) * Math.pow(2, 32);\n lo = this._view.getUint32(this._offset + 4);\n this._offset += 8;\n return hi + lo;\n\n // fixext\n case 0xd4:\n type = this._view.getInt8(this._offset);\n this._offset += 1;\n if (type === 0x00) {\n this._offset += 1;\n return void 0;\n }\n return [type, this._bin(1)];\n case 0xd5:\n type = this._view.getInt8(this._offset);\n this._offset += 1;\n return [type, this._bin(2)];\n case 0xd6:\n type = this._view.getInt8(this._offset);\n this._offset += 1;\n return [type, this._bin(4)];\n case 0xd7:\n type = this._view.getInt8(this._offset);\n this._offset += 1;\n if (type === 0x00) {\n hi = this._view.getInt32(this._offset) * Math.pow(2, 32);\n lo = this._view.getUint32(this._offset + 4);\n this._offset += 8;\n return new Date(hi + lo);\n }\n return [type, this._bin(8)];\n case 0xd8:\n type = this._view.getInt8(this._offset);\n this._offset += 1;\n return [type, this._bin(16)];\n\n // str\n case 0xd9:\n length = this._view.getUint8(this._offset);\n this._offset += 1;\n return this._str(length);\n case 0xda:\n length = this._view.getUint16(this._offset);\n this._offset += 2;\n return this._str(length);\n case 0xdb:\n length = this._view.getUint32(this._offset);\n this._offset += 4;\n return this._str(length);\n\n // array\n case 0xdc:\n length = this._view.getUint16(this._offset);\n this._offset += 2;\n return this._array(length);\n case 0xdd:\n length = this._view.getUint32(this._offset);\n this._offset += 4;\n return this._array(length);\n\n // map\n case 0xde:\n length = this._view.getUint16(this._offset);\n this._offset += 2;\n return this._map(length);\n case 0xdf:\n length = this._view.getUint32(this._offset);\n this._offset += 4;\n return this._map(length);\n }\n\n throw new Error('Could not parse');\n};\n\nfunction decode(buffer) {\n var decoder = new Decoder(buffer);\n var value = decoder._parse();\n if (decoder._offset !== buffer.byteLength) {\n throw new Error((buffer.byteLength - decoder._offset) + ' trailing bytes');\n }\n return value;\n}\n\nmodule.exports = decode;\n","exports.encode = require('./encode');\nexports.decode = require('./decode');\n","\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n // Remove event specific arrays for event types that no\r\n // one is subscribed for to avoid memory leak.\r\n if (callbacks.length === 0) {\r\n delete this._callbacks['$' + event];\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n\r\n var args = new Array(arguments.length - 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n for (var i = 1; i < arguments.length; i++) {\r\n args[i - 1] = arguments[i];\r\n }\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n","var msgpack = require(\"notepack.io\");\nvar Emitter = require(\"component-emitter\");\n\nexports.protocol = 5;\n\n/**\n * Packet types (see https://github.com/socketio/socket.io-protocol)\n */\n\nvar PacketType = (exports.PacketType = {\n CONNECT: 0,\n DISCONNECT: 1,\n EVENT: 2,\n ACK: 3,\n CONNECT_ERROR: 4,\n});\n\nvar isInteger =\n Number.isInteger ||\n function (value) {\n return (\n typeof value === \"number\" &&\n isFinite(value) &&\n Math.floor(value) === value\n );\n };\n\nvar isString = function (value) {\n return typeof value === \"string\";\n};\n\nvar isObject = function (value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n};\n\nfunction Encoder() {}\n\nEncoder.prototype.encode = function (packet) {\n return [msgpack.encode(packet)];\n};\n\nfunction Decoder() {}\n\nEmitter(Decoder.prototype);\n\nDecoder.prototype.add = function (obj) {\n var decoded = msgpack.decode(obj);\n this.checkPacket(decoded);\n this.emit(\"decoded\", decoded);\n};\n\nfunction isDataValid(decoded) {\n switch (decoded.type) {\n case PacketType.CONNECT:\n return decoded.data === undefined || isObject(decoded.data);\n case PacketType.DISCONNECT:\n return decoded.data === undefined;\n case PacketType.CONNECT_ERROR:\n return isString(decoded.data) || isObject(decoded.data);\n default:\n return Array.isArray(decoded.data);\n }\n}\n\nDecoder.prototype.checkPacket = function (decoded) {\n var isTypeValid =\n isInteger(decoded.type) &&\n decoded.type >= PacketType.CONNECT &&\n decoded.type <= PacketType.CONNECT_ERROR;\n if (!isTypeValid) {\n throw new Error(\"invalid packet type\");\n }\n\n if (!isString(decoded.nsp)) {\n throw new Error(\"invalid namespace\");\n }\n\n if (!isDataValid(decoded)) {\n throw new Error(\"invalid payload\");\n }\n\n var isAckValid = decoded.id === undefined || isInteger(decoded.id);\n if (!isAckValid) {\n throw new Error(\"invalid packet id\");\n }\n};\n\nDecoder.prototype.destroy = function () {};\n\nexports.Encoder = Encoder;\nexports.Decoder = Decoder;\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","/**\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 { 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 const onError = (err) => {\n this.cleanup();\n this._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 this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(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(() => {\n this.clearTimeoutFn(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","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 { 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"],"names":["PACKET_TYPES","Object","create","PACKET_TYPES_REVERSE","keys","forEach","key","TEXT_ENCODER","ERROR_PACKET","type","data","withNativeBlob","Blob","prototype","toString","call","withNativeArrayBuffer","ArrayBuffer","isView","obj","buffer","encodePacket","_ref","supportsBinary","callback","encodeBlobAsBase64","fileReader","FileReader","onload","content","result","split","readAsDataURL","toArray","Uint8Array","byteOffset","byteLength","chars","lookup","i","charCodeAt","TEXT_DECODER","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","substring","length","decoded","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","len","p","arraybuffer","bytes","decode","SEPARATOR","String","fromCharCode","createPacketEncoderStream","TransformStream","transform","packet","controller","arrayBuffer","then","encoded","TextEncoder","encode","encodePacketToBinary","header","payloadLength","DataView","setUint8","view","setUint16","setBigUint64","BigInt","enqueue","totalLength","chunks","reduce","acc","chunk","concatChunks","size","shift","j","slice","Emitter","mixin","on","addEventListener","event","fn","this","_callbacks","push","Emitter$1","once","off","apply","arguments","removeListener","removeAllListeners","removeEventListener","cb","callbacks","splice","emit","args","Array","emitReserved","listeners","hasListeners","globalThisShim","self","window","Function","pick","_len","attr","_key","k","hasOwnProperty","NATIVE_SET_TIMEOUT","globalThis","setTimeout","NATIVE_CLEAR_TIMEOUT","clearTimeout","installTimerFunctions","opts","useNativeTimers","setTimeoutFn","bind","clearTimeoutFn","prev","TransportError","_Error","_inherits","_super","_createSuper","reason","description","context","_this","_classCallCheck","_createClass","_wrapNativeSuper","Error","Transport","_Emitter","_super2","_this2","writable","_assertThisInitialized","query","socket","value","_get","_getPrototypeOf","readyState","doOpen","doClose","onClose","packets","write","onPacket","details","onPause","schema","undefined","_hostname","_port","path","_query","hostname","indexOf","port","secure","Number","encodedQuery","str","encodeURIComponent","alphabet","map","seed","num","Math","floor","yeast","now","Date","XMLHttpRequest","err","hasCORS","XHR","xdomain","e","concat","join","empty","hasXHR2","responseType","Polling","_Transport","polling","location","isSSL","protocol","xd","forceBase64","withCredentials","cookieJar","createCookieJar","get","poll","pause","total","doPoll","_this3","encodedPayload","encodedPackets","decodedPacket","decodePayload","onOpen","_this4","close","_this5","count","encodePayload","doWrite","timestampRequests","timestampParam","sid","b64","createUri","_extends","Request","uri","_this6","req","request","method","xhrStatus","onError","_this7","onData","pollXhr","_this8","_a","_this9","xhr","open","extraHeaders","setDisableHeaderCheck","setRequestHeader","addCookies","requestTimeout","timeout","onreadystatechange","parseCookies","status","onLoad","send","document","index","requestsCount","requests","cleanup","fromError","abort","responseText","attachEvent","unloadHandler","nextTick","Promise","resolve","WebSocket","MozWebSocket","isReactNative","navigator","product","toLowerCase","WS","check","protocols","headers","ws","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","onmessage","ev","onerror","_loop","lastPacket","WT","WebTransport","transport","transportOptions","name","closed","ready","createBidirectionalStream","stream","decoderStream","maxPayload","TextDecoder","state","expectedLength","isBinary","headerArray","getUint16","n","getUint32","pow","createPacketDecoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","writer","getWriter","read","done","transports","websocket","webtransport","re","parts","parse","src","b","replace","m","exec","source","host","authority","ipv6uri","pathNames","regx","names","queryKey","$0","$1","$2","Socket","writeBuffer","_typeof","prevBufferLen","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","qs","qry","pairs","l","pair","decodeURIComponent","id","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","beforeunloadEventListener","offlineEventListener","EIO","priorWebsocketSuccess","createTransport","setTransport","onDrain","failed","onTransportOpen","msg","upgrading","flush","freezeTransport","error","onTransportClose","onupgrade","to","probe","resetPingTimeout","onHandshake","JSON","sendPacket","code","filterUpgrades","getWritablePackets","payloadSize","c","utf8Length","ceil","options","compress","cleanupAndClose","waitForUpgrade","filteredUpgrades","Socket$1","utf8Write","offset","_encode","defers","hi","lo","_str","_length","_offset","isFinite","_float","isArray","time","getTime","_bin","toJSON","allKeys","encode_1","buf","deferIndex","deferWritten","nextOffset","defer","deferLength","bin","setFloat64","Decoder","_buffer","_view","_array","_parse","_map","string","chr","end","byte","getUint8","utf8Read","prefix","getInt8","getFloat32","getFloat64","getInt16","getInt32","decode_1","decoder","lib","require$$0","require$$1","module","exports","msgpack","socket_ioMsgpackParser","PacketType","PacketType_1","CONNECT","DISCONNECT","EVENT","ACK","CONNECT_ERROR","isInteger","isString","isObject","Encoder","add","checkPacket","nsp","isDataValid","destroy","Encoder_1","Decoder_1","RESERVED_EVENTS","freeze","connect","connect_error","disconnect","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","flags","auth","_opts","_autoConnect","subs","onpacket","subEvents","_readyState","unshift","_len2","_key2","retries","fromQueue","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","notifyOutgoingListeners","ackTimeout","timer","_len3","_key3","_len4","_key4","withErr","reject","arg1","arg2","tryCount","pending","_len5","responseArgs","_key5","_drainQueue","force","_packet","_sendConnectPacket","_pid","pid","_lastOffset","onconnect","BINARY_EVENT","onevent","BINARY_ACK","onack","ondisconnect","message","emitEvent","_anyListeners","_step","_iterator","_createForOfIteratorHelper","s","f","sent","_len6","_key6","emitBuffered","subDestroy","listener","_anyOutgoingListeners","_step2","_iterator2","Backoff","ms","min","max","factor","jitter","attempts","duration","rand","random","deviation","reset","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","autoConnect","v","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","maybeReconnectOnOpen","errorSub","onping","ondata","ondecoded","active","_i","_nsps","_close","delay","onreconnect","attempt","cache","parsed","loc","test","href","url","sameNamespace","forceNew","multiplex"],"mappings":"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"} \ No newline at end of file diff --git a/packages/puter-dot-js/src/lib/utils.js b/packages/puter-dot-js/src/lib/utils.js new file mode 100644 index 000000000..6706b75b3 --- /dev/null +++ b/packages/puter-dot-js/src/lib/utils.js @@ -0,0 +1,436 @@ +/** + * Parses a given response text into a JSON object. If the parsing fails due to invalid JSON format, + * the original response text is returned. + * + * @param {string} responseText - The response text to be parsed into JSON. It is expected to be a valid JSON string. + * @returns {Object|string} The parsed JSON object if the responseText is valid JSON, otherwise returns the original responseText. + * @example + * // returns { key: "value" } + * parseResponse('{"key": "value"}'); + * + * @example + * // returns "Invalid JSON" + * parseResponse('Invalid JSON'); + */ +async function parseResponse(target) { + if ( target.responseType === 'blob' ) { + // Get content type of the blob + const contentType = target.getResponseHeader('content-type'); + if ( contentType.startsWith('application/json') ) { + // If the blob is JSON, parse it + const text = await target.response.text(); + try { + return JSON.parse(text); + } catch (error) { + return text; + } + }else if ( contentType.startsWith('application/octet-stream') ) { + // If the blob is an octet stream, return the blob + return target.response; + } + + // Otherwise return an ojbect + return { + success: true, + result: target.response, + }; + } + const responseText = target.responseText; + try { + return JSON.parse(responseText); + } catch (error) { + return responseText; + } +} + +/** + * A function that generates a UUID (Universally Unique Identifier) using the version 4 format, + * which are random UUIDs. It uses the cryptographic number generator available in modern browsers. + * + * The generated UUID is a 36 character string (32 alphanumeric characters separated by 4 hyphens). + * It follows the pattern: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, where x is any hexadecimal digit + * and y is one of 8, 9, A, or B. + * + * @returns {string} Returns a new UUID v4 string. + * + * @example + * + * let id = this.#uuidv4(); // Generate a new UUID + * + */ +function uuidv4(){ + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) + ); +} + + +/** + * Initializes and returns an XMLHttpRequest object configured for a specific API endpoint, method, and headers. + * + * @param {string} endpoint - The API endpoint to which the request will be sent. This is appended to the API origin URL. + * @param {string} APIOrigin - The origin URL of the API. This is prepended to the endpoint. + * @param {string} authToken - The authorization token used for accessing the API. This is included in the request headers. + * @param {string} [method='post'] - The HTTP method to be used for the request. Defaults to 'post' if not specified. + * @param {string} [contentType='application/json;charset=UTF-8'] - The content type of the request. Defaults to + * 'application/json;charset=UTF-8' if not specified. + * + * @returns {XMLHttpRequest} The initialized XMLHttpRequest object. + */ +function initXhr(endpoint, APIOrigin, authToken, method= "post", contentType = "application/json;charset=UTF-8", responseType = undefined) { + const xhr = new XMLHttpRequest(); + xhr.open(method, APIOrigin + endpoint, true); + xhr.setRequestHeader("Authorization", "Bearer " + authToken); + xhr.setRequestHeader("Content-Type", contentType); + xhr.responseType = responseType; + return xhr; +} + +/** + * Handles an HTTP response by invoking appropriate callback functions and resolving or rejecting a promise. + * + * @param {Function} success_cb - An optional callback function for successful responses. It should take a response object + * as its only argument. + * @param {Function} error_cb - An optional callback function for error handling. It should take an error object + * as its only argument. + * @param {Function} resolve_func - A function used to resolve a promise. It should take a response object + * as its only argument. + * @param {Function} reject_func - A function used to reject a promise. It should take an error object + * as its only argument. + * @param {Object} response - The HTTP response object from the request. Expected to have 'status' and 'responseText' + * properties. + * + * @returns {void} The function does not return a value but will either resolve or reject a promise based on the + * response status. + */ +async function handle_resp(success_cb, error_cb, resolve_func, reject_func, response){ + const resp = await parseResponse(response); + // error - unauthorized + if(response.status === 401){ + // if error callback is provided, call it + if(error_cb && typeof error_cb === 'function') + error_cb({status: 401, message: 'Unauthorized'}) + // reject promise + return reject_func({status: 401, message: 'Unauthorized'}) + } + // error - other + else if(response.status !== 200){ + // if error callback is provided, call it + if(error_cb && typeof error_cb === 'function') + error_cb(resp) + // reject promise + return reject_func(resp) + } + // success + else{ + // This is a driver error + if(resp.success === false && resp.error?.code === 'permission_denied'){ + let perm = await puter.ui.requestPermission({permission: 'driver:puter-image-generation:generate'}); + // try sending again if permission was granted + if(perm.granted){ + // todo repeat request + } + } + // if success callback is provided, call it + if(success_cb && typeof success_cb === 'function') + success_cb(resp); + // resolve with success + return resolve_func(resp); + } +} + +/** + * Handles an error by invoking a specified error callback and then rejecting a promise. + * + * @param {Function} error_cb - An optional callback function that is called if it's provided. + * This function should take an error object as its only argument. + * @param {Function} reject_func - A function used to reject a promise. It should take an error object + * as its only argument. + * @param {Object} error - The error object that is passed to both the error callback and the reject function. + * + * @returns {void} The function does not return a value but will call the reject function with the error. + */ +function handle_error(error_cb, reject_func, error){ + // if error callback is provided, call it + if(error_cb && typeof error_cb === 'function') + error_cb(error) + // reject promise + return reject_func(error) +} + +function setupXhrEventHandlers(xhr, success_cb, error_cb, resolve_func, reject_func) { + // load: success or error + xhr.addEventListener('load', function(e){ + return handle_resp(success_cb, error_cb, resolve_func, reject_func, this, xhr); + }); + + // error + xhr.addEventListener('error', function(e){ + return handle_error(error_cb, reject_func, this); + }) +} + +const NOOP = () => {}; +class Valid { + static callback (cb) { + return (cb && typeof cb === 'function') ? cb : undefined; + } +} + +/** + * Makes the hybrid promise/callback function for a particular driver method + * @param {string[]} arg_defs - argument names (for now; definitions eventually) + * @param {string} driverInterface - name of the interface + * @param {string} driverMethod - name of the method + */ +function make_driver_method(arg_defs, driverInterface, driverMethod, settings = {}) { + return async function (...args) { + let driverArgs = {}; + let options = {}; + + // Check if the first argument is an object and use it as named parameters + if (args.length === 1 && typeof args[0] === 'object' && !Array.isArray(args[0])) { + driverArgs = { ...args[0] }; + options = { + success: driverArgs.success, + error: driverArgs.error, + }; + // Remove callback functions from driverArgs if they exist + delete driverArgs.success; + delete driverArgs.error; + } else { + // Handle as individual arguments + arg_defs.forEach((argName, index) => { + driverArgs[argName] = args[index]; + }); + options = { + success: args[arg_defs.length], + error: args[arg_defs.length + 1], + }; + } + + // preprocess + if(settings.preprocess && typeof settings.preprocess === 'function'){ + driverArgs = settings.preprocess(driverArgs); + } + + return await driverCall(options, driverInterface, driverMethod, driverArgs, settings); + }; +} + +async function driverCall (options, driverInterface, driverMethod, driverArgs, settings) { + const tp = new TeePromise(); + + driverCall_( + options, + tp.resolve.bind(tp), + tp.reject.bind(tp), + driverInterface, + driverMethod, + driverArgs, + undefined, + undefined, + settings, + ); + + return await tp; +} + +// This function encapsulates the logic for sending a driver call request +async function driverCall_( + options = {}, + resolve_func, reject_func, + driverInterface, driverMethod, driverArgs, + method, + contentType = 'application/json;charset=UTF-8', + settings = {}, +) { + // If there is no authToken and the environment is web, try authenticating with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + return reject_func({ + error: { + code: 'auth_canceled', message: 'Authentication canceled' + } + }) + } + } + + const success_cb = Valid.callback(options.success) ?? NOOP; + const error_cb = Valid.callback(options.error) ?? NOOP; + // create xhr object + const xhr = initXhr('/drivers/call', puter.APIOrigin, puter.authToken, 'POST', contentType); + + if ( settings.responseType ) { + xhr.responseType = settings.responseType; + } + + // load: success or error + xhr.addEventListener('load', async function(response){ + const resp = await parseResponse(response.target); + // HTTP Error - unauthorized + if(response.status === 401 || resp?.code === "token_auth_failed"){ + if(resp?.code === "token_auth_failed" && puter.env === 'web'){ + try{ + puter.resetAuthToken(); + await puter.ui.authenticateWithPuter(); + }catch(e){ + return reject_func({ + error: { + code: 'auth_canceled', message: 'Authentication canceled' + } + }) + } + } + // if error callback is provided, call it + if(error_cb && typeof error_cb === 'function') + error_cb({status: 401, message: 'Unauthorized'}) + // reject promise + return reject_func({status: 401, message: 'Unauthorized'}) + } + // HTTP Error - other + else if(response.status && response.status !== 200){ + // if error callback is provided, call it + error_cb(resp) + // reject promise + return reject_func(resp) + } + // HTTP Success + else{ + // Driver Error: permission denied + if(resp.success === false && resp.error?.code === 'permission_denied'){ + let perm = await puter.ui.requestPermission({permission: 'driver:' + driverInterface + ':' + driverMethod}); + // try sending again if permission was granted + if(perm.granted){ + // repeat request with permission granted + return driverCall_(options, resolve_func, reject_func, driverInterface, driverMethod, driverArgs, method, contentType, settings); + }else{ + // if error callback is provided, call it + error_cb(resp) + // reject promise + return reject_func(resp) + } + } + // Driver Error: other + else if(resp.success === false){ + // if error callback is provided, call it + error_cb(resp) + // reject promise + return reject_func(resp) + } + + let result = resp.result !== undefined ? resp.result : resp; + if ( settings.transform ) { + result = await settings.transform(result); + } + + // Success: if callback is provided, call it + if(resolve_func.success) + success_cb(result); + // Success: resolve with the result + return resolve_func(result); + } + }); + + // error + xhr.addEventListener('error', function(e){ + return handle_error(error_cb, reject_func, this); + }) + + // send request + xhr.send(JSON.stringify({ + interface: driverInterface, + test_mode: settings?.test_mode, + method: driverMethod, + args: driverArgs, + })); +} + +class TeePromise { + static STATUS_PENDING = {}; + static STATUS_RUNNING = {}; + static STATUS_DONE = {}; + constructor () { + this.status_ = this.constructor.STATUS_PENDING; + this.donePromise = new Promise((resolve, reject) => { + this.doneResolve = resolve; + this.doneReject = reject; + }); + } + get status () { + return this.status_; + } + set status (status) { + this.status_ = status; + if ( status === this.constructor.STATUS_DONE ) { + this.doneResolve(); + } + } + resolve (value) { + this.status_ = this.constructor.STATUS_DONE; + this.doneResolve(value); + } + awaitDone () { + return this.donePromise; + } + then (fn, rfn) { + return this.donePromise.then(fn, rfn); + } + + reject (err) { + this.status_ = this.constructor.STATUS_DONE; + this.doneReject(err); + } + + /** + * @deprecated use then() instead + */ + onComplete(fn) { + return this.then(fn); + } +} + +async function blob_to_url (blob) { + const tp = new TeePromise(); + const reader = new FileReader(); + reader.onloadend = () => tp.resolve(reader.result); + reader.readAsDataURL(blob); + return await tp; +} + +function blobToDataUri(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function(event) { + resolve(event.target.result); + }; + reader.onerror = function(error) { + reject(error); + }; + reader.readAsDataURL(blob); + }); +} + +function arrayBufferToDataUri(arrayBuffer) { + return new Promise((resolve, reject) => { + const blob = new Blob([arrayBuffer]); + const reader = new FileReader(); + reader.onload = function(event) { + resolve(event.target.result); + }; + reader.onerror = function(error) { + reject(error); + }; + reader.readAsDataURL(blob); + }); +} + +export {parseResponse, uuidv4, handle_resp, handle_error, initXhr, setupXhrEventHandlers, driverCall, + TeePromise, + make_driver_method, + blob_to_url, + arrayBufferToDataUri, + blobToDataUri, +}; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/AI.js b/packages/puter-dot-js/src/modules/AI.js new file mode 100644 index 000000000..346325107 --- /dev/null +++ b/packages/puter-dot-js/src/modules/AI.js @@ -0,0 +1,253 @@ +import * as utils from '../lib/utils.js' + +class AI{ + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token and resets the socket connection with the updated token, if applicable. + * + * @param {string} authToken - The new authentication token. + * @memberof [AI] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [AI] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + img2txt = async (...args) => { + let MAX_INPUT_SIZE = 10 * 1024 * 1024; + let options = {}; + let testMode = false; + + // Check that the argument is not undefined or null + if(!args){ + throw({message: 'Arguments are required', code: 'arguments_required'}); + } + + // if argument is string transform it to the object that the API expects + if (typeof args[0] === 'string' || args[0] instanceof Blob) { + options.source = args[0]; + } + + // if input is a blob, transform it to a data URI + if (args[0].source instanceof Blob) { + options.source = await utils.blobToDataUri(args[0].source); + } + + // check input size + if (options.source.length > this.MAX_INPUT_SIZE) { + throw { message: 'Input size cannot be larger than ' + MAX_INPUT_SIZE, code: 'input_too_large' }; + } + + // determine if test mode is enabled + if (typeof args[1] === 'boolean' && args[1] === true || + typeof args[2] === 'boolean' && args[2] === true || + typeof args[3] === 'boolean' && args[3] === true) { + testMode = true; + } + + console.log(args, options); + return await utils.make_driver_method(['source'], 'puter-ocr', 'recognize', { + test_mode: testMode ?? false, + transform: async (result) => { + let str = ''; + for (let i = 0; i < result?.blocks?.length; i++) { + if("text/textract:LINE" === result.blocks[i].type) + str += result.blocks[i].text + "\n"; + } + return str; + } + }).call(this, options); + } + + txt2speech = async (...args) => { + let MAX_INPUT_SIZE = 3000; + let options = {}; + let testMode = false; + + if(!args){ + throw({message: 'Arguments are required', code: 'arguments_required'}); + } + + // if argument is string transform it to the object that the API expects + if (typeof args[0] === 'string') { + options = { text: args[0] }; + } + + // if second argument is string, it's the language + if (args[1] && typeof args[1] === 'string') { + options.language = args[1]; + } + + // check input size + if (options.text.length > this.MAX_INPUT_SIZE) { + throw { message: 'Input size cannot be larger than ' + MAX_INPUT_SIZE, code: 'input_too_large' }; + } + + // determine if test mode is enabled + if (typeof args[1] === 'boolean' && args[1] === true || + typeof args[2] === 'boolean' && args[2] === true || + typeof args[3] === 'boolean' && args[3] === true) { + testMode = true; + } + + return await utils.make_driver_method(['source'], 'puter-tts', 'synthesize', { + responseType: 'blob', + test_mode: testMode ?? false, + transform: async (result) => { + const url = await utils.blob_to_url(result); + const audio = new Audio(url); + audio.toString = () => url; + audio.valueOf = () => url; + return audio; + } + }).call(this, options); + } + + + // accepts either a string or an array of message objects + // if string, it's treated as the prompt which is a shorthand for { messages: [{ content: prompt }] } + // if object, it's treated as the full argument object that the API expects + chat = async (...args) => { + let options = {}; + let testMode = false; + + // Check that the argument is not undefined or null + if(!args){ + throw({message: 'Arguments are required', code: 'arguments_required'}); + } + + // ai.chat(prompt) + // ai.chat(prompt, testMode) + if (typeof args[0] === 'string' && (!args[1] || typeof args[1] === 'boolean')) { + options = { messages: [{ content: args[0] }] }; + } + // ai.chat(prompt, imageURL/File) + // ai.chat(prompt, imageURL/File, testMode) + else if (typeof args[0] === 'string' && (typeof args[1] === 'string' || args[1] instanceof File)) { + // if imageURL is a File, transform it to a data URI + if(args[1] instanceof File){ + args[1] = await utils.blobToDataUri(args[1]); + } + + // parse args[1] as an image_url object + options = { + vision: true, + messages: [ + { + content: [ + args[0], + { + image_url: { + url: args[1] + } + } + ], + } + ] + }; + } + // chat(prompt, [imageURLs]) + else if (typeof args[0] === 'string' && Array.isArray(args[1])) { + // parse args[1] as an array of image_url objects + for (let i = 0; i < args[1].length; i++) { + args[1][i] = { image_url: { url: args[1][i] } }; + } + options = { + vision: true, + messages: [ + { + content: [ + args[0], + ...args[1] + ], + } + ] + }; + } + // chat([messages]) + else if (Array.isArray(args[0])) { + options = { messages: args[0] }; + } + + // determine if testMode is enabled + if (typeof args[1] === 'boolean' && args[1] === true || + typeof args[2] === 'boolean' && args[2] === true || + typeof args[3] === 'boolean' && args[3] === true) { + testMode = true; + } + + // Call the original chat.complete method + return await utils.make_driver_method(['messages'], 'puter-chat-completion', 'complete', { + test_mode: testMode ?? false, + transform: async (result) => { + result.toString = () => { + return result.message?.content; + }; + + result.valueOf = () => { + return result.message?.content; + } + + return result; + } + }).call(this, options); + } + + txt2img = async (...args) => { + let options = {}; + let testMode = false; + + if(!args){ + throw({message: 'Arguments are required', code: 'arguments_required'}); + } + + // if argument is string transform it to the object that the API expects + if (typeof args[0] === 'string') { + options = { prompt: args[0] }; + } + + // if second argument is string, it's the `testMode` + if (typeof args[1] === 'boolean' && args[1] === true) { + testMode = true; + } + + // Call the original chat.complete method + return await utils.make_driver_method(['prompt'], 'puter-image-generation', 'generate', { + responseType: 'blob', + test_mode: testMode ?? false, + transform: async blob => { + let img = new Image(); + img.src = await utils.blob_to_url(blob); + img.toString = () => img.src; + img.valueOf = () => img.src; + return img; + } + }).call(this, options); + } +} + +export default AI; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/Apps.js b/packages/puter-dot-js/src/modules/Apps.js new file mode 100644 index 000000000..c36d1be51 --- /dev/null +++ b/packages/puter-dot-js/src/modules/Apps.js @@ -0,0 +1,158 @@ +import * as utils from '../lib/utils.js' + +class Apps{ + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token. + * + * @param {string} authToken - The new authentication token. + * @memberof [Apps] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [Apps] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + list = async (...args) => { + let options = {}; + + options = { "predicate": ['user-can-edit'] }; + + return utils.make_driver_method(['uid'], 'puter-apps', 'select').call(this, options); + } + + create = async (...args) => { + let options = {}; + // * allows for: puter.apps.new('example-app') * + if (typeof args[0] === 'string') { + let indexURL = args[1]; + let title = args[2] ?? args[0]; + + options = { object: { name: args[0], index_url: indexURL, title: title}}; + }else if (typeof args[0] === 'object' && args[0] !== null) { + let options_raw = args[0]; + options = { + object: { + name: options_raw.name, + index_url: options_raw.indexURL, + title: options_raw.title, + description: options_raw.description, + icon: options_raw.icon, + maximize_on_start: options_raw.maximizeOnStart, + filetype_associations: options_raw.filetypeAssociations, + } + }; + } + // Call the original chat.complete method + return await utils.make_driver_method(['object'], 'puter-apps', 'create').call(this, options); + } + + update = async(...args) => { + let options = {}; + + // if there is one string argument, assume it is the app name + // * allows for: puter.apps.update('example-app') * + if (Array.isArray(args) && typeof args[0] === 'string') { + let object_raw = args[1]; + let object = { + name: object_raw.name, + index_url: object_raw.indexURL, + title: object_raw.title, + description: object_raw.description, + icon: object_raw.icon, + maximize_on_start: object_raw.maximizeOnStart, + filetype_associations: object_raw.filetypeAssociations, + }; + + options = { id: { name: args[0]}, object: object}; + } + + // Call the original chat.complete method + return await utils.make_driver_method(['object'], 'puter-apps', 'update').call(this, options); + } + + get = async(...args) => { + let options = {}; + // if there is one string argument, assume it is the app name + // * allows for: puter.apps.get('example-app') * + if (Array.isArray(args) && typeof args[0] === 'string') { + options = { id: {name: args[0]}}; + } + return utils.make_driver_method(['uid'], 'puter-apps', 'read').call(this, options); + } + + delete = async(...args) => { + let options = {}; + // if there is one string argument, assume it is the app name + // * allows for: puter.apps.get('example-app') * + if (Array.isArray(args) && typeof args[0] === 'string') { + options = { id: {name: args[0]}}; + } + return utils.make_driver_method(['uid'], 'puter-apps', 'delete').call(this, options); + } + + getDeveloperProfile = function(...args){ + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + }; + } + + return new Promise((resolve, reject) => { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + }; + } + + return new Promise((resolve, reject) => { + const xhr = utils.initXhr('/get-dev-profile', puter.APIOrigin, puter.authToken, 'get'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) + }); + } +} + +export default Apps; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/Auth.js b/packages/puter-dot-js/src/modules/Auth.js new file mode 100644 index 000000000..7c877bbe2 --- /dev/null +++ b/packages/puter-dot-js/src/modules/Auth.js @@ -0,0 +1,115 @@ +import * as utils from '../lib/utils.js' + +class Auth{ + // Used to generate a unique message id for each message sent to the host environment + // we start from 1 because 0 is falsy and we want to avoid that for the message id + #messageID = 1; + + + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token. + * + * @param {string} authToken - The new authentication token. + * @memberof [Auth] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [Auth] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + signIn = () =>{ + return new Promise((resolve, reject) => { + let msg_id = this.#messageID++; + + let w = 600; + let h = 600; + let title = 'Puter'; + var left = (screen.width/2)-(w/2); + var top = (screen.height/2)-(h/2); + window.open(puter.defaultGUIOrigin + '/action/sign-in?embedded_in_popup=true&msg_id=' + msg_id, + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); + + window.addEventListener('message', function(e){ + if(e.data.msg_id == msg_id){ + // remove redundant attributes + delete e.data.msg_id; + delete e.data.msg; + + if(e.data.success){ + // set the auth token + puter.setAuthToken(e.data.token); + + resolve(e.data); + }else + reject(e.data); + + // delete the listener + window.removeEventListener('message', this); + } + }); + }); + } + + isSignedIn = () =>{ + if(puter.authToken) + return true; + else + return false; + } + + getUser = function(...args){ + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + }; + } + + return new Promise((resolve, reject) => { + const xhr = utils.initXhr('/whoami', puter.APIOrigin, puter.authToken, 'get'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) + } + + signOut = () =>{ + puter.resetAuthToken(); + } +} + +export default Auth \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FSItem.js b/packages/puter-dot-js/src/modules/FSItem.js new file mode 100644 index 000000000..0df2ec5f3 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FSItem.js @@ -0,0 +1,98 @@ +import path from "../lib/path.js" + +class FSItem{ + constructor(options){ + this.readURL = options.readURL ?? options.read_url; + this.writeURL = options.writeURL ?? options.write_url; + this.metadataURL = options.metadataURL ?? options.metadata_url; + this.name = options.name ?? options.fsentry_name; + this.uid = options.uid ?? options.uuid ?? options.fsentry_uid ?? options.fsentry_id ?? options.fsentry_uuid ?? options.id; + this.id = this.uid; + this.uuid = this.uid; + this.path = options.path ?? options.fsentry_path; + this.size = options.size ?? options.fsentry_size; + this.accessed = options.accessed ?? options.fsentry_accessed; + this.modified = options.modified ?? options.fsentry_modified; + this.created = options.created ?? options.fsentry_created; + this.isDirectory = (options.isDirectory || options.is_dir || options.fsentry_is_dir) ? true : false; + } + + write = async function(data){ + return puter.fs.write( + this.path, + new File([data], this.name), + { + overwrite: true, + dedupeName: false, + }, + ); + } + + // Watches for changes to the item, and calls the callback function + // with the new data when a change is detected. + watch = function(callback){ + // todo - implement + } + + open = function(callback){ + // todo - implement + } + + // Set wallpaper + setAsWallpaper = function(options, callback){ + // todo - implement + } + + rename = function(new_name){ + return puter.fs.rename(this.uid, new_name); + } + + move = function(dest_path, overwrite=false, new_name){ + return puter.fs.move(this.path, dest_path, overwrite, new_name); + } + + copy = function(destination_directory, auto_rename=false, overwrite=false){ + return puter.fs.copy(this.path, destination_directory, auto_rename, overwrite); + } + + delete = function(){ + return puter.fs.delete(this.path); + } + + versions = async function(){ + // todo - implement + } + + trash = function(){ + // todo make sure puter allows for moving to trash by default + // todo implement trashing + } + + mkdir = async function(name, auto_rename = false){ + // Don't proceed if this is not a directory, throw error + if(!this.isDirectory) + throw new Error('mkdir() can only be called on a directory'); + + // mkdir + return puter.fs.mkdir(path.join(this.path, name)); + } + + metadata = async function(){ + // todo - implement + } + + readdir = async function(){ + // Don't proceed if this is not a directory, throw error + if(!this.isDirectory) + throw new Error('readdir() can only be called on a directory'); + + // readdir + return puter.fs.readdir(this.path); + } + + read = async function(){ + return puter.fs.read(this.path); + } +} + +export default FSItem; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/index.js b/packages/puter-dot-js/src/modules/FileSystem/index.js new file mode 100644 index 000000000..e39805cc8 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/index.js @@ -0,0 +1,133 @@ +import io from '../../lib/socket.io/socket.io.esm.min.js'; + +// Operations +import readdir from "./operations/readdir.js"; +import stat from "./operations/stat.js"; +import space from "./operations/space.js"; +import mkdir from "./operations/mkdir.js"; +import copy from "./operations/copy.js"; +import rename from "./operations/rename.js"; +import upload from "./operations/upload.js"; +import read from "./operations/read.js"; +import move from "./operations/move.js"; +import write from "./operations/write.js"; +import sign from "./operations/sign.js"; +// Why is this called deleteFSEntry instead of just delete? because delete is +// a reserved keyword in javascript +import deleteFSEntry from "./operations/deleteFSEntry.js"; + +class FileSystem{ + + readdir = readdir; + stat = stat; + space = space; + mkdir = mkdir; + copy = copy; + rename = rename; + upload = upload; + read = read; + // Why is this called deleteFSEntry instead of just delete? because delete is + // a reserved keyword in javascript. + delete = deleteFSEntry; + move = move; + write = write; + sign = sign; + + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * and connects to the socket. + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + // Connect socket. + this.initializeSocket(); + } + + /** + * Initializes the socket connection to the server using the current API origin. + * If a socket connection already exists, it disconnects it before creating a new one. + * Sets up various event listeners on the socket to handle different socket events like + * connect, disconnect, reconnect, reconnect_attempt, reconnect_error, reconnect_failed, and error. + * + * @memberof FileSystem + * @returns {void} + */ + initializeSocket() { + if (this.socket) { + this.socket.disconnect(); + } + + this.socket = io(this.APIOrigin, { + query: { + auth_token: this.authToken, + } + }); + + this.bindSocketEvents(); + } + + bindSocketEvents() { + this.socket.on('connect', () => { + console.log('FileSystem Socket: Connected', this.socket.id); + }); + + this.socket.on('disconnect', () => { + console.log('FileSystem Socket: Disconnected'); + }); + + this.socket.on('reconnect', (attempt) => { + console.log('FileSystem Socket: Reconnected', this.socket.id); + }); + + this.socket.on('reconnect_attempt', (attempt) => { + console.log('FileSystem Socket: Reconnection Attemps', attempt); + }); + + this.socket.on('reconnect_error', (error) => { + console.log('FileSystem Socket: Reconnection Error', error); + }); + + this.socket.on('reconnect_failed', () => { + console.log('FileSystem Socket: Reconnection Failed'); + }); + + this.socket.on('error', (error) => { + console.error('FileSystem Socket Error:', error); + }); + } + + /** + * Sets a new authentication token and resets the socket connection with the updated token. + * + * @param {string} authToken - The new authentication token. + * @memberof [FileSystem] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + // reset socket + this.initializeSocket(); + } + + /** + * Sets the API origin and resets the socket connection with the updated API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [Apps] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + // reset socket + this.initializeSocket(); + } +} + +export default FileSystem; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/copy.js b/packages/puter-dot-js/src/modules/FileSystem/operations/copy.js new file mode 100644 index 000000000..4e33162a0 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/copy.js @@ -0,0 +1,61 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const copy = function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + source: args[0], + destination: args[1], + overwrite: args[2]?.overwrite, + new_name: args[2]?.newName || args[2]?.new_name, + create_missing_parents: args[2]?.createMissingParents || args[2]?.create_missing_parents, + new_metadata: args[2]?.newMetadata || args[2]?.new_metadata, + original_client_socket_id: args[2]?.excludeSocketID || args[2]?.original_client_socket_id, + success: args[3], + error: args[4], + // Add more if needed... + }; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // convert paths to absolute path + options.source = getAbsolutePathForApp(options.source); + options.destination = getAbsolutePathForApp(options.destination); + + // create xhr object + const xhr = utils.initXhr('/copy', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(JSON.stringify({ + original_client_socket_id: this.socket.id, + socket_id: this.socket.id, + source: options.source, + destination: options.destination, + overwrite: options.overwrite, + new_name: (options.new_name || options.newName), + // if user is copying an item to where its source is, change the name so there is no conflict + dedupe_name: (options.dedupe_name || options.dedupeName), + })); + }) +} + +export default copy; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js b/packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js new file mode 100644 index 000000000..0b8644b65 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js @@ -0,0 +1,59 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +// why is this called deleteFSEntry instead of just delete? +// because delete is a reserved keyword in javascript +const deleteFSEntry = async function(...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } + // Otherwise, we assume separate arguments are provided + else { + options = { + paths: args[0], + recursive: args[1]?.recursive ?? true, + descendantsOnly: args[1]?.descendantsOnly ?? false, + }; + } + + // If paths is a string, convert to array + // this is to make it easier for the user to provide a single path without having to wrap it in an array + let paths = options.paths; + if(typeof paths === 'string') + paths = [paths]; + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/delete', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + // convert paths to absolute paths + paths = paths.map((path) => { + return getAbsolutePathForApp(path); + }) + + xhr.send(JSON.stringify({ + paths: paths, + descendants_only: (options.descendants_only || options.descendantsOnly) ?? false, + recursive: options.recursive ?? true, + })); + }) +} + +export default deleteFSEntry; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js b/packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js new file mode 100644 index 000000000..c256ab654 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js @@ -0,0 +1,59 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; +import path from "../../../lib/path.js" + +const mkdir = function (...args) { + let options = {}; + + // If first argument is a string and the second is an object, or if the first is an object + if ((typeof args[0] === 'string' && typeof args[1] === 'object' && !(args[1] instanceof Function)) || (typeof args[0] === 'object' && args[0] !== null)) { + // If it's a string followed by an object, it means path then options + if (typeof args[0] === 'string') { + options.path = args[0]; + // Merge the options + Object.assign(options, args[1]); + options.success = args[2]; + options.error = args[3]; + } else { + options = args[0]; + } + } else if (typeof args[0] === 'string') { + // it means it's a path then functions (success and optionally error) + options.path = args[0]; + options.success = args[1]; + options.error = args[2]; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/mkdir', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + options.path = getAbsolutePathForApp(options.path); + + xhr.send(JSON.stringify({ + parent: path.dirname(options.path), + path: path.basename(options.path), + overwrite: options.overwrite ?? false, + dedupe_name: (options.rename || options.dedupeName) ?? false, + shortcut_to: options.shortcutTo, + original_client_socket_id: this.socket.id, + create_missing_parents: (options.recursive || options.createMissingParents) ?? false, + })); + }) +} + +export default mkdir; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/move.js b/packages/puter-dot-js/src/modules/FileSystem/operations/move.js new file mode 100644 index 000000000..eb87c245b --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/move.js @@ -0,0 +1,57 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const move = function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + source: args[0], + destination: args[1], + overwrite: args[2]?.overwrite, + new_name: args[2]?.newName || args[2]?.new_name, + create_missing_parents: args[2]?.createMissingParents || args[2]?.create_missing_parents, + new_metadata: args[2]?.newMetadata || args[2]?.new_metadata, + original_client_socket_id: args[2]?.excludeSocketID || args[2]?.original_client_socket_id, + }; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // convert source and destination to absolute path + options.source = getAbsolutePathForApp(options.source); + options.destination = getAbsolutePathForApp(options.destination); + + // create xhr object + const xhr = utils.initXhr('/move', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(JSON.stringify({ + source: options.source, + destination: options.destination, + overwrite: options.overwrite, + new_name: (options.new_name || options.newName), + create_missing_parents: (options.create_missing_parents || options.createMissingParents), + new_metadata: (options.new_metadata || options.newMetadata), + original_client_socket_id: options.excludeSocketID, + })); + }) +} + +export default move; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/read.js b/packages/puter-dot-js/src/modules/FileSystem/operations/read.js new file mode 100644 index 000000000..971bc59d8 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/read.js @@ -0,0 +1,44 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const read = function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + path: typeof args[0] === 'string' ? args[0] : (typeof args[0] === 'object' && args[0] !== null ? args[0].path : args[0]), + success: args[1], + error: args[2], + }; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // convert path to absolute path + options.path = getAbsolutePathForApp(options.path); + + // create xhr object + const xhr = utils.initXhr('/read?file=' + encodeURIComponent(options.path), this.APIOrigin, this.authToken, 'get', "application/json;charset=UTF-8", 'blob'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) +} + +export default read; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js b/packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js new file mode 100644 index 000000000..fe2f2e145 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js @@ -0,0 +1,46 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const readdir = async function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + path: args[0], + success: args[1], + error: args[2], + }; + } + + return new Promise(async (resolve, reject) => { + // path is required + if(!options.path){ + throw new Error({ code: 'NO_PATH', message: 'No path provided.' }); + } + + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/readdir', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(JSON.stringify({path: getAbsolutePathForApp(options.path)})); + }) +} + +export default readdir; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/rename.js b/packages/puter-dot-js/src/modules/FileSystem/operations/rename.js new file mode 100644 index 000000000..c670e482a --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/rename.js @@ -0,0 +1,56 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const rename = function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + path: args[0], + new_name: args[1], + success: args[2], + error: args[3], + // Add more if needed... + }; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/rename', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + let dataToSend = { + original_client_socket_id: options.excludeSocketID || options.original_client_socket_id, + new_name: options.new_name || options.newName, + }; + + if (options.uid !== undefined) { + dataToSend.uid = options.uid; + } else if (options.path !== undefined) { + // If dirPath is not provided or it's not starting with a slash, it means it's a relative path + // in that case, we need to prepend the app's root directory to it + dataToSend.path = getAbsolutePathForApp(options.path); + } + + xhr.send(JSON.stringify(dataToSend)); + }) +} + +export default rename; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/sign.js b/packages/puter-dot-js/src/modules/FileSystem/operations/sign.js new file mode 100644 index 000000000..c2d5efb50 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/sign.js @@ -0,0 +1,103 @@ + +import * as utils from '../../../lib/utils.js'; + +/** + * Signs a file system entry or entries and optionally calls a provided callback with the result. + * If a single item is passed, it is converted into an array. + * Sends a POST request to the server to sign the items. + * + * @param {(Object|Object[])} items - The file system entry or entries to be signed. Can be a single object or an array of objects. + * @param {function} [callback] - Optional callback function to be invoked with the result of the signing. + * @returns {(Object|Object[])} If a single item was passed, returns a single object. If multiple items were passed, returns an array of objects. + * @throws {Error} If the AJAX request fails. + * @async + */ +const sign = function(...args){ + let options; + + // Otherwise, we assume separate arguments are provided + options = { + app_uid: args[0], + items: args[1], + success: args[2], + error: args[3], + // Add more if needed... + }; + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + + let items = options.items; + + // if only a single item is passed, convert it to array + // so that the code below can work with arrays + if(!Array.isArray(items)){ + items = [items] + } + + // create xhr object + const xhr = utils.initXhr('/sign', this.APIOrigin, this.authToken); + + // response + xhr.addEventListener('load', async function(e){ + const resp = await utils.parseResponse(this); + // error + if(this.status !== 200){ + // if error callback is provided, call it + if(options.error && typeof options.error === 'function') + options.error(resp) + // reject promise + return reject(resp) + } + // success + else{ + let res = resp; + let result; + let token = res.token; + // if only a single item was passed, return a single object + if(items.length == 1){ + result = {...(res.signatures[0])}; + } + // if multiple items were passed, return an array of objects + else{ + let obj=[]; + for(let i=0; i { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/df', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) +} + +export default space; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/stat.js b/packages/puter-dot-js/src/modules/FileSystem/operations/stat.js new file mode 100644 index 000000000..28f9d6498 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/stat.js @@ -0,0 +1,57 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; + +const stat = async function (...args) { + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + path: args[0], + options: typeof args[1] === 'object' ? args[1] : {}, + success: typeof args[1] === 'object' ? args[2] : args[1], + error: typeof args[1] === 'object' ? args[3] : args[2], + // Add more if needed... + }; + } + + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject('Authentication failed.'); + } + } + + // create xhr object + const xhr = utils.initXhr('/stat', this.APIOrigin, this.authToken); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + let dataToSend = {}; + if (options.uid !== undefined) { + dataToSend.uid = options.uid; + } else if (options.path !== undefined) { + // If dirPath is not provided or it's not starting with a slash, it means it's a relative path + // in that case, we need to prepend the app's root directory to it + dataToSend.path = getAbsolutePathForApp(options.path); + } + + dataToSend.return_subdomains = options.returnSubdomains; + dataToSend.return_permissions = options.returnPermissions; + dataToSend.return_versions = options.returnVersions; + dataToSend.return_size = options.returnSize; + + xhr.send(JSON.stringify(dataToSend)); + }) +} + +export default stat; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/upload.js b/packages/puter-dot-js/src/modules/FileSystem/operations/upload.js new file mode 100644 index 000000000..8aab5d6c9 --- /dev/null +++ b/packages/puter-dot-js/src/modules/FileSystem/operations/upload.js @@ -0,0 +1,419 @@ +import * as utils from '../../../lib/utils.js'; +import getAbsolutePathForApp from '../utils/getAbsolutePathForApp.js'; +import path from "../../../lib/path.js" + +const upload = async function(items, dirPath, options = {}){ + return new Promise(async (resolve, reject) => { + // If auth token is not provided and we are in the web environment, + // try to authenticate with Puter + if(!puter.authToken && puter.env === 'web'){ + try{ + await puter.ui.authenticateWithPuter(); + }catch(e){ + // if authentication fails, throw an error + reject(e); + } + } + + // xhr object to be used for the upload + let xhr = new XMLHttpRequest(); + + // Can not write to root + if(dirPath === '/'){ + // if error callback is provided, call it + if(options.error && typeof options.error === 'function') + options.error('Can not upload to root directory.'); + return reject('Can not upload to root directory.'); + } + + // If dirPath is not provided or it's not starting with a slash, it means it's a relative path + // in that case, we need to prepend the app's root directory to it + dirPath = getAbsolutePathForApp(dirPath); + + // Generate a unique ID for this upload operation + // This will be used to uniquely identify this operation and its progress + // across servers and clients + const operation_id = utils.uuidv4(); + + // Call 'init' callback if provided + // init is basically a hook that allows the user to get the operation ID and the XMLHttpRequest object + if(options.init && typeof options.init === 'function'){ + options.init(operation_id, xhr); + } + + // keeps track of the amount of data uploaded to the server + let bytes_uploaded_to_server = 0; + // keeps track of the amount of data uploaded to the cloud + let bytes_uploaded_to_cloud = 0; + + // This will hold the normalized entries to be uploaded + // Since 'items' could be a DataTransferItemList, FileList, File, or an array of any of these, + // we need to normalize it into an array of consistently formatted objects which will be held in 'entries' + let entries; + + // will hold the total size of the upload + let total_size = 0; + let file_count = 0; + + let seemsToBeParsedDataTransferItems = false; + if(Array.isArray(items) && items.length > 0){ + for(let i=0; i { + if ( entry_a.isDirectory && ! entry_b.isDirectory ) return -1; + if ( ! entry_a.isDirectory && entry_b.isDirectory ) return 1; + if ( entry_a.isDirectory && entry_b.isDirectory ) return 0; + + return entry_a.size - entry_b.size; + }); + } + // FileList/File + else if(items instanceof File || items[0] instanceof File || items instanceof FileList || items[0] instanceof FileList){ + if(!Array.isArray(items)) + entries = items instanceof FileList ? Array.from(items) : [items]; + else + entries = items; + + // Sort entries by size ascending + entries.sort((entry_a, entry_b) => { + return entry_a.size - entry_b.size; + }) + // add FullPath property to each entry + for(let i=0; i { + if(msg.operation_id === operation_id){ + bytes_uploaded_to_cloud += msg.loaded_diff + } + } + + // Handle upload progress events from server + this.socket.on('upload.progress', progress_handler); + + // keeps track of the amount of data uploaded to the server + let previous_chunk_uploaded = null; + + // open request to server + xhr.open("post",(this.APIOrigin +'/batch'), true); + // set auth header + xhr.setRequestHeader("Authorization", "Bearer " + this.authToken); + + // ----------------------------------------------- + // Upload progress: client -> server + // ----------------------------------------------- + xhr.upload.addEventListener('progress', function(e){ + // update operation tracker + let chunk_uploaded; + if(previous_chunk_uploaded === null){ + chunk_uploaded = e.loaded; + previous_chunk_uploaded = 0; + }else{ + chunk_uploaded = e.loaded - previous_chunk_uploaded; + } + previous_chunk_uploaded += chunk_uploaded; + bytes_uploaded_to_server += chunk_uploaded; + + // overall operation progress + let op_progress = ((bytes_uploaded_to_cloud + bytes_uploaded_to_server)/total_size * 100).toFixed(2); + op_progress = op_progress > 100 ? 100 : op_progress; + + // progress callback function + if(options.progress && typeof options.progress === 'function') + options.progress(operation_id, op_progress); + }) + + // ----------------------------------------------- + // Upload progress: server -> cloud + // the following code will check the progress of the upload every 100ms + // ----------------------------------------------- + let cloud_progress_check_interval = setInterval(function() { + // operation progress + let op_progress = ((bytes_uploaded_to_cloud + bytes_uploaded_to_server)/total_size * 100).toFixed(2); + + op_progress = op_progress > 100 ? 100 : op_progress; + if(options.progress && typeof options.progress === 'function') + options.progress(operation_id, op_progress); + }, 100); + + // ----------------------------------------------- + // onabort + // ----------------------------------------------- + xhr.onabort = ()=>{ + // stop the cloud upload progress tracker + clearInterval(cloud_progress_check_interval); + // remove progress handler + this.socket.off('upload.progress', progress_handler); + // if an 'abort' callback is provided, call it + if(options.abort && typeof options.abort === 'function') + options.abort(operation_id); + } + + // ----------------------------------------------- + // on success/error + // ----------------------------------------------- + xhr.onreadystatechange = async (e)=>{ + if (xhr.readyState === 4) { + const resp = await utils.parseResponse(xhr); + // Error + if((xhr.status >= 400 && xhr.status < 600) || (options.strict && xhr.status === 218)) { + // stop the cloud upload progress tracker + clearInterval(cloud_progress_check_interval); + + // remove progress handler + this.socket.off('upload.progress', progress_handler); + + // If this is a 'strict' upload (i.e. status code is 218), we need to find out which operation failed + // and call the error callback with that operation. + if(options.strict && xhr.status === 218){ + // find the operation that failed + let failed_operation; + for(let i=0; i{ + // if we are in the gui environment, return the relative path as is + if(puter.env === 'gui') + return relativePath; + + // if no relative path is provided, use the current working directory + if(!relativePath) + relativePath = '.'; + + // If relativePath is not provided, or it's not starting with a slash or tilde, + // it means it's a relative path. In that case, prepend the app's root directory. + if (!relativePath || (!relativePath.startsWith('/') && !relativePath.startsWith('~') && puter.appID)) { + relativePath = path.join('~/AppData', puter.appID, relativePath); + } + + return relativePath; +} + +export default getAbsolutePathForApp; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/Hosting.js b/packages/puter-dot-js/src/modules/Hosting.js new file mode 100644 index 000000000..fa2234164 --- /dev/null +++ b/packages/puter-dot-js/src/modules/Hosting.js @@ -0,0 +1,136 @@ +import * as utils from '../lib/utils.js'; +import getAbsolutePathForApp from './FileSystem/utils/getAbsolutePathForApp.js'; + +class Hosting{ + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token. + * + * @param {string} authToken - The new authentication token. + * @memberof [Router] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [Apps] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + // todo document the `Subdomain` object. + list = utils.make_driver_method([], 'puter-subdomains', 'select'); + + create = async (...args) => { + let options = {}; + // * allows for: puter.hosting.new('example-subdomain') * + if (typeof args[0] === 'string' && args.length === 1) { + // if subdomain is in the format of a `subdomain.puter.site` or `subdomain.puter.com`, extract the subdomain + // and use it as the subdomain. This is to make development easier. + if (args[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)) { + args[0] = args[0].split('.')[0]; + } + + options = { object: { subdomain: args[0] }}; + } + // if there are two string arguments, assume they are the subdomain and the target directory + // * allows for: puter.hosting.new('example-subdomain', '/path/to/target') * + else if (Array.isArray(args) && args.length === 2 && typeof args[0] === 'string') { + // if subdomain is in the format of a `subdomain.puter.site` or `subdomain.puter.com`, extract the subdomain + // and use it as the subdomain. This is to make development easier. + if (args[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)) { + args[0] = args[0].split('.')[0]; + } + + // if the target directory is not an absolute path, make it an absolute path relative to the app's root directory + if(args[1]){ + args[1] = getAbsolutePathForApp(args[1]); + } + + options = { object: { subdomain: args[0], root_dir: args[1] }}; + } + // allows for: puter.hosting.new({ subdomain: 'subdomain' }) + else if (typeof args[0] === 'object') { + options = { object: args[0] }; + } + // Call the original chat.complete method + return await utils.make_driver_method(['object'], 'puter-subdomains', 'create').call(this, options); + } + + update = async(...args) => { + let options = {}; + // If there are two string arguments, assume they are the subdomain and the target directory + // * allows for: puter.hosting.update('example-subdomain', '/path/to/target') * + if (Array.isArray(args) && typeof args[0] === 'string') { + // if subdomain is in the format of a `subdomain.puter.site` or `subdomain.puter.com`, extract the subdomain + // and use it as the subdomain. This is to make development easier. + if (args[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)) { + args[0] = args[0].split('.')[0]; + } + + // if the target directory is not an absolute path, make it an absolute path relative to the app's root directory + if(args[1]){ + args[1] = getAbsolutePathForApp(args[1]); + } + + options = { id: {subdomain: args[0]}, object: { root_dir: args[1] ?? null }}; + } + + // Call the original chat.complete method + return await utils.make_driver_method(['object'], 'puter-subdomains', 'update').call(this, options); + } + + get = async(...args) => { + let options = {}; + // if there is one string argument, assume it is the subdomain + // * allows for: puter.hosting.get('example-subdomain') * + if (Array.isArray(args) && typeof args[0] === 'string') { + // if subdomain is in the format of a `subdomain.puter.site` or `subdomain.puter.com`, extract the subdomain + // and use it as the subdomain. This is to make development easier. + if (args[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)) { + args[0] = args[0].split('.')[0]; + } + + options = { id: {subdomain: args[0]}}; + } + return utils.make_driver_method(['uid'], 'puter-subdomains', 'read').call(this, options); + } + + delete = async(...args) => { + let options = {}; + // if there is one string argument, assume it is the subdomain + // * allows for: puter.hosting.get('example-subdomain') * + if (Array.isArray(args) && typeof args[0] === 'string') { + // if subdomain is in the format of a `subdomain.puter.site` or `subdomain.puter.com`, extract the subdomain + // and use it as the subdomain. This is to make development easier. + if (args[0].match(/^[a-z0-9]+\.puter\.(site|com)$/)) { + args[0] = args[0].split('.')[0]; + } + + options = { id: {subdomain: args[0]}}; + } + return utils.make_driver_method(['uid'], 'puter-subdomains', 'delete').call(this, options); + } +} + +export default Hosting; diff --git a/packages/puter-dot-js/src/modules/KV.js b/packages/puter-dot-js/src/modules/KV.js new file mode 100644 index 000000000..c04056065 --- /dev/null +++ b/packages/puter-dot-js/src/modules/KV.js @@ -0,0 +1,205 @@ +import * as utils from '../lib/utils.js' + +class KV{ + MAX_KEY_SIZE = 1024; + MAX_VALUE_SIZE = 400 * 1024; + + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token. + * + * @param {string} authToken - The new authentication token. + * @memberof [KV] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [KV] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + /** + * Resolves to 'true' on success, or rejects with an error on failure + * + * `key` cannot be undefined or null. + * `key` size cannot be larger than 1mb. + * `value` size cannot be larger than 10mb. + */ + set = utils.make_driver_method(['key', 'value'], 'puter-kvstore', 'set',{ + preprocess: (args)=>{ + // key cannot be undefined or null + if(args.key === undefined || args.key === null){ + throw { message: 'Key cannot be undefined', code: 'key_undefined'}; + } + // key size cannot be larger than MAX_KEY_SIZE + if(args.key.length > this.MAX_KEY_SIZE){ + throw {message: 'Key size cannot be larger than ' + this.MAX_KEY_SIZE, code: 'key_too_large'}; + } + // value size cannot be larger than MAX_VALUE_SIZE + if(args.value && args.value.length > this.MAX_VALUE_SIZE){ + throw {message: 'Value size cannot be larger than ' + this.MAX_VALUE_SIZE, code: 'value_too_large'}; + } + return args; + } + }) + + /** + * Resolves to the value if the key exists, or `undefined` if the key does not exist. Rejects with an error on failure. + */ + get = utils.make_driver_method(['key'], 'puter-kvstore', 'get', { + preprocess: (args)=>{ + // key size cannot be larger than MAX_KEY_SIZE + if(args.key.length > this.MAX_KEY_SIZE){ + throw ({message: 'Key size cannot be larger than ' + this.MAX_KEY_SIZE, code: 'key_too_large'}); + } + + return args; + }, + transform: (res)=>{ + return res; + } + }) + + incr = async(...args) => { + let options = {}; + + // arguments are required + if(!args || args.length === 0){ + throw ({message: 'Arguments are required', code: 'arguments_required'}); + } + + options.key = args[0]; + options.amount = args[1] ?? 1; + + // key size cannot be larger than MAX_KEY_SIZE + if(options.key.length > this.MAX_KEY_SIZE){ + throw ({message: 'Key size cannot be larger than ' + this.MAX_KEY_SIZE, code: 'key_too_large'}); + } + + return utils.make_driver_method(['key'], 'puter-kvstore', 'incr').call(this, options); + } + + decr = async(...args) => { + let options = {}; + + // arguments are required + if(!args || args.length === 0){ + throw ({message: 'Arguments are required', code: 'arguments_required'}); + } + + options.key = args[0]; + options.amount = args[1] ?? 1; + + // key size cannot be larger than MAX_KEY_SIZE + if(options.key.length > this.MAX_KEY_SIZE){ + throw ({message: 'Key size cannot be larger than ' + this.MAX_KEY_SIZE, code: 'key_too_large'}); + } + + return utils.make_driver_method(['key'], 'puter-kvstore', 'decr').call(this, options); + } + + // resolves to 'true' on success, or rejects with an error on failure + // will still resolve to 'true' if the key does not exist + del = utils.make_driver_method(['key'], 'puter-kvstore', 'del', { + preprocess: (args)=>{ + // key size cannot be larger than this.MAX_KEY_SIZE + if(args.key.length > this.MAX_KEY_SIZE){ + throw ({message: 'Key size cannot be larger than ' + this.MAX_KEY_SIZE, code: 'key_too_large'}); + } + + return args; + } + }); + + list = async(...args) => { + let options = {}; + let pattern; + let returnValues = false; + + // list(true) or list(pattern, true) will return the key-value pairs + if((args && args.length === 1 && args[0] === true) || (args && args.length === 2 && args[1] === true)){ + options = {}; + returnValues = true; + } + // return only the keys, default behavior + else{ + options = { as: 'keys'}; + } + + // list(pattern) + // list(pattern, true) + if((args && args.length === 1 && typeof args[0] === 'string') || (args && args.length === 2 && typeof args[0] === 'string' && args[1] === true)){ + pattern = args[0]; + } + + return utils.make_driver_method([], 'puter-kvstore', 'list', { + transform: (res)=>{ + // glob pattern was provided + if(pattern){ + // consider both the key and the value + if(!returnValues) { + let keys = res.filter((key)=>{ + return globMatch(pattern, key); + }); + return keys; + }else{ + let keys = res.filter((key_value_pair)=>{ + return globMatch(pattern, key_value_pair.key); + }); + return keys; + } + } + + return res; + } + }).call(this, options); + } + + // resolve to 'true' on success, or rejects with an error on failure + // will still resolve to 'true' if there are no keys + flush = utils.make_driver_method([], 'puter-kvstore', 'flush') + + // clear is an alias for flush + clear = this.flush; +} + + +function globMatch(pattern, str) { + const escapeRegExp = (string) => string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + + let regexPattern = escapeRegExp(pattern) + .replace(/\\\*/g, '.*') // Replace * with .* + .replace(/\\\?/g, '.') // Replace ? with . + .replace(/\\\[/g, '[') // Replace [ with [ + .replace(/\\\]/g, ']') // Replace ] with ] + .replace(/\\\^/g, '^'); // Replace ^ with ^ + + let re = new RegExp('^' + regexPattern + '$'); + return re.test(str); +} + + + +export default KV \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/OS.js b/packages/puter-dot-js/src/modules/OS.js new file mode 100644 index 000000000..a436e58a3 --- /dev/null +++ b/packages/puter-dot-js/src/modules/OS.js @@ -0,0 +1,90 @@ +import * as utils from '../lib/utils.js' + +class OS{ + /** + * Creates a new instance with the given authentication token, API origin, and app ID, + * + * @class + * @param {string} authToken - Token used to authenticate the user. + * @param {string} APIOrigin - Origin of the API server. Used to build the API endpoint URLs. + * @param {string} appID - ID of the app to use. + */ + constructor (authToken, APIOrigin, appID) { + this.authToken = authToken; + this.APIOrigin = APIOrigin; + this.appID = appID; + } + + /** + * Sets a new authentication token. + * + * @param {string} authToken - The new authentication token. + * @memberof [OS] + * @returns {void} + */ + setAuthToken (authToken) { + this.authToken = authToken; + } + + /** + * Sets the API origin. + * + * @param {string} APIOrigin - The new API origin. + * @memberof [Apps] + * @returns {void} + */ + setAPIOrigin (APIOrigin) { + this.APIOrigin = APIOrigin; + } + + user = function(...args){ + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + }; + } + + return new Promise((resolve, reject) => { + const xhr = utils.initXhr('/whoami', this.APIOrigin, this.authToken, 'get'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) + } + + version = function(...args){ + let options; + + // If first argument is an object, it's the options + if (typeof args[0] === 'object' && args[0] !== null) { + options = args[0]; + } else { + // Otherwise, we assume separate arguments are provided + options = { + success: args[0], + error: args[1], + // Add more if needed... + }; + } + + return new Promise((resolve, reject) => { + const xhr = utils.initXhr('/version', this.APIOrigin, this.authToken, 'get'); + + // set up event handlers for load and error events + utils.setupXhrEventHandlers(xhr, options.success, options.error, resolve, reject); + + xhr.send(); + }) + } +} + +export default OS \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/PuterDialog.js b/packages/puter-dot-js/src/modules/PuterDialog.js new file mode 100644 index 000000000..8be194176 --- /dev/null +++ b/packages/puter-dot-js/src/modules/PuterDialog.js @@ -0,0 +1,373 @@ +class PuterDialog extends HTMLElement { + constructor(resolve, reject) { + super(); + this.attachShadow({ mode: 'open' }); + + this.reject = reject; + this.resolve = resolve; + + // Dialog + this.shadowRoot.innerHTML = ` + +

+
+ ✕ + +

This website uses Puter to bring you safe, secure, and private AI and Cloud features.

+
+ + +
+

Powered by Puter.js

+

By clicking 'Continue' you agree to Puter's Terms of Service and Privacy Policy.

+
+
`; + + // Event listener for the 'message' event + this.messageListener = async (event) => { + if (event.data.msg === 'puter.token') { + this.close(); + // Set the authToken property + puter.setAuthToken(event.data.token); + // update appID + puter.setAppID(event.data.app_uid); + // Remove the event listener to avoid memory leaks + window.removeEventListener('message', this.messageListener); + + puter.puterAuthState.authGranted = true; + // Resolve the promise + this.resolve(); + + // Call onAuth callback + if(puter.onAuth && typeof puter.onAuth === 'function'){ + puter.getUser().then((user) => { + puter.onAuth(user) + }); + } + + puter.puterAuthState.isPromptOpen = false; + // Resolve or reject any waiting promises. + if (puter.puterAuthState.resolver) { + if (puter.puterAuthState.authGranted) { + puter.puterAuthState.resolver.resolve(); + } else { + puter.puterAuthState.resolver.reject(); + } + puter.puterAuthState.resolver = null; + }; + } + }; + + } + + // Optional: Handle dialog cancellation as rejection + cancelListener = () => { + this.close(); + window.removeEventListener('message', this.messageListener); + puter.puterAuthState.authGranted = false; + puter.puterAuthState.isPromptOpen = false; + + // Reject the promise with an error message indicating user cancellation. + // This ensures that the calling code's catch block will be triggered. + this.reject(new Error('User cancelled the authentication')); + + // If there's a resolver set, use it to reject the waiting promise as well. + if (puter.puterAuthState.resolver) { + puter.puterAuthState.resolver.reject(new Error('User cancelled the authentication')); + puter.puterAuthState.resolver = null; + } + }; + + connectedCallback() { + // Add event listener to the button + this.shadowRoot.querySelector('#launch-auth-popup').addEventListener('click', ()=>{ + let w = 600; + let h = 400; + let title = 'Puter'; + var left = (screen.width/2)-(w/2); + var top = (screen.height/2)-(h/2); + window.open(puter.defaultGUIOrigin + '/?embedded_in_popup=true&request_auth=true', + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); + }) + + // Add the event listener to the window object + window.addEventListener('message', this.messageListener); + + // Add event listeners for cancel and close buttons + this.shadowRoot.querySelector('#launch-auth-popup-cancel').addEventListener('click', this.cancelListener); + this.shadowRoot.querySelector('.close-btn').addEventListener('click',this.cancelListener); + } + + open() { + this.shadowRoot.querySelector('dialog').showModal(); + } + + close() { + this.shadowRoot.querySelector('dialog').close(); + } +} +customElements.define('puter-dialog', PuterDialog); + +module.exports = PuterDialog; \ No newline at end of file diff --git a/packages/puter-dot-js/src/modules/UI.js b/packages/puter-dot-js/src/modules/UI.js new file mode 100644 index 000000000..849d4cad8 --- /dev/null +++ b/packages/puter-dot-js/src/modules/UI.js @@ -0,0 +1,1019 @@ +import FSItem from './FSItem.js'; +import PuterDialog from './PuterDialog.js'; +import EventListener from '../lib/EventListener.js'; + +// AppConnection provides an API for interacting with another app. +// It's returned by UI methods, and cannot be constructed directly by user code. +// For basic usage: +// - postMessage(message) Send a message to the target app +// - on('message', callback) Listen to messages from the target app +class AppConnection extends EventListener { + // targetOrigin for postMessage() calls to Puter + #puterOrigin = '*'; + + // Whether the target app is open + #isOpen; + + constructor(messageTarget, appInstanceID, targetAppInstanceID) { + super([ + 'message', // The target sent us something with postMessage() + 'close', // The target app was closed + ]); + this.messageTarget = messageTarget; + this.appInstanceID = appInstanceID; + this.targetAppInstanceID = targetAppInstanceID; + this.#isOpen = true; + + // TODO: Set this.#puterOrigin to the puter origin + + window.addEventListener('message', event => { + if (event.data.msg === 'messageToApp') { + if (event.data.appInstanceID !== this.targetAppInstanceID) { + // Message is from a different AppConnection; ignore it. + return; + } + if (event.data.targetAppInstanceID !== this.appInstanceID) { + console.error(`AppConnection received message intended for wrong app! appInstanceID=${this.appInstanceID}, target=${event.data.targetAppInstanceID}`); + return; + } + this.emit('message', event.data.contents); + return; + } + + if (event.data.msg === 'appClosed') { + if (event.data.appInstanceID !== this.targetAppInstanceID) { + // Message is from a different AppConnection; ignore it. + return; + } + + this.#isOpen = false; + this.emit('close', { + appInstanceID: this.targetAppInstanceID, + }); + } + }); + } + + postMessage(message) { + if (!this.#isOpen) { + console.warn('Trying to post message on a closed AppConnection'); + return; + } + + this.messageTarget.postMessage({ + msg: 'messageToApp', + appInstanceID: this.appInstanceID, + targetAppInstanceID: this.targetAppInstanceID, + targetAppOrigin: '*', // TODO: Specify this somehow + contents: message, + }, this.#puterOrigin); + } + + // Attempt to close the target application + close() { + if (!this.#isOpen) { + console.warn('Trying to close an app on a closed AppConnection'); + return; + } + + this.messageTarget.postMessage({ + msg: 'closeApp', + appInstanceID: this.appInstanceID, + targetAppInstanceID: this.targetAppInstanceID, + }, this.#puterOrigin); + } +} + +class UI extends EventListener { + // Used to generate a unique message id for each message sent to the host environment + // we start from 1 because 0 is falsy and we want to avoid that for the message id + #messageID = 1; + + // Holds the callback functions for the various events + // that are triggered when a watched item has changed. + itemWatchCallbackFunctions = []; + + // Holds the unique app instance ID that is provided by the host environment + appInstanceID; + + // Holds the unique app instance ID for the parent (if any), which is provided by the host environment + parentInstanceID; + + // If we have a parent app, holds an AppConnection to it + #parentAppConnection = null; + + // Holds the callback functions for the various events + // that can be triggered by the host environment's messages. + #callbackFunctions = []; + + // onWindowClose() is executed right before the window is closed. Users can override this function + // to perform a variety of tasks right before window is closed. Users can override this function. + #onWindowClose; + + // When an item is opened by this app in any way onItemsOpened() is executed. Users can override this function. + #onItemsOpened; + + #onLaunchedWithItems; + + // List of events that can be listened to. + #eventNames; + + // The most recent value that we received for a given broadcast, by name. + #lastBroadcastValue = new Map(); // name -> data + + // Replaces boilerplate for most methods: posts a message to the GUI with a unique ID, and sets a callback for it. + #postMessageWithCallback = function(name, resolve, args = {}) { + const msg_id = this.#messageID++; + this.messageTarget?.postMessage({ + msg: name, + env: this.env, + appInstanceID: this.appInstanceID, + uuid: msg_id, + ...args, + }, '*'); + //register callback + this.#callbackFunctions[msg_id] = resolve; + } + + constructor (appInstanceID, parentInstanceID, appID, env) { + const eventNames = [ + 'localeChanged', + 'themeChanged', + ]; + super(eventNames); + this.#eventNames = eventNames; + this.appInstanceID = appInstanceID; + this.parentInstanceID = parentInstanceID; + this.appID = appID; + this.env = env; + + if(this.env === 'app'){ + this.messageTarget = window.parent; + } + else if(this.env === 'gui'){ + return; + } + + if (this.parentInstanceID) { + this.#parentAppConnection = new AppConnection(this.messageTarget, this.appInstanceID, this.parentInstanceID); + } + + // Tell the host environment that this app is using the Puter SDK and is ready to receive messages, + // this will allow the OS to send custom messages to the app + this.messageTarget?.postMessage({ + msg: "READY", + appInstanceID: this.appInstanceID, + }, '*'); + + // When this app's window is focused send a message to the host environment + window.addEventListener('focus', (e) => { + this.messageTarget?.postMessage({ + msg: "windowFocused", + appInstanceID: this.appInstanceID, + }, '*'); + }); + + // Bind the message event listener to the window + let lastDraggedOverElement = null; + window.addEventListener('message', async (e) => { + // `error` + if(e.data.error){ + throw e.data.error; + } + // `focus` event + else if(e.data.msg && e.data.msg === 'focus'){ + window.focus(); + } + // `click` event + else if(e.data.msg && e.data.msg === 'click'){ + // Get the element that was clicked on and click it + const clicked_el = document.elementFromPoint(e.data.x, e.data.y); + if(clicked_el !== null) + clicked_el.click(); + } + // `dragover` event based on the `drag` event from the host environment + else if(e.data.msg && e.data.msg === 'drag'){ + // Get the element being dragged over + const draggedOverElement = document.elementFromPoint(e.data.x, e.data.y); + if(draggedOverElement !== lastDraggedOverElement){ + // If the last element exists and is different from the current, dispatch a dragleave on it + if(lastDraggedOverElement){ + const dragLeaveEvent = new Event('dragleave', { + bubbles: true, + cancelable: true, + clientX: e.data.x, + clientY: e.data.y + }); + lastDraggedOverElement.dispatchEvent(dragLeaveEvent); + } + // If the current element exists and is different from the last, dispatch dragenter on it + if(draggedOverElement){ + const dragEnterEvent = new Event('dragenter', { + bubbles: true, + cancelable: true, + clientX: e.data.x, + clientY: e.data.y + }); + draggedOverElement.dispatchEvent(dragEnterEvent); + } + + // Update the lastDraggedOverElement + lastDraggedOverElement = draggedOverElement; + } + } + // `drop` event + else if(e.data.msg && e.data.msg === 'drop'){ + if(lastDraggedOverElement){ + const dropEvent = new CustomEvent('drop', { + bubbles: true, + cancelable: true, + detail: { + clientX: e.data.x, + clientY: e.data.y, + items: e.data.items + } + }); + lastDraggedOverElement.dispatchEvent(dropEvent); + + // Reset the lastDraggedOverElement + lastDraggedOverElement = null; + } + } + // windowWillClose + else if(e.data.msg === 'windowWillClose'){ + // If the user has not overridden onWindowClose() then send a message back to the host environment + // to let it know that it is ok to close the window. + if(this.#onWindowClose === undefined){ + this.messageTarget?.postMessage({ + msg: true, + appInstanceID: this.appInstanceID, + original_msg_id: e.data.msg_id, + }, '*'); + } + // If the user has overridden onWindowClose() then send a message back to the host environment + // to let it know that it is NOT ok to close the window. Then execute onWindowClose() and the user will + // have to manually close the window. + else{ + this.messageTarget?.postMessage({ + msg: false, + appInstanceID: this.appInstanceID, + original_msg_id: e.data.msg_id, + }, '*'); + this.#onWindowClose(); + } + } + // itemsOpened + else if(e.data.msg === 'itemsOpened'){ + // If the user has not overridden onItemsOpened() then only send a message back to the host environment + if(this.#onItemsOpened === undefined){ + this.messageTarget?.postMessage({ + msg: true, + appInstanceID: this.appInstanceID, + original_msg_id: e.data.msg_id, + }, '*'); + } + // If the user has overridden onItemsOpened() then send a message back to the host environment + // and execute onItemsOpened() + else{ + this.messageTarget?.postMessage({ + msg: false, + appInstanceID: this.appInstanceID, + original_msg_id: e.data.msg_id, + }, '*'); + + let items = []; + if(e.data.items.length > 0){ + for (let index = 0; index < e.data.items.length; index++) + items.push(new FSItem(e.data.items[index])) + } + this.#onItemsOpened(items); + } + } + // getAppDataSucceeded + else if(e.data.msg === 'getAppDataSucceeded'){ + let appDataItem = new FSItem(e.data.item); + if(e.data.original_msg_id && this.#callbackFunctions[e.data.original_msg_id]){ + this.#callbackFunctions[e.data.original_msg_id](appDataItem); + } + } + // readAppDataFileSucceeded + else if(e.data.msg === 'readAppDataFileSucceeded'){ + let appDataItem = new FSItem(e.data.item); + if(e.data.original_msg_id && this.#callbackFunctions[e.data.original_msg_id]){ + this.#callbackFunctions[e.data.original_msg_id](appDataItem); + } + } + // readAppDataFileFailed + else if(e.data.msg === 'readAppDataFileFailed'){ + if(e.data.original_msg_id && this.#callbackFunctions[e.data.original_msg_id]){ + this.#callbackFunctions[e.data.original_msg_id](null); + } + } + // Determine if this is a response to a previous message and if so, is there + // a callback function for this message? if answer is yes to both then execute the callback + else if(e.data.original_msg_id && this.#callbackFunctions[e.data.original_msg_id]){ + if(e.data.msg === 'fileOpenPicked'){ + // 1 item returned + if(e.data.items.length === 1){ + this.#callbackFunctions[e.data.original_msg_id](new FSItem(e.data.items[0])); + } + // multiple items returned + else if(e.data.items.length > 1){ + // multiple items returned + let items = []; + for (let index = 0; index < e.data.items.length; index++) + items.push(new FSItem(e.data.items[index])) + this.#callbackFunctions[e.data.original_msg_id](items); + } + } + else if(e.data.msg === 'directoryPicked'){ + // 1 item returned + if(e.data.items.length === 1){ + this.#callbackFunctions[e.data.original_msg_id](new FSItem({ + uid: e.data.items[0].uid, + name: e.data.items[0].fsentry_name, + path: e.data.items[0].path, + readURL: e.data.items[0].read_url, + writeURL: e.data.items[0].write_url, + metadataURL: e.data.items[0].metadata_url, + isDirectory: true, + size: e.data.items[0].fsentry_size, + accessed: e.data.items[0].fsentry_accessed, + modified: e.data.items[0].fsentry_modified, + created: e.data.items[0].fsentry_created, + })); + } + // multiple items returned + else if(e.data.items.length > 1){ + // multiple items returned + let items = []; + for (let index = 0; index < e.data.items.length; index++) + items.push(new FSItem(e.data.items[index])) + this.#callbackFunctions[e.data.original_msg_id](items); + } + } + else if(e.data.msg === 'colorPicked'){ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](e.data.color); + } + else if(e.data.msg === 'fontPicked'){ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](e.data.font); + } + else if(e.data.msg === 'alertResponded'){ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](e.data.response); + } + else if(e.data.msg === 'promptResponded'){ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](e.data.response); + } + else if(e.data.msg === "fileSaved"){ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](new FSItem(e.data.saved_file)); + } + else if (e.data.msg === 'childAppLaunched') { + // execute callback with a new AppConnection to the child + const connection = new AppConnection(this.messageTarget, this.appInstanceID, e.data.child_instance_id); + this.#callbackFunctions[e.data.original_msg_id](connection); + } + else{ + // execute callback + this.#callbackFunctions[e.data.original_msg_id](e.data); + } + + //remove this callback function since it won't be needed again + delete this.#callbackFunctions[e.data.original_msg_id]; + } + // Item Watch response + else if(e.data.msg === "itemChanged" && e.data.data && e.data.data.uid){ + //excute callback + if(itemWatchCallbackFunctions[e.data.data.uid] && typeof itemWatchCallbackFunctions[e.data.data.uid] === 'function') + itemWatchCallbackFunctions[e.data.data.uid](e.data.data); + } + // Broadcasts + else if (e.data.msg === 'broadcast') { + const { name, data } = e.data; + if (!this.#eventNames.includes(name)) { + return; + } + this.emit(name, data); + this.#lastBroadcastValue.set(name, data); + } + }); + } + + onWindowClose = function(callback) { + this.#onWindowClose = callback; + } + + onItemsOpened = function(callback) { + // DEPRECATED - this is also called when items are dropped on the app, which in new versions should be handled + // with the 'drop' event. + // Check if a file was opened with this app, i.e. check URL parameters of window/iframe + // Even though the file has been opened when the app is launched, we need to wait for the onItemsOpened callback to be set + // before we can call it. This is why we need to check the URL parameters here. + // This should also be done only the very first time the callback is set (hence the if(!this.#onItemsOpened) check) since + // the URL parameters will be checked every time the callback is set which can cause problems if the callback is set multiple times. + if(!this.#onItemsOpened){ + let URLParams = new URLSearchParams(window.location.search); + if(URLParams.has('puter.item.name') && URLParams.has('puter.item.uid') && URLParams.has('puter.item.read_url')){ + let fpath = URLParams.get('puter.item.path'); + fpath = `~/` + fpath.split('/').slice(2).join('/'); + callback([new FSItem({ + name: URLParams.get('puter.item.name'), + path: fpath, + uid: URLParams.get('puter.item.uid'), + readURL: URLParams.get('puter.item.read_url'), + writeURL: URLParams.get('puter.item.write_url'), + metadataURL: URLParams.get('puter.item.metadata_url'), + size: URLParams.get('puter.item.size'), + accessed: URLParams.get('puter.item.accessed'), + modified: URLParams.get('puter.item.modified'), + created: URLParams.get('puter.item.created'), + })]); + } + } + + this.#onItemsOpened = callback; + } + + onLaunchedWithItems = function(callback) { + // Check if a file was opened with this app, i.e. check URL parameters of window/iframe + // Even though the file has been opened when the app is launched, we need to wait for the onLaunchedWithItems callback to be set + // before we can call it. This is why we need to check the URL parameters here. + // This should also be done only the very first time the callback is set (hence the if(!this.#onLaunchedWithItems) check) since + // the URL parameters will be checked every time the callback is set which can cause problems if the callback is set multiple times. + if(!this.#onLaunchedWithItems){ + let URLParams = new URLSearchParams(window.location.search); + if(URLParams.has('puter.item.name') && URLParams.has('puter.item.uid') && URLParams.has('puter.item.read_url')){ + let fpath = URLParams.get('puter.item.path'); + fpath = `~/` + fpath.split('/').slice(2).join('/'); + callback([new FSItem({ + name: URLParams.get('puter.item.name'), + path: fpath, + uid: URLParams.get('puter.item.uid'), + readURL: URLParams.get('puter.item.read_url'), + writeURL: URLParams.get('puter.item.write_url'), + metadataURL: URLParams.get('puter.item.metadata_url'), + size: URLParams.get('puter.item.size'), + accessed: URLParams.get('puter.item.accessed'), + modified: URLParams.get('puter.item.modified'), + created: URLParams.get('puter.item.created'), + })]); + } + } + + this.#onLaunchedWithItems = callback; + } + + alert = function(message, buttons, options, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('ALERT', resolve, { message, buttons, options }); + }) + } + + prompt = function(message, placeholder, options, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('PROMPT', resolve, { message, placeholder, options }); + }) + } + + showDirectoryPicker = function(options, callback){ + return new Promise((resolve) => { + const msg_id = this.#messageID++; + if(this.env === 'app'){ + this.messageTarget?.postMessage({ + msg: "showDirectoryPicker", + appInstanceID: this.appInstanceID, + uuid: msg_id, + options: options, + env: this.env, + }, '*'); + }else{ + let w = 700; + let h = 400; + let title = 'Puter: Open Directory'; + var left = (screen.width/2)-(w/2); + var top = (screen.height/2)-(h/2); + window.open(`${puter.defaultGUIOrigin}/action/show-directory-picker?embedded_in_popup=true&msg_id=${msg_id}&appInstanceID=${this.appInstanceID}&env=${this.env}&options=${JSON.stringify(options)}`, + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); + } + + //register callback + this.#callbackFunctions[msg_id] = resolve; + }) + } + + showOpenFilePicker = function(options, callback){ + return new Promise((resolve) => { + const msg_id = this.#messageID++; + + if(this.env === 'app'){ + this.messageTarget?.postMessage({ + msg: "showOpenFilePicker", + appInstanceID: this.appInstanceID, + uuid: msg_id, + options: options ?? {}, + env: this.env, + }, '*'); + }else{ + let w = 700; + let h = 400; + let title = 'Puter: Open File'; + var left = (screen.width/2)-(w/2); + var top = (screen.height/2)-(h/2); + window.open(`${puter.defaultGUIOrigin}/action/show-open-file-picker?embedded_in_popup=true&msg_id=${msg_id}&appInstanceID=${this.appInstanceID}&env=${this.env}&options=${JSON.stringify(options ?? {})}`, + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); + } + //register callback + this.#callbackFunctions[msg_id] = resolve; + }) + } + + showFontPicker = function(options){ + return new Promise((resolve) => { + this.#postMessageWithCallback('showFontPicker', resolve, { options: options ?? {} }); + }) + } + + showColorPicker = function(options){ + return new Promise((resolve) => { + this.#postMessageWithCallback('showColorPicker', resolve, { options: options ?? {} }); + }) + } + + showSaveFilePicker = function(content, suggestedName){ + return new Promise((resolve) => { + const msg_id = this.#messageID++; + const url = (Object.prototype.toString.call(content) === '[object URL]' ? content : undefined); + + if(this.env === 'app'){ + this.messageTarget?.postMessage({ + msg: "showSaveFilePicker", + appInstanceID: this.appInstanceID, + content: url ? undefined : content, + url: url ? url.toString() : undefined, + suggestedName: suggestedName ?? '', + env: this.env, + uuid: msg_id + }, '*'); + }else{ + window.addEventListener('message', async (e) => { + if(e.data?.msg === "sendMeFileData"){ + // Send the blob URL to the host environment + e.source.postMessage({ + msg: "showSaveFilePickerPopup", + content: url ? undefined : content, + url: url ? url.toString() : undefined, + suggestedName: suggestedName ?? '', + env: this.env, + uuid: msg_id + }, '*'); + + // remove the event listener + window.removeEventListener('message', this); + } + }); + // Create a Blob from your binary data + let blob = new Blob([content], {type: 'application/octet-stream'}); + + // Create an object URL for the Blob + let objectUrl = URL.createObjectURL(blob); + + let w = 700; + let h = 400; + let title = 'Puter: Save File'; + var left = (screen.width/2)-(w/2); + var top = (screen.height/2)-(h/2); + window.open(`${puter.defaultGUIOrigin}/action/show-save-file-picker?embedded_in_popup=true&msg_id=${msg_id}&appInstanceID=${this.appInstanceID}&env=${this.env}&blobUrl=${encodeURIComponent(objectUrl)}`, + title, + 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); + } + //register callback + this.#callbackFunctions[msg_id] = resolve; + }) + } + + setWindowTitle = function(title, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('setWindowTitle', resolve, { new_title: title }); + }) + } + + setWindowWidth = function(width, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('setWindowWidth', resolve, { width }); + }) + } + + setWindowHeight = function(height, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('setWindowHeight', resolve, { height }); + }) + } + + setWindowSize = function(width, height, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('setWindowSize', resolve, { width, height }); + }) + } + + setWindowPosition = function(x, y, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('setWindowPosition', resolve, { x, y }); + }) + } + + /** + * Asynchronously extracts entries from DataTransferItems, like files and directories. + * + * @private + * @function + * @async + * @param {DataTransferItemList} dataTransferItems - List of data transfer items from a drag-and-drop operation. + * @param {Object} [options={}] - Optional settings. + * @param {boolean} [options.raw=false] - Determines if the file path should be processed. + * @returns {Promise>} - A promise that resolves to an array of File or Entry objects. + * @throws {Error} - Throws an error if there's an EncodingError and provides information about how to solve it. + * + * @example + * const items = event.dataTransfer.items; + * const entries = await getEntriesFromDataTransferItems(items, { raw: false }); + */ + getEntriesFromDataTransferItems = async function(dataTransferItems, options = { raw: false }) { + const checkErr = (err) => { + if (this.getEntriesFromDataTransferItems.didShowInfo) return + if (err.name !== 'EncodingError') return + this.getEntriesFromDataTransferItems.didShowInfo = true + const infoMsg = `${err.name} occured within datatransfer-files-promise module\n` + + `Error message: "${err.message}"\n` + + 'Try serving html over http if currently you are running it from the filesystem.' + console.warn(infoMsg) + } + + const readFile = (entry, path = '') => { + return new Promise((resolve, reject) => { + entry.file(file => { + if (!options.raw) file.filepath = path + file.name // save full path + resolve(file) + }, (err) => { + checkErr(err) + reject(err) + }) + }) + } + + const dirReadEntries = (dirReader, path) => { + return new Promise((resolve, reject) => { + dirReader.readEntries(async entries => { + let files = [] + for (let entry of entries) { + const itemFiles = await getFilesFromEntry(entry, path) + files = files.concat(itemFiles) + } + resolve(files) + }, (err) => { + checkErr(err) + reject(err) + }) + }) + } + + const readDir = async (entry, path) => { + const dirReader = entry.createReader() + const newPath = path + entry.name + '/' + let files = [] + let newFiles + do { + newFiles = await dirReadEntries(dirReader, newPath) + files = files.concat(newFiles) + } while (newFiles.length > 0) + return files + } + + const getFilesFromEntry = async (entry, path = '') => { + if(entry === null) + return; + else if (entry.isFile) { + const file = await readFile(entry, path) + return [file] + } + else if (entry.isDirectory) { + const files = await readDir(entry, path) + files.push(entry) + return files + } + } + + let files = [] + let entries = [] + + // Pull out all entries before reading them + for (let i = 0, ii = dataTransferItems.length; i < ii; i++) { + entries.push(dataTransferItems[i].webkitGetAsEntry()) + } + + // Recursively read through all entries + for (let entry of entries) { + const newFiles = await getFilesFromEntry(entry) + files = files.concat(newFiles) + } + + return files + } + + authenticateWithPuter = function() { + if(this.env !== 'web'){ + return; + } + + // if authToken is already present, resolve immediately + if(this.authToken){ + return new Promise((resolve) => { + resolve(); + }) + } + + // If a prompt is already open, return a promise that resolves based on the existing prompt's result. + if (puter.puterAuthState.isPromptOpen) { + return new Promise((resolve, reject) => { + puter.puterAuthState.resolver = { resolve, reject }; + }); + } + + // Show the permission prompt and set the state. + puter.puterAuthState.isPromptOpen = true; + puter.puterAuthState.authGranted = null; + + return new Promise((resolve, reject) => { + if (!puter.authToken) { + const puterDialog = new PuterDialog(resolve, reject); + document.body.appendChild(puterDialog); + puterDialog.open(); + } else { + // If authToken is already present, resolve immediately + resolve(); + } + }); + } + + // Returns a Promise + launchApp = function(appName, args, callback) { + return new Promise((resolve) => { + // if appName is an object and args is not set, then appName is actually args + if (typeof appName === 'object' && !args) { + args = appName; + appName = undefined; + } + + this.#postMessageWithCallback('launchApp', resolve, { app_name: appName, args }); + }) + } + + parentApp() { + return this.#parentAppConnection; + } + + createWindow = function (options, callback) { + return new Promise((resolve) => { + this.#postMessageWithCallback('createWindow', resolve, { options: options ?? {} }); + }) + } + + // Menubar + menubar = function(){ + // Remove previous style tag + document.querySelectorAll('style.puter-stylesheet').forEach(function(el) { + el.remove(); + }) + + // Add new style tag + const style = document.createElement('style'); + style.classList.add('puter-stylesheet'); + style.innerHTML = ` + .--puter-menubar { + border-bottom: 1px solid #e9e9e9; + background-color: #fbf9f9; + padding-top: 3px; + padding-bottom: 2px; + display: inline-block; + position: fixed; + top: 0; + width: 100%; + margin: 0; + padding: 0; + height: 31px; + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; + z-index: 9999; + } + + .--puter-menubar, .--puter-menubar * { + user-select: none; + -webkit-user-select: none; + cursor: default; + } + + .--puter-menubar .dropdown-item-divider>hr { + margin-top: 5px; + margin-bottom: 5px; + border-bottom: none; + border-top: 1px solid #00000033; + } + + .--puter-menubar>li { + display: inline-block; + padding: 10px 5px; + } + + .--puter-menubar>li>ul { + display: none; + z-index: 999999999999; + list-style: none; + background-color: rgb(233, 233, 233); + width: 200px; + border: 1px solid #e4ebf3de; + box-shadow: 0px 0px 5px #00000066; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; + color: #333; + border-radius: 4px; + padding: 2px; + min-width: 200px; + margin-top: 5px; + position: absolute; + } + + .--puter-menubar .menubar-item { + display: block; + line-height: 24px; + margin-top: -7px; + text-align: center; + border-radius: 3px; + padding: 0 5px; + } + + .--puter-menubar .menubar-item-open { + background-color: rgb(216, 216, 216); + } + + .--puter-menubar .dropdown-item { + padding: 5px; + padding: 5px 30px; + list-style-type: none; + user-select: none; + font-size: 13px; + } + + .--puter-menubar .dropdown-item-icon, .--puter-menubar .dropdown-item-icon-active { + pointer-events: none; + width: 18px; + height: 18px; + margin-left: -23px; + margin-bottom: -4px; + margin-right: 5px; + } + .--puter-menubar .dropdown-item-disabled .dropdown-item-icon{ + display: inline-block !important; + } + .--puter-menubar .dropdown-item-disabled .dropdown-item-icon-active{ + display: none !important; + } + .--puter-menubar .dropdown-item-icon-active { + display:none; + } + .--puter-menubar .dropdown-item:hover .dropdown-item-icon{ + display: none; + } + .--puter-menubar .dropdown-item:hover .dropdown-item-icon-active{ + display: inline-block; + } + .--puter-menubar .dropdown-item-hide-icon .dropdown-item-icon, .--puter-menubar .dropdown-item-hide-icon .dropdown-item-icon-active{ + display: none !important; + } + .--puter-menubar .dropdown-item a { + color: #333; + text-decoration: none; + } + + .--puter-menubar .dropdown-item:hover, .--puter-menubar .dropdown-item:hover a { + background-color: rgb(59 134 226); + color: white; + border-radius: 4px; + } + + .--puter-menubar .dropdown-item-disabled, .--puter-menubar .dropdown-item-disabled:hover { + opacity: 0.5; + background-color: transparent; + color: initial; + cursor: initial; + pointer-events: none; + } + + .--puter-menubar .menubar * { + user-select: none; + } + `; + let head = document.head || document.getElementsByTagName('head')[0]; + head.appendChild(style); + + document.addEventListener('click', function(e){ + // Don't hide if clicking on disabled item + if(e.target.classList.contains('dropdown-item-disabled')) + return false; + // Hide open menus + if(!(e.target).classList.contains('menubar-item')){ + document.querySelectorAll('.menubar-item.menubar-item-open').forEach(function(el) { + el.classList.remove('menubar-item-open'); + }) + + document.querySelectorAll('.dropdown').forEach(el => el.style.display = "none"); + } + }); + + // When focus is gone from this window, hide open menus + window.addEventListener('blur', function(e){ + document.querySelectorAll('.dropdown').forEach(function(el) { + el.style.display = "none"; + }) + document.querySelectorAll('.menubar-item.menubar-item-open').forEach(el => el.classList.remove('menubar-item-open')); + }); + + // Returns the siblings of the element + const siblings = function (e) { + const siblings = []; + + // if no parent, return empty list + if(!e.parentNode) { + return siblings; + } + + // first child of the parent node + let sibling = e.parentNode.firstChild; + + // get all other siblings + while (sibling) { + if (sibling.nodeType === 1 && sibling !== e) { + siblings.push(sibling); + } + sibling = sibling.nextSibling; + } + return siblings; + }; + + // Open dropdown + document.querySelectorAll('.menubar-item').forEach(el => el.addEventListener('mousedown', function(e){ + // Hide all other menus + document.querySelectorAll('.dropdown').forEach(function(el) { + el.style.display = 'none'; + }); + + // Remove open class from all menus, except this menu that was just clicked + document.querySelectorAll('.menubar-item.menubar-item-open').forEach(function(el) { + if(el != e.target) + el.classList.remove('menubar-item-open'); + }); + + // If menu is already open, close it + if(this.classList.contains('menubar-item-open')){ + document.querySelectorAll('.menubar-item.menubar-item-open').forEach(function(el) { + el.classList.remove('menubar-item-open'); + }); + } + + // If menu is not open, open it + else if(!e.target.classList.contains('dropdown-item')){ + this.classList.add('menubar-item-open') + + // show all sibling + siblings(this).forEach(function(el) { + el.style.display = 'block'; + }); + } + + })); + + // If a menu is open, and you hover over another menu, open that menu + document.querySelectorAll('.--puter-menubar .menubar-item').forEach(el => el.addEventListener('mouseover', function(e){ + const open_menus = document.querySelectorAll('.menubar-item.menubar-item-open'); + if(open_menus.length > 0 && open_menus[0] !== e.target){ + e.target.dispatchEvent(new Event('mousedown')); + } + })) + } + + on(eventName, callback) { + super.on(eventName, callback); + // If we already received a broadcast for this event, run the callback immediately + if (this.#eventNames.includes(eventName) && this.#lastBroadcastValue.has(eventName)) { + callback(this.#lastBroadcastValue.get(eventName)); + } + } +} + +export default UI \ No newline at end of file diff --git a/packages/puter-dot-js/test/fs.test.js b/packages/puter-dot-js/test/fs.test.js new file mode 100644 index 000000000..1f2e4bc11 --- /dev/null +++ b/packages/puter-dot-js/test/fs.test.js @@ -0,0 +1,619 @@ +naughtyStrings = [ + "文件.txt", // Chinese characters + "файл.txt", // Cyrillic characters + "ファイル.txt", // Japanese characters + "파일.txt", // Korean characters + "ملف.txt", // Arabic characters + "फ़ाइल.txt", // Hindi characters + "archivo.txt", // Spanish characters + "fichier.txt", // French characters + "αρχείο.txt", // Greek characters + "datei.txt", // German characters + "fil.txt", // Swedish characters + "קובץ.txt", // Hebrew characters + "文件名.txt", // Chinese characters + "файлы.txt", // Russian characters + "फ़ाइलें.txt", // Hindi characters + "📄_emoji.txt", // Emoji + "file name with spaces.txt", + "file-name-with-dashes.txt", + "file_name_with_underscores.txt", + "file.name.with.periods.txt", + "file,name,with,commas.txt", + "file;name;with;semicolons.txt", + "file(name)with(parentheses).txt", + "file[name]with[brackets].txt", + "file{name}with{braces}.txt", + "file!name!with!exclamations!.txt", + "file@name@with@ats.txt", + "file#name#with#hashes#.txt", + "file$name$with$dollars$.txt", + "file%name%with%percentages%.txt", + "file^name^with^carats^.txt", + "file&name&with&s&.txt", + "file*name*with*asterisks*.txt", + "file_name_with_long_name_exceeding_255_characters_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz.txt", + "file👍name👍with👍thumbs👍up.txt", + "file😂name😂with😂emojis😂.txt", + "file🌍name🌍with🌍globe🌍emojis🌍.txt", + "file🔥name🔥with🔥fire🔥emoji🔥.txt", + "file🎉name🎉with🎉party🎉popper🎉emoji🎉.txt", + "file💼name💼with💼briefcase💼emoji💼.txt", + "file🍔name🍔with🍔burger🍔emoji🍔.txt", + "file🚀name🚀with🚀rocket🚀emoji🚀.txt", + "file👽name👽with👽alien👽emoji👽.txt", + "file🌈name🌈with🌈rainbow🌈emoji🌈.txt", + "file🍆name🍆with🍆eggplant🍆emoji🍆.txt", + "file🍑name🍑with🍑peach🍑emoji🍑.txt", + "invisible\u200Bname.txt", // Invisible Unicode character (Zero Width Space) + "invisible\u200Cname.txt", // Invisible Unicode character (Zero Width Non-Joiner) + "invisible\u200Dname.txt", // Invisible Unicode character (Zero Width Joiner) + "invisible\uFEFFname.txt", // Invisible Unicode character (Zero Width No-Break Space) + "invisible\u180Ename.txt", // Invisible Unicode character (Mongolian Vowel Separator) + "hash#tag.txt", + "percent%20encoded.txt", + "plus+sign.txt", + "ampersand&symbol.txt", + "at@symbol.txt", + "parentheses(1).txt", + "brackets[1].txt", + "curly{braces}.txt", + "angle.txt", + "exclamation!point.txt", + "question?mark.txt", + "colon:separated.txt", + "semicolon;separated.txt", + "single'quote.txt", + "double\"quote.txt", + "backtick`char.txt", + "tilde~sign.txt", + "underscore_character.txt", + "hyphen-character.txt", + "equal=sign.txt", + "plus+sign.txt", + "asterisk*char.txt", + "caret^char.txt", + "percent%sign.txt", + "dollar$sign.txt", + "pound#sign.txt", + "at@sign.txt", + "exclamation!mark.txt", + "question?mark.txt", + "backslash\\char.txt", + "pipe|char.txt", + "colon:char.txt", + "semicolon;char.txt", + "quote'char.txt", + "double\"quote.txt", + "backtick`char.txt", + "braces{char}.txt", + "brackets[char].txt", + "parentheses(char).txt", + "angle.txt", + "ellipsis….txt", + "accentué.txt", + "ümlaut.txt", + "tildeñ.txt", + "çedilla.txt", + "špecial.txt", + "russianЯ.txt", + "chinese中文.txt", + "arabicعربى.txt", + "hebrewעברית.txt", + "japanese日本語.txt", + "korean한국어.txt", + "vietnameseTiếng Việt.txt", + +] + +window.fsTests = [ + testFSWrite = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.write(randName, 'testValue'); + assert(result.uid, "Failed to write to file"); + pass("testFSWrite passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + throw("testFSWrite failed to delete file:", error); + } + } catch (error) { + console.log(error); + throw("testFSWrite failed:", error); + } + }, + testFSRead = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await (await puter.fs.read(randName)).text(); + assert(result === 'testValue', "Failed to read from file"); + pass("testFSRead passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSRead failed to delete file:", error); + } + } catch (error) { + fail("testFSRead failed:", error); + } + }, + testFSWriteWithoutData = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.write(randName); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteWithoutData passed"); + if(randName !== result.name) { + fail(`testFSWriteWithoutData failed: Names do not match ${randName} ${result.name}`); + } + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteWithoutData failed to delete file:", error); + } + } catch (error) { + fail("testFSWriteWithoutData failed:", error); + } + }, + testFSReadWithoutData = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName); + const result = await (await puter.fs.read(randName)).text(); + assert(result === '', "Failed to read from file"); + pass("testFSReadWithoutData passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSReadWithoutData failed to delete file:", error); + } + } catch (error) { + fail("testFSReadWithoutData failed:", error); + } + }, + testFSWriteToExistingFile = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.write(randName, 'updatedValue'); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteToExistingFile passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteToExistingFile failed to delete file:", error); + } + } catch (error) { + fail("testFSWriteToExistingFile failed:", error); + } + }, + testFSWriteToExistingFileWithoutOverwriteAndDedupe = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.write(randName, 'updatedValue', { overwrite: false, dedupeName: false }); + assert(!result.uid, "Failed to write to file"); + fail("testFSWriteToExistingFileWithoutOverwriteAndDedupe failed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteToExistingFileWithoutOverwriteAndDedupe failed to delete file:", error); + } + } catch (error) { + pass("testFSWriteToExistingFileWithoutOverwriteAndDedupe passed"); + } + + }, + testFSWriteToExistingFileWithoutOverwriteButWithDedupe = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.write(randName, 'updatedValue', { overwrite: false, dedupeName: true }); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteToExistingFileWithoutOverwriteButWithDedupe passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteToExistingFileWithoutOverwriteButWithDedupe failed to delete file:", error); + } + } catch (error) { + fail("testFSWriteToExistingFileWithoutOverwriteButWithDedupe failed:", error); + } + }, + testFSWriteToExistingFileWithOverwriteButWithoutDedupe = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.write(randName, 'updatedValue', { overwrite: true, dedupeName: false }); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteToExistingFileWithOverwriteButWithoutDedupe passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteToExistingFileWithOverwriteButWithoutDedupe failed to delete file:", error); + } + } catch (error) { + fail("testFSWriteToExistingFileWithOverwriteButWithoutDedupe failed:", error); + } + }, + // create a directory + testFSCreateDir = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.mkdir(randName); + assert(result.uid, "Failed to create directory"); + pass("testFSCreateDir passed"); + } catch (error) { + fail("testFSCreateDir failed:", error); + } + }, + + // write a number of files to a directory and list them + testFSReadDir = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.mkdir(randName); + await puter.fs.write(randName + '/file1', 'testValue'); + await puter.fs.write(randName + '/file2', 'testValue'); + await puter.fs.write(randName + '/file3', 'testValue'); + const result = await puter.fs.readdir(randName); + assert(result.length === 3, "Failed to read directory"); + pass("testFSReadDir passed"); + } catch (error) { + fail("testFSReadDir failed:", error); + } + }, + + // create a file then delete it + testFSDelete = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.delete(randName); + assert(!result.uid, "Failed to delete file"); + pass("testFSDelete passed"); + } catch (error) { + fail("testFSDelete failed:", error); + } + }, + + // create a directory, write a number of files to it, then delete it + testFSDeleteDir = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.mkdir(randName); + await puter.fs.write(randName + '/file1', 'testValue'); + await puter.fs.write(randName + '/file2', 'testValue'); + await puter.fs.write(randName + '/file3', 'testValue'); + const result = await puter.fs.delete(randName); + assert(!result.uid, "Failed to delete directory"); + pass("testFSDeleteDir passed"); + } catch (error) { + fail("testFSDeleteDir failed:", error); + } + }, + + // attempt to delete a non-existent file + testFSDeleteNonExistentFile = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.delete(randName); + assert(!result.uid, "Failed to delete non-existent file"); + pass("testFSDeleteNonExistentFile passed"); + } catch (error) { + if(error.code !== "subject_does_not_exist") + fail("testFSDeleteNonExistentFile failed:", error); + else + pass("testFSDeleteNonExistentFile passed"); + } + }, + + // attempt to access a non-existent file + testFSReadNonExistentFile = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.read(randName); + fail("testFSReadNonExistentFile failed"); + } catch (error) { + if(error.code !== "subject_does_not_exist") + fail("testFSReadNonExistentFile failed:", error); + else + pass("testFSReadNonExistentFile passed"); + } + }, + + testFSWriteWithSpecialCharacters = async ()=>{ + let randName + try { + randName = 'testFileWithSpecialCharacte rs!@#$%^&*()_+{}|:"<>?`~' + const result = await puter.fs.write(randName, 'testValue', { specialCharacters: true }); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteWithSpecialCharacters passed"); + } catch (error) { + fail("testFSWriteWithSpecialCharacters failed:", error); + } + + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSWriteWithSpecialCharacters failed to delete file:", error); + } + }, + + testFSReadWithSpecialCharacters = async ()=>{ + try { + let randName = 'testFileWithSpecialCharacte rs!@#$%^&*()_+{}|:"<>?`~' + await puter.fs.write(randName, 'testValue'); + const result = await (await puter.fs.read(randName)).text(); + assert(result === 'testValue', "Failed to read from file"); + pass("testFSReadWithSpecialCharacters passed"); + } catch (error) { + fail("testFSReadWithSpecialCharacters failed:", error); + } + }, + + testFSWriteLargeFile = async ()=>{ + try { + let randName = puter.randName(); + const result = await puter.fs.write(randName, 'testValue'.repeat(100000)); + assert(result.uid, "Failed to write to file"); + pass("testFSWriteLargeFile passed"); + } catch (error) { + fail("testFSWriteLargeFile failed:", error); + } + }, + + testFSReadLargeFile = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'.repeat(100000)); + const result = await (await puter.fs.read(randName)).text(); + assert(result === 'testValue'.repeat(100000), "Failed to read from file"); + pass("testFSReadLargeFile passed"); + } catch (error) { + fail("testFSReadLargeFile failed:", error); + } + }, + + testFSRenameFile = async ()=>{ + try { + let randName = puter.randName(); + let randName2 = puter.randName(); + await puter.fs.write(randName, 'testValue'); + const result = await puter.fs.rename(randName, randName2); + assert(result.name, "Failed to rename file"); + pass("testFSRenameFile passed"); + // check that the old file is gone + try { + await puter.fs.read(randName); + fail("testFSRenameFile failed to delete old file"); + } catch (error) { + if(error.code !== "subject_does_not_exist") + fail("testFSRenameFile failed to delete old file:", error); + else + pass("testFSRenameFile passed"); + } + } catch (error) { + fail("testFSRenameFile failed:", error); + } + }, + + testFSMoveFile = async ()=>{ + try { + let randName = puter.randName(); + let randName2 = puter.randName(); + await puter.fs.write(randName, 'testValue'); + await puter.fs.mkdir(randName2); + let result = await puter.fs.move(randName, randName2); + assert(result.moved, "Failed to move file"); + // check that the old file is gone + try { + await puter.fs.read(randName); + fail("testFSMoveFile failed to delete old file"); + } catch (error) { + if(error.code !== "subject_does_not_exist") + fail("testFSMoveFile failed to delete old file:", error); + else + pass("testFSMoveFile passed"); + } + } catch (error) { + fail("testFSMoveFile failed:", error); + } + }, + + testFSCopyFile = async ()=>{ + try { + let randName = puter.randName(); + let randName2 = puter.randName(); + await puter.fs.write(randName, 'testValue'); + await puter.fs.mkdir(randName2); + let result = await puter.fs.copy(randName, randName2); + assert(Array.isArray(result) && result[0].uid, "Failed to copy file"); + // check that the old file is still there + try { + await puter.fs.read(randName); + pass("testFSCopyFile passed"); + } catch (error) { + fail("testFSCopyFile failed to keep old file:", error); + } + } catch (error) { + fail("testFSCopyFile failed:", error); + } + }, + + // copy a file to a directory with newName option + testFSCopyFileWithNewName = async ()=>{ + try { + let randName = puter.randName(); + let randName2 = puter.randName(); + await puter.fs.write(randName, 'testValue'); + await puter.fs.mkdir(randName2); + let result = await puter.fs.copy(randName, randName2, { newName: 'newName' }); + assert(Array.isArray(result) && result[0].uid, "Failed to copy file"); + // check file name + assert(result[0].name === 'newName', "Failed to copy file with new name"); + // check that the old file is still there + try { + await puter.fs.read(randName); + pass("testFSCopyFileWithNewName passed"); + } catch (error) { + fail("testFSCopyFileWithNewName failed to keep old file:", error); + } + } catch (error) { + fail("testFSCopyFileWithNewName failed:", error); + } + }, + + testFSStat = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.write(randName, 'testValue'); + let result = await puter.fs.stat(randName); + assert(result.uid, "Failed to stat file"); + pass("testFSStat passed"); + } catch (error) { + fail("testFSStat failed:", error); + } + }, + + testFSStatDir = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.mkdir(randName); + let result = await puter.fs.stat(randName); + assert(result.uid, "Failed to stat directory"); + pass("testFSStatDir passed"); + } catch (error) { + fail("testFSStatDir failed:", error); + } + }, + + testFSStatNonExistent = async ()=>{ + try { + let randName = puter.randName(); + let result = await puter.fs.stat(randName); + fail("testFSStatNonExistent failed"); + } catch (error) { + if(error.code !== "subject_does_not_exist") + fail("testFSStatNonExistent failed:", error); + else + pass("testFSStatNonExistent passed"); + } + }, + + // create a directory, write a number of files to it, then delete it + testFSDeleteDirWithFiles = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.mkdir(randName); + await puter.fs.write(randName + '/file1', 'testValue'); + await puter.fs.write(randName + '/file2', 'testValue'); + await puter.fs.write(randName + '/file3', 'testValue'); + const result = await puter.fs.delete(randName, { recursive: true }); + assert(!result.uid, "Failed to delete directory"); + pass("testFSDeleteDirWithFiles passed"); + } catch (error) { + fail("testFSDeleteDirWithFiles failed:", error); + } + }, + // check if stat on a directory returns name, path, is_dir + testFSStatDirReturnsAttrs = async ()=>{ + try { + let randName = puter.randName(); + await puter.fs.mkdir(randName); + let result = await puter.fs.stat(randName); + assert(result.name && typeof result.name === 'string', "Failed to stat directory (name)"); + assert(result.path && typeof result.path === 'string', "Failed to stat directory (path)"); + assert(result.immutable !== undefined, "Failed to stat directory (immutable)"); + assert(result.metadata !== undefined, "Failed to stat directory (metadata)"); + assert(result.modified !== undefined, "Failed to stat directory (modified)"); + assert(result.created !== undefined, "Failed to stat directory (created)"); + assert(result.accessed !== undefined, "Failed to stat directory (accessed)"); + assert(result.size !== undefined, "Failed to stat directory (size)"); + assert(result.layout !== undefined, "Failed to stat directory (layout)"); + assert(result.owner !== undefined && typeof result.owner === 'object', "Failed to stat directory (owner)"); + assert(result.dirname !== undefined && typeof result.dirname === 'string', "Failed to stat directory (dirname)"); + assert(result.parent_id !== undefined && typeof result.parent_id === 'string', "Failed to stat directory (parent_id)"); + // todo this will fail for now until is_dir is turned into boolean + assert(result.is_dir !== undefined && typeof result.is_dir === 'boolean' && result.is_dir === true, "Failed to stat directory (is_dir)"); + assert(result.is_empty !== undefined && typeof result.is_empty === 'boolean', "Failed to stat directory (is_empty)"); + pass("testFSStatDirReturnsAttrs passed"); + } catch (error) { + throw("testFSStatDirReturnsAttrs failed:", error); + } + }, + + // test read() with the object returned by write() + testFSReadWithWriteResult = async ()=>{ + try { + let randName = puter.randName(); + let writeResult = await puter.fs.write(randName, 'testValue'); + let result = await (await puter.fs.read(writeResult)).text(); + assert(result === 'testValue', "Failed to read from file"); + pass("testFSReadWithWriteResult passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSReadWithWriteResult failed to delete file:", error); + } + } catch (error) { + fail("testFSReadWithWriteResult failed:", error); + } + }, + + // test stat() with the object returned by write() + testFSStatWithWriteResult = async ()=>{ + try { + let randName = puter.randName(); + let writeResult = await puter.fs.write(randName, 'testValue'); + let result = await puter.fs.stat(writeResult); + assert(result.uid, "Failed to stat file"); + pass("testFSStatWithWriteResult passed"); + // delete the file + try { + await puter.fs.delete(randName); + } catch (error) { + fail("testFSStatWithWriteResult failed to delete file:", error); + } + } catch (error) { + fail("testFSStatWithWriteResult failed:", error); + } + }, + + // test creating files with names from naughtyStrings + testFSWriteWithNaughtyStrings = async ()=>{ + try { + let randName = puter.randName(); + for(let i = 0; i < naughtyStrings.length; i++) { + let filename = randName + naughtyStrings[i]; + console.log(filename); + let result = await puter.fs.write(filename, 'testValue'); + assert(result.uid, "Failed to write to file"); + // check name + assert(result.name === filename, "Failed to write to file with naughty name: " + filename); + // delete the file + try { + await puter.fs.delete(filename); + } catch (error) { + fail("testFSWriteWithNaughtyStrings failed to delete file: " + filename, error); + } + } + pass("testFSWriteWithNaughtyStrings passed"); + } catch (error) { + console.log(error); + fail("testFSWriteWithNaughtyStrings failed:", error); + } + }, +]; \ No newline at end of file diff --git a/packages/puter-dot-js/test/kv.test.js b/packages/puter-dot-js/test/kv.test.js new file mode 100644 index 000000000..5dad4b4a4 --- /dev/null +++ b/packages/puter-dot-js/test/kv.test.js @@ -0,0 +1,417 @@ +window.kvTests = [ + testSetKeyWithValue = async function() { + try { + const result = await puter.kv.set('testKey', 'testValue'); + assert(result === true, "Failed to set key with value"); + pass("testSetKeyWithValue passed"); + } catch (error) { + fail("testSetKeyWithValue failed:", error); + } + }, + + testUpdateKey = async function() { + try { + await puter.kv.set('updateKey', 'initialValue'); + const result = await puter.kv.set('updateKey', 'updatedValue'); + assert(result === true, "Failed to update existing key"); + pass("testUpdateKey passed"); + } catch (error) { + fail("testUpdateKey failed:", error); + } + }, + + testKeySizeLimit = async function() { + try { + const largeKey = 'a'.repeat(1025); // 1 KB + 1 byte + await puter.kv.set(largeKey, 'value'); + fail("testKeySizeLimit failed: No error thrown for large key"); + } catch (error) { + pass("testKeySizeLimit passed:", error.message); + } + }, + + testInvalidParameters = async function() { + try { + await puter.kv.set(undefined, 'value'); + fail("testInvalidParameters failed: No error thrown for undefined key"); + } catch (error) { + pass("testInvalidParameters passed:", error.message); + } + }, + + // testEmptyKey should fail + testEmptyKey = async function() { + try { + await puter.kv.set('', 'value'); + fail("testEmptyKey failed: No error thrown for empty key"); + } catch (error) { + pass("testEmptyKey passed:", error.message); + } + }, + + + testSetNullValue = async function() { + try { + const result = await puter.kv.set('nullValueKey', null); + assert(result === true, "Failed to set null value"); + pass("testSetNullValue passed"); + } catch (error) { + fail("testSetNullValue failed:", error); + } + }, + + testSetObjectValue = async function() { + try { + const result = await puter.kv.set('objectKey', { a: 1 }); + assert(result === true, "Failed to set object as value"); + pass("testSetObjectValue passed"); + } catch (error) { + fail("testSetObjectValue failed:", error); + } + }, + + testSetKeyWithSpecialCharacters = async function() { + try { + const result = await puter.kv.set('special@Key#', 'value'); + assert(result === true, "Failed to set key with special characters"); + pass("testSetKeyWithSpecialCharacters passed"); + } catch (error) { + fail("testSetKeyWithSpecialCharacters failed:", error); + } + }, + + testSetLargeValue = async function() { + try { + const largeValue = 'a'.repeat(10000); // 10 KB + const result = await puter.kv.set('largeValueKey', largeValue); + assert(result === true, "Failed to set large value"); + pass("testSetLargeValue passed"); + } catch (error) { + fail("testSetLargeValue failed:", error); + } + }, + + testSetBooleanValue = async function() { + try { + const result = await puter.kv.set('booleanKey', true); + assert(result === true, "Failed to set boolean value"); + pass("testSetBooleanValue passed"); + } catch (error) { + fail("testSetBooleanValue failed:", error); + } + }, + + testSetNumericKey = async function() { + try { + const result = await puter.kv.set(123, 'value'); + assert(result === true, "Failed to set numeric key"); + pass("testSetNumericKey passed"); + } catch (error) { + fail("testSetNumericKey failed:", error); + } + }, + + testSetConcurrentKeys = async function() { + try { + const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')]; + const results = await Promise.all(promises); + assert(results.every(result => result === true), "Failed to set concurrent keys"); + pass("testSetConcurrentKeys passed"); + } catch (error) { + fail("testSetConcurrentKeys failed:", error); + } + }, + + testSetValueAndRetrieve = async function() { + try { + await puter.kv.set('retrieveKey', 'testValue'); + const value = await puter.kv.get('retrieveKey'); + assert(value === 'testValue', "Failed to retrieve correct value"); + pass("testSetValueAndRetrieve passed"); + } catch (error) { + fail("testSetValueAndRetrieve failed:", error); + } + }, + + testUpdateValueAndRetrieve = async function() { + try { + await puter.kv.set('updateKey', 'initialValue'); + await puter.kv.set('updateKey', 'updatedValue'); + const value = await puter.kv.get('updateKey'); + assert(value === 'updatedValue', "Failed to retrieve updated value"); + pass("testUpdateValueAndRetrieve passed"); + } catch (error) { + fail("testUpdateValueAndRetrieve failed:", error); + } + }, + + testSetNumericValueAndRetrieve = async function() { + try { + await puter.kv.set('numericKey', 123); + const value = await puter.kv.get('numericKey'); + assert(value === 123, "Failed to retrieve numeric value"); + pass("testSetNumericValueAndRetrieve passed"); + } catch (error) { + fail("testSetNumericValueAndRetrieve failed:", error); + } + }, + + testSetBooleanValueAndRetrieve = async function() { + try { + await puter.kv.set('booleanKey', true); + const value = await puter.kv.get('booleanKey'); + assert(value === true, "Failed to retrieve boolean value"); + pass("testSetBooleanValueAndRetrieve passed"); + } catch (error) { + fail("testSetBooleanValueAndRetrieve failed:", error); + } + }, + + + testSetAndDeleteKey = async function() { + try { + await puter.kv.set('deleteKey', 'value'); + const result = await puter.kv.del('deleteKey'); + assert(result === true, "Failed to delete key"); + pass("testSetAndDeleteKey passed"); + } catch (error) { + fail("testSetAndDeleteKey failed:", error); + } + }, + + // if key does not exist, get() should return null + testGetNonexistentKey = async function() { + try { + const value = await puter.kv.get('nonexistentKey_102mk'); + assert(value === null, "Failed to return `null` for nonexistent key"); + pass("testGetNonexistentKey passed"); + } catch (error) { + fail("testGetNonexistentKey failed:", error); + } + }, + + // string key and object value + testSetObjectValue = async function() { + try { + const result = await puter.kv.set('objectKey', { a: 1 }); + assert(result === true, "Failed to set object as value"); + const value = await puter.kv.get('objectKey'); + assert(value.a === 1, "Failed to retrieve object value"); + pass("testSetObjectValue passed"); + } catch (error) { + fail("testSetObjectValue failed:", error); + } + }, + + // string key and array value + testSetArrayValue = async function() { + try { + const result = await puter.kv.set('arrayKey', [1, 2, 3]); + assert(result === true, "Failed to set array as value"); + const value = await puter.kv.get('arrayKey'); + assert(value[0] === 1, "Failed to retrieve array value"); + pass("testSetArrayValue passed"); + } catch (error) { + fail("testSetArrayValue failed:", error); + } + }, + + testSetKeyWithSpecialCharactersAndRetrieve = async function() { + try { + await puter.kv.set('special@Key#', 'value'); + const value = await puter.kv.get('special@Key#'); + assert(value === 'value', "Failed to retrieve value for key with special characters"); + pass("testSetKeyWithSpecialCharactersAndRetrieve passed"); + } catch (error) { + fail("testSetKeyWithSpecialCharactersAndRetrieve failed:", error); + } + }, + + testConcurrentSetOperations = async function() { + try { + const promises = [puter.kv.set('key1', 'value1'), puter.kv.set('key2', 'value2')]; + const results = await Promise.all(promises); + assert(results.every(result => result === true), "Failed to set concurrent keys"); + pass("testConcurrentSetOperations passed"); + } catch (error) { + fail("testConcurrentSetOperations failed:", error); + } + }, + + //test flush: create a bunch of keys, flush, then check if they exist + testFlush = async function() { + try { + const keys = []; + for(let i = 0; i < 10; i++){ + keys.push('key' + i); + } + await Promise.all(keys.map(key => puter.kv.set(key, 'value'))); + await puter.kv.flush(); + const results = await Promise.all(keys.map(key => puter.kv.get(key))); + assert(results.every(result => result === null), "Failed to flush keys"); + pass("testFlush passed"); + } catch (error) { + fail("testFlush failed:", error); + } + }, + + // incr + testIncr = async function() { + try { + const result = await puter.kv.incr('incrKey'); + assert(result === 1, "Failed to increment key"); + pass("testIncr passed"); + } catch (error) { + fail("testIncr failed:", error); + } + }, + + // decr + testDecr = async function() { + try { + const result = await puter.kv.decr('decrKey'); + assert(result === -1, "Failed to decrement key"); + pass("testDecr passed"); + } catch (error) { + fail("testDecr failed:", error); + } + }, + + // incr existing key + testIncrExistingKey = async function() { + try { + await puter.kv.set('incrKey', 1); + const result = await puter.kv.incr('incrKey'); + assert(result === 2, "Failed to increment existing key"); + pass("testIncrExistingKey passed"); + } catch (error) { + fail("testIncrExistingKey failed:", error); + } + }, + + // decr existing key + testIncrExistingKey = async function() { + try { + await puter.kv.set('decrKey', 2); + const result = await puter.kv.decr('decrKey'); + assert(result === 1, "Failed to decrement existing key"); + pass("testDecrExistingKey passed"); + } catch (error) { + fail("testDecrExistingKey failed:", error); + } + }, + + // incr by amount + testIncrByAmount = async function() { + try { + await puter.kv.set('incrKey', 1); + const result = await puter.kv.incr('incrKey', 5); + assert(result === 6, "Failed to increment key by amount"); + pass("testIncrByAmount passed"); + } catch (error) { + fail("testIncrByAmount failed:", error); + } + }, + + // decr by amount + testDecrByAmount = async function() { + try { + await puter.kv.set('decrKey', 10); + const result = await puter.kv.decr('decrKey', 5); + assert(result === 5, "Failed to decrement key by amount"); + pass("testDecrByAmount passed"); + } catch (error) { + fail("testDecrByAmount failed:", error); + } + }, + + // incr by amount existing key + testIncrByAmountExistingKey = async function() { + try { + await puter.kv.set('incrKey', 1); + const result = await puter.kv.incr('incrKey', 5); + assert(result === 6, "Failed to increment existing key by amount"); + pass("testIncrByAmountExistingKey passed"); + } catch (error) { + fail("testIncrByAmountExistingKey failed:", error); + } + }, + + // decr by amount existing key + testDecrByAmountExistingKey= async function() { + try { + await puter.kv.set('decrKey', 10); + const result = await puter.kv.decr('decrKey', 5); + assert(result === 5, "Failed to decrement existing key by amount"); + pass("testDecrByAmountExistingKey passed"); + } catch (error) { + fail("testDecrByAmountExistingKey failed:", error); + } + }, + + // incr by negative amount + testIncrByNegativeAmount = async function() { + try { + await puter.kv.set('incrKey', 1); + const result = await puter.kv.incr('incrKey', -5); + assert(result === -4, "Failed to increment key by negative amount"); + pass("testIncrByNegativeAmount passed"); + } catch (error) { + fail("testIncrByNegativeAmount failed:", error); + } + }, + + // decr by negative amount + testDecrByNegativeAmount = async function() { + try { + await puter.kv.set('decrKey', 10); + const result = await puter.kv.decr('decrKey', -5); + assert(result === 15, "Failed to decrement key by negative amount"); + pass("testDecrByNegativeAmount passed"); + } catch (error) { + fail("testDecrByNegativeAmount failed:", error); + } + }, + + // list keys + testListKeys = async function() { + try { + const keys = []; + // flush first + await puter.kv.flush(); + // create 10 keys + for(let i = 0; i < 10; i++){ + keys.push('key' + i); + } + // set all keys + await Promise.all(keys.map(key => puter.kv.set(key, 'value'))); + // list keys + const result = await puter.kv.list(); + assert(result.length === 10, "Failed to list keys"); + pass("testListKeys passed"); + } catch (error) { + fail("testListKeys failed:", error); + } + }, + + // list keys using glob + testListKeysGlob = async function() { + try { + const keys = []; + // flush first + await puter.kv.flush(); + // create 10 keys + for(let i = 0; i < 10; i++){ + keys.push('key' + i); + } + // set all keys + await Promise.all(keys.map(key => puter.kv.set(key, 'value'))); + // list keys + const result = await puter.kv.list('k*'); + assert(result.length === 10, "Failed to list keys using glob"); + pass("testListKeysGlob passed"); + } catch (error) { + fail("testListKeysGlob failed:", error); + } + }, +] diff --git a/packages/puter-dot-js/test/run.html b/packages/puter-dot-js/test/run.html new file mode 100644 index 000000000..3b01c34e2 --- /dev/null +++ b/packages/puter-dot-js/test/run.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/src/index.js b/src/index.js index 25d136175..6bb56651c 100644 --- a/src/index.js +++ b/src/index.js @@ -53,11 +53,9 @@ window.gui = async function(options){ window.max_item_name_length = options.max_item_name_length ?? 500; window.require_email_verification_to_publish_website = options.require_email_verification_to_publish_website ?? true; - // Add Puter.JS - await loadScript('https://js.puter.com/v2/'); - // DEV: Load the initgui.js file if we are in development mode if(!window.gui_env || window.gui_env === "dev"){ + await loadScript('/sdk/puter.dev.js'); await loadScript('/initgui.js', {isModule: true}); } @@ -65,6 +63,7 @@ window.gui = async function(options){ // note: the order of the bundles is important // note: Build script will prepend `window.gui_env="prod"` to the top of the file else if(gui_env === "prod"){ + await loadScript('https://js.puter.com/v2/'); // Load the minified bundles await loadCSS('/dist/bundle.min.css'); await loadScript('/dist/bundle.min.js'); From afcd821f507d4b39ee0b273d8cde4381b239bbe5 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 19:40:50 -0400 Subject: [PATCH 22/35] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 230f67917..a1934ab9d 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,12 @@ your first step. This user by default has 10GB storage instead of the default
+## License + +This repository is licensed under AGPL3. However, our SDK (puter.js) is also available under Apache 2.0, as indicated by the license file in that section (packages/puter-dot-js) of this repository. + +
+ ## FAQ ### ❓ What's the use case for Puter? From bb9edc4f65ecd23eb47f83acc749f586e31cf991 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:33:44 -0400 Subject: [PATCH 23/35] Add automatic token migration --- packages/backend/src/config.js | 4 +++ packages/backend/src/middleware/auth2.js | 30 +++++++++++++++++++ packages/backend/src/routers/whoami.js | 17 +++++++++-- .../backend/src/services/auth/AuthService.js | 30 +++++++++++++++---- src/initgui.js | 2 +- 5 files changed, 74 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/config.js b/packages/backend/src/config.js index 580a5ca7e..55b13fadc 100644 --- a/packages/backend/src/config.js +++ b/packages/backend/src/config.js @@ -97,6 +97,10 @@ if (config.server_id) { config.contact_email = 'hey@' + config.domain; +// TODO: default value will be changed to false in a future release; +// details to follow in a future announcement. +config.legacy_token_migrate = true; + module.exports = config; // NEW_CONFIG_LOADING diff --git a/packages/backend/src/middleware/auth2.js b/packages/backend/src/middleware/auth2.js index d9eaa2f33..8b592b96b 100644 --- a/packages/backend/src/middleware/auth2.js +++ b/packages/backend/src/middleware/auth2.js @@ -18,8 +18,24 @@ */ const APIError = require("../api/APIError"); const config = require("../config"); +const { UserActorType } = require("../services/auth/Actor"); +const { LegacyTokenError } = require("../services/auth/AuthService"); const { Context } = require("../util/context"); +// The "/whoami" endpoint is a special case where we want to allow +// a legacy token to be used for authentication. The "/whoami" +// endpoint will then return a new token for further requests. +// +const is_whoami = (req) => { + if ( ! config.legacy_token_migrate ) return; + + if ( req.path !== '/whoami' ) return; + + // const subdomain = req.subdomains[res.subdomains.length - 1]; + // if ( subdomain !== 'api' ) return; + return true; +} + // TODO: Allow auth middleware to be used without requiring // authentication. This will allow us to use the auth middleware // in endpoints that do not require authentication, but can @@ -70,6 +86,20 @@ const auth2 = async (req, res, next) => { e.write(res); return; } + if ( e instanceof LegacyTokenError && is_whoami(req) ) { + const new_info = await svc_auth.check_session(token, { + req, + from_upgrade: true, + }) + context.set('actor', new_info.actor); + context.set('user', new_info.user); + req.new_token = new_info.token; + req.token = new_info.token; + req.user = new_info.user; + req.actor = new_info.actor; + next(); + return; + } const re = APIError.create('token_auth_failed'); re.write(res); return; diff --git a/packages/backend/src/routers/whoami.js b/packages/backend/src/routers/whoami.js index e02661237..61ce36de3 100644 --- a/packages/backend/src/routers/whoami.js +++ b/packages/backend/src/routers/whoami.js @@ -54,6 +54,7 @@ const WHOAMI_GET = eggspress('/whoami', { is_temp: (req.user.password === null && req.user.email === null), taskbar_items: await get_taskbar_items(req.user), referral_code: req.user.referral_code, + ...(req.new_token ? { token: req.token } : {}) }; if ( ! is_user ) { @@ -65,6 +66,7 @@ const WHOAMI_GET = eggspress('/whoami', { delete details.desktop_bg_color; delete details.desktop_bg_fit; delete details.taskbar_items; + delete details.token; } res.send(details); @@ -76,8 +78,19 @@ const WHOAMI_GET = eggspress('/whoami', { const WHOAMI_POST = new express.Router(); WHOAMI_POST.post('/whoami', auth, fs, express.json(), async (req, response, next)=>{ // check subdomain - if(require('../helpers').subdomain(req) !== 'api') - next(); + if(require('../helpers').subdomain(req) !== 'api') { + return; + } + + const actor = Context.get('actor'); + if ( ! actor ) { + throw Error('actor not found in context'); + } + + const is_user = actor.type instanceof UserActorType; + if ( ! is_user ) { + throw Error('actor is not a user'); + } let desktop_items = []; diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index c00345421..a1cfc4bd6 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -25,6 +25,8 @@ const { DB_WRITE } = require("../database/consts"); const APP_ORIGIN_UUID_NAMESPACE = '33de3768-8ee0-43e9-9e73-db192b97a5d8'; +const LegacyTokenError = class extends Error {}; + class AuthService extends BaseService { static MODULES = { jwt: require('jsonwebtoken'), @@ -45,7 +47,7 @@ class AuthService extends BaseService { ); if ( ! decoded.hasOwnProperty('type') ) { - throw new Error('legacy token'); + throw new LegacyTokenError(); const user = await this.db.requireRead( "SELECT * FROM `user` WHERE `uuid` = ? LIMIT 1", [decoded.uuid], @@ -251,7 +253,7 @@ class AuthService extends BaseService { user_uid: user.uuid, }, this.global_config.jwt_secret); - return token; + return { session, token }; } async check_session (cur_token, meta) { @@ -264,13 +266,17 @@ class AuthService extends BaseService { if ( decoded.type && decoded.type !== 'session' ) { return {}; } + + const is_legacy = ! decoded.type; - const user = await get_user({ uuid: decoded.user_uid }); + const user = await get_user({ uuid: + is_legacy ? decoded.uuid : decoded.user_uid + }); if ( ! user ) { return {}; } - if ( decoded.type ) { + if ( ! is_legacy ) { // Ensure session exists const session = await this.get_session_(decoded.uuid); if ( ! session ) { @@ -285,8 +291,19 @@ class AuthService extends BaseService { // Upgrade legacy token // TODO: phase this out - const { token } = await this.create_session_token(user, meta); - return { user, token }; + const { session, token } = await this.create_session_token(user, meta); + + const actor_type = new UserActorType({ + user, + session, + }); + + const actor = new Actor({ + user_uid: user.uuid, + type: actor_type, + }); + + return { actor, user, token }; } async create_access_token (authorizer, permissions) { @@ -430,4 +447,5 @@ class AuthService extends BaseService { module.exports = { AuthService, + LegacyTokenError, }; diff --git a/src/initgui.js b/src/initgui.js index dfb1e3b04..1cc6ac4a3 100644 --- a/src/initgui.js +++ b/src/initgui.js @@ -366,7 +366,7 @@ window.initgui = async function(){ } while(!is_verified) } - update_auth_data(window.auth_token, whoami); + update_auth_data(whoami.token || window.auth_token, whoami); // ------------------------------------------------------------------------------------- // Load desktop, only if we're not embedded in a popup From 2d76025c9c968a4f336af88a1cc41f2aa81612ce Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:40:10 -0400 Subject: [PATCH 24/35] Send cookie on token upgrade --- packages/backend/src/middleware/auth2.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backend/src/middleware/auth2.js b/packages/backend/src/middleware/auth2.js index 8b592b96b..bfc69a98c 100644 --- a/packages/backend/src/middleware/auth2.js +++ b/packages/backend/src/middleware/auth2.js @@ -97,6 +97,12 @@ const auth2 = async (req, res, next) => { req.token = new_info.token; req.user = new_info.user; req.actor = new_info.actor; + + res.cookie(config.cookie_name, new_info.token, { + sameSite: 'none', + secure: true, + httpOnly: true, + }); next(); return; } From 2f6f7e39bb9ccc80164ab40d7a9080a3474ed549 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:41:19 -0400 Subject: [PATCH 25/35] Add timestamp --- packages/backend/src/services/auth/AuthService.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index a1cfc4bd6..c1cdc9e5f 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -214,6 +214,9 @@ class AuthService extends BaseService { } } + meta.created = new Date().toISOString(); + meta.created_unix = Math.floor(Date.now() / 1000); + const uuid = this.modules.uuidv4(); await this.db.write( 'INSERT INTO `sessions` ' + From 13525c85a0f914d7cb68728fe952451a0ac7b788 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:46:43 -0400 Subject: [PATCH 26/35] -dot- --- packages/backend/src/SelfhostedModule.js | 4 ++-- packages/{puter-dot-js => puter-js}/.gitignore | 0 .../{puter-dot-js => puter-js}/APACHE_LICENSE.txt | 0 packages/{puter-dot-js => puter-js}/README.md | 0 .../app-migration-guide.txt | 0 .../{puter-dot-js => puter-js}/package-lock.json | 0 packages/{puter-dot-js => puter-js}/package.json | 0 packages/{puter-dot-js => puter-js}/src/bg.png | Bin packages/{puter-dot-js => puter-js}/src/bg.webp | Bin packages/{puter-dot-js => puter-js}/src/index.js | 0 .../src/lib/EventListener.js | 0 packages/{puter-dot-js => puter-js}/src/lib/path.js | 0 .../src/lib/socket.io/socket.io.esm.min.js | 0 .../src/lib/socket.io/socket.io.esm.min.js.map | 0 .../src/lib/socket.io/socket.io.js | 0 .../src/lib/socket.io/socket.io.js.map | 0 .../src/lib/socket.io/socket.io.min.js | 0 .../src/lib/socket.io/socket.io.min.js.map | 0 .../src/lib/socket.io/socket.io.msgpack.min.js | 0 .../src/lib/socket.io/socket.io.msgpack.min.js.map | 0 .../{puter-dot-js => puter-js}/src/lib/utils.js | 0 .../{puter-dot-js => puter-js}/src/modules/AI.js | 0 .../{puter-dot-js => puter-js}/src/modules/Apps.js | 0 .../{puter-dot-js => puter-js}/src/modules/Auth.js | 0 .../src/modules/FSItem.js | 0 .../src/modules/FileSystem/index.js | 0 .../src/modules/FileSystem/operations/copy.js | 0 .../modules/FileSystem/operations/deleteFSEntry.js | 0 .../src/modules/FileSystem/operations/mkdir.js | 0 .../src/modules/FileSystem/operations/move.js | 0 .../src/modules/FileSystem/operations/read.js | 0 .../src/modules/FileSystem/operations/readdir.js | 0 .../src/modules/FileSystem/operations/rename.js | 0 .../src/modules/FileSystem/operations/sign.js | 0 .../src/modules/FileSystem/operations/space.js | 0 .../src/modules/FileSystem/operations/stat.js | 0 .../src/modules/FileSystem/operations/upload.js | 0 .../src/modules/FileSystem/operations/write.js | 0 .../FileSystem/utils/getAbsolutePathForApp.js | 0 .../src/modules/Hosting.js | 0 .../{puter-dot-js => puter-js}/src/modules/KV.js | 0 .../{puter-dot-js => puter-js}/src/modules/OS.js | 0 .../src/modules/PuterDialog.js | 0 .../{puter-dot-js => puter-js}/src/modules/UI.js | 0 packages/{puter-dot-js => puter-js}/test/fs.test.js | 0 packages/{puter-dot-js => puter-js}/test/kv.test.js | 0 packages/{puter-dot-js => puter-js}/test/run.html | 0 47 files changed, 2 insertions(+), 2 deletions(-) rename packages/{puter-dot-js => puter-js}/.gitignore (100%) rename packages/{puter-dot-js => puter-js}/APACHE_LICENSE.txt (100%) rename packages/{puter-dot-js => puter-js}/README.md (100%) rename packages/{puter-dot-js => puter-js}/app-migration-guide.txt (100%) rename packages/{puter-dot-js => puter-js}/package-lock.json (100%) rename packages/{puter-dot-js => puter-js}/package.json (100%) rename packages/{puter-dot-js => puter-js}/src/bg.png (100%) rename packages/{puter-dot-js => puter-js}/src/bg.webp (100%) rename packages/{puter-dot-js => puter-js}/src/index.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/EventListener.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/path.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.esm.min.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.esm.min.js.map (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.js.map (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.min.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.min.js.map (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.msgpack.min.js (100%) rename packages/{puter-dot-js => puter-js}/src/lib/socket.io/socket.io.msgpack.min.js.map (100%) rename packages/{puter-dot-js => puter-js}/src/lib/utils.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/AI.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/Apps.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/Auth.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FSItem.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/index.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/copy.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/deleteFSEntry.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/mkdir.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/move.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/read.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/readdir.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/rename.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/sign.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/space.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/stat.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/upload.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/operations/write.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/FileSystem/utils/getAbsolutePathForApp.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/Hosting.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/KV.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/OS.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/PuterDialog.js (100%) rename packages/{puter-dot-js => puter-js}/src/modules/UI.js (100%) rename packages/{puter-dot-js => puter-js}/test/fs.test.js (100%) rename packages/{puter-dot-js => puter-js}/test/kv.test.js (100%) rename packages/{puter-dot-js => puter-js}/test/run.html (100%) diff --git a/packages/backend/src/SelfhostedModule.js b/packages/backend/src/SelfhostedModule.js index 3829dc50b..cb35362cc 100644 --- a/packages/backend/src/SelfhostedModule.js +++ b/packages/backend/src/SelfhostedModule.js @@ -17,7 +17,7 @@ class SelfhostedModule extends AdvancedBase { commands: [ { name: 'puter.js:webpack-watch', - directory: 'packages/puter-dot-js', + directory: 'packages/puter-js', command: 'npm', args: ['run', 'start-webpack'], }, @@ -29,7 +29,7 @@ class SelfhostedModule extends AdvancedBase { directories: [ { prefix: '/sdk', - path: path_.resolve(__dirname, '../../../packages/puter-dot-js/dist'), + path: path_.resolve(__dirname, '../../../packages/puter-js/dist'), }, ], }); diff --git a/packages/puter-dot-js/.gitignore b/packages/puter-js/.gitignore similarity index 100% rename from packages/puter-dot-js/.gitignore rename to packages/puter-js/.gitignore diff --git a/packages/puter-dot-js/APACHE_LICENSE.txt b/packages/puter-js/APACHE_LICENSE.txt similarity index 100% rename from packages/puter-dot-js/APACHE_LICENSE.txt rename to packages/puter-js/APACHE_LICENSE.txt diff --git a/packages/puter-dot-js/README.md b/packages/puter-js/README.md similarity index 100% rename from packages/puter-dot-js/README.md rename to packages/puter-js/README.md diff --git a/packages/puter-dot-js/app-migration-guide.txt b/packages/puter-js/app-migration-guide.txt similarity index 100% rename from packages/puter-dot-js/app-migration-guide.txt rename to packages/puter-js/app-migration-guide.txt diff --git a/packages/puter-dot-js/package-lock.json b/packages/puter-js/package-lock.json similarity index 100% rename from packages/puter-dot-js/package-lock.json rename to packages/puter-js/package-lock.json diff --git a/packages/puter-dot-js/package.json b/packages/puter-js/package.json similarity index 100% rename from packages/puter-dot-js/package.json rename to packages/puter-js/package.json diff --git a/packages/puter-dot-js/src/bg.png b/packages/puter-js/src/bg.png similarity index 100% rename from packages/puter-dot-js/src/bg.png rename to packages/puter-js/src/bg.png diff --git a/packages/puter-dot-js/src/bg.webp b/packages/puter-js/src/bg.webp similarity index 100% rename from packages/puter-dot-js/src/bg.webp rename to packages/puter-js/src/bg.webp diff --git a/packages/puter-dot-js/src/index.js b/packages/puter-js/src/index.js similarity index 100% rename from packages/puter-dot-js/src/index.js rename to packages/puter-js/src/index.js diff --git a/packages/puter-dot-js/src/lib/EventListener.js b/packages/puter-js/src/lib/EventListener.js similarity index 100% rename from packages/puter-dot-js/src/lib/EventListener.js rename to packages/puter-js/src/lib/EventListener.js diff --git a/packages/puter-dot-js/src/lib/path.js b/packages/puter-js/src/lib/path.js similarity index 100% rename from packages/puter-dot-js/src/lib/path.js rename to packages/puter-js/src/lib/path.js diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js b/packages/puter-js/src/lib/socket.io/socket.io.esm.min.js similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js rename to packages/puter-js/src/lib/socket.io/socket.io.esm.min.js diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map b/packages/puter-js/src/lib/socket.io/socket.io.esm.min.js.map similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.esm.min.js.map rename to packages/puter-js/src/lib/socket.io/socket.io.esm.min.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.js b/packages/puter-js/src/lib/socket.io/socket.io.js similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.js rename to packages/puter-js/src/lib/socket.io/socket.io.js diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.js.map b/packages/puter-js/src/lib/socket.io/socket.io.js.map similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.js.map rename to packages/puter-js/src/lib/socket.io/socket.io.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js b/packages/puter-js/src/lib/socket.io/socket.io.min.js similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.min.js rename to packages/puter-js/src/lib/socket.io/socket.io.min.js diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map b/packages/puter-js/src/lib/socket.io/socket.io.min.js.map similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.min.js.map rename to packages/puter-js/src/lib/socket.io/socket.io.min.js.map diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js b/packages/puter-js/src/lib/socket.io/socket.io.msgpack.min.js similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js rename to packages/puter-js/src/lib/socket.io/socket.io.msgpack.min.js diff --git a/packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map b/packages/puter-js/src/lib/socket.io/socket.io.msgpack.min.js.map similarity index 100% rename from packages/puter-dot-js/src/lib/socket.io/socket.io.msgpack.min.js.map rename to packages/puter-js/src/lib/socket.io/socket.io.msgpack.min.js.map diff --git a/packages/puter-dot-js/src/lib/utils.js b/packages/puter-js/src/lib/utils.js similarity index 100% rename from packages/puter-dot-js/src/lib/utils.js rename to packages/puter-js/src/lib/utils.js diff --git a/packages/puter-dot-js/src/modules/AI.js b/packages/puter-js/src/modules/AI.js similarity index 100% rename from packages/puter-dot-js/src/modules/AI.js rename to packages/puter-js/src/modules/AI.js diff --git a/packages/puter-dot-js/src/modules/Apps.js b/packages/puter-js/src/modules/Apps.js similarity index 100% rename from packages/puter-dot-js/src/modules/Apps.js rename to packages/puter-js/src/modules/Apps.js diff --git a/packages/puter-dot-js/src/modules/Auth.js b/packages/puter-js/src/modules/Auth.js similarity index 100% rename from packages/puter-dot-js/src/modules/Auth.js rename to packages/puter-js/src/modules/Auth.js diff --git a/packages/puter-dot-js/src/modules/FSItem.js b/packages/puter-js/src/modules/FSItem.js similarity index 100% rename from packages/puter-dot-js/src/modules/FSItem.js rename to packages/puter-js/src/modules/FSItem.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/index.js b/packages/puter-js/src/modules/FileSystem/index.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/index.js rename to packages/puter-js/src/modules/FileSystem/index.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/copy.js b/packages/puter-js/src/modules/FileSystem/operations/copy.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/copy.js rename to packages/puter-js/src/modules/FileSystem/operations/copy.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js b/packages/puter-js/src/modules/FileSystem/operations/deleteFSEntry.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/deleteFSEntry.js rename to packages/puter-js/src/modules/FileSystem/operations/deleteFSEntry.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js b/packages/puter-js/src/modules/FileSystem/operations/mkdir.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/mkdir.js rename to packages/puter-js/src/modules/FileSystem/operations/mkdir.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/move.js b/packages/puter-js/src/modules/FileSystem/operations/move.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/move.js rename to packages/puter-js/src/modules/FileSystem/operations/move.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/read.js b/packages/puter-js/src/modules/FileSystem/operations/read.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/read.js rename to packages/puter-js/src/modules/FileSystem/operations/read.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js b/packages/puter-js/src/modules/FileSystem/operations/readdir.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/readdir.js rename to packages/puter-js/src/modules/FileSystem/operations/readdir.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/rename.js b/packages/puter-js/src/modules/FileSystem/operations/rename.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/rename.js rename to packages/puter-js/src/modules/FileSystem/operations/rename.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/sign.js b/packages/puter-js/src/modules/FileSystem/operations/sign.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/sign.js rename to packages/puter-js/src/modules/FileSystem/operations/sign.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/space.js b/packages/puter-js/src/modules/FileSystem/operations/space.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/space.js rename to packages/puter-js/src/modules/FileSystem/operations/space.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/stat.js b/packages/puter-js/src/modules/FileSystem/operations/stat.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/stat.js rename to packages/puter-js/src/modules/FileSystem/operations/stat.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/upload.js b/packages/puter-js/src/modules/FileSystem/operations/upload.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/upload.js rename to packages/puter-js/src/modules/FileSystem/operations/upload.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/operations/write.js b/packages/puter-js/src/modules/FileSystem/operations/write.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/operations/write.js rename to packages/puter-js/src/modules/FileSystem/operations/write.js diff --git a/packages/puter-dot-js/src/modules/FileSystem/utils/getAbsolutePathForApp.js b/packages/puter-js/src/modules/FileSystem/utils/getAbsolutePathForApp.js similarity index 100% rename from packages/puter-dot-js/src/modules/FileSystem/utils/getAbsolutePathForApp.js rename to packages/puter-js/src/modules/FileSystem/utils/getAbsolutePathForApp.js diff --git a/packages/puter-dot-js/src/modules/Hosting.js b/packages/puter-js/src/modules/Hosting.js similarity index 100% rename from packages/puter-dot-js/src/modules/Hosting.js rename to packages/puter-js/src/modules/Hosting.js diff --git a/packages/puter-dot-js/src/modules/KV.js b/packages/puter-js/src/modules/KV.js similarity index 100% rename from packages/puter-dot-js/src/modules/KV.js rename to packages/puter-js/src/modules/KV.js diff --git a/packages/puter-dot-js/src/modules/OS.js b/packages/puter-js/src/modules/OS.js similarity index 100% rename from packages/puter-dot-js/src/modules/OS.js rename to packages/puter-js/src/modules/OS.js diff --git a/packages/puter-dot-js/src/modules/PuterDialog.js b/packages/puter-js/src/modules/PuterDialog.js similarity index 100% rename from packages/puter-dot-js/src/modules/PuterDialog.js rename to packages/puter-js/src/modules/PuterDialog.js diff --git a/packages/puter-dot-js/src/modules/UI.js b/packages/puter-js/src/modules/UI.js similarity index 100% rename from packages/puter-dot-js/src/modules/UI.js rename to packages/puter-js/src/modules/UI.js diff --git a/packages/puter-dot-js/test/fs.test.js b/packages/puter-js/test/fs.test.js similarity index 100% rename from packages/puter-dot-js/test/fs.test.js rename to packages/puter-js/test/fs.test.js diff --git a/packages/puter-dot-js/test/kv.test.js b/packages/puter-js/test/kv.test.js similarity index 100% rename from packages/puter-dot-js/test/kv.test.js rename to packages/puter-js/test/kv.test.js diff --git a/packages/puter-dot-js/test/run.html b/packages/puter-js/test/run.html similarity index 100% rename from packages/puter-dot-js/test/run.html rename to packages/puter-js/test/run.html From aa14541e5083ddce586bf7ecddaa2db4e47f7fb7 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:54:50 -0400 Subject: [PATCH 27/35] Update package-lock.json for npm ci --- package-lock.json | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/package-lock.json b/package-lock.json index 2a73bfe0c..2932cd1b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -412,6 +412,24 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/@babel/template": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", @@ -4915,6 +4933,48 @@ "typedarray": "^0.0.6" } }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -5107,6 +5167,22 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -8800,6 +8876,10 @@ "node": ">=6" } }, + "node_modules/puter": { + "resolved": "packages/puter-js", + "link": true + }, "node_modules/puter-js-common": { "resolved": "packages/puter-js-common", "link": true @@ -9115,6 +9195,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9310,6 +9399,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -9555,6 +9653,12 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -10074,6 +10178,15 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -10865,6 +10978,14 @@ "typescript": "^5.1.6" } }, + "packages/puter-js": { + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "concurrently": "^8.2.2", + "webpack-cli": "^5.1.4" + } + }, "packages/puter-js-common": { "version": "1.0.0", "license": "UNLICENSED" From 5effca4bbc6f76ea05a95a20e7de8edb4062c71d Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 21:57:26 -0400 Subject: [PATCH 28/35] Add missing i18n key --- src/i18n/translations/en.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/translations/en.js b/src/i18n/translations/en.js index 473966097..544b96c90 100644 --- a/src/i18n/translations/en.js +++ b/src/i18n/translations/en.js @@ -181,6 +181,7 @@ const en = { select: "Select", selected: 'selected', select_color: 'Select color…', + sessions: "Sessions", send: "Send", send_password_recovery_email: "Send Password Recovery Email", session_saved: "Thank you for creating an account. This session has been saved.", From f4f58dbfb912b6c79c4f49da1d35e04676b6356f Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 23:27:43 -0400 Subject: [PATCH 29/35] Fix destructuring --- packages/backend/src/routers/login.js | 2 +- packages/backend/src/routers/signup.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/routers/login.js b/packages/backend/src/routers/login.js index 3a75c1990..705b76259 100644 --- a/packages/backend/src/routers/login.js +++ b/packages/backend/src/routers/login.js @@ -90,7 +90,7 @@ router.post('/login', express.json(), body_parser_error_handler, async (req, res // check password if(await bcrypt.compare(req.body.password, user.password)){ const svc_auth = req.services.get('auth'); - const token = await svc_auth.create_session_token(user, { req }); + const { token } = await svc_auth.create_session_token(user, { req }); //set cookie // res.cookie(config.cookie_name, token); res.cookie(config.cookie_name, token, { diff --git a/packages/backend/src/routers/signup.js b/packages/backend/src/routers/signup.js index 91a9cd607..4f2db4ea1 100644 --- a/packages/backend/src/routers/signup.js +++ b/packages/backend/src/routers/signup.js @@ -247,7 +247,7 @@ module.exports = eggspress(['/signup'], { ); // create token for login - const token = await svc_auth.create_session_token(user, { + const { token } = await svc_auth.create_session_token(user, { req, }); // jwt.sign({uuid: user_uuid}, config.jwt_secret); From 0eedcf567ef87c7afab9d6ff117cbd17df4a8df4 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 11 Apr 2024 23:48:17 -0400 Subject: [PATCH 30/35] Apply some fixes --- packages/backend/src/middleware/auth2.js | 2 ++ packages/backend/src/routers/signup.js | 5 +++++ packages/backend/src/services/auth/AuthService.js | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/middleware/auth2.js b/packages/backend/src/middleware/auth2.js index bfc69a98c..7a5e8024d 100644 --- a/packages/backend/src/middleware/auth2.js +++ b/packages/backend/src/middleware/auth2.js @@ -63,8 +63,10 @@ const auth2 = async (req, res, next) => { if(!token) { APIError.create('token_missing').write(res); + return; } else if (typeof token !== 'string') { APIError.create('token_auth_failed').write(res); + return; } else { token = token.replace('Bearer ', '') } diff --git a/packages/backend/src/routers/signup.js b/packages/backend/src/routers/signup.js index 4f2db4ea1..4d25e3791 100644 --- a/packages/backend/src/routers/signup.js +++ b/packages/backend/src/routers/signup.js @@ -71,6 +71,11 @@ module.exports = eggspress(['/signup'], { const { user, token } = await svc_auth.check_session( req.cookies[config.cookie_name] ); + res.cookie(config.cookie_name, token, { + sameSite: 'none', + secure: true, + httpOnly: true, + }); // const decoded = await jwt.verify(token, config.jwt_secret); // const user = await get_user({ uuid: decoded.uuid }); if ( user ) { diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index c1cdc9e5f..08de91532 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -378,7 +378,7 @@ class AuthService extends BaseService { if ( session.uuid === actor.type.session ) { session.current = true; } - session.meta = JSON.parse(session.meta ?? {}); + session.meta = JSON.parse(session.meta ?? "{}"); }); return sessions; From 356a3284faa28c8cf448230e45b64b078d693b0f Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Fri, 12 Apr 2024 00:10:56 -0400 Subject: [PATCH 31/35] Fix mysql incompatibility --- packages/backend/src/services/auth/AuthService.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index 08de91532..361a32892 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -240,7 +240,10 @@ class AuthService extends BaseService { [uuid], ); - session.meta = JSON.parse(session.meta ?? {}); + session.meta = this.db.case({ + mysql: () => session.meta, + otherwise: () => JSON.parse(session.meta ?? "{}") + })(); return session; } @@ -375,10 +378,13 @@ class AuthService extends BaseService { ); sessions.forEach(session => { + session.meta = this.db.case({ + mysql: () => session.meta, + otherwise: () => JSON.parse(session.meta ?? "{}") + })(); if ( session.uuid === actor.type.session ) { session.current = true; } - session.meta = JSON.parse(session.meta ?? "{}"); }); return sessions; From 1da3a769c439ce048afd4e8283bd0ae4ed156a1d Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Fri, 12 Apr 2024 00:19:07 -0400 Subject: [PATCH 32/35] Use localstorage instead of cookie for list-sessions --- src/UI/UIWindowManageSessions.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/UI/UIWindowManageSessions.js b/src/UI/UIWindowManageSessions.js index 561597fb5..1debb5da9 100644 --- a/src/UI/UIWindowManageSessions.js +++ b/src/UI/UIWindowManageSessions.js @@ -87,6 +87,7 @@ const UIWindowManageSessions = async function UIWindowManageSessions () { const resp = await fetch(`${api_origin}/auth/revoke-session`, { method: 'POST', headers: { + Authorization: `Bearer ${puter.authToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ @@ -115,6 +116,9 @@ const UIWindowManageSessions = async function UIWindowManageSessions () { const reload_sessions = async () => { const resp = await fetch(`${api_origin}/auth/list-sessions`, { + headers: { + Authorization: `Bearer ${puter.authToken}`, + }, method: 'GET', }); From 09c3cc6db1ff5a901fc4ea5b512898db63d6f593 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Fri, 12 Apr 2024 01:22:33 -0400 Subject: [PATCH 33/35] Fix error when session not found --- packages/backend/src/services/auth/AuthService.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/services/auth/AuthService.js b/packages/backend/src/services/auth/AuthService.js index 361a32892..4b264e2a3 100644 --- a/packages/backend/src/services/auth/AuthService.js +++ b/packages/backend/src/services/auth/AuthService.js @@ -186,7 +186,7 @@ class AuthService extends BaseService { req.connection.remoteAddress : req.connection.remoteAddress ; - + meta.ip = ip; meta.server = this.global_config.server_id; @@ -240,6 +240,8 @@ class AuthService extends BaseService { [uuid], ); + if ( ! session ) return; + session.meta = this.db.case({ mysql: () => session.meta, otherwise: () => JSON.parse(session.meta ?? "{}") @@ -274,7 +276,7 @@ class AuthService extends BaseService { } const is_legacy = ! decoded.type; - + const user = await get_user({ uuid: is_legacy ? decoded.uuid : decoded.user_uid }); From d06f856e4684947f36531422063f67833dec2d62 Mon Sep 17 00:00:00 2001 From: Christian Neff Date: Fri, 12 Apr 2024 22:00:42 +0200 Subject: [PATCH 34/35] Update German translation --- src/i18n/translations/de.js | 62 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/i18n/translations/de.js b/src/i18n/translations/de.js index 8fc51caee..639d4b765 100644 --- a/src/i18n/translations/de.js +++ b/src/i18n/translations/de.js @@ -21,9 +21,9 @@ const de = { english_name: "German", code: "de", dictionary: { - access_granted_to: "Erlaubt zugriff auf", + access_granted_to: "Zugriff erlaubt für", add_existing_account: "Bestehenden Account hinzufügen", - all_fields_required: 'Alle felder müssen ausgefüllt werden.', + all_fields_required: 'Alle Felder müssen ausgefüllt werden.', apply: "Anwenden", ascending: 'Aufsteigend', background: "Hintergrund", @@ -34,7 +34,7 @@ const de = { change_language: "Sprache ändern", change_password: "Passwort ändern", change_username: "Benutzername ändern", - close_all_windows: "Alle fenster schließen", + close_all_windows: "Alle Fenster schließen", color: 'Farbe', confirm_account_for_free_referral_storage_c2a: 'Erstellen Sie ein Konto und bestätigen Sie Ihre E-Mail-Adresse, um 1 GB kostenlosen Speicherplatz zu erhalten. Auch Ihr Freund erhält 1 GB kostenlosen Speicherplatz.', confirm_new_password: "Neues Passwort bestätigen", @@ -43,7 +43,7 @@ const de = { continue: "Weiter", copy: 'Kopieren', copy_link: "Link kopieren", - copying: "Kopiert", + copying: "Kopiere", cover: 'Abdecken', create_account: "Account erstellen", create_free_account: "Kostenlosen Account erstellen", @@ -52,19 +52,19 @@ const de = { cut: 'Ausschneiden', date_modified: 'Zuletzt geändert', delete: 'Entfernen', - delete_permanently: "Permanent entfernen", + delete_permanently: "Dauerhaft entfernen", deploy_as_app: 'Als App bereitstellen', - descending: 'Herabsteigend', - desktop_background_fit: "Fit", //idk translation - dir_published_as_website: `%strong% Wurde veröffentlicht zu:`, - disassociate_dir: "Verzeichniss trennen", + descending: 'Absteigend', + desktop_background_fit: "Passend", + dir_published_as_website: `%strong% wurde veröffentlicht zu:`, + disassociate_dir: "Verzeichnis trennen", download: 'Herunterladen', downloading: "Lädt herunter", - email: "Email", - email_or_username: "Email oder Benutzername", + email: "E-Mail", + email_or_username: "E-Mail oder Benutzername", empty_trash: 'Papierkorb leeren', empty_trash_confirmation: `Sind Sie sicher, dass Sie die Elemente im Papierkorb dauerhaft löschen möchten?`, - emptying_trash: 'Leert Papierkorb…', + emptying_trash: 'Papierkorb wird geleert…', feedback: "Feedback", feedback_c2a: "Bitte verwenden Sie das untenstehende Formular, um uns Ihr Feedback, Ihre Kommentare und Fehlerberichte zu senden.", feedback_sent_confirmation: "Danke, dass Sie uns kontaktiert haben. Wenn mit Ihrem Konto eine E-Mail-Adresse verknüpft ist, erhalten Sie so schnell wie möglich eine Rückmeldung von uns.", @@ -83,15 +83,15 @@ const de = { log_in: "Einloggen", log_out: 'Ausloggen', move: 'Verschieben', - moving: "Verschiebt", + moving: "Verschiebe", my_websites: "Meine Webseiten", name: 'Name', name_cannot_be_empty: 'Name kann nicht leer sein.', name_cannot_contain_double_period: "Der Name kann nicht '..' sein.", name_cannot_contain_period: "Der Name kann nicht '.' sein.", name_cannot_contain_slash: "Der Name kann nicht '/' enthalten.", - name_must_be_string: "Name kann nur eine Zeichenfolge sein.", - name_too_long: `Der Name kann nicht länger als %% Zeichen sein.`, + name_must_be_string: "Name darf nur eine Zeichenfolge sein.", + name_too_long: `Der Name darf nicht länger als %% Zeichen sein.`, new: 'Neu', new_folder: 'Neuer Ordner', new_password: "Neues Passwort", @@ -100,25 +100,25 @@ const de = { no_websites_published: "Sie haben noch keine Webseite veröffentlicht", ok: 'OK', open: "Öffnen", - open_in_new_tab: "Im neuen Tab öffnen", - open_in_new_window: "Im neuen Fenster öffnen", + open_in_new_tab: "In neuem Tab öffnen", + open_in_new_window: "In neuem Fenster öffnen", open_with: "Öffnen mit", password: "Passwort", password_changed: "Passwort geändert.", - passwords_do_not_match: '`Neues Passwoer` und `Neues Passwort bestätigen` stimmen nicht überein.', + passwords_do_not_match: 'Die Passwörter in `Neues Passwort` und `Neues Passwort bestätigen` stimmen nicht überein.', paste: 'Einfügen', paste_into_folder: "In Ordner einfügen", pick_name_for_website: "Wählen Sie einen Namen für Ihre Webseite:", picture: "Bild", powered_by_puter_js: `Betrieben von {{link=docs}}Puter.js{{/link}}`, - preparing: "Bereitet vor...", - preparing_for_upload: "Bereitet für das Hochladen vor...", + preparing: "Bereite vor…", + preparing_for_upload: "Bereite für das Hochladen vor…", properties: "Einstellungen", publish: "Veröffentlichen", publish_as_website: 'Als Webseite veröffentlichen', recent: "Kürzlich", recover_password: "Passwort wiederherstellen", - refer_friends_c2a: "Erhalten Sie 1 GB für jeden Freund, der ein Account bei Puter erstellt und bestätigt. Ihr Freund bekommt auch 1 GB!", + refer_friends_c2a: "Erhalten Sie 1 GB für jeden Freund, der einen Account bei Puter erstellt und bestätigt. Ihr Freund bekommt auch 1 GB!", refer_friends_social_media_c2a: `Erhalten Sie 1 GB kostenlosen Speicherplatz auf Puter.com!`, refresh: 'Neu laden', release_address_confirmation: `Sind Sie sicher, dass Sie diese Adresse freigeben möchten?`, @@ -127,9 +127,9 @@ const de = { repeat: 'Wiederholen', resend_confirmation_code: "Bestätigungscode erneut senden", restore: "Wiederherstellen", - save_account_to_get_copy_link: "Bitte erstellen Sie ein Acccount, um fortzufahren.", - save_account_to_publish: 'Bitte erstellen Sie ein Acccount, um fortzufahren.', - save_session_c2a: 'Erstellen Sie ein Konto, um Ihre aktuelle Sitzung zu speichern und den Verlust Ihrer Arbeit zu vermeiden.', + save_account_to_get_copy_link: "Bitte erstellen Sie einen Acccount, um fortzufahren.", + save_account_to_publish: 'Bitte erstellen Sie einen Acccount, um fortzufahren.', + save_session_c2a: 'Erstellen Sie ein Konto, um Ihre aktuelle Sitzung zu speichern und den Verlust Ihrer Arbeit zu verhindern.', scan_qr_c2a: 'Scannen Sie den folgenden Code, um sich von anderen Geräten aus bei dieser Sitzung anzumelden', select: "Auswählen", select_color: 'Farbe auswählen…', @@ -140,19 +140,19 @@ const de = { share_to: "Teilen mit", show_all_windows: "Alle Fenster zeigen", show_hidden: 'Zeige versteckte', - sign_in_with_puter: "Einloggen mit Puter", - sign_up: "Einloggen", - signing_in: "Loggt ein…", + sign_in_with_puter: "Anmelden mit Puter", + sign_up: "Anmelden", + signing_in: "Melde an…", size: 'Größe', - sort_by: 'Sotieren nach', + sort_by: 'Sortieren nach', start: 'Start', storage_puter_used: 'Verwendet von Puter', - taking_longer_than_usual: 'Dauert etwas länger als gewöhnlich. Bitte warten...', + taking_longer_than_usual: 'Es dauert etwas länger als gewöhnlich. Bitte warten…', text_document: 'Textdokument', tos_fineprint: `Indem Sie auf „Kostenloses Konto erstellen“ klicken, stimmen Sie den {{link=terms}}Nutzungsbedingungen{{/link}} und der {{link=privacy}}Datenschutzerklärung{{/link}} von Puter zu.`, trash: 'Papierkorb', type: 'Typ', - undo: 'Zurück', + undo: 'Rückgängig', unzip: "Entpacken", upload: 'Hochladen', upload_here: 'Hier hochladen', @@ -161,7 +161,7 @@ const de = { versions: "Versionen", yes_release_it: 'Ja, veröffentlichen', you_have_been_referred_to_puter_by_a_friend: "Sie wurden von einem Freund an Puter verwiesen!", - zip: "Zip", + zip: "Zippen", } }; From 352f1bc23e1781fc927a94f86a179d109b18ff4c Mon Sep 17 00:00:00 2001 From: Nariman Jelveh Date: Fri, 12 Apr 2024 13:59:59 -0700 Subject: [PATCH 35/35] Update README.md to add link to fridge running Puter. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a1934ab9d..39451340a 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ Puter interacts directly with the DOM and jQuery provides an elegant yet powerfu - [Minecraft](https://twitter.com/HeyPuter/status/1771957571496092036) | [video](https://www.youtube.com/watch?v=GIowZUXkg5g) - [PlayStation 4](https://twitter.com/HeyPuter/status/1767978053014270059) - [Skyworth TV](https://twitter.com/ericalexdube/status/1767983049277411564) +- [A Fridge!](https://twitter.com/HeyPuter/status/1778890003797745842) - [Oculus Quest 2](https://twitter.com/HeyPuter/status/1768664081756754012) - [Tesla Model S](https://twitter.com/HeyPuter/status/1767971178864587057) - [Tesla Model Y](https://twitter.com/HeyPuter/status/1772858333751636310)