From 56d22a28a099ae82098cab2b9fd94d50dbc7ff26 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Wed, 27 Oct 2021 07:46:21 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Changes=20to=20support=20BullMQ?= =?UTF-8?q?=20on=20the=20service=20layer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Removed socket connection from context 2. Added Redux middleware to persist socket connection 3. Removed amqplib and RabbitMQ support 4. Removed RabbitMQ from docker-compose configuration 5. Removed a proxy route to IMS from the facade 6. Refactored file actions to support the new way of socket event emitting and listening --- docker-compose.env | 1 - docker-compose.yml | 12 -- package.json | 4 +- src/client/actions/fileops.actions.tsx | 75 +++++------- src/client/components/Import.tsx | 5 +- src/client/constants/action-types.ts | 4 + src/client/constants/endpoints.ts | 4 +- src/client/context/socket/socket.context.tsx | 48 -------- src/client/index.tsx | 9 +- src/client/reducers/fileops.reducer.ts | 16 ++- .../shared/utils/tradepaperback.utils.ts | 32 +++-- src/client/store/index.ts | 10 +- src/server/index.ts | 38 ------ src/server/route/index.ts | 3 +- .../route/routes/importComics.routes.ts | 45 ------- yarn.lock | 115 +++++++++++------- 16 files changed, 151 insertions(+), 270 deletions(-) delete mode 100644 src/client/context/socket/socket.context.tsx diff --git a/docker-compose.env b/docker-compose.env index 3affd09..e69de29 100644 --- a/docker-compose.env +++ b/docker-compose.env @@ -1 +0,0 @@ -RABBITMQ_URI=amqp://user:bitnami@rabbitmq:5672 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 7775bec..1f0d79a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,7 +21,6 @@ services: - "3050:3050" - "8051:8051" depends_on: - - rabbitmq - db - nats - traefik @@ -173,17 +172,6 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - rabbitmq: - image: 'bitnami/rabbitmq:latest' - container_name: queue - environment: - RABBITMQ_USERNAME: 'user' - RABBITMQ_PASSWORD: 'bitnami' - ports: - - "5672:5672" - - "15672:15672" - networks: - - proxy networks: proxy: diff --git a/package.json b/package.json index 0c88a18..4b1a096 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "@types/socket.io": "^3.0.2", "@types/socket.io-client": "^3.0.0", "airdcpp-apisocket": "^2.4.4", - "amqplib": "^0.8.0", "array-sort-by": "^1.2.1", "babel-polyfill": "^6.26.0", "better-docs": "^2.3.2", @@ -65,8 +64,9 @@ "react-stickynode": "^4.0.0", "react-table": "^7.7.0", "react-window-dynamic-list": "^2.3.5", + "redux-socket.io-middleware": "^1.0.4", "sharp": "^0.28.1", - "socket.io-client": "^4.1.2", + "socket.io-client": "^4.3.2", "threetwo-ui-typings": "^1.0.10", "voca": "^1.4.0", "websocket": "^1.0.34", diff --git a/src/client/actions/fileops.actions.tsx b/src/client/actions/fileops.actions.tsx index 11feb0e..101fcd3 100644 --- a/src/client/actions/fileops.actions.tsx +++ b/src/client/actions/fileops.actions.tsx @@ -4,7 +4,6 @@ import { API_BASE_URI, COMICBOOKINFO_SERVICE_URI, IMPORT_SERVICE_BASE_URI, - SOCKET_BASE_URI, } from "../constants/endpoints"; import { IMS_COMICBOOK_METADATA_FETCHED, @@ -18,11 +17,11 @@ import { IMS_CV_METADATA_IMPORT_CALL_IN_PROGRESS, IMS_CV_METADATA_IMPORT_SUCCESSFUL, IMS_CV_METADATA_IMPORT_FAILED, + LS_IMPORT, } from "../constants/action-types"; import { refineQuery } from "../shared/utils/filenameparser.utils"; import sortBy from "array-sort-by"; import { success } from "react-notification-system-redux"; -import { Socket } from "socket.io-client"; export async function walkFolder(path: string): Promise> { return axios @@ -50,50 +49,35 @@ export async function walkFolder(path: string): Promise> { * @param {Object} options * @return {Promise} HTML of the page */ -export const fetchComicBookMetadata = - (options, socketInstance: Socket) => async (dispatch) => { - const socket = socketInstance.socket; - const extractionOptions = { - extractTarget: "cover", - targetExtractionFolder: "./userdata/covers", - extractionMode: "bulk", - paginationOptions: { - pageLimit: 25, - page: 1, - }, - }; - const walkedFolders = await walkFolder("./comics"); - dispatch( - success({ - // uid: 'once-please', // you can specify your own uid if required - title: "Import Started", - message: ` Socket ${socket.id} connected. ${walkedFolders.length} comics scanned.`, - dismissible: "click", - position: "tr", - autoDismiss: 0, - }), - ); - await axios - .request({ - url: `${API_BASE_URI}/getComicCovers`, - method: "POST", - data: { - extractionOptions, - walkedFolders, - }, - }) - .then((response) => { - console.log("Response from import call", response); - }); - - socket.on("coverExtracted", (data) => { - console.log(data); - dispatch({ - type: IMS_COMICBOOK_METADATA_FETCHED, - data, - }); - }); +export const fetchComicBookMetadata = (options) => async (dispatch) => { + const extractionOptions = { + extractTarget: "cover", + targetExtractionFolder: "./userdata/covers", + extractionMode: "bulk", + paginationOptions: { + pageLimit: 25, + page: 1, + }, }; + const walked = await walkFolder("./comics"); + // dispatch( + // success({ + // // uid: 'once-please', // you can specify your own uid if required + // title: "Import Started", + // message: ` Socket ${socket.id} connected. ${walkedFolders.length} comics scanned.`, + // dismissible: "click", + // position: "tr", + // autoDismiss: 0, + // }), + // ); + walked.forEach((walkedFolders) => + dispatch({ + type: LS_IMPORT, + meta: { remote: true }, + data: { extractionOptions, walkedFolders }, + }), + ); +}; export const getComicBooks = (options) => async (dispatch) => { const { paginationOptions } = options; @@ -128,7 +112,6 @@ export const importToDB = (payload?: any) => (dispatch) => { dispatch({ type: IMS_CV_METADATA_IMPORT_CALL_IN_PROGRESS, }); - return axios .request({ url: `${IMPORT_SERVICE_BASE_URI}/rawImportToDb`, diff --git a/src/client/components/Import.tsx b/src/client/components/Import.tsx index e64efd7..df9b441 100644 --- a/src/client/components/Import.tsx +++ b/src/client/components/Import.tsx @@ -2,7 +2,6 @@ import React, { ReactElement, useCallback, useContext } from "react"; import { isEmpty, isNil, isUndefined } from "lodash"; import { useSelector, useDispatch } from "react-redux"; import { fetchComicBookMetadata } from "../actions/fileops.actions"; -import { WebSocketContext } from "../context/socket/socket.context"; import { IFolderData } from "threetwo-ui-typings"; import { LazyLog, ScrollFollow } from "react-lazylog"; import DynamicList, { createCache } from "react-window-dynamic-list"; @@ -30,7 +29,6 @@ interface IProps { */ export const Import = (props: IProps): ReactElement => { - const socket = useContext(WebSocketContext); const dispatch = useDispatch(); const isSocketConnected = useSelector((state: RootState) => { console.log(state); @@ -44,8 +42,7 @@ export const Import = (props: IProps): ReactElement => { ); const initiateImport = useCallback(() => { if (typeof props.path !== "undefined") { - console.log("asdasd"); - dispatch(fetchComicBookMetadata(props.path, socket)); + dispatch(fetchComicBookMetadata(props.path)); } }, [dispatch]); const cache = createCache(); diff --git a/src/client/constants/action-types.ts b/src/client/constants/action-types.ts index 07db074..20b494b 100644 --- a/src/client/constants/action-types.ts +++ b/src/client/constants/action-types.ts @@ -57,3 +57,7 @@ export const AIRDCPP_RESULT_DOWNLOAD_INITIATED = "AIRDCPP_RESULT_DOWNLOAD_INITIATED"; export const AIRDCPP_BUNDLES_FETCHED = "AIRDCPP_BUNDLES_FETCHED"; export const AIRDCPP_DOWNLOAD_PROGRESS_TICK = "AIRDCPP_DOWNLOAD_PROGRESS_TICK"; + +// LIBRARY SOCKET ENDPOINT +export const LS_IMPORT = "LS_IMPORT"; +export const LS_COVER_EXTRACTED = "LS_COVER_EXTRACTED"; diff --git a/src/client/constants/endpoints.ts b/src/client/constants/endpoints.ts index ab83454..02745e4 100644 --- a/src/client/constants/endpoints.ts +++ b/src/client/constants/endpoints.ts @@ -37,8 +37,8 @@ export const IMPORT_SERVICE_BASE_URI = hostURIBuilder({ }); export const SOCKET_BASE_URI = hostURIBuilder({ - protocol: "ws", + protocol: "http", host: process.env.DOCKER_HOST || "localhost", port: "3001", - apiPath: ``, + apiPath: `/`, }); diff --git a/src/client/context/socket/socket.context.tsx b/src/client/context/socket/socket.context.tsx deleted file mode 100644 index 2678b6b..0000000 --- a/src/client/context/socket/socket.context.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React, { createContext, ReactElement } from "react"; -import io, { Socket } from "socket.io-client"; -import { SOCKET_BASE_URI } from "../../constants/endpoints"; -import { useDispatch } from "react-redux"; -import { RMQ_SOCKET_CONNECTED } from "../../constants/action-types"; -import { success } from "react-notification-system-redux"; - -const WebSocketContext = createContext(null); -export const WebSocketProvider = ({ children }): ReactElement => { - const dispatch = useDispatch(); - const socket: Socket = io(SOCKET_BASE_URI); - socket.on("connect", () => { - console.log("connected"); - dispatch({ - type: RMQ_SOCKET_CONNECTED, - isSocketConnected: true, - socketId: socket.id, - }); - }); - // on cover extraction - socket.on("coverExtracted", (data) => { - console.log("shaket", data); - dispatch( - success({ - // uid: 'once-please', // you can specify your own uid if required - title: "Cover Extracted", - message: ` Socket ${socket.id} connected. ${data}`, - dismissible: "click", - position: "tr", - autoDismiss: 0, - }), - ); - }); - socket.on("disconnect", () => { - console.log(`disconnect`); - }); - - socket.emit("bastard", { name: "puk" }); - const ws: any = { - socket, - }; - - return ( - {children} - ); -}; -export { WebSocketContext }; -export default WebSocketProvider; diff --git a/src/client/index.tsx b/src/client/index.tsx index fed90b4..b5081df 100644 --- a/src/client/index.tsx +++ b/src/client/index.tsx @@ -2,7 +2,6 @@ import React from "react"; import { render } from "react-dom"; import { Provider } from "react-redux"; import { ConnectedRouter } from "connected-react-router"; -import WebSocketProvider from "./context/socket/socket.context"; import configureStore, { history } from "./store/index"; import App from "./components/App"; const store = configureStore({}); @@ -10,11 +9,9 @@ const rootEl = document.getElementById("root"); render( - - - - - + + + , rootEl, ); diff --git a/src/client/reducers/fileops.reducer.ts b/src/client/reducers/fileops.reducer.ts index 814ea2a..6164e69 100644 --- a/src/client/reducers/fileops.reducer.ts +++ b/src/client/reducers/fileops.reducer.ts @@ -16,6 +16,8 @@ import { IMS_COMIC_BOOK_GROUPS_CALL_FAILED, IMS_COMIC_BOOK_ARCHIVE_EXTRACTION_CALL_IN_PROGRESS, IMS_COMIC_BOOK_ARCHIVE_EXTRACTION_SUCCESS, + LS_IMPORT, + LS_COVER_EXTRACTED, } from "../constants/action-types"; const initialState = { IMSCallInProgress: false, @@ -114,7 +116,19 @@ function fileOpsReducer(state = initialState, action) { return { ...state, extractedComicBookArchive: [], - } + }; + } + + case LS_IMPORT: { + return { + ...state, + }; + } + case LS_COVER_EXTRACTED: { + console.log("BASH", action); + return { + ...state, + }; } default: return state; diff --git a/src/client/shared/utils/tradepaperback.utils.ts b/src/client/shared/utils/tradepaperback.utils.ts index a29f45c..2b5d502 100644 --- a/src/client/shared/utils/tradepaperback.utils.ts +++ b/src/client/shared/utils/tradepaperback.utils.ts @@ -1,4 +1,4 @@ -import { flatten, compact, map, isEmpty } from "lodash"; +import { flatten, compact, map, isEmpty, isNil } from "lodash"; import axios from "axios"; export const detectIssueTypes = (deck: string): any => { @@ -33,17 +33,23 @@ const getIssueTypeDisplayName = ( regexPattern: RegExp[], displayName: string, ) => { - const matches = [...regexPattern] - .map((regex) => { - return deck.match(regex); - }) - .map((item) => { - if (item !== undefined) { - return item; - } - }); - const results = flatten(compact(matches)); - if (!isEmpty(results)) { - return { displayName, results }; + try { + const matches = [...regexPattern] + .map((regex) => { + if (!isNil(deck)) { + return deck.match(regex); + } + }) + .map((item) => { + if (item !== undefined) { + return item; + } + }); + const results = flatten(compact(matches)); + if (!isEmpty(results)) { + return { displayName, results }; + } + } catch (error) { + console.log(error); } }; diff --git a/src/client/store/index.ts b/src/client/store/index.ts index 5cec8b2..c413440 100644 --- a/src/client/store/index.ts +++ b/src/client/store/index.ts @@ -3,16 +3,20 @@ import { createStore, applyMiddleware, compose } from "redux"; import { createBrowserHistory } from "history"; import thunk from "redux-thunk"; import createRootReducer from "../reducers"; +import socketIO from "socket.io-client"; +import socketIoMiddleware from "redux-socket.io-middleware"; +const io = socketIO(`http://localhost:3001`); export const history = createBrowserHistory(); -export default function configureStore(initialState) { +const configureStore = (initialState) => { const store = createStore( createRootReducer(history), initialState, compose( - applyMiddleware(thunk, routerMiddleware(history)), + applyMiddleware(socketIoMiddleware(io), thunk, routerMiddleware(history)), // window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), ), ); return store; -} +}; +export default configureStore; diff --git a/src/server/index.ts b/src/server/index.ts index f90b542..77f141d 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,14 +1,9 @@ import express, { Request, Response, Router, Express } from "express"; import bodyParser from "body-parser"; -import { createServer } from "http"; - import router from "./route"; -import cors from "cors"; -const amqp = require("amqplib/callback_api"); // call express const app: Express = express(); // define our app using express -app.use(cors({ origin: "*" })); // configure app to use bodyParser for // Getting data from body of requests @@ -16,10 +11,6 @@ app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); const port: number = Number(process.env.PORT) || 8050; // set our port -// set rabbitMQ host - -const rabbitMQConnectionString = - process.env.RABBITMQ_URI || "amqp://localhost:5672"; app.get("/", (req: Request, res: Response) => { console.log("sending index.html"); @@ -37,33 +28,4 @@ app.use(express.static("public")); app.listen(port); -amqp.connect(`${rabbitMQConnectionString}`, (error0, connection) => { - if (error0) { - throw error0; - } - connection.createChannel((error1, channel) => { - if (error1) { - throw error1; - } - const queue = "comicBookCovers"; - channel.assertQueue(queue, { - durable: false, - }); - - console.log(`RabbitMQ: Connected to ${queue} queue.`); - console.log(`RabbitMQ: Waiting for comic book cover data in ${queue}`); - - channel.consume( - queue, - (data) => { - //Socket Trigger All Clients - // io.sockets.emit("coverExtracted", JSON.parse(data.content.toString())); - }, - { - noAck: true, - }, - ); - }); -}); - console.log(`Server is listening on ${port}`); diff --git a/src/server/route/index.ts b/src/server/route/index.ts index 7a1f5fd..d9954c9 100644 --- a/src/server/route/index.ts +++ b/src/server/route/index.ts @@ -1,4 +1,3 @@ -import extra from "./routes/importComics.routes"; import opds from "./routes/opds.routes"; -export default { extra, opds }; +export default { opds }; diff --git a/src/server/route/routes/importComics.routes.ts b/src/server/route/routes/importComics.routes.ts index 878aede..e69de29 100644 --- a/src/server/route/routes/importComics.routes.ts +++ b/src/server/route/routes/importComics.routes.ts @@ -1,45 +0,0 @@ -import router from "../router"; -import { Request, Response } from "express"; -import axios, { AxiosPromise } from "axios"; - -router.route("/getComicCovers").post(async (req: Request, res: Response) => { - typeof req.body === "object" ? req.body : {}; - const importServiceURI = process.env.DOCKER_HOST - ? `http://${process.env.DOCKER_HOST}:3000/api/import` - : "http://localhost:3000/api/import"; - - const axiosArray: AxiosPromise[] = []; - for (let x = 0; x < req.body.walkedFolders.length; x++) { - const newPromise = axios({ - method: "POST", - url: `${importServiceURI}/processAndImportToDB`, - data: { - extractionOptions: req.body.extractionOptions, - walkedFolders: req.body.walkedFolders[x], - }, - }); - axiosArray.push(newPromise); - } - - axios - .all(axiosArray) - .then( - axios.spread((...responses) => { - responses.forEach((res) => console.log("Success")); - console.log("submitted all axios calls"); - }), - ) - .catch((error) => {}); - - // await axios.request({ - // url: `${importServiceURI}/processAndImportToDB`, - // method: "POST", - // data: { - // extractionOptions: req.body.extractionOptions, - // walkedFolders: req.body.walkedFolders, - // }, - // }); - res.send({ message: "Scan and import initiated." }); -}); - -export default router; diff --git a/yarn.lock b/yarn.lock index 2ca6219..f5d8e67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1570,6 +1570,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@socket.io/component-emitter@~3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9" + integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q== + "@teamsupercell/typings-for-css-modules-loader@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@teamsupercell/typings-for-css-modules-loader/-/typings-for-css-modules-loader-2.5.1.tgz#9a8c5f9667de5edbc18a5e5d4c1a5c38a09ca004" @@ -2316,18 +2321,6 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -amqplib@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.8.0.tgz#088d10bc61cc5ac5a49ac72033c7ac66c23aeb61" - integrity sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA== - dependencies: - bitsyntax "~0.1.0" - bluebird "^3.7.2" - buffer-more-ints "~1.0.0" - readable-stream "1.x >=1.1.9" - safe-buffer "~5.2.1" - url-parse "~1.5.1" - ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -2959,6 +2952,11 @@ base64-arraybuffer@0.1.4: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= +base64-arraybuffer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz#87bd13525626db4a9838e00a508c2b73efcf348c" + integrity sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA== + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3103,15 +3101,6 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bitsyntax@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.1.0.tgz#b0c59acef03505de5a2ed62a2f763c56ae1d6205" - integrity sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q== - dependencies: - buffer-more-ints "~1.0.0" - debug "~2.6.9" - safe-buffer "~5.1.2" - bl@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" @@ -3282,11 +3271,6 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== -buffer-more-ints@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz#ef4f8e2dddbad429ed3828a9c55d44f05c611422" - integrity sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg== - buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -4375,7 +4359,7 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9, debug@~2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4921,6 +4905,21 @@ engine.io-client@~5.2.0: xmlhttprequest-ssl "~2.0.0" yeast "0.1.2" +engine.io-client@~6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.0.2.tgz#ccfc059051e65ca63845e65929184757754cc34e" + integrity sha512-cAep9lhZV6Q8jMXx3TNSU5cydMzMed8/O7Tz5uzyqZvpNPtQ3WQXrLYGADxlsuaFmOLN7wZLmT7ImiFhUOku8g== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + debug "~4.3.1" + engine.io-parser "~5.0.0" + has-cors "1.1.0" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~8.2.3" + xmlhttprequest-ssl "~2.0.0" + yeast "0.1.2" + engine.io-parser@~4.0.0, engine.io-parser@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" @@ -4928,6 +4927,13 @@ engine.io-parser@~4.0.0, engine.io-parser@~4.0.1: dependencies: base64-arraybuffer "0.1.4" +engine.io-parser@~5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.1.tgz#6695fc0f1e6d76ad4a48300ff80db5f6b3654939" + integrity sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA== + dependencies: + base64-arraybuffer "~1.0.1" + engine.io@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-5.2.0.tgz#554cdd0230d89de7b1a49a809d7ee5a129d36809" @@ -6936,7 +6942,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -11191,16 +11197,6 @@ read@1, read@^1.0.7, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1.x >=1.1.9": - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -11274,6 +11270,11 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redux-socket.io-middleware@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/redux-socket.io-middleware/-/redux-socket.io-middleware-1.0.4.tgz#5ab34821629383889fe871525d8c257f8416910b" + integrity sha1-WrNIIWKTg4if6HFSXYwlf4QWkQs= + redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" @@ -11634,12 +11635,12 @@ rxjs@^6.5.2: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@~5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0, safe-buffer@~5.2.1: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -12064,7 +12065,7 @@ socket.io-adapter@~2.3.2: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz#039cd7c71a52abad984a6d57da2c0b7ecdd3c289" integrity sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg== -socket.io-client@*, socket.io-client@^4.1.2: +socket.io-client@*: version "4.2.0" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.2.0.tgz#195feed3de40283b1ae3f7d02cf91d3eb2c905c1" integrity sha512-3GJ2KMh7inJUNAOjgf8NaKJZJa9uRyfryh2LrVJyKyxmzoXlfW9DeDNqylJn0ovOFt4e/kRLNWzMt/YqqEWYSA== @@ -12077,6 +12078,18 @@ socket.io-client@*, socket.io-client@^4.1.2: parseuri "0.0.6" socket.io-parser "~4.0.4" +socket.io-client@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.3.2.tgz#9cfdb8fecac8a24d5723daf8c8749e70c8fdeb25" + integrity sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + backo2 "~1.0.2" + debug "~4.3.2" + engine.io-client "~6.0.1" + parseuri "0.0.6" + socket.io-parser "~4.1.1" + socket.io-parser@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" @@ -12086,6 +12099,14 @@ socket.io-parser@~4.0.4: component-emitter "~1.3.0" debug "~4.3.1" +socket.io-parser@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.1.1.tgz#0ad53d980781cab1eabe320417d8480c0133e62d" + integrity sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + debug "~4.3.1" + socket.io@*: version "4.2.0" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.2.0.tgz#9e1c09d3ea647e24963a2e7ba8ea5c847778e2ed" @@ -12478,11 +12499,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -13413,7 +13429,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.5.3, url-parse@~1.5.1: +url-parse@^1.4.3, url-parse@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== @@ -14009,6 +14025,11 @@ ws@~7.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"